Commit e53f157d authored by 智勇's avatar 智勇

用户管理

parent d8b4579f
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
"element-ui": "2.4.6", "element-ui": "2.4.6",
"js-cookie": "2.2.0", "js-cookie": "2.2.0",
"mockjs": "1.0.1-beta3", "mockjs": "1.0.1-beta3",
"moment": "^2.24.0",
"normalize.css": "7.0.0", "normalize.css": "7.0.0",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"vue": "2.5.17", "vue": "2.5.17",
......
...@@ -11,6 +11,14 @@ export function getChannels(data) { ...@@ -11,6 +11,14 @@ export function getChannels(data) {
}) })
} }
export function getChannelInfo(params) {
return request({
url: '/channel/all',
method: 'get',
params
})
}
export function saveChannel(data) { export function saveChannel(data) {
return request({ return request({
url: '/channel/cfg/info', url: '/channel/cfg/info',
......
...@@ -71,3 +71,11 @@ export function logHistory(query) { ...@@ -71,3 +71,11 @@ export function logHistory(query) {
params: query params: query
}) })
} }
export function repaymentPlan(params) {
return request({
url: '/order/repaymentPlan',
method: 'get',
params
})
}
import request from '@/utils/request'
export function getPermission(params) {
return request({
url: '/permission/all',
method: 'get',
params
})
}
import request from '@/utils/request'
export function fetchUser(params) {
return request({
url: '/user/list/get',
method: 'get',
params
})
}
export function fetchUserRank(params) {
return request({
url: '/user/rank',
method: 'get',
params
})
}
export function save(data) {
return request({
url: '/user/add',
method: 'post',
data
})
}
export function modifyUser(data) {
return request({
url: '/user/modify',
method: 'put',
data
})
}
export function getRoles(params) {
return request({
url: '/role/all',
method: 'get',
params
})
}
export function getRoleList(params) {
return request({
url: '/role/list',
method: 'get',
params
})
}
export function saveRole(data) {
return request({
url: '/role/save',
method: 'post',
data
})
}
export function modifyRole(data) {
return request({
url: '/role/modify',
method: 'put',
data
})
}
...@@ -53,19 +53,6 @@ export const constantRouterMap = [ ...@@ -53,19 +53,6 @@ export const constantRouterMap = [
] ]
}, },
{
path: '/user',
component: Layout,
children: [
{
path: '',
name: 'User',
component: () => import('@/views/user/index'),
meta: { title: '常用操作', icon: 'user' }
}
]
},
{ {
path: '/testorder', path: '/testorder',
component: Layout, component: Layout,
...@@ -89,6 +76,35 @@ export const constantRouterMap = [ ...@@ -89,6 +76,35 @@ export const constantRouterMap = [
] ]
}, },
{
path: '/user',
component: Layout,
meta: {
title: '用户操作',
icon: 'user'
},
children: [
{
path: '',
name: 'User',
component: () => import('@/views/user/index'),
meta: { title: '常用操作' }
},
{
path: 'userManager',
name: 'userManager',
component: () => import('@/views/user/manager'),
meta: { title: '用户管理' }
},
{
path: 'roleManager',
name: 'roleManager',
component: () => import('@/views/user/roleManager'),
meta: { title: '角色管理' }
}
]
},
{ {
path: '/', path: '/',
name: 'Dashboard', name: 'Dashboard',
......
...@@ -87,7 +87,41 @@ ...@@ -87,7 +87,41 @@
</el-table> </el-table>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="还款计划" name="third">还款计划</el-tab-pane> <el-tab-pane label="还款计划" name="repaymentPlan">
<el-table
ref="repaymentPlan"
:data="repaymentPlan"
fit
highlight-current-row
style="margin-bottom:20px">
<el-table-column label="期数" prop="periodNo" align="center"/>
<el-table-column label="还款状态" prop="repaymentStatus" align="center"/>
<el-table-column label="应还本金" prop="principal" align="center"/>
<el-table-column label="应还利息" prop="interest" align="center"/>
<el-table-column label="逾期利息" prop="overdueInterest" align="center"/>
<el-table-column label="服务费" prop="serviceFee" align="center"/>
<el-table-column label="其他费用" prop="otherFee" align="center"/>
<el-table-column label="当期到期日" align="center">
<template slot-scope="scope">
<span >{{ scope.row.dueTime | formatDate }}</span>
</template>
</el-table-column>
<el-table-column label="实还本金" prop="actPrincipal" align="center"/>
<el-table-column label="实还利息" prop="actInterest" align="center"/>
<el-table-column label="实还服务费" prop="actServiceFee" align="center"/>
<el-table-column label="实还逾期利息" prop="actOverdueInterest" align="center"/>
<el-table-column label="实还其他费用" prop="actOtherFee" align="center"/>
<el-table-column label="应还总额" prop="requiredRepayment" align="center"/>
<el-table-column label="实还总额" prop="repayAmount" align="center"/>
<el-table-column label="发起还款时间" align="center">
<template slot-scope="scope">
<span >{{ scope.row.repayTime | formatDate }}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="操作日志" name="logHistory"> <el-tab-pane label="操作日志" name="logHistory">
<el-table <el-table
:data="logHistory" :data="logHistory"
...@@ -163,9 +197,11 @@ import { ...@@ -163,9 +197,11 @@ import {
callbackRecord, callbackRecord,
logHistory, logHistory,
secondAudit, secondAudit,
cancelLoanAfter cancelLoanAfter,
repaymentPlan
} from '@/api/order' } from '@/api/order'
import Pagination from '@/components/Pagination' import Pagination from '@/components/Pagination'
import moment from 'moment'
import store from '@/store' import store from '@/store'
export default { export default {
...@@ -185,6 +221,10 @@ export default { ...@@ -185,6 +221,10 @@ export default {
false: '' false: ''
} }
return activeMap[status] return activeMap[status]
},
formatDate(date, pattern = 'YYYY-MM-DD HH:mm:ss') {
return moment(date * 1000).format(pattern)
} }
}, },
data() { data() {
...@@ -207,6 +247,7 @@ export default { ...@@ -207,6 +247,7 @@ export default {
callbackRecords: [], callbackRecords: [],
orderHistory: [], orderHistory: [],
logHistory: [], logHistory: [],
repaymentPlan: [],
approveData: {}, approveData: {},
typeOptions: [ typeOptions: [
{ key: '0', display_name: '非存管' }, { key: '0', display_name: '非存管' },
...@@ -386,6 +427,11 @@ export default { ...@@ -386,6 +427,11 @@ export default {
this.callbackRecords = res.data this.callbackRecords = res.data
}) })
} }
if (this.activeName === 'repaymentPlan') {
repaymentPlan({ channelOrderNumber: this.order.channelOrderNumber, loanId: this.order.loanId }).then(res => {
this.repaymentPlan = res.data.repaymentPlans
})
}
if (this.activeName === 'logHistory') { if (this.activeName === 'logHistory') {
logHistory({ channelOrderNumber: this.order.channelOrderNumber }).then(res => { logHistory({ channelOrderNumber: this.order.channelOrderNumber }).then(res => {
this.logHistory = res.data this.logHistory = res.data
......
<template>
<div class="app-container">
<div class="filter-container">
<el-input v-model="listQuery.username" placeholder="登录账号" clearable style="width: 200px;" class="filter-item" @keyup.enter.native="fetchUser"/>
<el-select v-model="listQuery.roleId" placeholder="角色" clearable class="filter-item" >
<el-option v-for="item in roles" :key="item.id" :label="item.name" :value="item.id"/>
</el-select>
<el-button class="filter-item" type="primary" icon="el-icon-search" @click="fetchUser">查询</el-button>
<el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-edit" @click="handleCreate">创建</el-button>
</div>
<el-table
:data="users"
fit
max-height="700"
size="medium"
style="width: 100%;">
<el-table-column label="ID" type="index" align="center" width="55"/>
<el-table-column label="登录账号" prop="username" align="center"/>
<el-table-column sortable label="用户名" prop="nickname" align="center"/>
<el-table-column sortable label="渠道" prop="channelId" align="center"/>
<el-table-column label="角色" prop="rank" align="center"/>
<el-table-column label="角色" align="center">
<template slot-scope="{row}">
<div><span v-for="item in row.roles" :key="item.id" >{{ item.name }} </span></div>
</template>
</el-table-column>
<el-table-column label="用户状态" width="90px" align="center">
<template slot-scope="{row}">
<el-tag :type="row.status | statusFilter">{{ row.status | activeFileter }}</el-tag>
</template>
</el-table-column>
<el-table-column label="创建时间" prop="createTime" align="center"/>
<el-table-column label="更新时间" prop="updateTime" align="center"/>
<el-table-column label="登录时间" prop="lastLoginTime" align="center"/>
<el-table-column label="操作" align="center" width="80" class-name="small-padding fixed-width">
<template slot-scope="{row}">
<el-button type="primary" size="mini" @click="handleUpdate(row)">编辑</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="count>0" :total="count" :page.sync="page" :limit.sync="listQuery.pageSize" @pagination="fetchUser" />
<el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="115px" style="margin-left:10px;">
<el-form-item label="登录账号" prop="username" >
<el-input :disabled="dialogStatus!=='create'" v-model="temp.username"/>
</el-form-item>
<el-form-item label="用户名" prop="nickname">
<el-input v-model="temp.nickname"/>
</el-form-item>
<el-form-item v-show="dialogStatus==='create'" label="密码" prop="password" >
<el-input v-model="temp.password"/>
</el-form-item>
<el-form-item label="渠道" prop="channelId">
<el-select v-model="temp.channelId" class="filter-item" placeholder="Please select">
<el-option v-for="item in channels" :key="item.id" :label="item.name" :value="item.id"/>
</el-select>
</el-form-item>
<el-form-item label="角色" prop="roleId">
<el-select v-model="temp.roldId" class="filter-item" placeholder="Please select">
<el-option v-for="item in roles" :key="item.id" :label="item.name" :value="item.id"/>
</el-select>
</el-form-item>
<el-form-item label="用户等级" prop="rank">
<el-select v-model="temp.rank" class="filter-item" placeholder="Please select">
<el-option v-for="item in userRank" :key="item.id" :label="item.name" :value="item.id"/>
</el-select>
</el-form-item>
<el-form-item label="用户状态" >
<el-switch v-model="temp.status" active-value="ENABLED" inactive-value="DISABLED"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取消</el-button>
<el-button type="primary" @click="dialogStatus==='create' ? createData() : modifyData()">确定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { fetchUser, fetchUserRank, save, modifyUser, getRoles } from '@/api/userManager'
import { getChannelInfo } from '@/api/channel'
import Pagination from '@/components/Pagination'
import permission from '@/directive/permission/index.js' // 权限判断指令
const activeKeyValue = {
ENABLED: '可用',
DISABLED: '不可用'
}
export default {
components: { Pagination },
directives: { permission },
filters: {
statusFilter(status) {
const statusMap = {
ENABLED: 'success',
false: 'danger'
}
return statusMap[status]
},
activeFileter(status) {
return activeKeyValue[status]
}
},
data() {
return {
total: 0,
typeOptions: [],
temp: {},
dialogFormVisible: false,
dialogDeleteVisible: false,
dialogStatus: '',
textMap: {
update: 'Edit',
create: 'Create'
},
users: [],
channels: [{ id: 159881, name: '拍拍贷' }, { id: 159878, name: '睿智' }],
roles: [{ id: 8, name: '量化派测试' }, { id: 9, name: '量化派开发' }],
userRank: [{ id: 1, name: 'OPERATOR' }, { id: 2, name: 'CHANNEL' }],
disabled: undefined,
rules: {
username: [{ required: true, message: '请输入', trigger: 'change' }],
nickname: [{ required: true, message: '请输入', trigger: 'change' }],
password: [{ required: true, message: '请输入', trigger: 'change' }],
rank: [{ required: true, message: '请选择', trigger: 'change' }],
roleId: [{ required: true, message: '请选择', trigger: 'change' }]
},
count: 1,
page: 1,
listQuery: {
pageNumber: 0,
pageSize: 10
}
}
},
created() {
this.fetchUser()
this.disabled = !this.$store.getters.roles.includes('admin')
},
methods: {
fetchUser() {
for (const prop in this.listQuery) {
if (this.listQuery[prop] === '') {
delete this.listQuery[prop]
}
}
this.listQuery.pageNumber = this.page - 1
fetchUser(this.listQuery).then(res => {
this.count = res.totalElements
this.users = res.content
})
},
fetchUserRank() {
fetchUserRank().then(res => {
this.userRank = res.data
})
},
getChannels() {
getChannelInfo().then(res => {
this.channels = res.data.content
})
},
getRoles() {
getRoles().then(res => {
this.roles = res.data
})
},
handleCreate() {
this.temp = {
}
this.dialogStatus = 'create'
this.dialogFormVisible = true
this.$nextTick(() => {
this.$refs['dataForm'].clearValidate()
})
this.fetchUserRank()
this.getChannels()
this.getRoles()
},
createData() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
save(this.temp).then(() => {
this.dialogFormVisible = false
this.$notify({
title: '成功',
message: '保存成功',
type: 'success',
duration: 2000
})
this.fetchUser()
})
}
})
},
handleUpdate(row) {
this.temp = Object.assign({}, row) // copy obj
this.temp.roldId = row.roles.length > 0 ? row.roles[0].id : ''
this.dialogStatus = 'update'
this.dialogFormVisible = true
this.$nextTick(() => {
this.$refs['dataForm'].clearValidate()
})
this.fetchUserRank()
this.getChannels()
},
modifyData() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
delete this.temp.createTime
delete this.temp.updateTime
delete this.temp.password
delete this.temp.roles
delete this.temp.lastLoginTime
modifyUser(this.temp).then(() => {
this.dialogFormVisible = false
this.$notify({
title: '成功',
message: '保存成功',
type: 'success',
duration: 2000
})
this.fetchUser()
})
}
})
}
}
}
</script>
<template>
<div class="app-container">
<div class="filter-container">
<el-select v-model="listQuery.name" placeholder="角色" clearable class="filter-item" >
<el-option v-for="item in roles" :key="item.id" :label="item.name" :value="item.name"/>
</el-select>
<el-button class="filter-item" type="primary" icon="el-icon-search" @click="getRoleList">查询</el-button>
<el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-edit" @click="handleCreate">创建</el-button>
</div>
<el-table
:data="roleList"
fit
max-height="700"
size="medium"
style="width: 100%;">
<el-table-column label="ID" type="index" align="center" width="55"/>
<el-table-column sortable label="角色名" prop="name" align="center"/>
<el-table-column label="父角色" prop="parent.name" align="center"/>
<el-table-column label="描述" prop="desc" align="center"/>
<el-table-column label="创建时间" prop="createTime" align="center"/>
<el-table-column label="更新时间" prop="updateTime" align="center"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="{row}">
<el-button type="primary" size="mini" @click="handleUpdate(row)">编辑</el-button>
<!-- <el-button type="danger" size="mini" @click="handleUpdate(row)">删除</el-button> -->
</template>
</el-table-column>
</el-table>
<pagination v-show="count>0" :total="count" :page.sync="page" :limit.sync="listQuery.pageSize" @pagination="getRoleList" />
<el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="115px" style="margin-left:10px;">
<el-form-item label="角色名" prop="name" >
<el-input :disabled="dialogStatus!=='create'" v-model="temp.name"/>
</el-form-item>
<el-form-item label="父角色" prop="parentId">
<el-select v-model="temp.parentId" class="filter-item" placeholder="Please select">
<el-option v-for="item in roles" :key="item.id" :label="item.name" :value="item.id"/>
</el-select>
</el-form-item>
<el-form-item label="描述" prop="desc" >
<el-input :autosize="{ minRows: 2, maxRows: 10}" v-model="temp.desc" type="textarea"/>
</el-form-item>
<el-form-item label="权限" prop="permissions">
<el-checkbox
v-for="item in permissions"
v-model="temp.permissions"
:key="item.id"
:label="item.id"
>
{{ item.name }}
</el-checkbox>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取消</el-button>
<el-button type="primary" @click="dialogStatus==='create' ? createData() : modifyData()">确定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { getRoles, getRoleList, saveRole, modifyRole } from '@/api/userManager'
import { getPermission } from '@/api/permission'
import Pagination from '@/components/Pagination'
import permission from '@/directive/permission/index.js' // 权限判断指令
const activeKeyValue = {
ENABLED: '可用',
DISABLED: '不可用'
}
export default {
components: { Pagination },
directives: { permission },
filters: {
statusFilter(status) {
const statusMap = {
ENABLED: 'success',
false: 'danger'
}
return statusMap[status]
},
activeFileter(status) {
return activeKeyValue[status]
}
},
data() {
return {
total: 0,
typeOptions: [],
temp: {},
dialogFormVisible: false,
dialogDeleteVisible: false,
dialogStatus: '',
textMap: {
update: 'Edit',
create: 'Create'
},
roles: [{ id: 8, name: '量化派测试' }, { id: 9, name: '量化派开发' }],
roleList: [{ 'id': 45, 'createTime': '2020-03-04 14:27:42', 'updateTime': '2020-03-04 14:32:21', 'name': 'xxx', parent: { 'name': 'name22', id: 9 }, 'desc': '王向伟',
permissions: [{ id: 1, name: 'per1' }] }],
userRank: [{ id: 1, name: 'OPERATOR' }, { id: 2, name: 'CHANNEL' }],
permissions: [{ id: 1, name: 'per1' }, { id: 2, name: 'per2' }],
disabled: undefined,
rules: {
type: [{ required: true, message: '请选择', trigger: 'change' }]
},
count: 1,
page: 1,
listQuery: {
pageNumber: 0,
pageSize: 10
}
}
},
created() {
this.getRoleList()
this.getRoles()
this.getPermission()
this.disabled = !this.$store.getters.roles.includes('admin')
},
methods: {
getRoleList() {
for (const prop in this.listQuery) {
if (this.listQuery[prop] === '') {
delete this.listQuery[prop]
}
}
this.listQuery.pageNumber = this.page - 1
getRoleList(this.listQuery).then(res => {
this.count = res.totalElements
this.roleList = res.content
})
},
getRoles() {
getRoles().then(res => {
this.roles = res.data
})
},
getPermission() {
getPermission().then(res => {
this.permissions = res.data
})
},
handleCreate() {
this.temp = {
permissions: []
}
this.dialogStatus = 'create'
this.dialogFormVisible = true
this.$nextTick(() => {
this.$refs['dataForm'].clearValidate()
})
},
createData() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
saveRole(this.temp).then(() => {
this.dialogFormVisible = false
this.$notify({
title: '成功',
message: '保存成功',
type: 'success',
duration: 2000
})
this.getRoleList()
})
}
})
},
handleUpdate(row) {
this.temp = Object.assign({}, row) // copy obj
this.temp.parentId = row.parent.id
this.temp.permissions = row.permissions.map(i => i.id)
this.dialogStatus = 'update'
this.dialogFormVisible = true
this.$nextTick(() => {
this.$refs['dataForm'].clearValidate()
})
},
modifyData() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
delete this.temp.createTime
delete this.temp.updateTime
delete this.temp.parent
modifyRole(this.temp).then(() => {
this.dialogFormVisible = false
this.$notify({
title: '成功',
message: '保存成功',
type: 'success',
duration: 2000
})
this.getRoleList()
})
}
})
}
}
}
</script>
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