Commit 93790c31 authored by caimeng's avatar caimeng

6.6 日 提交

parent 7c1f1ff7
......@@ -52,6 +52,7 @@
"jsplumb": "^2.14.6",
"lodash": "^4.17.20",
"mockjs": "^1.1.0",
"moment": "^2.29.3",
"nprogress": "^0.2.0",
"qs": "^6.9.4",
"remixicon": "^2.5.0",
......
......@@ -37,7 +37,7 @@ export function getUserInfo(accessToken) {
export function logout() {
return request({
url: '/logout',
url: '/login/logout',
method: 'post',
})
}
......
.page{
position: relative;
box-sizing: border-box;
padding: 20px;
}
.labelCls{
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>
<div>
<block-header title='操作日志' />
......@@ -133,12 +134,12 @@
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;
//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;
}
},
}
......
<!-- 预授信申述 -->
<template>
<div>
<!--图钉-->
<el-button class='btn-fixed'>审核</el-button>
<!--搜索-->
<block-header title="申述" />
<el-form label-suffix=":" label-width='120px' :model="form" class="form-inline">
......@@ -19,7 +23,6 @@
<el-button icon="el-icon-search" type="primary" @click="onSubmit">提 交</el-button>
</el-form-item>
</el-form>
</div>
</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 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 {
name: "Login",
name: "Minix",
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 {
// 登录
login(data) {
return request({
url: "/sysUser/login",
url: "/login",
method: "post",
data
});
......@@ -13,7 +13,7 @@ export default {
// 登出
logout(data) {
return request({
url: "/sysUser/logout",
url: "/login/logout",
method: "post",
data
});
......@@ -21,7 +21,7 @@ export default {
// 用户信息
userInfo(params) {
return request({
url: "/sysUser/getInfo",
url: "/user/get",
method: "get",
params
});
......@@ -29,7 +29,7 @@ export default {
// 发送验证码
send_msg_code(data) {
return request({
url: "/sysUser/transmitCode",
url: "/login/sendLoginSms",
method: "post",
data
});
......@@ -193,5 +193,71 @@ export default {
method: "get",
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 @@
*/
import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'
Vue.use(Vuex)
const files = require.context('./modules', false, /\.js$/)
......@@ -19,5 +20,6 @@ Object.keys(modules).forEach((key) => {
const store = new Vuex.Store({
modules,
getters
})
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逻辑,不建议修改
*/
import Vue from "vue";
import { getUserInfo, logout } from "@/api/user";
import { getAccessToken, removeAccessToken, setAccessToken } from "@/utils/accessToken";
import { resetRouter } from "@/router";
import { title, tokenName } from "@/config";
import Vue from 'vue'
import { getUserInfo, logout } from '@/api/user'
import { getAccessToken, removeAccessToken, setAccessToken } from '@/utils/accessToken'
import { resetRouter } from '@/router'
import { title, tokenName } from '@/config'
import API from "@/server/api";
import API from '@/server/api'
import Cookies from 'js-cookie'
const state = {
accessToken: getAccessToken(),
username: "",
avatar: "",
username: '',
avatar: '',
user: null
};
}
const getters = {
accessToken: (state) => state.accessToken,
username: (state) => state.username,
avatar: (state) => state.avatar,
user: (state) => state.user
};
}
const mutations = {
setAccessToken(state, accessToken) {
state.accessToken = accessToken;
setAccessToken(accessToken);
state.accessToken = accessToken
setAccessToken(accessToken)
},
setUsername(state, username) {
state.username = username;
state.username = username
},
setAvatar(state, avatar) {
state.avatar = avatar;
state.avatar = avatar
},
setUser(state, user) {
state.user = user;
state.user = user
}
};
}
const actions = {
/**
* @description 登录拦截放行时,设置虚拟角色
* @param {*} { commit, dispatch }
*/
setVirtualRoles({ commit, dispatch }) {
dispatch("acl/setFull", true, { root: true });
commit("setAvatar", "https://i.gtimg.cn/club/item/face/img/2/15922_100.gif");
commit("setUsername", "admin(未开启登录拦截)");
dispatch('acl/setFull', true, { root: true })
commit('setAvatar', 'https://i.gtimg.cn/club/item/face/img/2/15922_100.gif')
commit('setUsername', 'admin(未开启登录拦截)')
},
/**
* @description 登录
*/
async login({ commit }, userInfo) {
const result = await API.login(userInfo);
const result = await API.login(userInfo)
if (result.success) {
const user = result.result;
console.log('我知道');
commit("setUser", user);
commit("setUsername", user.nickName);
const user = result.result
console.log('我知道')
commit('setUser', user)
commit('setUsername', user.nickName)
}
// 设置假的token
const accessToken = "mmcai";
const accessToken = Cookies.get('x-auth-token')
if (accessToken) {
commit("setAccessToken", accessToken);
commit('setAccessToken', accessToken)
}
},
......@@ -69,9 +71,12 @@ const actions = {
* @description 获取验证码
*/
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) {
return result;
return result
}
},
/**
......@@ -80,33 +85,20 @@ const actions = {
* @returns
*/
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{
}
}catch (e){
throw new Error('bao cuo')
}
//let { username, avatar, roles, ability } = state.user;
//if (username && avatar) {
// commit("setUsername", userName);
//commit("setAvatar", '');
const result = await API.userInfo({
loginName: 'caimm'
})
if (result.success) {
const { loginName } = result.result
commit('setUsername', loginName)
//commit('setAvatar')
commit('setAvatar', 'https://i.gtimg.cn/club/item/face/img/2/15922_100.gif')
// 当不传递roles或ability时,默认使用管理员权限,可查看所有路由和按钮
//dispatch("acl/setFull", true, { root: true });
// 当返回数据包含roles(角色)或ability(权限),保存至vuex
// 如不使用roles权限控制,请不要传递roles,可删除以下代码
//if (roles instanceof Array) dispatch("acl/setRole", roles, { root: true });
// 如不使用ability权限控制,请不要传递ability,可删除以下代码
//if (ability instanceof Array) dispatch("acl/setAbility", ability, { root: true });
//}
dispatch('acl/setFull', true, { root: true })
} else {
await dispatch('resetAll')
}
},
/**
......@@ -114,28 +106,28 @@ const actions = {
* @param {*} { dispatch }
*/
async logout({ dispatch }) {
await API.logout();
await dispatch("resetAll");
await API.logout()
await dispatch('resetAll')
},
/**
* @description 重置accessToken、roles、ability、router等
* @param {*} { commit, dispatch }
*/
async resetAll({ dispatch }) {
await dispatch("setAccessToken", "");
await dispatch("acl/setFull", false, { root: true });
await dispatch("acl/setRole", [], { root: true });
await dispatch("acl/setAbility", [], { root: true });
await resetRouter();
removeAccessToken();
await dispatch('setAccessToken', '')
await dispatch('acl/setFull', false, { root: true })
await dispatch('acl/setRole', [], { root: true })
await dispatch('acl/setAbility', [], { root: true })
await resetRouter()
removeAccessToken()
},
// 设置token
setAccessToken({ commit }, accessToken) {
commit("setAccessToken", accessToken);
commit('setAccessToken', accessToken)
},
// 设置用户
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 axios from "axios";
import Vue from 'vue'
import axios from 'axios'
import {
baseURL,
contentType,
......@@ -7,39 +7,40 @@ import {
requestTimeout,
successCode,
tokenName
} from "@/config";
import store from "@/store";
import qs from "qs";
import router from "@/router";
import { isArray } from "@/utils/validate";
} from '@/config'
import store from '@/store'
import qs from 'qs'
import router from '@/router'
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,'是啥');
let loadingInstance;
let loadingInstance
// 操作正常Code数组
const codeVerificationArray = isArray(successCode)
? [...successCode]
: [...[successCode]];
: [...[successCode]]
const CODE_MESSAGE = {
200: "服务器成功返回请求数据",
201: "新建或修改数据成功",
202: "一个请求已经进入后台排队(异步任务)",
204: "删除数据成功",
400: "发出信息有误",
401: "用户没有权限(令牌、用户名、密码错误)",
403: "用户得到授权,但是访问是被禁止的",
404: "访问资源不存在",
406: "请求格式不可得",
410: "请求资源被永久删除,且不会被看到",
500: "服务器发生错误",
502: "网关错误",
503: "服务不可用,服务器暂时过载或维护",
504: "网关超时"
};
200: '服务器成功返回请求数据',
201: '新建或修改数据成功',
202: '一个请求已经进入后台排队(异步任务)',
204: '删除数据成功',
400: '发出信息有误',
401: '用户没有权限(令牌、用户名、密码错误)',
403: '用户得到授权,但是访问是被禁止的',
404: '访问资源不存在',
406: '请求格式不可得',
410: '请求资源被永久删除,且不会被看到',
500: '服务器发生错误',
502: '网关错误',
503: '服务不可用,服务器暂时过载或维护',
504: '网关超时'
}
//code: "500"
//message: "验证码发送过于频繁请稍后重试!"
......@@ -47,15 +48,15 @@ const CODE_MESSAGE = {
//success: false
const handleData = ({ config, data, status, statusText }) => {
if (loadingInstance) loadingInstance.close();
if (loadingInstance) loadingInstance.close()
// 若data.code存在,覆盖默认code
let code = data && data.code ? data.code : status;
let code = data && data.code ? data.code : status
// 若code属于操作正常code,则status修改为200
if (codeVerificationArray.includes(code)) code = 200;
if (codeVerificationArray.includes(code)) code = 200
// 若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) {
case 200:
......@@ -66,24 +67,26 @@ const handleData = ({ config, data, status, statusText }) => {
// 修改返回内容为 `data` 内容,对于绝大多数场景已经无须再关心业务状态码(code)和消息(msg)
// return data.data
// 或者依然保持完整的格式
return data;
return data
case 401:
Vue.prototype.$baseMessage(msg, "error");
store.dispatch("user/resetAll").catch(() => {
});
break;
Vue.prototype.$baseMessage(msg, 'error')
store.dispatch('user/resetAll').catch(() => {
})
break
case 403:
store.dispatch("user/resetAll").catch(() => {
});
router.push({ path: "/login" }).catch(() => {
});
break;
store.dispatch('user/resetAll').catch(() => {
})
router.push({ path: '/login' }).catch(() => {
})
break
default:
Vue.prototype.$baseMessage(msg, "error");
break;
Vue.prototype.$baseMessage(msg, 'error')
break
}
return data;
};
console.log(data, '沃日')
return data
}
/**
* @description axios初始化
......@@ -94,28 +97,37 @@ const instance = axios.create({
timeout: requestTimeout,
withCredentials: true,
headers: {
"Content-Type": contentType
'Content-Type': contentType
}
});
})
/**
* @description axios请求拦截器
*/
instance.interceptors.request.use(
(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") {
config.data = qs.stringify(config.data);
const token = Cookies.get('x-auth-token')
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))) {
loadingInstance = Vue.prototype.$baseLoading();
loadingInstance = Vue.prototype.$baseLoading()
}
// 处理get 请求的数组 springmvc 可以处理
if (config.method === "post") {
if (config.method === 'post') {
//请求头转换为表单形式
//config.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
//config.transformRequest = [function (data) {
......@@ -128,33 +140,36 @@ instance.interceptors.request.use(
}
return config;
return config
},
(error) => {
return Promise.reject(error);
return Promise.reject(error)
}
);
)
/**
* @description axios响应拦截器
*/
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) => {
const { response } = error;
const { response } = error
if (response === undefined) {
Vue.prototype.$baseMessage(
"未可知错误,大部分是由于后端不支持跨域CORS或无效配置引起",
"error"
);
return {};
'未可知错误,大部分是由于后端不支持跨域CORS或无效配置引起',
'error'
)
return {}
} else {
console.log(response,'返回结果');
console.log(response, '返回结果')
//throw new Error(response)
return handleData(response);
return handleData(response)
}
}
);
)
export default instance;
export default instance
......@@ -30,7 +30,13 @@
username: 'user/username',
}),
},
created() {
this.initSearchData()
},
methods: {
async initSearchData() {
await this.$store.dispatch('common/GetSearchData');
},
translateTitle,
handleCommand(command) {
switch (command) {
......@@ -46,7 +52,7 @@
this.$router.push('/personalCenter/personalCenter')
},
async logout() {
await this.$store.dispatch('user/logout')
await this.$store.dispatch('user/logout');
if (recordRoute) {
const fullPath = this.$route.fullPath
await this.$router.push(`/login?redirect=${fullPath}`)
......
/**
* @description 路由守卫,目前两种模式:all模式与intelligence模式
*/
import router from "@/router";
import store from "@/store";
import VabProgress from "nprogress";
import "nprogress/nprogress.css";
import getPageTitle from "@/utils/pageTitle";
import router from '@/router'
import store from '@/store'
import VabProgress from 'nprogress'
import 'nprogress/nprogress.css'
import getPageTitle from '@/utils/pageTitle'
import {
authentication,
loginInterception,
recordRoute,
routesWhiteList
} from "@/config";
} from '@/config'
VabProgress.configure({
easing: "ease",
easing: 'ease',
speed: 500,
trickleSpeed: 200,
showSpinner: false
});
})
//console.log(router.getRoutes(), "路由信息");
router.beforeEach(async (to, from, next) => {
const showProgressBar = store.getters["settings/showProgressBar"];
if (showProgressBar) VabProgress.start();
let hasToken = store.getters["user/accessToken"];
if (!loginInterception) hasToken = true;
const showProgressBar = store.getters['settings/showProgressBar']
if (showProgressBar) VabProgress.start()
let hasToken = store.getters['user/accessToken']
//if (loginInterception) hasToken = false
if (routesWhiteList.indexOf(to.path) !== -1) {
if (to.path === "/login" && hasToken) next({ path: "/" });
else next();
if (to.path === '/login' && hasToken) next({ path: '/' })
else next()
} else {
if (hasToken) {
const hasAccess = store.getters["acl/admin"];
const hasAccess = store.getters['acl/admin']
if (hasAccess) {
next();
next()
} else {
try {
if (loginInterception) await store.dispatch("user/getUserInfo");
if (loginInterception) await store.dispatch('user/getUserInfo')
//settings.js loginInterception为false(关闭登录拦截时)时,创建虚拟角色
else await store.dispatch("user/setVirtualRoles");
else await store.dispatch('user/setVirtualRoles')
//根据路由模式添加路由
router.addRoutes(
await store.dispatch("routes/setRoutes", authentication)
);
next({ ...to, replace: true });
}
catch(err) {
console.log(err,'啥错误');
await store.dispatch("user/resetAll");
if (recordRoute && to.path !== "/") {
await store.dispatch('routes/setRoutes', authentication)
)
next({ ...to, replace: true })
} catch (err) {
console.log(err, '啥错误')
await store.dispatch('user/resetAll')
if (recordRoute && to.path !== '/') {
next({
path: "/login",
path: '/login',
query: { redirect: to.path },
replace: true
});
})
} else {
next({ path: "/login", replace: true });
next({ path: '/login', replace: true })
}
}
}
}
else {
if (recordRoute && to.path !== "/")
next({ path: "/login", query: { redirect: to.path }, replace: true });
else next({ path: "/login", replace: true });
if (recordRoute && to.path !== '/') {
next({ path: '/login', query: { redirect: to.path }, replace: true })
} else {
next({ path: '/login', replace: true })
}
}
}
});
})
router.afterEach((to) => {
document.title = getPageTitle(to.meta.title);
if (VabProgress.status) VabProgress.done();
});
document.title = getPageTitle(to.meta.title)
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>
<div class="merchant-new">
<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>
<div class='page'>
<script>
import BlockHeader from "@/components/blockHeader";
import API from "@/server/api";
const $API = process.env.VUE_APP_API_PATH;
<user-base-info />
export default {
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"
}
],
<user-project-info />
raiseTimeMin: [
{ 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"
}
],
<user-other-info />
applyAmtMin: [
{ 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"
}
],
<operation-log />
incomeTimeBefore: [
{ 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"
}
],
<plead />
withdrawSpan: [{ required: true, message: "请输入提现跨度", trigger: "blur" }],
approvalTime: [{ required: true, message: "请输入申请时间", trigger: "blur" }],
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;
}
}
},
</div>
</template>
handleSuccessLogo(res) {
this.form.appLogo = res.result;
},
beforeAvatarUpload(file) {
const isJPG = file.type === "image/jpeg";
const isPNG = file.type === "image/png";
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isJPG && !isPNG) {
this.$message.error("上传图片只能是 JPG 或者 PNG 格式!");
return false;
}
if (!isLt2M) {
this.$message.error("上传图片大小不能超过 2MB!");
return false;
<script>
import API from '@/server/api'
export default {
name: 'PreDetail',
data() {
return {
tenantNo: ''
}
return true;
},
onSubmit(formName) {
this.$refs[formName].validate(async (valid) => {
if (valid) {
const form = Object.assign({}, this.form);
//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);
}
created() {
const { query } = this.$route
if (query && query.tenantNo) {
this.tenantNo = query.tenantNo
}
});
},
onReset(formName) {
this.$refs[formName].resetFields();
}
methods: {}
}
};
</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>
<div class='page'>
<div v-if='detail!==null' class='page'>
<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>
<!--用户基础信息-->
<template v-if='detail.clientDetail!==null'>
<user-base-info :base-info='detail.clientDetail' />
</template>
<!--用户项目信息-->
<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>
<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>
<!--其它信息-->
<user-other-info :info='detail' />
<!--操作日志-->
<operation-log />
<template v-if='detail.operationLogResponse!==null'>
<operation-log :data='detail.operationLogResponse' />
</template>
<!--申述操作-->
<template v-if='false'>
<pre-plead />
</template>
</div>
</template>
<script>
import OperationLog from './components/pre-operation-log'
import PrePlead from './components/pre-plead'
import API from '@/server/api'
export default {
name: 'PreDetail',
components: {
'operation-log': OperationLog,
'pre-plead': PrePlead
},
data() {
return {
tenantNo: ''
creditNo: '',
detail: null
}
},
created() {
async created() {
const { query } = this.$route
if (query && query.tenantNo) {
this.tenantNo = query.tenantNo
if (query && query.creditNo) {
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>
......
This diff is collapsed.
<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'>
<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='首次授信'>1</el-descriptions-item>
<el-descriptions v-if='detail.preBasisInfoResponse!==null' style='margin-bottom: 20px;' border size='small' :column='3'>
<el-descriptions-item label-class-name='labelCls' label='客户姓名'>{{detail.preBasisInfoResponse.realName}}</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='身份证号'>{{detail.preBasisInfoResponse.idCard}}</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='申请时间'>{{detail.preBasisInfoResponse.applyDate}}</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='授信状态'>{{detail.preBasisInfoResponse.preState}}</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='首次授信'>{{detail.preBasisInfoResponse.realName}}</el-descriptions-item>
</el-descriptions>
<div v-if='detail.reportResponse!==null'>
<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>
</div>
<!--操作日志-->
<operation-log />
<div v-if='detail.operationLogResponse && detail.operationLogResponse.length'>
<operation-log :data='detail.operationLogResponse' />
</div>
<!--申述操作-->
<pre-plead />
......@@ -32,28 +37,32 @@
</template>
<script>
import OperationLog from './components/pre-operation-log'
import PrePlead from './components/pre-plead'
import API from '@/server/api'
export default {
name: 'PreDetail',
components: {
'operation-log': OperationLog,
'pre-plead': PrePlead
},
data() {
return {
tenantNo: ''
preCreditNo: '',
detail: null
}
},
created() {
async created() {
const { query } = this.$route
if (query && query.tenantNo) {
this.tenantNo = query.tenantNo
if (query && query.preCreditNo) {
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>
......
This diff is collapsed.
This diff is collapsed.
......@@ -61,7 +61,9 @@ module.exports = {
// 注释掉的地方是前端配置代理访问后端的示例
proxy: {
"/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,
changeOrigin: true,
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