Commit 93790c31 authored by caimeng's avatar caimeng

6.6 日 提交

parent 7c1f1ff7
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
"jsplumb": "^2.14.6", "jsplumb": "^2.14.6",
"lodash": "^4.17.20", "lodash": "^4.17.20",
"mockjs": "^1.1.0", "mockjs": "^1.1.0",
"moment": "^2.29.3",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"qs": "^6.9.4", "qs": "^6.9.4",
"remixicon": "^2.5.0", "remixicon": "^2.5.0",
......
...@@ -37,7 +37,7 @@ export function getUserInfo(accessToken) { ...@@ -37,7 +37,7 @@ export function getUserInfo(accessToken) {
export function logout() { export function logout() {
return request({ return request({
url: '/logout', url: '/login/logout',
method: 'post', method: 'post',
}) })
} }
......
.page{ .page{
position: relative;
box-sizing: border-box; box-sizing: border-box;
padding: 20px; padding: 20px;
} }
.labelCls{ .labelCls{
width: 140px !important; width: 140px !important;
} }
.btn-fixed{
position: fixed;
top:130px;
right: 30px;
}
// 组件样式
.com{
padding-bottom: 20px;
}
<!-- 操作日志 -->
<template>
<div class='com'>
<block-header title='审批结果' />
<el-table
ref="tableSort"
v-loading="listLoading"
border
:data="list"
style="width: 100%"
>
<el-table-column
v-for="(item, index) in finallyColumns"
:key="index"
align="center"
:label="item.label"
:sortable="item.sortable"
:width="item.width"
:fixed="!!item.fixed"
:show-overflow-tooltip="!!item.overflow"
>
<template #default="{ row }">
<div v-if="item.label==='营业执照' || item.label==='小贷拍照' || item.label==='金融办批文'">
<el-image
style="width: 100px; height: 75px"
:src="row[item.prop]"
fit="fit"
/>
</div>
<div v-else-if="item.label==='机构状态'">
<span>{{ row[item.prop]==="1"?'启用':'禁用' }}</span>
</div>
<span v-else>{{ row[item.prop] }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import _ from 'lodash'
import API from '@/server/api'
export default {
name: 'TableEdit',
data() {
return {
checkList: ["用户申请金额", "剩余未还本金", "机审建议额度", "人审额度", "合作商等级"],
columns: [
{
order: 1,
label: "用户申请金额",
prop: "tenantNo"
},
{
order: 2,
label: "剩余未还本金",
prop: "tenantFullName"
},
{
order: 3,
label: "机审建议额度",
prop: "tenantName"
},
{
order: 4,
label: "人审额度",
prop: "status"
},
{
order: 5,
label: "合作商等级",
prop: "businessLicenseUrl",
overflow: true
}
],
list: [],
listLoading: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 1,
queryForm: {
current: 1,
size: 9,
status: "",
tenantName: "",
tenantNo: ""
}
}
},
computed: {
finallyColumns() {
let finallyArray = [];
this.checkList.forEach((checkItem) => {
finallyArray.push(
this.columns.filter((item) => item.label === checkItem)[0]
);
});
return _.sortBy(finallyArray, (item) => item.order);
//return finallyArray;
}
},
created() {
//防止三级以上路由时多次走created
if (this.$route.name === this.$options.name) this.fetchData();
},
mounted() {
this.fetchData();
},
methods: {
handleSizeChange(val) {
this.queryForm.size = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.current = val;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const result = await API.merchant_list(this.queryForm);
const { records, total } = result.result;
this.list = records;
this.total = total;
this.listLoading = false;
}
},
}
</script>
<!-- 操作日志 -->
<template>
<div class='com'>
<block-header title='机审报告' />
<el-table
ref="tableSort"
v-loading="listLoading"
border
:data="list"
style="width: 100%; margin-bottom: 20px;"
>
<el-table-column
v-for="(item, index) in finallyColumns"
:key="index"
align="center"
:label="item.label"
:sortable="item.sortable"
:width="item.width"
:fixed="!!item.fixed"
:show-overflow-tooltip="!!item.overflow"
>
<template #default="{ row }">
<div v-if="item.label==='营业执照' || item.label==='小贷拍照' || item.label==='金融办批文'">
<el-image
style="width: 100px; height: 75px"
:src="row[item.prop]"
fit="fit"
/>
</div>
<div v-else-if="item.label==='机构状态'">
<span>{{ row[item.prop]==="1"?'启用':'禁用' }}</span>
</div>
<span v-else>{{ row[item.prop] }}</span>
</template>
</el-table-column>
</el-table>
<block-header title='第三方报告' />
<el-descriptions style='margin-bottom: 20px;' border size='small' :column='3'>
<el-descriptions-item label-class-name='labelCls' label='同盾报告'>
<el-button type='text'>下载</el-button>
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<script>
import _ from 'lodash'
import API from '@/server/api'
export default {
name: 'TableEdit',
data() {
return {
checkList: ["用户申请金额", "剩余未还本金", "机审建议额度", "人审额度", "合作商等级"],
columns: [
{
order: 1,
label: "用户申请金额",
prop: "tenantNo"
},
{
order: 2,
label: "剩余未还本金",
prop: "tenantFullName"
},
{
order: 3,
label: "机审建议额度",
prop: "tenantName"
},
{
order: 4,
label: "人审额度",
prop: "status"
},
{
order: 5,
label: "合作商等级",
prop: "businessLicenseUrl",
overflow: true
}
],
list: [],
listLoading: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 1,
queryForm: {
current: 1,
size: 9,
status: "",
tenantName: "",
tenantNo: ""
}
}
},
computed: {
finallyColumns() {
let finallyArray = [];
this.checkList.forEach((checkItem) => {
finallyArray.push(
this.columns.filter((item) => item.label === checkItem)[0]
);
});
return _.sortBy(finallyArray, (item) => item.order);
//return finallyArray;
}
},
created() {
//防止三级以上路由时多次走created
if (this.$route.name === this.$options.name) this.fetchData();
},
mounted() {
this.fetchData();
},
methods: {
handleSizeChange(val) {
this.queryForm.size = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.current = val;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const result = await API.merchant_list(this.queryForm);
const { records, total } = result.result;
this.list = records;
this.total = total;
this.listLoading = false;
}
},
}
</script>
<!-- 预授信申述 -->
<template>
<div>
<!--图钉-->
<el-button class='btn-fixed'>审核</el-button>
<!--搜索-->
<block-header title='申述' />
<el-row>
<el-col :span='8'>
<el-form ref='form' :model='form' :rules='rules' label-suffix=':' label-width='120px'>
<el-form-item prop='quota' label='人审额度'>
<el-input v-model='form.quota' clearable placeholder='请输入额度' />
</el-form-item>
<el-form-item prop='fund' label='资金方选择'>
<!--<el-select v-model='form.fund' placeholder='请选择资金方'>-->
<!-- <el-option label='自己' value='1'></el-option>-->
<!-- <el-option label='其它人' value='2'></el-option>-->
<!--</el-select>-->
<el-select v-model="form.fund" style='width: 100%;' placeholder="请选择活动区域">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item prop='remarks' label='申述备注'>
<el-input v-model='form.remarks' clearable placeholder='请输入申述备注' />
</el-form-item>
<el-form-item prop='idea' label='审批意见'>
<el-radio-group v-model='form.idea'>
<el-radio :label='3'>备选项</el-radio>
<el-radio :label='6'>备选项</el-radio>
<el-radio :label='9'>备选项</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button type='primary' @click='onSubmit'>提 交</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
</div>
</template>
<script>
import API from '@/server/api'
export default {
name: 'PrePlead',
data() {
return {
rules: {
quota: [
{
required: true,
message: '请输入额度',
trigger: 'blur'
}
],
fund: [
{
required: true,
message: '请选择资金方',
trigger: 'blur'
}
]
},
form: {
quota: '',
fund: '',
remarks: '',
idea: ''
}
}
},
methods: {
onSubmit() {
}
}
}
</script>
<style lang='scss' scoped>
.page-fence {
::v-deep {
i {
cursor: pointer;
}
}
box-sizing: border-box;
padding: 20px;
}
</style>
<style lang='scss'>
.custom-table-checkbox {
.el-checkbox {
display: block !important;
margin: 0 0 $base-padding/4 0;
}
}
.action-bar {
margin-bottom: 15px;
}
</style>
<!-- 操作日志 -->
<template> <template>
<div> <div>
<block-header title='操作日志' /> <block-header title='操作日志' />
...@@ -133,12 +134,12 @@ ...@@ -133,12 +134,12 @@
this.fetchData(); this.fetchData();
}, },
async fetchData() { async fetchData() {
this.listLoading = true; //this.listLoading = true;
const result = await API.merchant_list(this.queryForm); //const result = await API.merchant_list(this.queryForm);
const { records, total } = result.result; //const { records, total } = result.result;
this.list = records; //this.list = records;
this.total = total; //this.total = total;
this.listLoading = false; //this.listLoading = false;
} }
}, },
} }
......
<!-- 预授信申述 -->
<template> <template>
<div> <div>
<!--图钉-->
<el-button class='btn-fixed'>审核</el-button>
<!--搜索--> <!--搜索-->
<block-header title="申述" /> <block-header title="申述" />
<el-form label-suffix=":" label-width='120px' :model="form" class="form-inline"> <el-form label-suffix=":" label-width='120px' :model="form" class="form-inline">
...@@ -19,7 +23,6 @@ ...@@ -19,7 +23,6 @@
<el-button icon="el-icon-search" type="primary" @click="onSubmit">提 交</el-button> <el-button icon="el-icon-search" type="primary" @click="onSubmit">提 交</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
</template> </template>
......
<!-- 用户基础信息 -->
<template>
<div class='com'>
<block-header title='基础信息' />
<el-descriptions style='margin-bottom: 20px;' border size='small' :column='3'>
<el-descriptions-item label-class-name='labelCls' label='申请时间'>{{baseInfo.applyDate}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='授信类型'>{{baseInfo.creditTypeStr}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='授信状态'>{{baseInfo.creditStatusStr}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='客户姓名'>{{baseInfo.realName}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='手机号码'>{{baseInfo.mobile}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='身份证号'>{{baseInfo.idCard}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='学历'>{{baseInfo.applyDate}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='婚姻状况'>{{baseInfo.applyDate}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='年龄(周岁)'>{{baseInfo.applyDate}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='工作行业'>{{baseInfo.applyDate}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='工作城市'>{{baseInfo.applyDate}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='公司全称'>{{baseInfo.companyName}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='居中城市'>{{baseInfo.liveAddress}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='居中地址'>{{baseInfo.liveDetailAddress}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='QQ/微信'>{{baseInfo.qqWechar}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='户籍地址'>{{baseInfo.address}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='BD经理'>{{baseInfo.bdName}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='商户区域'>{{baseInfo.regionName}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='工作地址'>{{baseInfo.companyAddress}}{{baseInfo.companyAddressDetail}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='是否需要补交资料'>{{baseInfo.applyDate}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='合同展示地址'>{{baseInfo.contractAddress}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='收入'>{{baseInfo.selfMonthIncome}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='客户GPS'>{{baseInfo.clientGps}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='首次授信'>{{baseInfo.isFirstCredit}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='BD用户名'>{{baseInfo.loginName}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='办单模式'>{{baseInfo.orderProcessingMode}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='收款主体'>{{baseInfo.collectionMain}}</el-descriptions-item>
</el-descriptions>
</div>
</template>
<script>
export default {
name: "UserBaseInfo",
props:{
baseInfo:{
type:Object,
require:true
}
}
};
</script>
<style lang="scss" scoped>
.page-fence {
::v-deep {
i {
cursor: pointer;
}
}
box-sizing: border-box;
padding: 20px;
}
</style>
<style lang="scss">
.custom-table-checkbox {
.el-checkbox {
display: block !important;
margin: 0 0 $base-padding/4 0;
}
}
.action-bar {
margin-bottom: 15px;
}
</style>
<!-- 图片信息 -->
<template>
<div>
<template v-if='clientIdCardInfoResponse.length'>
<block-header title='客户身份证信息' />
<el-row>
<el-col v-for='(o, index) in clientIdCardInfoResponse' :key='index' :span='4' :offset='index > 0 ? 1 : 0'>
<el-card :body-style="{ padding: '10px' }">
<el-image class='el-card-image' :src='o[1]' :preview-src-list='imgList'></el-image>
<div class='el-card-intro'>
<span v-if='o[0]==="frontImgPath"'>身份证正面</span>
<span v-else>身份证反面</span>
</div>
</el-card>
</el-col>
</el-row>
</template>
<template v-if='faceInfoResponse.length'>
<block-header title='人脸信息' />
<el-row>
<el-col v-for='(o, index) in faceInfoResponse' :key='index' :span='4' :offset='index > 0 ? 1 : 0'>
<el-card :body-style="{ padding: '10px' }">
<el-image class='el-card-image' :src='o[1]' :preview-src-list='imgList'></el-image>
<div class='el-card-intro'>
<span v-if='o[0]==="panoramaImgPath"'>全景照</span>
<span v-else-if='o[0]==="randomImgPath"'>随机照</span>
<span v-else>最佳人脸照</span>
</div>
</el-card>
</el-col>
</el-row>
</template>
<template v-if='creditAttachInfo.length'>
<block-header title='授信附件信息' />
<el-row>
<el-col v-for='(o, index) in data.PRODUCTS' :key='index' :span='4' :offset='index > 0 ? 1 : 0'>
<el-card :body-style="{ padding: '10px' }">
<el-image class='el-card-image' :src='o.content' :preview-src-list='imgList'></el-image>
<div class='el-card-intro'>
<span>{{ o.name }}</span>
</div>
</el-card>
</el-col>
</el-row>
</template>
<block-header title='客户附件信息' />
<el-row v-if='false'>
<el-col v-for='(o, index) in data.PRODUCTS' :key='index' :span='4' :offset='index > 0 ? 1 : 0'>
<el-card :body-style="{ padding: '10px' }">
<el-image class='el-card-image' :src='o.content' :preview-src-list='imgList'></el-image>
<div class='el-card-intro'>
<span>{{ o.name }}</span>
</div>
</el-card>
</el-col>
</el-row>
<!--机审报告-->
<template v-if='reportResponse!==null'>
<audit-result />
</template>
<!--审批结果-->
<template v-if='approvalResultResponse!==null'>
<approval-result />
</template>
</div>
</template>
<script>
export default {
name: 'UserOtherInfo',
props: {
info: {
type: Object,
require: true
}
},
data() {
return {
data: '',
approvalResultResponse:null,
faceInfoResponse:[],
creditAttachInfo:[],
clientIdCardInfoResponse:[],
reportResponse:null,
thirdPartyReport:null,
imgList:[]
}
},
created() {
const {
approvalResultResponse,
clientIdCardInfoResponse,
creditAttachInfo,
faceInfoResponse,
reportResponse,
thirdPartyReport
} = this.info;
this.data = this.info;
this.approvalResultResponse = approvalResultResponse;
this.clientIdCardInfoResponse = Object.entries(clientIdCardInfoResponse);
this.faceInfoResponse = Object.entries(faceInfoResponse);
this.creditAttachInfo = JSON.parse(creditAttachInfo);
this.reportResponse = reportResponse;
this.thirdPartyReport = thirdPartyReport;
console.log(creditAttachInfo,'信息')
}
}
</script>
<style lang='scss' scoped>
.page-fence {
::v-deep {
i {
cursor: pointer;
}
}
box-sizing: border-box;
padding: 20px;
}
</style>
<style lang='scss'>
.custom-table-checkbox {
.el-checkbox {
display: block !important;
margin: 0 0 $base-padding/4 0;
}
}
.action-bar {
margin-bottom: 15px;
}
.el-card-image {
display: block;
width: 100%;
height: 100px;
max-height: 100px
}
.el-card-intro {
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
</style>
<!-- 用户项目信息 -->
<template>
<div class='com'>
<block-header title='项目信息' />
<el-descriptions style='margin-bottom: 20px;' border size='small' :column='3'>
<el-descriptions-item label-class-name='labelCls' label='医院名称'>{{projectInfo.regName}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='项目金额'>{{projectInfo.projectAmount}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='申请金额'>{{projectInfo.loanIntentionAmount}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='借款期限'>{{projectInfo.loanIntentionNum}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='申请项目'>{{projectInfo.projectName}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='商家等级'>{{projectInfo.applyDate}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='商户GPS'>{{projectInfo.projectId}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='资质类型'>{{projectInfo.loanApplyDate}}</el-descriptions-item>
</el-descriptions>
</div>
</template>
<script>
export default {
name: "UserProjectInfo",
props:{
projectInfo:{
type:Object,
require:true
}
}
};
</script>
<style lang="scss" scoped>
.page-fence {
::v-deep {
i {
cursor: pointer;
}
}
box-sizing: border-box;
padding: 20px;
}
</style>
<style lang="scss">
.custom-table-checkbox {
.el-checkbox {
display: block !important;
margin: 0 0 $base-padding/4 0;
}
}
.action-bar {
margin-bottom: 15px;
}
</style>
import BlockHeader from '@/components/blockHeader' import BlockHeader from '@/components/blockHeader'
import OperationLog from '@/components/pre-operation-log'
import PrePlead from '@/components/pre-plead'
import Plead from '@/components/plead'
import UserOtherInfo from '@/components/user-other-info'
import ApprovalResult from '@/components/approval-result'
import AuditResult from '@/components/audit-result'
import UserBaseInfo from '@/components/user-base-info'
import UserProjectInfo from '@/components/user-project-info'
export default { export default {
name: "Login", name: "Minix",
components:{ components:{
BlockHeader BlockHeader,
OperationLog,
PrePlead,
Plead,
UserOtherInfo,
ApprovalResult,
AuditResult,
UserBaseInfo,
UserProjectInfo
},
methods: {
onReset(formName) {
if (formName) {
this.$refs[formName].resetFields();
}
}
} }
} }
This diff is collapsed.
...@@ -5,7 +5,7 @@ export default { ...@@ -5,7 +5,7 @@ export default {
// 登录 // 登录
login(data) { login(data) {
return request({ return request({
url: "/sysUser/login", url: "/login",
method: "post", method: "post",
data data
}); });
...@@ -13,7 +13,7 @@ export default { ...@@ -13,7 +13,7 @@ export default {
// 登出 // 登出
logout(data) { logout(data) {
return request({ return request({
url: "/sysUser/logout", url: "/login/logout",
method: "post", method: "post",
data data
}); });
...@@ -21,7 +21,7 @@ export default { ...@@ -21,7 +21,7 @@ export default {
// 用户信息 // 用户信息
userInfo(params) { userInfo(params) {
return request({ return request({
url: "/sysUser/getInfo", url: "/user/get",
method: "get", method: "get",
params params
}); });
...@@ -29,7 +29,7 @@ export default { ...@@ -29,7 +29,7 @@ export default {
// 发送验证码 // 发送验证码
send_msg_code(data) { send_msg_code(data) {
return request({ return request({
url: "/sysUser/transmitCode", url: "/login/sendLoginSms",
method: "post", method: "post",
data data
}); });
...@@ -193,5 +193,71 @@ export default { ...@@ -193,5 +193,71 @@ export default {
method: "get", method: "get",
params params
}); });
} },
/** 授信管理接口 **/
// 预授信列表
preCreditList(data) {
return request({
url: "/credit/preList",
method: "post",
data
});
},
// 预授信详情
preCreditDetail(params) {
return request({
url: "/credit/preDetail",
method: "get",
params
});
},
// 预授信申述
preCreditPlead(params) {
return request({
url: "/credit/preSubmit",
method: "post",
data
});
},
// 授信列表
creditList(data) {
return request({
url: "/credit/creditList",
method: "post",
data
});
},
// 授信详情
creditDetail(params) {
return request({
url: "/credit/creditDetail",
method: "get",
params
});
},
// 授信详情申述
creditPlead(data) {
return request({
url: "/credit/myAllotSubmit",
method: "post",
data
});
},
// 初始化过滤条件的基础数据
initSearchData(data) {
return request({
url: "/credit/statusList",
method: "post",
data
});
},
}; };
const getters = {
searchData: state => state.common.searchData,
}
export default getters
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
*/ */
import Vue from 'vue' import Vue from 'vue'
import Vuex from 'vuex' import Vuex from 'vuex'
import getters from './getters'
Vue.use(Vuex) Vue.use(Vuex)
const files = require.context('./modules', false, /\.js$/) const files = require.context('./modules', false, /\.js$/)
...@@ -19,5 +20,6 @@ Object.keys(modules).forEach((key) => { ...@@ -19,5 +20,6 @@ Object.keys(modules).forEach((key) => {
const store = new Vuex.Store({ const store = new Vuex.Store({
modules, modules,
getters
}) })
export default store export default store
import API from '@/server/api'
const common = {
state: {
searchData: null,
},
actions: {
GetSearchData({commit}){
return new Promise(resolve => {
API.initSearchData().then((res) => {
const data = res.result;
commit("SET_SEARCH_DATA", data);
resolve(data);
});
});
}
},
mutations: {
SET_SEARCH_DATA: (state, data) => {
state.searchData = data
}
}
}
export default common
/** /**
* @description 登录、获取用户信息、退出登录、清除accessToken逻辑,不建议修改 * @description 登录、获取用户信息、退出登录、清除accessToken逻辑,不建议修改
*/ */
import Vue from "vue"; import Vue from 'vue'
import { getUserInfo, logout } from "@/api/user"; import { getUserInfo, logout } from '@/api/user'
import { getAccessToken, removeAccessToken, setAccessToken } from "@/utils/accessToken"; import { getAccessToken, removeAccessToken, setAccessToken } from '@/utils/accessToken'
import { resetRouter } from "@/router"; import { resetRouter } from '@/router'
import { title, tokenName } from "@/config"; import { title, tokenName } from '@/config'
import API from "@/server/api"; import API from '@/server/api'
import Cookies from 'js-cookie'
const state = { const state = {
accessToken: getAccessToken(), accessToken: getAccessToken(),
username: "", username: '',
avatar: "", avatar: '',
user: null user: null
}; }
const getters = { const getters = {
accessToken: (state) => state.accessToken, accessToken: (state) => state.accessToken,
username: (state) => state.username, username: (state) => state.username,
avatar: (state) => state.avatar, avatar: (state) => state.avatar,
user: (state) => state.user user: (state) => state.user
}; }
const mutations = { const mutations = {
setAccessToken(state, accessToken) { setAccessToken(state, accessToken) {
state.accessToken = accessToken; state.accessToken = accessToken
setAccessToken(accessToken); setAccessToken(accessToken)
}, },
setUsername(state, username) { setUsername(state, username) {
state.username = username; state.username = username
}, },
setAvatar(state, avatar) { setAvatar(state, avatar) {
state.avatar = avatar; state.avatar = avatar
}, },
setUser(state, user) { setUser(state, user) {
state.user = user; state.user = user
} }
}; }
const actions = { const actions = {
/** /**
* @description 登录拦截放行时,设置虚拟角色 * @description 登录拦截放行时,设置虚拟角色
* @param {*} { commit, dispatch } * @param {*} { commit, dispatch }
*/ */
setVirtualRoles({ commit, dispatch }) { setVirtualRoles({ commit, dispatch }) {
dispatch("acl/setFull", true, { root: true }); dispatch('acl/setFull', true, { root: true })
commit("setAvatar", "https://i.gtimg.cn/club/item/face/img/2/15922_100.gif"); commit('setAvatar', 'https://i.gtimg.cn/club/item/face/img/2/15922_100.gif')
commit("setUsername", "admin(未开启登录拦截)"); commit('setUsername', 'admin(未开启登录拦截)')
}, },
/** /**
* @description 登录 * @description 登录
*/ */
async login({ commit }, userInfo) { async login({ commit }, userInfo) {
const result = await API.login(userInfo); const result = await API.login(userInfo)
if (result.success) { if (result.success) {
const user = result.result; const user = result.result
console.log('我知道'); console.log('我知道')
commit("setUser", user); commit('setUser', user)
commit("setUsername", user.nickName); commit('setUsername', user.nickName)
} }
// 设置假的token // 设置假的token
const accessToken = "mmcai";
const accessToken = Cookies.get('x-auth-token')
if (accessToken) { if (accessToken) {
commit("setAccessToken", accessToken); commit('setAccessToken', accessToken)
} }
}, },
...@@ -69,9 +71,12 @@ const actions = { ...@@ -69,9 +71,12 @@ const actions = {
* @description 获取验证码 * @description 获取验证码
*/ */
async send_msg_code({ commit }, userInfo) { async send_msg_code({ commit }, userInfo) {
const result = await API.send_msg_code(userInfo); const result = await API.send_msg_code(userInfo)
console.log(result, '验证码返回结果')
if (result.success) { if (result.success) {
return result; return result
} }
}, },
/** /**
...@@ -80,33 +85,20 @@ const actions = { ...@@ -80,33 +85,20 @@ const actions = {
* @returns * @returns
*/ */
async getUserInfo({ commit, dispatch, state }) { async getUserInfo({ commit, dispatch, state }) {
try{
const result = await API.userInfo();
if(result.success){
const {avatar,nickName} = result.result;
commit("setUsername", nickName);
commit("setAvatar", avatar);
// 当不传递roles或ability时,默认使用管理员权限,可查看所有路由和按钮
dispatch("acl/setFull", true, { root: true });
}else{
} const result = await API.userInfo({
}catch (e){ loginName: 'caimm'
throw new Error('bao cuo') })
} if (result.success) {
const { loginName } = result.result
//let { username, avatar, roles, ability } = state.user; commit('setUsername', loginName)
//if (username && avatar) { //commit('setAvatar')
// commit("setUsername", userName); commit('setAvatar', 'https://i.gtimg.cn/club/item/face/img/2/15922_100.gif')
//commit("setAvatar", '');
// 当不传递roles或ability时,默认使用管理员权限,可查看所有路由和按钮 // 当不传递roles或ability时,默认使用管理员权限,可查看所有路由和按钮
//dispatch("acl/setFull", true, { root: true }); dispatch('acl/setFull', true, { root: true })
// 当返回数据包含roles(角色)或ability(权限),保存至vuex } else {
// 如不使用roles权限控制,请不要传递roles,可删除以下代码 await dispatch('resetAll')
//if (roles instanceof Array) dispatch("acl/setRole", roles, { root: true }); }
// 如不使用ability权限控制,请不要传递ability,可删除以下代码
//if (ability instanceof Array) dispatch("acl/setAbility", ability, { root: true });
//}
}, },
/** /**
...@@ -114,28 +106,28 @@ const actions = { ...@@ -114,28 +106,28 @@ const actions = {
* @param {*} { dispatch } * @param {*} { dispatch }
*/ */
async logout({ dispatch }) { async logout({ dispatch }) {
await API.logout(); await API.logout()
await dispatch("resetAll"); await dispatch('resetAll')
}, },
/** /**
* @description 重置accessToken、roles、ability、router等 * @description 重置accessToken、roles、ability、router等
* @param {*} { commit, dispatch } * @param {*} { commit, dispatch }
*/ */
async resetAll({ dispatch }) { async resetAll({ dispatch }) {
await dispatch("setAccessToken", ""); await dispatch('setAccessToken', '')
await dispatch("acl/setFull", false, { root: true }); await dispatch('acl/setFull', false, { root: true })
await dispatch("acl/setRole", [], { root: true }); await dispatch('acl/setRole', [], { root: true })
await dispatch("acl/setAbility", [], { root: true }); await dispatch('acl/setAbility', [], { root: true })
await resetRouter(); await resetRouter()
removeAccessToken(); removeAccessToken()
}, },
// 设置token // 设置token
setAccessToken({ commit }, accessToken) { setAccessToken({ commit }, accessToken) {
commit("setAccessToken", accessToken); commit('setAccessToken', accessToken)
}, },
// 设置用户 // 设置用户
setUser({ commit }, user) { setUser({ commit }, user) {
commit("setUser", user); commit('setUser', user)
} }
}; }
export default { state, getters, mutations, actions }; export default { state, getters, mutations, actions }
import Vue from "vue"; import Vue from 'vue'
import axios from "axios"; import axios from 'axios'
import { import {
baseURL, baseURL,
contentType, contentType,
...@@ -7,39 +7,40 @@ import { ...@@ -7,39 +7,40 @@ import {
requestTimeout, requestTimeout,
successCode, successCode,
tokenName tokenName
} from "@/config"; } from '@/config'
import store from "@/store"; import store from '@/store'
import qs from "qs"; import qs from 'qs'
import router from "@/router"; import router from '@/router'
import { isArray } from "@/utils/validate"; import { isArray } from '@/utils/validate'
import Cookies from 'js-cookie'
const API_URL = process.env.VUE_APP_API_PATH; const API_URL = process.env.VUE_APP_API_PATH
//console.log(API_URL,'是啥'); //console.log(API_URL,'是啥');
let loadingInstance; let loadingInstance
// 操作正常Code数组 // 操作正常Code数组
const codeVerificationArray = isArray(successCode) const codeVerificationArray = isArray(successCode)
? [...successCode] ? [...successCode]
: [...[successCode]]; : [...[successCode]]
const CODE_MESSAGE = { const CODE_MESSAGE = {
200: "服务器成功返回请求数据", 200: '服务器成功返回请求数据',
201: "新建或修改数据成功", 201: '新建或修改数据成功',
202: "一个请求已经进入后台排队(异步任务)", 202: '一个请求已经进入后台排队(异步任务)',
204: "删除数据成功", 204: '删除数据成功',
400: "发出信息有误", 400: '发出信息有误',
401: "用户没有权限(令牌、用户名、密码错误)", 401: '用户没有权限(令牌、用户名、密码错误)',
403: "用户得到授权,但是访问是被禁止的", 403: '用户得到授权,但是访问是被禁止的',
404: "访问资源不存在", 404: '访问资源不存在',
406: "请求格式不可得", 406: '请求格式不可得',
410: "请求资源被永久删除,且不会被看到", 410: '请求资源被永久删除,且不会被看到',
500: "服务器发生错误", 500: '服务器发生错误',
502: "网关错误", 502: '网关错误',
503: "服务不可用,服务器暂时过载或维护", 503: '服务不可用,服务器暂时过载或维护',
504: "网关超时" 504: '网关超时'
}; }
//code: "500" //code: "500"
//message: "验证码发送过于频繁请稍后重试!" //message: "验证码发送过于频繁请稍后重试!"
...@@ -47,15 +48,15 @@ const CODE_MESSAGE = { ...@@ -47,15 +48,15 @@ const CODE_MESSAGE = {
//success: false //success: false
const handleData = ({ config, data, status, statusText }) => { const handleData = ({ config, data, status, statusText }) => {
if (loadingInstance) loadingInstance.close(); if (loadingInstance) loadingInstance.close()
// 若data.code存在,覆盖默认code // 若data.code存在,覆盖默认code
let code = data && data.code ? data.code : status; let code = data && data.code ? data.code : status
// 若code属于操作正常code,则status修改为200 // 若code属于操作正常code,则status修改为200
if (codeVerificationArray.includes(code)) code = 200; if (codeVerificationArray.includes(code)) code = 200
// 若data.msg存在,覆盖默认提醒消息 // 若data.msg存在,覆盖默认提醒消息
const msg = !data ? `后端接口 ${config.url} 异常 ${code}${CODE_MESSAGE[code]}` : !data.message ? `后端接口 ${config.url} 异常 ${code}${statusText}` : data.message; const msg = !data ? `后端接口 ${config.url} 异常 ${code}${CODE_MESSAGE[code]}` : !data.message ? `后端接口 ${config.url} 异常 ${code}${statusText}` : data.message
code = code * 1; code = code * 1
switch (code) { switch (code) {
case 200: case 200:
...@@ -66,24 +67,26 @@ const handleData = ({ config, data, status, statusText }) => { ...@@ -66,24 +67,26 @@ const handleData = ({ config, data, status, statusText }) => {
// 修改返回内容为 `data` 内容,对于绝大多数场景已经无须再关心业务状态码(code)和消息(msg) // 修改返回内容为 `data` 内容,对于绝大多数场景已经无须再关心业务状态码(code)和消息(msg)
// return data.data // return data.data
// 或者依然保持完整的格式 // 或者依然保持完整的格式
return data; return data
case 401: case 401:
Vue.prototype.$baseMessage(msg, "error"); Vue.prototype.$baseMessage(msg, 'error')
store.dispatch("user/resetAll").catch(() => { store.dispatch('user/resetAll').catch(() => {
}); })
break; break
case 403: case 403:
store.dispatch("user/resetAll").catch(() => { store.dispatch('user/resetAll').catch(() => {
}); })
router.push({ path: "/login" }).catch(() => { router.push({ path: '/login' }).catch(() => {
}); })
break; break
default: default:
Vue.prototype.$baseMessage(msg, "error"); Vue.prototype.$baseMessage(msg, 'error')
break; break
} }
return data;
}; console.log(data, '沃日')
return data
}
/** /**
* @description axios初始化 * @description axios初始化
...@@ -94,28 +97,37 @@ const instance = axios.create({ ...@@ -94,28 +97,37 @@ const instance = axios.create({
timeout: requestTimeout, timeout: requestTimeout,
withCredentials: true, withCredentials: true,
headers: { headers: {
"Content-Type": contentType 'Content-Type': contentType
} }
}); })
/** /**
* @description axios请求拦截器 * @description axios请求拦截器
*/ */
instance.interceptors.request.use( instance.interceptors.request.use(
(config) => { (config) => {
if (store.getters["user/accessToken"]) {
config.headers[tokenName] = store.getters["user/accessToken"];
if (store.getters['user/accessToken']) {
config.headers[tokenName] = store.getters['user/accessToken']
} }
if (config.data && config.headers["Content-Type"] === "application/x-www-form-urlencoded;charset=UTF-8") { const token = Cookies.get('x-auth-token')
config.data = qs.stringify(config.data); if (token) {
config.headers['X-Auth-Token'] = token
// req.headers['token'] = localStorage.getItem("token_xxx")
}
if (config.data && config.headers['Content-Type'] === 'application/x-www-form-urlencoded;charset=UTF-8') {
config.data = qs.stringify(config.data)
} }
if (debounce.some((item) => config.url.includes(item))) { if (debounce.some((item) => config.url.includes(item))) {
loadingInstance = Vue.prototype.$baseLoading(); loadingInstance = Vue.prototype.$baseLoading()
} }
// 处理get 请求的数组 springmvc 可以处理 // 处理get 请求的数组 springmvc 可以处理
if (config.method === "post") { if (config.method === 'post') {
//请求头转换为表单形式 //请求头转换为表单形式
//config.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8' //config.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
//config.transformRequest = [function (data) { //config.transformRequest = [function (data) {
...@@ -128,33 +140,36 @@ instance.interceptors.request.use( ...@@ -128,33 +140,36 @@ instance.interceptors.request.use(
} }
return config; return config
}, },
(error) => { (error) => {
return Promise.reject(error); return Promise.reject(error)
} }
); )
/** /**
* @description axios响应拦截器 * @description axios响应拦截器
*/ */
instance.interceptors.response.use( instance.interceptors.response.use(
(response) => handleData(response), (response) => {
const token = response.headers['x-auth-token']
token && Cookies.set('x-auth-token', token)
return handleData(response)
},
(error) => { (error) => {
const { response } = error; const { response } = error
if (response === undefined) { if (response === undefined) {
Vue.prototype.$baseMessage( Vue.prototype.$baseMessage(
"未可知错误,大部分是由于后端不支持跨域CORS或无效配置引起", '未可知错误,大部分是由于后端不支持跨域CORS或无效配置引起',
"error" 'error'
); )
return {}; return {}
} else { } else {
console.log(response,'返回结果'); console.log(response, '返回结果')
//throw new Error(response) //throw new Error(response)
return handleData(response); return handleData(response)
} }
} }
); )
export default instance; export default instance
...@@ -30,7 +30,13 @@ ...@@ -30,7 +30,13 @@
username: 'user/username', username: 'user/username',
}), }),
}, },
created() {
this.initSearchData()
},
methods: { methods: {
async initSearchData() {
await this.$store.dispatch('common/GetSearchData');
},
translateTitle, translateTitle,
handleCommand(command) { handleCommand(command) {
switch (command) { switch (command) {
...@@ -46,7 +52,7 @@ ...@@ -46,7 +52,7 @@
this.$router.push('/personalCenter/personalCenter') this.$router.push('/personalCenter/personalCenter')
}, },
async logout() { async logout() {
await this.$store.dispatch('user/logout') await this.$store.dispatch('user/logout');
if (recordRoute) { if (recordRoute) {
const fullPath = this.$route.fullPath const fullPath = this.$route.fullPath
await this.$router.push(`/login?redirect=${fullPath}`) await this.$router.push(`/login?redirect=${fullPath}`)
......
/** /**
* @description 路由守卫,目前两种模式:all模式与intelligence模式 * @description 路由守卫,目前两种模式:all模式与intelligence模式
*/ */
import router from "@/router"; import router from '@/router'
import store from "@/store"; import store from '@/store'
import VabProgress from "nprogress"; import VabProgress from 'nprogress'
import "nprogress/nprogress.css"; import 'nprogress/nprogress.css'
import getPageTitle from "@/utils/pageTitle"; import getPageTitle from '@/utils/pageTitle'
import { import {
authentication, authentication,
loginInterception, loginInterception,
recordRoute, recordRoute,
routesWhiteList routesWhiteList
} from "@/config"; } from '@/config'
VabProgress.configure({ VabProgress.configure({
easing: "ease", easing: 'ease',
speed: 500, speed: 500,
trickleSpeed: 200, trickleSpeed: 200,
showSpinner: false showSpinner: false
}); })
//console.log(router.getRoutes(), "路由信息"); //console.log(router.getRoutes(), "路由信息");
router.beforeEach(async (to, from, next) => { router.beforeEach(async (to, from, next) => {
const showProgressBar = store.getters["settings/showProgressBar"]; const showProgressBar = store.getters['settings/showProgressBar']
if (showProgressBar) VabProgress.start(); if (showProgressBar) VabProgress.start()
let hasToken = store.getters["user/accessToken"]; let hasToken = store.getters['user/accessToken']
//if (loginInterception) hasToken = false
if (!loginInterception) hasToken = true;
if (routesWhiteList.indexOf(to.path) !== -1) { if (routesWhiteList.indexOf(to.path) !== -1) {
if (to.path === "/login" && hasToken) next({ path: "/" }); if (to.path === '/login' && hasToken) next({ path: '/' })
else next(); else next()
} else { } else {
if (hasToken) { if (hasToken) {
const hasAccess = store.getters["acl/admin"]; const hasAccess = store.getters['acl/admin']
if (hasAccess) { if (hasAccess) {
next(); next()
} else { } else {
try { try {
if (loginInterception) await store.dispatch("user/getUserInfo");
if (loginInterception) await store.dispatch('user/getUserInfo')
//settings.js loginInterception为false(关闭登录拦截时)时,创建虚拟角色 //settings.js loginInterception为false(关闭登录拦截时)时,创建虚拟角色
else await store.dispatch("user/setVirtualRoles"); else await store.dispatch('user/setVirtualRoles')
//根据路由模式添加路由 //根据路由模式添加路由
router.addRoutes( router.addRoutes(
await store.dispatch("routes/setRoutes", authentication) await store.dispatch('routes/setRoutes', authentication)
); )
next({ ...to, replace: true }); next({ ...to, replace: true })
} } catch (err) {
catch(err) { console.log(err, '啥错误')
console.log(err,'啥错误'); await store.dispatch('user/resetAll')
await store.dispatch("user/resetAll"); if (recordRoute && to.path !== '/') {
if (recordRoute && to.path !== "/") {
next({ next({
path: "/login", path: '/login',
query: { redirect: to.path }, query: { redirect: to.path },
replace: true replace: true
}); })
} else { } else {
next({ path: "/login", replace: true }); next({ path: '/login', replace: true })
} }
} }
} }
} }
else { else {
if (recordRoute && to.path !== "/") if (recordRoute && to.path !== '/') {
next({ path: "/login", query: { redirect: to.path }, replace: true }); next({ path: '/login', query: { redirect: to.path }, replace: true })
else next({ path: "/login", replace: true }); } else {
next({ path: '/login', replace: true })
}
} }
} }
}); })
router.afterEach((to) => { router.afterEach((to) => {
document.title = getPageTitle(to.meta.title); document.title = getPageTitle(to.meta.title)
if (VabProgress.status) VabProgress.done(); if (VabProgress.status) VabProgress.done()
}); })
This diff is collapsed.
This diff is collapsed.
.merchant-new{
box-sizing: border-box;
padding: 20px;
}
.form-item{
width:500px;
margin-bottom: 24px !important;
}
.mc-form-item{
width:800px;
margin-bottom: 24px !important;
}
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
width: 120px;
height: 120px;
line-height: 120px;
}
.avatar-uploader .el-upload:hover {
border-color: #409eff;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 120px;
height: 120px;
line-height: 120px;
text-align: center;
}
.avatar {
width: 120px;
height: 120px;
display: block;
}
//.el-input{
// width:200px;
//}
<!-- 用户基础信息 -->
<template>
<el-dialog
v-drag
title="转派"
:visible.sync="visible"
:close-on-click-modal="false"
:append-to-body="true"
width="30%"
:before-close="handleClose"
>
<el-form :model='form'>
<el-form-item label='选择转派人员'>
<el-select v-model='form.status' clearable placeholder='请选择'>
<el-option label='启用' value='1' />
<el-option label='禁用' value='0' />
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="default" @click="handleClose">取 消</el-button>
<el-button type="primary" @click="onSubmit">确 定</el-button>
</div>
</el-dialog>
</template>
<script>
import API from "@/server/api";
export default {
name: "Reassignment",
props:{
visible:{
type:Boolean,
required:true
}
},
data() {
return {
form: {
status: ''
}
};
},
methods: {
onSubmit(){
},
handleClose(){
this.$emit("handleClose");
}
}
};
</script>
<style lang="scss" scoped>
.page-fence {
::v-deep {
i {
cursor: pointer;
}
}
box-sizing: border-box;
padding: 20px;
}
</style>
<style lang="scss">
.custom-table-checkbox {
.el-checkbox {
display: block !important;
margin: 0 0 $base-padding/4 0;
}
}
.action-bar {
margin-bottom: 15px;
}
</style>
<template> <template>
<div class="merchant-new"> <div class='page'>
<el-form
ref="h5form"
label-suffix=":"
:rules="rules"
:model="form"
label-width="120px"
>
<block-header title="对接信息" />
<el-form-item
class="form-item"
label="对接机构"
>
<el-select
v-model="form.tenantNo"
:disabled="!!appNo"
placeholder="请选择"
>
<el-option
v-for="(item,index) in merchant"
:key="index"
:label="item.tenantName"
:value="item.tenantNo"
/>
</el-select>
</el-form-item>
<el-form-item
class="form-item"
label="对接方式"
>
<el-select
v-model="form.abutmentWay"
:disabled="!!appNo"
placeholder="请选择"
>
<el-option
label="API"
value="API"
/>
<el-option
label="H5"
value="H5"
/>
</el-select>
</el-form-item>
</el-form>
</div>
</template>
<script> <user-base-info />
import BlockHeader from "@/components/blockHeader";
import API from "@/server/api";
const $API = process.env.VUE_APP_API_PATH;
export default { <user-project-info />
name: "MerchantNew",
components: {
"block-header": BlockHeader
},
data() {
return {
uploadUrl:`${$API}/sysUser/upload`,
appNo:'',
form: {
tenantNo: "",
abutmentWay: "",
gradeSort: "3",
appLogo: "",
appName: "MC产品",
appInfo: "产品介绍",
abstratInfo: "产品摘要",
applyAmtMin: "300",
applyAmtMax: "500",
withdrawSpan: "1000",
incomeCount: "1000",
approvalTime: "1000",
raiseTimeMax: "7",
raiseTimeMin: "5",
memo: "1000",
customerNumbers: "400", // 客服电话
creditWay: 1 // 授信方式
},
rules: {
tenantNo: [{ required: true, message: "请选择机构名称", trigger: "change" }],
abutmentWay: [{ required: true, message: "请选择对接方式", trigger: "change" }],
appName: [{ required: true, message: "请输入产品名称", trigger: "blur" }],
appLogo: [{ required: true, message: "请上传产品LOGO图片", trigger: "blur" }],
appInfo: [{ required: true, message: "请输入产品描述", trigger: "blur" }],
abstratInfo: [{ required: true, message: "请输入产品摘要", trigger: "blur" }],
customerNumbers: [{ required: true, message: "请输入客服电话", trigger: "blur" }],
creditWay: [{ required: true, message: "请选择授信方式", trigger: "blur" }],
gradeSort: [
{
required: true,
message: "请输入产品等级",
trigger: "blur"
}
],
raiseTimeMin: [ <user-other-info />
{ required: true, message: "请输入时间", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value * 1 >= this.form.raiseTimeMax * 1) {
callback(new Error("时间不大于最大时间"));
} else {
callback();
}
},
trigger: "change"
}
],
raiseTimeMax: [
{ required: true, message: "请输入时间", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value * 1 <= this.form.raiseTimeMin * 1) {
callback(new Error("时间不小于最小时间"));
} else {
callback();
}
},
trigger: "change"
}
],
applyAmtMin: [ <operation-log />
{ required: true, message: "请输入额度", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value * 1 >= this.form.applyAmtMax * 1) {
callback(new Error("额度必须小于最大额度"));
} else {
callback();
}
},
trigger: "change"
}
],
applyAmtMax: [
{ required: true, message: "请输入额度", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value * 1 <= this.form.applyAmtMin * 1) {
callback(new Error("额度必须大于最小额度"));
} else {
callback();
}
},
trigger: "change"
}
],
incomeTimeBefore: [ <plead />
{ required: true, message: "请输入时间", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value * 1 >= this.form.incomeTimeLate * 1) {
callback(new Error("时间须小于结束时间"));
} else {
callback();
}
},
trigger: "change"
}
],
incomeTimeLate: [
{ required: true, message: "请输入时间", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value * 1 <= this.form.incomeTimeBefore * 1) {
callback(new Error("时间须大于开始时间"));
} else {
callback();
}
},
trigger: "change"
}
],
withdrawSpan: [{ required: true, message: "请输入提现跨度", trigger: "blur" }], </div>
approvalTime: [{ required: true, message: "请输入申请时间", trigger: "blur" }], </template>
incomeCount: [{ required: true, message: "请输入每日进件上限", trigger: "blur" }]
},
merchant: []
};
},
async created() {
// 初始化机构列表
await this.initMerchant();
// 再请求表单
const { query } = this.$route;
if (query && query.appNo) {
this.appNo = query.appNo;
await this.initProd();
await this.initDict("SYS_USER_SEX");
await this.initDict("EDUCATIONAL");
await this.initDict("MONTHLY_INCOME");
await this.initDict("MARRIAGE");
await this.initDict("REGION");
}
},
methods: {
// 初始化机构列表
async initMerchant() {
const result = await API.merchant_select();
if (result.success) {
this.merchant = result.result;
}
},
// 初始化产品信息
async initProd() {
const appNo = this.appNo;
const { result, success } = await API.prod_view({ appNo });
if (success) {
//result.creditWay = result.creditWay+'';
this.form = result;
}
},
// 初始化字典
async initDict(dictType) {
const result = await API.dict({
dictType
});
if (result.success) {
const data = result.result;
switch (dictType) {
case "SYS_USER_SEX":
this.dict.sex = data;
break;
case "EDUCATIONAL":
this.dict.edu = data;
break;
case "MARRIAGE":
this.dict.marriage = data;
break;
case "REGION":
this.dict.region = data;
break;
case "MONTHLY_INCOME":
this.dict.money = data;
break;
}
}
},
handleSuccessLogo(res) { <script>
this.form.appLogo = res.result; import API from '@/server/api'
}, export default {
beforeAvatarUpload(file) { name: 'PreDetail',
const isJPG = file.type === "image/jpeg"; data() {
const isPNG = file.type === "image/png"; return {
const isLt2M = file.size / 1024 / 1024 < 2; tenantNo: ''
if (!isJPG && !isPNG) {
this.$message.error("上传图片只能是 JPG 或者 PNG 格式!");
return false;
}
if (!isLt2M) {
this.$message.error("上传图片大小不能超过 2MB!");
return false;
} }
return true;
}, },
onSubmit(formName) { created() {
this.$refs[formName].validate(async (valid) => { const { query } = this.$route
if (valid) { if (query && query.tenantNo) {
const form = Object.assign({}, this.form); this.tenantNo = query.tenantNo
//form.tenantNo = this.tenantNo;
//form.abutmentWay = 'API'
let result;
if(this.appNo){
form.appNo = this.appNo;
result = await API.prod_update({ ...form });
}else{
result = await API.prod_add({ ...form });
}
if (result.success) {
this.$baseMessage("产品保存成功", "success");
setTimeout(() => {
this.$router.back();
}, 1500);
}
} }
});
}, },
onReset(formName) { methods: {}
this.$refs[formName].resetFields();
}
} }
};
</script> </script>
<style lang="scss" src="./index.scss"></style> <style lang='scss' src='./index.scss'></style>
<template>
<div class="merchant-new">
<el-form
ref="h5form"
label-suffix=":"
:rules="rules"
:model="form"
label-width="120px"
>
<block-header title="对接信息" />
<el-form-item
prop="tenantNo"
class="form-item"
label="对接机构"
>
<el-select
v-model="form.tenantNo"
:disabled="isEdit"
placeholder="请选择"
@change="handleChange"
>
<el-option
v-for="(item,index) in merchant"
:key="index"
:label="item.tenantName"
:value="item.tenantNo"
/>
</el-select>
</el-form-item>
<el-form-item
prop="abutmentWay"
class="form-item"
label="对接方式"
>
<el-select
v-model="form.abutmentWay"
:disabled="isEdit"
placeholder="请选择"
@change="handleChange"
>
<el-option
label="API"
value="API"
/>
<el-option
label="H5"
value="H5"
/>
</el-select>
</el-form-item>
</el-form>
<template>
<component
:is="com"
:params="params"
/>
</template>
</div>
</template>
<script>
import ComH5 from "@/views/approval/components/comH5";
import ComAPI from "@/views/approval/components/comAPI";
import API from "@/server/api";
const $API = process.env.VUE_APP_API_PATH;
export default {
name: "MerchantNew",
components: {
ComH5,
ComAPI
},
data() {
return {
visible: false,
com: "",
params: null,
isEdit: false,
form: {
tenantNo: "",
abutmentWay: ""
},
rules: {
tenantNo: [{ required: true, message: "请选择机构名称", trigger: "change" }],
abutmentWay: [{ required: true, message: "请选择对接方式", trigger: "change" }]
},
merchant: []
};
},
async created() {
// 初始化机构列表
await this.initMerchant();
// 再请求表单
const { query } = this.$route;
if (query && query.appNo) {
this.appNo = query.appNo;
this.isEdit = true;
await this.initProd();
}
},
methods: {
// 初始化机构列表
async initMerchant() {
const result = await API.merchant_select();
if (result.success) {
this.merchant = result.result;
}
},
// 初始化产品信息
async initProd() {
const appNo = this.appNo;
const { result, success } = await API.prod_view({ appNo });
if (success) {
if (result.region) {
result.region = JSON.parse(result.region);
}
this.form = result;
this.params = result;
this.params.appNo = this.appNo;
this.visible = true;
// 那啥
this.handleChange();
}
},
handleChange() {
const { tenantNo, abutmentWay } = this.form;
if (tenantNo && abutmentWay) {
this.params = this.form;
this.visible = true;
if (abutmentWay === "H5") {
this.com = "ComH5";
} else if (abutmentWay === "API") {
this.com = "ComAPI";
}
}
}
}
};
</script>
<style lang="scss" src="./index.scss"></style>
This diff is collapsed.
<template>
<div class="page-fence">
<!--搜索-->
<block-header title="搜索" />
<div class="search">
<el-form
label-suffix=":"
:inline="true"
:model="queryForm"
class="form-inline"
>
<el-form-item label="机构编号">
<el-input
v-model="queryForm.tenantNo"
clearable
placeholder="请输入机构编号"
/>
</el-form-item>
<el-form-item label="产品名称">
<el-input
v-model="queryForm.appName"
clearable
placeholder="请输入机构名称"
/>
</el-form-item>
<el-form-item>
<el-button
icon="el-icon-search"
type="primary"
@click="onSubmit"
>
搜 索
</el-button>
</el-form-item>
</el-form>
</div>
<!--操作菜单栏-->
<block-header title="产品列表" />
<div
v-if="true"
class="action-bar"
>
<div class="action-bar-left">
<router-link to="/prod/new">
<el-button
icon="el-icon-plus"
type="primary"
size="mini"
>
新增产品
</el-button>
</router-link>
</div>
<div class="action-bar-right" />
</div>
<!--表格-->
<el-table
ref="tableSort"
v-loading="listLoading"
border
size="small"
:data="list"
style="width: 100%"
>
<el-table-column
v-for="(item, index) in finallyColumns"
:key="index"
align="center"
:label="item.label"
:sortable="item.sortable"
:width="item.width"
:fixed="!!item.fixed"
:show-overflow-tooltip="!!item.overflow"
>
<template #default="{ row }">
<div v-if="item.label==='LOGO'">
<el-image
style="width: 50px; height: 35px"
:src="row[item.prop]"
fit="fit"
/>
</div>
<div v-else-if="item.label==='产品状态'">
<el-tag
v-if="row[item.prop] === '1'"
type="success"
size="mini"
>
启用
</el-tag>
<el-tag
v-else
type="info"
size="mini"
>
禁用
</el-tag>
</div>
<span v-else>{{ row[item.prop] }}</span>
</template>
</el-table-column>
<el-table-column
width="170"
fixed="right"
align="center"
label="操作"
>
<template #default="{ row }">
<el-button
v-if="row.status==='1'"
size="mini"
type="danger"
@click="handleClick(row)"
>
禁用
</el-button>
<el-button
v-else
size="mini"
type="success"
@click="handleClick(row)"
>
启用
</el-button>
<el-button
size="mini"
type="primary"
@click="handleView(row)"
>
详情
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
:current-page="queryForm.current"
:layout="layout"
:page-size="queryForm.size"
:total="total"
background
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
/>
</div>
</template>
<script>
import _ from "lodash";
import { doDelete, getList } from "@/api/table";
import API from "@/server/api";
export default {
name: "Fence",
data() {
return {
checkList: ["产品等级", "产品编号", "产品名称", "LOGO", "机构编号", "产品状态", "对接方式", "创建时间"],
columns: [
{
order: 1,
label: "产品等级",
prop: "gradeSort"
},
{
order: 2,
label: "产品编号",
prop: "appNo"
},
{
order: 3,
label: "产品名称",
prop: "appName"
},
{
order: 4,
label: "LOGO",
prop: "appLogo"
},
{
order: 5,
label: "机构编号",
prop: "tenantNo",
overflow: true
},
{
order: 6,
label: "产品状态",
prop: "status"
},
{
order: 7,
label: "对接方式",
prop: "abutmentWay"
},
{
order: 8,
width: 170,
label: "创建时间",
prop: "gmtCreated"
}
],
list: [],
listLoading: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
queryForm: {
current: 1,
size: 10,
status: "",
appName: "",
tenantNo: ""
}
};
},
computed: {
finallyColumns() {
let finallyArray = [];
this.checkList.forEach((checkItem) => {
finallyArray.push(
this.columns.filter((item) => item.label === checkItem)[0]
);
});
return _.sortBy(finallyArray, (item) => item.order);
//return finallyArray;
}
},
created() {
//防止三级以上路由时多次走created
if (this.$route.name === this.$options.name) this.fetchData();
},
mounted() {
this.fetchData();
},
methods: {
onSubmit() {
this.fetchData();
},
handleView(row) {
const { appNo } = row;
this.$router.push({
path: "/prod/new",
query: { appNo }
});
},
handleSizeChange(val) {
this.queryForm.size = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.current = val;
this.fetchData();
},
handleQuery() {
this.queryForm.current = 1;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const result = await API.prod_list(this.queryForm);
const { records, total } = result.result;
this.list = records;
this.total = total;
this.listLoading = false;
},
async handleClick(row) {
console.log(row, "我知道");
let { appNo, status } = row;
status = status === "1" ? "2" : "1";
this.$confirm(`此操作将变更该产品状态, 是否继续?`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const result = await API.prod_switch_upDown({
appNo,
status
});
if (result.success) {
this.$message.success("操作成功");
await this.fetchData();
}
});
}
}
};
</script>
<style lang="scss" scoped>
.page-fence {
::v-deep {
i {
cursor: pointer;
}
}
box-sizing: border-box;
padding: 20px;
}
</style>
<style lang="scss">
.custom-table-checkbox {
.el-checkbox {
display: block !important;
margin: 0 0 $base-padding/4 0;
}
}
.action-bar {
margin-bottom: 15px;
}
</style>
<template>
<el-dialog
:title="title"
:visible.sync="dialogFormVisible"
width="500px"
@close="close"
>
<el-form
ref="form"
:model="form"
:rules="rules"
label-width="80px"
>
<el-form-item
label="标题"
prop="title"
>
<el-input v-model.trim="form.title" />
</el-form-item>
<el-form-item
label="作者"
prop="author"
>
<el-input v-model.trim="form.author" />
</el-form-item>
</el-form>
<div
slot="footer"
class="dialog-footer"
>
<el-button @click="close">
取 消
</el-button>
<el-button
type="primary"
@click="save"
>
确 定
</el-button>
</div>
</el-dialog>
</template>
<script>
import { doEdit } from '@/api/table'
export default {
name: 'TableEdit',
data() {
return {
form: {
title: '',
author: '',
},
rules: {
title: [{ required: true, trigger: 'blur', message: '请输入标题' }],
author: [{ required: true, trigger: 'blur', message: '请输入作者' }],
},
title: '',
dialogFormVisible: false,
}
},
created() {},
methods: {
showEdit(row) {
if (!row) {
this.title = '添加'
} else {
this.title = '编辑'
this.form = Object.assign({}, row)
}
this.dialogFormVisible = true
},
close() {
this.$refs['form'].resetFields()
this.form = this.$options.data().form
this.dialogFormVisible = false
this.$emit('fetch-data')
},
save() {
this.$refs['form'].validate(async (valid) => {
if (valid) {
const { msg } = await doEdit(this.form)
this.$baseMessage(msg, 'success')
this.$refs['form'].resetFields()
this.dialogFormVisible = false
this.$emit('fetch-data')
this.form = this.$options.data().form
} else {
return false
}
})
},
},
}
</script>
<template> <template>
<div class='page'> <div v-if='detail!==null' class='page'>
<block-header title='基础信息' /> <!--用户基础信息-->
<el-descriptions style='margin-bottom: 20px;' border size='small' :column='3'> <template v-if='detail.clientDetail!==null'>
<el-descriptions-item label-class-name='labelCls' label='申请时间'>1</el-descriptions-item> <user-base-info :base-info='detail.clientDetail' />
<el-descriptions-item label-class-name='labelCls' label='授信类型'>1</el-descriptions-item> </template>
<el-descriptions-item label-class-name='labelCls' label='授信状态'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='客户姓名'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='手机号码'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='身份证号'>1</el-descriptions-item>
<!--用户项目信息-->
<template v-if='detail.projectInfoResponse!==null'>
<user-project-info :project-info='detail.projectInfoResponse' />
</template>
<el-descriptions-item label-class-name='labelCls' label='学历'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='婚姻状况'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='年龄(周岁)'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='工作行业'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='工作城市'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='公司全程'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='居中城市'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='居中地址'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='QQ/微信'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='户籍地址'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='BD经理'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='商户区域'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='工作地址'>1</el-descriptions-item> <!--其它信息-->
<el-descriptions-item label-class-name='labelCls' label='是否需要补交资料'>1</el-descriptions-item> <user-other-info :info='detail' />
<el-descriptions-item label-class-name='labelCls' label='合同展示地址'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='收入'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='客户GPS'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='首次授信'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='BD用户名'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='办单模式'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='收款主体'>1</el-descriptions-item>
</el-descriptions>
<block-header title='项目信息' />
<el-descriptions style='margin-bottom: 20px;' border size='small' :column='3'>
<el-descriptions-item label-class-name='labelCls' label='医院名称'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='项目金额'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='申请金额'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='借款期限'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='申请项目'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='商家等级'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='商户GPS'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='资质类型'>1</el-descriptions-item>
</el-descriptions>
<block-header title='预审报告' />
<el-descriptions style='margin-bottom: 20px;' border size='small' :column='3'>
<el-descriptions-item label-class-name='labelCls' label='规则名称'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='规则名称'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='审批建议'>1</el-descriptions-item>
</el-descriptions>
<!--操作日志--> <!--操作日志-->
<operation-log /> <template v-if='detail.operationLogResponse!==null'>
<operation-log :data='detail.operationLogResponse' />
</template>
<!--申述操作--> <!--申述操作-->
<template v-if='false'>
<pre-plead /> <pre-plead />
</template>
</div> </div>
</template> </template>
<script> <script>
import OperationLog from './components/pre-operation-log'
import PrePlead from './components/pre-plead'
import API from '@/server/api' import API from '@/server/api'
export default { export default {
name: 'PreDetail', name: 'PreDetail',
components: {
'operation-log': OperationLog,
'pre-plead': PrePlead
},
data() { data() {
return { return {
tenantNo: '' creditNo: '',
detail: null
} }
}, },
created() { async created() {
const { query } = this.$route const { query } = this.$route
if (query && query.tenantNo) { if (query && query.creditNo) {
this.tenantNo = query.tenantNo this.creditNo = query.creditNo
await this.init()
} }
}, },
methods: {} methods: {
async init() {
const creditNo = this.creditNo
const result = await API.creditDetail({
creditNo
})
this.detail = result.result
}
}
} }
</script> </script>
......
This diff is collapsed.
<template> <template>
<div class='page'> <div v-if='detail!==null' class='page'>
<block-header title='基础信息' /> <block-header title='基础信息' />
<el-descriptions style='margin-bottom: 20px;' border size='small' :column='3'> <el-descriptions v-if='detail.preBasisInfoResponse!==null' style='margin-bottom: 20px;' border size='small' :column='3'>
<el-descriptions-item label-class-name='labelCls' label='客户姓名'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='客户姓名'>{{detail.preBasisInfoResponse.realName}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='手机号码'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='手机号码'>{{detail.preBasisInfoResponse.mobile}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='身份证号'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='身份证号'>{{detail.preBasisInfoResponse.idCard}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='户籍地址'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='户籍地址'>{{detail.preBasisInfoResponse.address}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='申请时间'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='申请时间'>{{detail.preBasisInfoResponse.applyDate}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='授信类型'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='授信类型'>{{detail.preBasisInfoResponse.creditType}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='授信状态'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='授信状态'>{{detail.preBasisInfoResponse.preState}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='商户区域'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='商户区域'>{{detail.preBasisInfoResponse.regionName}}</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='首次授信'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='首次授信'>{{detail.preBasisInfoResponse.realName}}</el-descriptions-item>
</el-descriptions> </el-descriptions>
<div v-if='detail.reportResponse!==null'>
<block-header title='预审报告' /> <block-header title='预审报告' />
<el-descriptions style='margin-bottom: 20px;' border size='small' :column='3'> <el-descriptions style='margin-bottom: 20px;' border size='small' :column='3'>
<el-descriptions-item label-class-name='labelCls' label='规则名称'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='规则名称'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='规则名称'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='规则名称'>1</el-descriptions-item>
<el-descriptions-item label-class-name='labelCls' label='审批建议'>1</el-descriptions-item> <el-descriptions-item label-class-name='labelCls' label='审批建议'>1</el-descriptions-item>
</el-descriptions> </el-descriptions>
</div>
<!--操作日志--> <!--操作日志-->
<operation-log /> <div v-if='detail.operationLogResponse && detail.operationLogResponse.length'>
<operation-log :data='detail.operationLogResponse' />
</div>
<!--申述操作--> <!--申述操作-->
<pre-plead /> <pre-plead />
...@@ -32,28 +37,32 @@ ...@@ -32,28 +37,32 @@
</template> </template>
<script> <script>
import OperationLog from './components/pre-operation-log'
import PrePlead from './components/pre-plead'
import API from '@/server/api' import API from '@/server/api'
export default { export default {
name: 'PreDetail', name: 'PreDetail',
components: {
'operation-log': OperationLog,
'pre-plead': PrePlead
},
data() { data() {
return { return {
tenantNo: '' preCreditNo: '',
detail: null
} }
}, },
created() { async created() {
const { query } = this.$route const { query } = this.$route
if (query && query.tenantNo) { if (query && query.preCreditNo) {
this.tenantNo = query.tenantNo this.preCreditNo = query.preCreditNo
await this.init()
} }
}, },
methods: {} methods: {
async init() {
const preCreditNo = this.preCreditNo
const result = await API.preCreditDetail({
preCreditNo
})
this.detail = result.result
}
}
} }
</script> </script>
......
This diff is collapsed.
This diff is collapsed.
...@@ -61,7 +61,9 @@ module.exports = { ...@@ -61,7 +61,9 @@ module.exports = {
// 注释掉的地方是前端配置代理访问后端的示例 // 注释掉的地方是前端配置代理访问后端的示例
proxy: { proxy: {
"/api": { "/api": {
target: "http://192.168.0.199:8221", //target: "http://192.168.0.199:8221",
//target: "http://192.168.0.26:8785",
target: "http://47.99.245.36:8785",
ws: true, ws: true,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment