Commit 3a0e7cec authored by hanfeng's avatar hanfeng

添加用户管理后台

parent ca8e5231
module.exports = {
NODE_ENV: '"development"',
BASE_API: '"http://10.1.37.246:8765"',//'"https://xxfcmgmt.upyuns.com"(正)',//http://10.1.37.192:9527(何), //https://xxtest.upyuns.com(测),10.1.37.246:9527(韩), 10.1.37.244(李斌)10.1.37.248:8765(小威)
BASE_API: '"https://xxtest.upyuns.com"',//'"https://xxfcmgmt.upyuns.com"(正)',//http://10.1.37.192:9527(何), //https://xxtest.upyuns.com(测),10.1.37.246:9527(韩), 10.1.37.244(李斌)10.1.37.248:8765(小威)
APP_ORIGIN: '"https://wallstreetcn.com"'
}
import fetch from 'utils/fetch';
export function getUserMemberByUserId(UserId) {
return fetch({
url: '/api/admin/baseUserMember/findOne/'+UserId,
method: 'get',
});
}
import fetch from 'utils/fetch';
export function page(obj) {
return fetch({
url: '/api/admin/appUsersManage/findAll',
method: 'post',
data: obj
});
}
export function getObj(id) {
return fetch({
url: '/api/admin/appUsersManage/findOneById/'+id,
method: 'get',
});
}
......@@ -359,4 +359,25 @@ export const asyncRouterMap = [{
}
]
}
, {
path: '/userManagement',
component: Layout,
name: '用户管理',
icon: 'setting',
authority: 'userManagement',
children: [
{
path: 'userList',
component: _import('userManagement/userList/index'),
name: '用户列表',
authority: 'userList'
},
{
path: 'memberManagement',
component: _import('userManagement/memberManagement/index'),
name: '会员管理',
authority: 'memberManagement'
}
]
}
];
<template>
<div class="app-container calendar-list-container">
<div class="filter-container">
<el-form :rules="rules" ref="queryForm" :model="listQuery" label-width="100px">
<el-row>
<el-col :span="4">
<el-form-item label="手机号">
<el-input v-model.number="listQuery.mobile" placeholder="请输入手机号"></el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="注册终端">
<el-select class="filter-item" v-model="listQuery.channel" placeholder="请选注册终端">
<el-option :key="undefined" label="无" :value="undefined"></el-option>
<el-option v-for="(val, key, index) in mobileList " :key="val.id" :label="val.name"
:value="val.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="会员类型">
<el-select class="filter-item" v-model="listQuery.memberLevel" placeholder="请选会员类型">
<el-option :key="undefined" label="无" :value="undefined"></el-option>
<el-option v-for="(val, key, index) in memberLevelist " :key="val.id" :label="val.name"
:value="val.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="注册时间" prop="bookDateRange">
<el-date-picker
v-model="listQuery.registrationDate "
type="daterange"
:editable="true"
format="yyyy-MM-dd"
placeholder="请输入已预订日期范围">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="用户来源">
<el-select class="filter-item" v-model="listQuery.source" placeholder="请选用户来源">
<el-option :key="undefined" label="无" :value="undefined"></el-option>
<el-option v-for="(val, key, index) in sourceList " :key="val.id" :label="val.name"
:value="val.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-button class="filter-item" type="primary" v-waves icon="search" @click="handleFilter">搜索</el-button>
<el-button class="filter-item" v-if="userManager_btn_add" style="margin-left: 10px;" @click=""
type="primary" icon="edit">新增会员<!-- handleCreate-->
</el-button>
<el-button class="filter-item" v-if="userManager_btn_add" style="margin-left: 10px;" @click="bulkUpload"
type="primary" icon="edit">批量导入会员
</el-button>
</div>
<el-table :key='tableKey' :data="list" v-loading.body="listLoading" border fit highlight-current-row
style="width: 100%">
<el-table-column align="center" label="用户id" width="150">
<template scope="scope">
<span>{{scope.row.userId}}</span>
</template>
</el-table-column>
<el-table-column width="200" align="center" label="手机号">
<template scope="scope">
<span>{{scope.row.username}}</span>
</template>
</el-table-column>
<el-table-column width="110" align="center" label="注册终端">
<template scope="scope">
<span>{{scope.row.channel}}</span>
</template>
</el-table-column>
<el-table-column width="110" align="center" label="来源">
<template scope="scope">
<span>{{scope.row.source}}</span>
</template>
</el-table-column>
<el-table-column width="100" align="center" label="真实姓名">
<template scope="scope">
<span>{{scope.row.realName}}</span>
</template>
</el-table-column>
<el-table-column width="180" align="center" label="会员类型">
<template scope="scope">
<span>{{scope.row.memberName}}</span>
</template>
</el-table-column>
<el-table-column width="200" align="center" label="加入时间">
<template scope="scope">
<span>{{scope.row.timeOfMembership}}</span>
</template>
</el-table-column>
<el-table-column width="200" align="center" label="免费总天数">
<template scope="scope">
<span>{{scope.row.totalNumber}}</span>
</template>
</el-table-column>
<el-table-column width="200" align="center" label="剩余天数">
<template scope="scope">
<span>{{scope.row.rentFreeDays}}</span>
</template>
</el-table-column>
<!-- <el-table-column width="200" align="center" label="会员">-->
<!-- <template scope="scope">-->
<!-- <span>{{scope.row.updName}}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column align="center" label="操作" width="400">
<template scope="scope">
<el-button v-if="userManager_btn_edit" size="small" type="success" @click="viewDetails(scope.row)">查看详情
</el-button>
<el-button v-if="userManager_btn_del" size="small" type="success" @click="">设置会员信息<!-- setMember(scope.row)-->
</el-button>
<el-button v-if="userManager_btn_del" size="small" type="success" @click="">用户订单 <!-- handleDelete(scope.row)-->
</el-button>
<el-button v-if="userManager_btn_del" size="small" type="danger" @click="handleDelete(scope.row)">设为禁用
</el-button>
</template>
</el-table-column>
</el-table>
<div v-show="!listLoading" class="pagination-container">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page.sync="listQuery.page" :page-sizes="[10,20,30, 50]" :page-size="listQuery.limit"
layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination>
</div>
<!-- 用户详细信息窗口-->
<el-dialog :visible.sync="detailsDialogFormVisible">
<span>用户详情</span>
<el-form :model="userDetails" :rules="rules" ref="form" label-width="100px">
<el-row>
<el-row>
<el-form-item v-if="userManager_btn_del" v label="基础信息">
<span>(状态-正常)</span>
</el-form-item>
<el-form-item v-if="!userManager_btn_del" v label="基础信息">
<span>(状态-已禁用)</span>
</el-form-item>
</el-row>
<el-row>
<el-col :span="6">
<!-- <img src="{{userDetails.userId}}">-->
</el-col>
<el-col :span="18">
<el-row>
<el-col :span="6">
<el-form-item label="用户Id:">
<span>{{userDetails.userId}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="昵称:">
<span>{{userDetails.nickName}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="手机号:">
<span>{{userDetails.username}}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="注册终端:">
<span>{{userDetails.channel}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="注册时间:">
<span>{{userDetails.createTime}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="最近登录时间:">
<span>{{userDetails.lastTime}}</span>
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
</el-row>
<el-row>
<el-row>
<el-form-item v-if="userManager_btn_del" v label="实名认证状态">
<span>(状态-未认证)</span>
</el-form-item>
<el-form-item v-if="!userManager_btn_del" v label="实名认证状态">
<span>(状态-已认证)</span>
</el-form-item>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="真实姓名: ">
<span>{{userDetails.realName}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="身份证号: ">
<span>{{userDetails.idNumber}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="性别: ">
<span>{{userDetails.sex}}</span>
</el-form-item>
</el-col>
</el-row>
</el-row>
<el-row>
<el-row>
<el-form-item v label="会员信息">
</el-form-item>
</el-row>
<el-row>
<el-row>
<el-col :span="6">
<el-form-item label="会员类型:">
<span>{{userDetails.memberName}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="有效期:">
<span>{{userDetails.validTime}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="充值次数:">
<span>{{userDetails.buyCount}}次</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="加入时间:">
<span>{{userDetails.timeOfMembership}}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="注册终端:">
<span>{{userDetails.channel}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="注册时间:">
<span>{{userDetails.createTime}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="最近登录时间:">
<span>{{userDetails.lastTime}}</span>
</el-form-item>
</el-col>
</el-row>
</el-row>
</el-row>
<el-row>
<el-row>
<el-form-item v-if="userManager_btn_del" v label="用户来源">
<span></span>
</el-form-item>
</el-row>
<el-row>
<el-row>
<el-col :span="6">
<el-form-item label="来源:">
<span>{{userDetails.source}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="邀请人账号:">
<span>{{userDetails.inviterAccount}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="所属地区:">
<span>{{userDetails.cityCode}}</span>
</el-form-item>
</el-col>
</el-row>
</el-row>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="cancelNotDeleteForm()">确 定</el-button>
</div>
</el-dialog>
<!-- 设置会员信息窗口-->
<el-dialog :visible.sync="memberArea">
<el-form :model="userMembershipInformation" :rules="rules" ref="form" label-width="100px">
<el-form-item label="会员等级" placeholder="会员等级" prop="password">
<el-input type="password" v-model="userMembershipInformation.password"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="cancel('form')">确 定</el-button>
<!-- <el-button v-if="dialogStatus=='create'" type="primary" @click="create('form')">确 定</el-button>-->
<!-- <el-button v-else type="primary" @click="update('form')">确 定</el-button>-->
</div>
</el-dialog>
<!-- 用户订单窗口-->
<el-dialog :visible.sync="userOrderForm">
<el-form :model="userOrderMessage" :rules="rules" ref="form" label-width="100px">
<!-- <el-form-item label="会员等级" placeholder="会员等级" prop="password">-->
<!-- <el-input type="password" v-model="userMembershipInformation.password"></el-input>-->
<!-- </el-form-item>-->
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="cancel('form')">确 定</el-button>
<!-- <el-button v-if="dialogStatus=='create'" type="primary" @click="create('form')">确 定</el-button>-->
<!-- <el-button v-else type="primary" @click="update('form')">确 定</el-button>-->
</div>
</el-dialog>
<!--批量导入会员窗口-->
<el-dialog :visible.sync="bulkUploadMember">
<el-form ref="upload" label-width="100px">
<el-upload
class="upload-demo"
ref="upload"
:action="BASE_API+'/api/admin/member/user/export'"
:on-preview="handlePreview"
:headers="getHeaderWithToken"
:on-remove="handleRemove"
:file-list="fileList"
:auto-upload="false">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button>
<div slot="tip" class="el-upload__tip">只能上传xlsx格式文件</div>
</el-upload>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="cancelNotDeleteForm('upload')">关闭</el-button>
</div>
</el-dialog>
<!-- <book-info-viewer ref="bookInfoViewer"></book-info-viewer>-->
<!-- <acc-item-selector :selectedAccItem="selectedAccItem" :isReadOnly="true" ref="accItemSelector"></acc-item-selector>-->
</div>
</template>
<script>
import {
page,
addObj,
getObj,
delObj,
putObj
} from 'src/api/admin/userManagement/index';
import {getToken} from 'src/utils/auth';
import {mapGetters} from 'vuex';
import {getUserMemberByUserId} from 'src/api/admin/baseUserMember/index';
import {
getAllCompany,
getAll
} from 'src/api/base_info/branch_company/index';
import {timestamp2Date} from 'src/utils/dateUtils';
import {fetchTree} from 'src/api/admin/group/index';
export default {
name: 'user',
data() {
return {
fileList:[],
userMembershipInformation:{},
userOrderMessage:{},
mobileList: [],
memberLevelist: [],
sourceList: [],
BASE_API: process.env.BASE_API,
userDetails: {
},
rules: {
name: [
{
required: true,
message: '请输入用户',
trigger: 'blur'
},
{
min: 3,
max: 20,
message: '长度在 3 到 20 个字符',
trigger: 'blur'
}
],
username: [
{
required: true,
message: '请输入账户',
trigger: 'blur'
},
{
min: 3,
max: 20,
message: '长度在 3 到 20 个字符',
trigger: 'blur'
}
],
password: [
{
required: true,
message: '请输入密码',
trigger: 'blur'
},
{
min: 5,
max: 20,
message: '长度在 5 到 20 个字符',
trigger: 'blur'
}
],
status: [
{
type: 'integer',
required: true,
message: '请选择',
trigger: 'blur'
}
],
zoneId: [
{
type: 'integer',
required: true,
message: '请选择',
trigger: 'blur'
}
],
},
list: null,
total: null,
listLoading: true,
listQuery: {
page: 1,
limit: 20,
mobileList: undefined,
mobile: undefined,
memberLevel: undefined,
registrationDate: undefined,
source: undefined,
channel: undefined,
},
sexOptions: ['男', '女'],
zoneOptions: ['男', '女'],
dataOptions: [{id: "1", val: "所属分公司"}, {id: "2", val: "所属片区"}, {id: "3", val: "所有数据"}],
statusOptions: [{id: 1, val: '开启'}, {id: 2, val: '禁用'}],
detailsDialogFormVisible: false,
memberArea: false,
userOrderForm:false,
bulkUploadMember:false,
dialogStatus: '',
userManager_btn_edit: false,
userManager_btn_del: false,
userManager_btn_add: false,
allCompanies: {},
allCompaniesArr: [],
myGroups: [],
loading: false,
textMap: {
update: '编辑',
create: '创建'
},
tableKey: 0,
selectedAccItem: undefined
}
},
created() {
this.getList();
getAll()
.then(response => {
this.allCompaniesArr = response.data;
})
getAllCompany(codeAndBranchCompany => {
this.allCompanies = codeAndBranchCompany;
});
this.userManager_btn_edit = this.elements['userManager:btn_edit'];
this.userManager_btn_del = this.elements['userManager:btn_del'];
this.userManager_btn_add = this.elements['userManager:btn_add'];
}
,
computed: {
...
mapGetters([
'elements'
]),
/**
* 获取token
*/
getHeaderWithToken() {
return {Authorization: getToken()};
}
}
,
methods: {
/**
* 上传excel文件方法(批量导入会员)
*/
submitUpload() {
this.$refs.upload.submit();
this.$refs.upload.clearFiles();
},
/**
* 删除
*/
handleRemove(file, fileList) {
console.log(file, fileList);
},
/**
* 预览
*/
handlePreview(file) {
console.log(file);
},
/**
* 弹出导入窗体
*/
bulkUpload(){
this.bulkUploadMember=true
},
/**
*
* @param query
*/
remoteGroupsMethod(query) {
if (query !== '') {
this.loading = true;
this.loading = false;
fetchTree({
name: query
}).then(response => {
this.myGroups = response;
// this.total = response.data.total;
this.loading = false;
});
} else {
this.myGroups = [];
}
}
,
/**
* 获取用户列表
*/
getList() {
this.listLoading = true;
page(this.listQuery)
.then(response => {
for (let listKey of response.data.list) {
if (listKey.timeOfMembership != undefined && listKey.timeOfMembership != '') {
listKey.timeOfMembership = timestamp2Date(listKey.timeOfMembership);
}
if (listKey.recentRecharge != undefined && listKey.recentRecharge != '') {
listKey.recentRecharge = timestamp2Date(listKey.recentRecharge);
}
if (listKey.lastTime != undefined && listKey.lastTime != '') {
listKey.lastTime = timestamp2Date(listKey.lastTime);
}
if (listKey.createTime != undefined && listKey.createTime != '') {
listKey.createTime = timestamp2Date(listKey.createTime);
}
if (listKey.buyCount != undefined && listKey.buyCount != '') {
listKey.buyCount = 0;
}
if (listKey.source == 0) {
listKey.source = "自来"
}
if (listKey.source == 1) {
listKey.source = "用户邀请"
}
}
this.list = response.data.list;
this.total = response.data.total;
this.listLoading = false;
})
}
,
/**
*
*/
handleFilter() {
this.getList();
}
,
handleSizeChange(val) {
this.listQuery.limit = val;
this.getList();
}
,
handleCurrentChange(val) {
this.listQuery.page = val;
this.getList();
}
,
handleCreate() {
this.resetTemp();
this.dialogStatus = 'create';
// this.dialogFormVisible = true;
},
/**
* 查看会员详细信息
* @param row
*/
viewDetails(row) {
// alert(JSON.stringify(row))
this.userDetails = row
this.detailsDialogFormVisible = true
}
,
/**
* 设置会员
* @param row
*/
setMember(row) {
getUserMemberByUserId(row.userId).then(response => {
this.userMembershipInformation = response.data
this.memberArea=true
})
},
create(formName) {
const set = this.$refs;
if (!this.form.state2 || this.form.state2 == "全部") {
this.form.companyId = undefined;
}
set[formName].validate(valid => {
if (valid) {
addObj(this.form)
.then(() => {
// this.dialogFormVisible = false;
this.getList();
this.$notify({
title: '成功',
message: '创建成功',
type: 'success',
duration: 2000
});
})
} else {
return false;
}
});
}
,
/**
* 关闭窗口,不需要清除表单
*/
cancelNotDeleteForm(){
this.detailsDialogFormVisible = false;
this.bulkUploadMember=false;
this.$refs.upload.clearFiles();
},
/**
* 关闭窗口,需要清除表单
*/
cancel(formName) {
this.$refs[formName].resetFields();
}
,
querySearch(queryString, cb) {
let selectArry = [];
this.allCompaniesArr.map(function (item) {
item.value = item.name;
selectArry.push(item);
});
this.selectArry = selectArry;
var results = queryString ? selectArry.filter(this.createFilter(queryString)) : selectArry;
// 调用 callback 返回建议列表的数据
cb(results);
}
,
handleSelect1(item) {
if (item.value == "全部") {
this.form.companyId = undefined;
} else {
this.form.companyId = item.id;
}
console.log(item);
}
,
createFilter(queryString) {
return (restaurant) => {
return (restaurant.name.indexOf(queryString.toLowerCase()) != -1);
};
}
,
update(formName) {
const set = this.$refs;
set[formName].validate(valid => {
if (valid) {
// this.dialogFormVisible = false;
if (this.form.passwordEdit) {
this.form.password = this.form.passwordEdit;
this.form.passwordEdit = undefined;
} else {
this.form.password = undefined;
}
putObj(this.form.id, this.form).then(() => {
// this.dialogFormVisible = false;
this.getList();
this.form.password = undefined;
this.$notify({
title: '成功',
message: '编辑成功',
type: 'success',
duration: 2000
});
});
} else {
return false;
}
});
}
,
resetTemp() {
this.form = {
username: undefined,
name: undefined,
sex: '男',
status: 1,
zoneId: undefined,
passwordEdit: undefined,
companyId: undefined,
state2: '',
password: "",
description: undefined,
dataLimit: [],
members: [],
};
}
}
}
</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