12.31开源admin代码更新

This commit is contained in:
hejinfu1026
2021-12-31 15:58:40 +08:00
parent 21e0d0e136
commit 0616cde752
545 changed files with 9743 additions and 139371 deletions

View File

@@ -1,65 +1,56 @@
<template>
<el-dialog
v-if="dialogVisible"
title="用户等级"
:visible.sync="dialogVisible"
width="500px"
:before-close="handleClose">
<el-form :model="formValidate" :rules="rules" ref="formValidate" label-width="100px" class="demo-ruleForm" v-loading="loading">
:before-close="handleClose" >
<el-form :model="user" :rules="rules" ref="user" label-width="100px" class="demo-ruleForm" v-loading="loading">
<el-form-item label="等级名称" prop="name">
<el-input v-model="formValidate.name" placeholder="请输入等级名称"></el-input>
<el-input v-model="user.name" placeholder="请输入等级名称"></el-input>
</el-form-item>
<el-form-item label="等级" prop="grade">
<el-input v-model.number="formValidate.grade" placeholder="请输入等级"></el-input>
<el-input v-model.number="user.grade" placeholder="请输入等级"></el-input>
</el-form-item>
<el-form-item label="享受折扣(%)" prop="discount">
<el-input-number :min="0" :max="100" step-strictly v-model="formValidate.discount" placeholder="请输入享受折扣"></el-input-number>
<el-input-number :min="0" :max="100" step-strictly v-model="user.discount" placeholder="请输入享受折扣"></el-input-number>
</el-form-item>
<el-form-item label="经验" prop="experience">
<el-input-number v-model.number="formValidate.experience" placeholder="请输入经验" :max="999999" step-strictly></el-input-number>
<el-input-number v-model.number="user.experience" placeholder="请输入经验" :min="0" step-strictly></el-input-number>
</el-form-item>
<el-form-item label="图标" prop="icon">
<div class="upLoadPicBox" @click="modalPicTap('1', 'icon')">
<div v-if="formValidate.icon" class="pictrue"><img :src="formValidate.icon"></div>
<div v-if="user.icon" class="pictrue"><img :src="user.icon"></div>
<div v-else-if="formValidate.icon" class="pictrue"><img :src="formValidate.icon"></div>
<div v-else class="upLoad">
<i class="el-icon-camera cameraIconfont" />
</div>
</div>
</el-form-item>
<!--<el-form-item label="用户背景" required prop="image">-->
<!--<div class="upLoadPicBox" @click="modalPicTap('1', 'image')">-->
<!--<div v-if="formValidate.image" class="pictrue"><img :src="formValidate.image"></div>-->
<!--<div v-else class="upLoad">-->
<!--<i class="el-icon-camera cameraIconfont" />-->
<!--</div>-->
<!--</div>-->
<!--</el-form-item>-->
<el-form-item label="是否显示" required>
<el-radio-group v-model="formValidate.isShow">
<el-radio :label="true" class="radio">显示</el-radio>
<el-radio :label="false">隐藏</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="resetForm('formValidate')"> </el-button>
<el-button type="primary" @click="submitForm('formValidate')"> </el-button>
<el-button @click="resetForm('user')"> </el-button>
<el-button type="primary" @click="submitForm('formValidate')" v-hasPermi="['admin:system:user:level:update','admin:system:user:level:save']"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { levelSaveApi, levelInfoApi, levelUpdateApi } from '@/api/user'
import {Debounce} from '@/utils/validate'
const obj = {
name:'',
grade: 1,
discount: '',
icon: '',
image: '',
isShow: true,
id: null
}
export default {
name: "CreatGrade",
props:{
'user':Object
},
data() {
return {
dialogVisible: false,
@@ -85,16 +76,18 @@
],
image: [
{ required: true, message: '请上传用户背景', trigger: 'change' }
]
],
}
}
},
methods:{
// 点击商品图
modalPicTap (tit, num) {
const _this = this
const _this = this
this.$modalUpload(function(img) {
tit==='1'&& num === 'icon' ? _this.formValidate.icon = img[0].sattDir : _this.formValidate.image = img[0].sattDir
this.$set(_this.user,'icon', _this.formValidate.icon);
this.$set(_this.user,'isShow', false);
},tit , 'user')
},
info(id) {
@@ -107,14 +100,26 @@
})
},
handleClose() {
this.dialogVisible = false
this.$refs['formValidate'].resetFields();
this.$nextTick(() => {
this.$refs.user.resetFields();
})
this.dialogVisible = false;
// this.user = Object.assign({}, '')
},
submitForm(formName) {
this.$refs[formName].validate((valid) => {
submitForm:Debounce(function(formName) {
this.$refs.user.validate((valid) => {
if (valid) {
this.loading = true
this.formValidate.id ? levelUpdateApi({id:this.formValidate.id}, this.formValidate).then(res => {
let data = {
discount:this.user.discount,
experience:this.user.experience,
grade:this.user.grade,
icon:this.user.icon,
id:this.user.id,
isShow:this.user.isShow,
name:this.user.name
};
this.user.id ? levelUpdateApi(this.user.id, data).then(res => {
this.$message.success('编辑成功')
this.loading = false
this.handleClose()
@@ -122,22 +127,28 @@
this.$parent.getList()
}).catch(() => {
this.loading = false
}): levelSaveApi(this.formValidate).then(res => {
}): levelSaveApi(this.user).then(res => {
this.$message.success('添加成功')
this.loading = false
this.handleClose()
this.formValidate = Object.assign({},obj)
this.$parent.getList()
}).catch(() => {
this.loading = false
this.formValidate = Object.assign({},obj)
})
} else {
return false;
}
});
},
}),
resetForm(formName) {
this.dialogVisible = false
this.$refs[formName].resetFields();
// this[formName] = {};
this.$nextTick(() => {
this.$refs.user.resetFields();
})
this.dialogVisible = false;
}
}
}

View File

@@ -2,23 +2,7 @@
<div class="divBox">
<el-card class="box-card">
<div slot="header" class="clearfix">
<div class="container">
<el-form :inline="true" size="small">
<el-form-item label="用户状态:" class="mr10">
<el-select v-model="tableFrom.isShow" clearable placeholder="请选择用户状态" @change="seachList" class="selWidth">
<el-option label="全部" value=""></el-option>
<el-option label="显示" value="true"></el-option>
<el-option label="隐藏" value="false"></el-option>
</el-select>
</el-form-item>
<el-form-item label="等级名称:">
<el-input v-model="tableFrom.name" placeholder="请输入等级名称" class="selWidth" clearable>
<el-button slot="append" icon="el-icon-search" @click="seachList" size="small"/>
</el-input>
</el-form-item>
</el-form>
</div>
<el-button type="primary" class="mr10" @click="add" size="small">添加用户等级</el-button>
<el-button type="primary" class="mr10" @click="add" size="small" v-hasPermi="['admin:system:user:level:save']">添加用户等级</el-button>
</div>
<el-table
v-loading="listLoading"
@@ -45,11 +29,11 @@
<el-table-column
prop="name"
label="等级名称"
min-width="150"
min-width="100"
/>
<el-table-column
prop="grade"
label="等级"
prop="experience"
label="经验"
min-width="100"
/>
<el-table-column
@@ -58,46 +42,37 @@
min-width="100"
/>
<el-table-column
label="是否显示"
min-width="150"
label="状态"
min-width="100"
>
<template slot-scope="scope">
<template slot-scope="scope" v-if="checkPermi(['admin:system:user:level:use'])">
<el-switch
v-model="scope.row.isShow"
:active-value="true"
:inactive-value="false"
active-text="显示"
inactive-text="隐藏"
@change="onchangeIsShow(scope.row)"
active-text="开启"
inactive-text="关闭"
disabled
@click.native="onchangeIsShow(scope.row)"
/>
</template>
</el-table-column>
<el-table-column label="操作" min-width="120" fixed="right" align="center">
<template slot-scope="scope">
<el-button type="text" size="small" @click="edit(scope.row.id)" class="mr10">编辑</el-button>
<el-button type="text" size="small" @click="handleDelete(scope.row.id, scope.$index)">删除</el-button>
<el-button type="text" size="small" @click="edit(scope.row)" class="mr10" v-hasPermi="['admin:system:user:level:update']">编辑</el-button>
<el-button type="text" size="small" @click="handleDelete(scope.row.id, scope.$index)" v-hasPermi="['admin:system:user:level:delete']">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="block">
<el-pagination
:page-sizes="[20, 40, 60, 80]"
:page-size="tableFrom.limit"
:current-page="tableFrom.page"
layout="total, sizes, prev, pager, next, jumper"
:total="tableData.total"
@size-change="handleSizeChange"
@current-change="pageChange"
/>
</div>
</el-card>
<creat-grade ref="grades"></creat-grade>
<creat-grade ref="grades" :user="userInfo"></creat-grade>
</div>
</template>
<script>
import { userListApi, groupListApi, levelListApi, levelUseApi, levelDeleteApi } from '@/api/user'
import creatGrade from './creatGrade'
import { checkPermi } from "@/utils/permission"; // 权限判断函数
export default {
name: 'Grade',
filters: {
@@ -114,16 +89,10 @@
data() {
return {
listLoading: true,
userInfo:{},
tableData: {
data: [],
total: 0
},
tableFrom: {
isShow: '',
name: '',
page: 1,
limit: 20,
isDel: 0
total: 0,
}
}
},
@@ -131,57 +100,68 @@
this.getList()
},
methods: {
checkPermi,
seachList() {
this.tableFrom.page = 1
this.getList()
},
add() {
this.$refs.grades.dialogVisible = true
this.userInfo = {};
},
edit(id) {
// this.$refs.grades.info(id)
this.userInfo = id;
this.$refs.grades.dialogVisible = true
this.$refs.grades.info(id)
},
// 列表
getList() {
this.listLoading = true
levelListApi(this.tableFrom).then(res => {
this.tableData.data = res.list
this.tableData.total = res.total
levelListApi().then(res => {
this.tableData.data = res
this.listLoading = false
}).catch(() => {
this.listLoading = false
})
},
pageChange(page) {
this.tableFrom.page = page
this.getList()
},
handleSizeChange(val) {
this.tableFrom.limit = val
this.getList()
},
// 删除
handleDelete(id, idx) {
this.$modalSure('删除吗?所有用户已经关联的数据都会清除').then(() => {
levelDeleteApi({id:id}).then(() => {
this.$modalSure('删除吗?删除会导致对应用户等级数据清空,请谨慎操作!').then(() => {
levelDeleteApi(id).then(() => {
this.$message.success('删除成功')
this.tableData.data.splice(idx, 1)
})
})
},
onchangeIsShow(row) {
levelUseApi({id: row.id, value:row.isShow}).then(() => {
this.$message.success('修改成功')
this.getList()
}).catch(()=>{
if(row.isShow == false){
row.isShow = !row.isShow
})
levelUseApi({id: row.id, isShow:row.isShow}).then(() => {
this.$message.success('修改成功')
this.getList()
}).catch(()=>{
row.isShow = !row.isShow
})
}else{
this.$modalSure('该操作会导致对应用户等级隐藏,请谨慎操作').then(() => {
row.isShow = !row.isShow
levelUseApi({id: row.id, isShow:row.isShow}).then(() => {
this.$message.success('修改成功')
this.getList()
}).catch(()=>{
row.isShow = !row.isShow
})
})
}
}
}
}
</script>
<style scoped lang="scss">
.el-switch.is-disabled {
opacity: 1;
}
::v-deep .el-switch__label {
cursor: pointer !important;;
}
</style>

View File

@@ -2,7 +2,7 @@
<div class="divBox">
<el-card class="box-card">
<div slot="header" class="clearfix">
<el-button size="small" type="primary" @click="onAdd(null)">{{$route.path.indexOf('group') !== -1?'添加用户分组':'添加用户标签'}}</el-button>
<el-button size="small" type="primary" @click="onAdd(null)" v-hasPermi="['admin:user:group:save','admin:user:tag:save']">{{$route.path.indexOf('group') !== -1?'添加用户分组':'添加用户标签'}}</el-button>
</div>
<el-table
v-loading="listLoading"
@@ -30,8 +30,8 @@
<!--/>-->
<el-table-column label="操作" min-width="120" fixed="right" align="center">
<template slot-scope="scope">
<el-button class="mr10" type="text" size="small" @click="onAdd(scope.row)">编辑</el-button>
<el-button type="text" size="small" @click="handleDelete(scope.row.id, scope.$index)" disable>删除</el-button>
<el-button class="mr10" type="text" size="small" @click="onAdd(scope.row)" v-hasPermi="['admin:user:group:update','admin:user:tag:update']">编辑</el-button>
<el-button type="text" size="small" @click="handleDelete(scope.row.id, scope.$index)" disable v-hasPermi="['admin:user:group:delete','admin:user:tag:delete']">删除</el-button>
</template>
</el-table-column>
</el-table>
@@ -81,7 +81,7 @@
inputErrorMessage: this.$route.path.indexOf('group') !== -1?'请输入分组名称':'请输入标签名称',
inputType: 'text',
closeOnClickModal: false,
inputValue: row ? (this.$route.path.indexOf('group') !== -1?row.groupName:row.name): '' ,
inputValue: row ? (this.$route.path.indexOf('group') !== -1?row.groupName:row.name): '',
inputPlaceholder: this.$route.path.indexOf('group') !== -1?'请输入分组名称':'请输入标签名称',
inputValidator: (value) => { if(!value) return '输入不能为空'}
}).then(({value}) => {

View File

@@ -3,36 +3,12 @@
<el-form-item label="用户编号:">
<el-input v-model="ruleForm.id" disabled class="selWidth"></el-input>
</el-form-item>
<!--<el-form-item label="真实姓名:">-->
<!--<el-input v-model="ruleForm.realName" class="selWidth"></el-input>-->
<!--</el-form-item>-->
<!--<el-form-item label="手机号码:" prop="phone">-->
<!--<el-input v-model.number="ruleForm.phone" class="selWidth" readonly></el-input>-->
<!--</el-form-item>-->
<!--<el-form-item label="生日:">-->
<!--<el-date-picker-->
<!--v-model="ruleForm.birthday"-->
<!--type="date"-->
<!--class="selWidth"-->
<!--placeholder="选择日期"-->
<!--format="yyyy 年 MM 月 dd 日"-->
<!--value-format="yyyy-MM-dd">-->
<!--</el-date-picker>-->
<!--</el-form-item>-->
<!--<el-form-item label="身份证号:">-->
<!--<el-input v-model="ruleForm.cardId" class="selWidth"></el-input>-->
<!--</el-form-item>-->
<el-form-item label="用户地址:">
<el-input v-model="ruleForm.addres" class="selWidth"></el-input>
</el-form-item>
<el-form-item label="用户备注:">
<el-input v-model="ruleForm.mark" type="textarea" class="selWidth"></el-input>
</el-form-item>
<el-form-item label="用户等级:">
<el-select v-model="ruleForm.level" placeholder="请选择" class="selWidth" clearable filterable>
<el-option :value="item.id" v-for="(item, index) in levelList" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="用户分组:">
<el-select v-model="ruleForm.groupId" placeholder="请选择" class="selWidth" clearable filterable>
<el-option :value="item.id" v-for="(item, index) in groupList" :key="index" :label="item.groupName"></el-option>
@@ -56,7 +32,7 @@
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
<el-button type="primary" @click="submitForm('ruleForm')" v-hasPermi="['admin:user:update']">提交</el-button>
<el-button @click="resetForm('ruleForm')">取消</el-button>
</el-form-item>
</el-form>
@@ -64,6 +40,7 @@
<script>
import { groupListApi, levelListApi, tagListApi, userInfoApi, userUpdateApi } from '@/api/user'
import {Debounce} from '@/utils/validate'
const defaultObj = {
// birthday: '',
// cardId: '',
@@ -137,11 +114,11 @@
},
// 等级列表
levelLists () {
levelListApi({ page: 1, limit: 9999, isShow: 1, isDel: 0}).then(async res => {
levelListApi().then(async res => {
this.levelList = res.list
})
},
submitForm(formName) {
submitForm:Debounce(function(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.ruleForm.tagId=this.labelData.join(',')
@@ -154,7 +131,7 @@
return false;
}
});
},
}),
resetForm(formName) {
this.$refs[formName].resetFields();
this.$emit('resetForm');

View File

@@ -1,5 +1,5 @@
<template>
<div class="divBox">
<div class="divBox relative">
<el-card class="box-card">
<div slot="header" class="clearfix">
<el-tabs v-model="loginType" @tab-click="getList(1)">
@@ -11,16 +11,9 @@
<el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
<el-col v-bind="grid">
<el-form-item label="用户搜索:">
<el-input v-model="userFrom.keywords" placeholder="请输入姓名" clearable class="selWidth"/>
<el-input v-model="userFrom.keywords" placeholder="请输入姓名或手机号" clearable class="selWidth"/>
</el-form-item>
</el-col>
<!--<el-col :span="24">-->
<!--<el-col v-bind="grid">-->
<!--<el-form-item label="会员搜索:">-->
<!--<el-input v-model="userFrom.keywords" placeholder="请输入" clearable class="selWidth"/>-->
<!--</el-form-item>-->
<!--</el-col>-->
<!--</el-col>-->
</el-col>
<template v-if="collapse">
<el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
@@ -61,8 +54,52 @@
<el-cascader :options="addresData" :props="propsCity" filterable v-model="address" @change="handleChange" clearable class="selWidth"></el-cascader>
</el-form-item>
</el-col>
<el-col v-bind="grid">
<el-form-item label="消费情况:">
<el-select v-model="userFrom.payCount" placeholder="请选择" class="selWidth" clearable>
<el-option value="" label="全部"></el-option>
<el-option value="0" label="0"></el-option>
<el-option value="1" label="1+"></el-option>
<el-option value="2" label="2+"></el-option>
<el-option value="3" label="3+"></el-option>
<el-option value="4" label="4+"></el-option>
<el-option value="5" label="5+"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col v-bind="grid">
<el-form-item label="时间选择:" class="timeBox">
<el-date-picker
v-model="timeVal"
align="right"
unlink-panels
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
size="small"
type="daterange"
placement="bottom-end"
placeholder="自定义时间"
class="selWidth"
:picker-options="pickerOptions"
@change="onchangeTime"
/>
</el-form-item>
</el-col>
</el-col>
<!-- <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
</el-col> -->
<el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
<el-col v-bind="grid">
<el-form-item label="访问情况:">
<el-select v-model="userFrom.accessType" placeholder="请选择" class="selWidth" clearable>
<el-option :value="0" label="全部"></el-option>
<el-option :value="1" label="首次访问"></el-option>
<el-option :value="2" label="时间段访问过"></el-option>
<el-option :value="3" label="时间段未访问"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col v-bind="grid">
<el-form-item label="性别:">
<el-radio-group v-model="userFrom.sex" type="button" class="selWidth">
@@ -100,51 +137,9 @@
</el-form-item>
</el-col>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
<el-col v-bind="grid">
<el-form-item label="访问情况:">
<el-select v-model="userFrom.accessType" placeholder="请选择" class="selWidth" clearable>
<el-option :value="0" label="全部"></el-option>
<el-option :value="1" label="首次访问"></el-option>
<el-option :value="2" label="时间段访问过"></el-option>
<el-option :value="3" label="时间段未访问"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col v-bind="grid">
<el-form-item label="消费情况:">
<el-select v-model="userFrom.payCount" placeholder="请选择" class="selWidth" clearable>
<el-option value="" label="全部"></el-option>
<el-option value="0" label="0"></el-option>
<el-option value="1" label="1+"></el-option>
<el-option value="2" label="2+"></el-option>
<el-option value="3" label="3+"></el-option>
<el-option value="4" label="4+"></el-option>
<el-option value="5" label="5+"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
<el-col v-bind="grid">
<el-form-item label="时间选择:" class="timeBox">
<el-date-picker
v-model="timeVal"
align="right"
unlink-panels
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
size="small"
type="daterange"
placement="bottom-end"
placeholder="自定义时间"
class="selWidth"
:picker-options="pickerOptions"
@change="onchangeTime"
/>
</el-form-item>
</el-col>
</el-col>
<!-- <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
</el-col> -->
</template>
<el-col :xs="24" :sm="24" :md="24" :lg="6" :xl="6" class="text-right userFrom">
<el-form-item>
@@ -163,10 +158,11 @@
</el-row>
</el-form>
</div>
<el-button class="mr10" size="small" @click="onSend">发送优惠券</el-button>
<!--<el-button v-show="loginType === 'wechat'" size="mini" class="mr10" @click="sendNews">发送文章</el-button>-->
<el-button class="mr10" size="small" @click="setBatch('group')">批量设置分组</el-button>
<el-button class="mr10" size="small" @click="setBatch('label')">批量设置标签</el-button>
<div class="btn_bt">
<el-button class="mr10" size="small" @click="onSend" type="primary" v-hasPermi="['admin:coupon:user:receive']">发送优惠券</el-button>
<el-button class="mr10" size="small" @click="setBatch('group')">批量设置分组</el-button>
<el-button class="mr10" size="small" @click="setBatch('label')">批量设置标签</el-button>
</div>
</div>
<el-table
ref="table"
@@ -187,23 +183,14 @@
<span>{{ props.row.createTime | filterEmpty }}</span>
</el-form-item>
<el-form-item label="近次访问:">
<span>{{ props.row.updateTime | filterEmpty }}</span>
<span>{{ props.row.lastLoginTime | filterEmpty }}</span>
</el-form-item>
<!--<el-form-item label="身份证号:">-->
<!--<span>{{ props.row.cardId | filterEmpty }}</span>-->
<!--</el-form-item>-->
<el-form-item label="手机号:">
<span>{{ props.row.phone | filterEmpty }}</span>
</el-form-item>
<!--<el-form-item label="真实姓名:">-->
<!--<span>{{ props.row.realName | filterEmpty }}</span>-->
<!--</el-form-item>-->
<el-form-item label="标签:">
<span>{{ props.row.tagName | filterEmpty }}</span>
</el-form-item>
<!--<el-form-item label="生日:">-->
<!--<span>{{ props.row.birthday | filterEmpty }}</span>-->
<!--</el-form-item>-->
<el-form-item label="地址:">
<span>{{ props.row.addres | filterEmpty }}</span>
</el-form-item>
@@ -222,7 +209,8 @@
label="ID"
min-width="80"
/>
<el-table-column label="头像" min-width="80">
<el-table-column
label="头像" min-width="80">
<template slot-scope="scope">
<div class="demo-image__preview">
<el-image
@@ -235,7 +223,7 @@
</el-table-column>
<el-table-column
label="姓名"
min-width="130"
min-width="160"
>
<template slot-scope="scope">
<span>{{scope.row.nickname | filterEmpty }} | {{scope.row.sex | sexFilter}}</span>
@@ -287,19 +275,20 @@
/>
<el-table-column label="操作" min-width="130" fixed="right" align="center">
<template slot-scope="scope">
<el-button type="text" @click="editUser(scope.row.uid)" size="small">编辑</el-button>
<el-button type="text" @click="editUser(scope.row.uid)" size="small" v-hasPermi="['admin:user:infobycondition']">编辑</el-button>
<el-dropdown trigger="click">
<span class="el-dropdown-link">
更多<i class="el-icon-arrow-down el-icon--right" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="onDetails(scope.row.uid)">账户详情</el-dropdown-item>
<el-dropdown-item @click.native="editPoint(scope.row.uid)">积分余额</el-dropdown-item>
<el-dropdown-item @click.native="setBatch('group',scope.row)">设置分组</el-dropdown-item>
<el-dropdown-item @click.native="setBatch('label',scope.row)">设置标签</el-dropdown-item>
<el-dropdown-item @click.native="setPhone(scope.row)">修改手机号</el-dropdown-item>
<el-dropdown-item @click.native="setExtension(scope.row)">修改上级推广人</el-dropdown-item>
<el-dropdown-item @click.native="clearSpread(scope.row)" v-if="scope.row.spreadUid && scope.row.spreadUid>0">清除上级推广人</el-dropdown-item>
<el-dropdown-item @click.native="onDetails(scope.row.uid)" v-if="checkPermi(['admin:user:topdetail'])">账户详情</el-dropdown-item>
<el-dropdown-item @click.native="editPoint(scope.row.uid)" v-if="checkPermi(['admin:user:operate:founds'])">积分余额</el-dropdown-item>
<el-dropdown-item @click.native="setBatch('group',scope.row)" v-if="checkPermi(['admin:user:group'])">设置分组</el-dropdown-item>
<el-dropdown-item @click.native="setBatch('label',scope.row)" v-if="checkPermi(['admin:user:tag'])">设置标签</el-dropdown-item>
<el-dropdown-item @click.native="setPhone(scope.row)" v-if="checkPermi(['admin:user:update:phone'])">修改手机号</el-dropdown-item>
<el-dropdown-item @click.native="onLevel(scope.row.uid,scope.row.level)" v-if="checkPermi(['admin:user:update:level'])">修改用户等级</el-dropdown-item>
<el-dropdown-item @click.native="setExtension(scope.row)" v-if="checkPermi(['admin:user:update:spread'])">修改上级推广人</el-dropdown-item>
<el-dropdown-item @click.native="clearSpread(scope.row)" v-if="scope.row.spreadUid && scope.row.spreadUid>0 && checkPermi(['admin:retail:spread:clean'])">清除上级推广人</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
@@ -373,7 +362,7 @@
:rules="[{ required: true, message: '请选择用户标签', trigger: 'change' }]"
v-else
>
<el-select v-model="dynamicValidateForm.groupId" placeholder="请选择标签" style="width: 80%" filterable multiple>
<el-select v-model="dynamicValidateForm.groupId" placeholder="请选择标签" style="width: 80%" filterable>
<el-option :value="item.id" v-for="(item, index) in labelLists" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
@@ -444,6 +433,14 @@
:before-close="Close">
<user-details ref="userDetails" :uid="uid" v-if="Visible"></user-details>
</el-dialog>
<!-- 用户等级 -->
<el-dialog
title="设置"
:visible.sync="levelVisible"
width="600px"
:before-close="Close">
<level-edit :levelInfo="levelInfo" :levelList="levelList"></level-edit>
</el-dialog>
</div>
</template>
@@ -452,12 +449,15 @@
import { spreadClearApi } from '@/api/distribution'
import editFrom from './edit'
import userDetails from './userDetails'
import levelEdit from './level'
import userList from '@/components/userList'
import * as logistics from '@/api/logistics.js'
import Cookies from 'js-cookie'
import { checkPermi } from "@/utils/permission"; // 权限判断函数
import {Debounce} from '@/utils/validate'
export default {
name: 'UserIndex',
components:{ editFrom, userDetails,userList },
components:{ editFrom, userDetails,userList ,levelEdit},
filters: {
sexFilter(status) {
const statusMap = {
@@ -479,65 +479,8 @@
ruleInline: {},
extensionVisible: false,
userVisible: false,
pickerOptions: {
shortcuts: [
{
text: '今天',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()))
picker.$emit('pick', [start, end])
}
},
{
text: '昨天',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.setTime(new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate() - 1)))
end.setTime(end.setTime(new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate())))
picker.$emit('pick', [start, end])
}
},
{
text: '最近7天',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
},
{
text: '最近30天',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
},
{
text: '本月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.setTime(new Date(new Date().getFullYear(), new Date().getMonth(), 1)))
picker.$emit('pick', [start, end])
}
},
{
text: '本年',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.setTime(new Date(new Date().getFullYear(), 0, 1)))
picker.$emit('pick', [start, end])
}
}
]
},
levelInfo:'',
pickerOptions: this.$timeOptions,
loadingBtn: false,
PointValidateForm: {
integralType: 2,
@@ -551,6 +494,7 @@
visible: false,
userIds: '',
dialogVisible: false,
levelVisible:false,
levelData: [],
groupData: [],
labelData: [],
@@ -604,20 +548,6 @@
sm: 24,
xs: 24
},
grid2: {
xl: 18,
lg: 16,
md: 12,
sm: 24,
xs: 24
},
grid3: {
xl: 8,
lg: 12,
md: 12,
sm: 24,
xs: 24
},
levelList: [],
labelLists: [],
groupList: [],
@@ -636,9 +566,15 @@
keyNum: 0,
address: [],
multipleSelectionAll: [],
idKey:'uid'
idKey:'uid',
uid:'',
}
},
activated(){
this.userFrom.keywords = '';
this.loginType = '0';
this.getList(1);
},
mounted() {
this.getList()
this.groupLists()
@@ -647,6 +583,7 @@
this.getCityList()
},
methods: {
checkPermi,
setPhone(row) {
this.$prompt('修改手机号', {
confirmButtonText: '确定',
@@ -658,7 +595,7 @@
closeOnClickModal: false,
inputValidator: (value) => {
if (!value) return '请填写手机号'
if (!/^1[3456789]\d{9}$/.test(value)) return '手机号格式不正确!'
// if (!/^1[3456789]\d{9}$/.test(value)) return '手机号格式不正确!'
// if(!value) return '输入不能为空'
}
}).then(({value}) => {
@@ -738,15 +675,15 @@
this.getList()
},
// 列表
getCityList() {
logistics.cityListTree().then(res => {
res.forEach((el, index) => {
el.child.forEach((cel, j) => {
delete cel.child
})
})
async getCityList() {
let res = await logistics.cityListTree();
//res.forEach((el, index) => {
// el.child.forEach((cel, j) => {
// delete cel.child
// })
// })
this.addresData = res
})
// })
},
// 发送文章
sendNews() {
@@ -771,19 +708,33 @@
},
Close() {
this.Visible = false
this.levelVisible = false;
},
// 账户详情
onDetails(id){
this.uid = id
this.Visible = true
},
// 等级
onLevel(id,level){
var userLevel = new Object();
this.levelList.forEach(item=>{
if(item.id == level){
userLevel.gradeLevel = item.grade;
}
})
userLevel.uid = id;
userLevel.level = level;
this.levelInfo = userLevel;
this.levelVisible = true;
},
// 积分余额
editPoint(id) {
this.uid = id
this.VisiblePoint = true
},
// 积分余额
submitPointForm(formName){
submitPointForm:Debounce(function(formName){
this.$refs[formName].validate((valid) => {
if (valid) {
this.PointValidateForm.uid = this.uid
@@ -800,7 +751,7 @@
return false
}
})
},
}),
// 积分余额
handlePointClose() {
this.VisiblePoint = false
@@ -920,9 +871,9 @@
},
// 等级列表
levelLists () {
levelListApi({ page: 1, limit: 9999}).then(async res => {
this.levelList = res.list
localStorage.setItem('levelKey', JSON.stringify(res.list))
levelListApi().then(async res => {
this.levelList = res
localStorage.setItem('levelKey', JSON.stringify(res))
})
},
// 列表
@@ -944,6 +895,7 @@
}).catch(() => {
this.listLoading = false
})
this.checkedCities = this.$cache.local.has('user_stroge') ? this.$cache.local.getJSON('user_stroge') : this.checkedCities;
},
// 设置选中的方法
setSelectRow() {
@@ -1039,7 +991,7 @@
}).catch(()=>{
row.isShow = !row.isShow
})
}
},
}
}
</script>
@@ -1093,4 +1045,11 @@
font-size: 12px;
color: #1682e6;
}
.btn_bt{
border-top:1px dashed #ccc;
padding-top: 20px;
}
.relative{
position: relative;
}
</style>

View File

@@ -0,0 +1,92 @@
<template>
<el-form :model="ruleForm" ref="ruleForm" label-width="100px" class="demo-ruleForm" >
<el-form-item>
<el-alert title="请勿频繁更改,以免计算产生混乱!" type="warning"></el-alert>
</el-form-item>
<el-form-item label="用户等级" label-width="100px">
<el-select v-model="ruleForm.levelId" clearable placeholder="请选择" @change="currentSel">
<el-option
v-for="item in levelList"
:key="item.grade"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="扣除经验" label-width="100px" v-if="grade =='' ? false : grade < levelInfo.gradeLevel">
<el-switch v-model="ruleForm.isSub"></el-switch>
</el-form-item>
<el-form-item>
<el-button @click="resetForm('ruleForm')">取消</el-button>
<el-button type="primary" @click="submitForm('ruleForm')">确定</el-button>
</el-form-item>
</el-form>
</template>
<script>
import { userLevelUpdateApi} from '@/api/user'
import {Debounce} from '@/utils/validate'
export default {
props:{
levelInfo:{
type:Object,
default:{},
},
levelList:{
type:Array,
default:[]
}
},
data() {
return {
grade:'',
levelStatus:false,
ruleForm: {
isSub: false,
levelId:"",
uid:this.levelInfo.uid
},
};
},
created(){
this.ruleForm.levelId = this.levelInfo.level?Number(this.levelInfo.level):''
},
watch: {
levelInfo(val){
this.ruleForm.uid = val.uid || 0;
this.ruleForm.levelId = this.levelInfo.level?Number(this.levelInfo.level):val.levelId;
},
},
methods: {
submitForm:Debounce(function(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
userLevelUpdateApi(this.ruleForm).then(res=>{
this.$message.success('编辑成功');
this.$parent.$parent.getList();
this.$parent.$parent.levelVisible = false;
this.$refs[formName].resetFields()
this.grade = '';
})
} else {
return false;
}
});
}),
currentSel(){
this.levelList.forEach(item=>{
if(item.id == this.ruleForm.levelId){
this.grade = item.grade;
}
})
},
resetForm(formName) {
this.$nextTick(() => {
this.$refs[formName].resetFields();
this.grade = '';
})
this.$parent.$parent.levelVisible = false
},
},
};
</script>

View File

@@ -1,13 +1,13 @@
<template>
<div>
<div class="acea-row row-middle" v-if="psInfo">
<div class="avatar mr15"><img :src="psInfo.user.avatar"></div>
<div class="acea-row row-middle border_bottom pb-24" v-if="psInfo">
<div class="avatar mr20"><img :src="psInfo.user.avatar"></div>
<div class="dashboard-workplace-header-tip">
<p class="dashboard-workplace-header-tip-title" v-text="psInfo.user.nickname || '-'"></p>
<div class="dashboard-workplace-header-tip-desc">
<span class="dashboard-workplace-header-tip-desc-sp">余额: {{ psInfo.balance }}</span>
<span class="dashboard-workplace-header-tip-desc-sp">总计订单: {{ psInfo.allOrderCount }}</span>
<span class="dashboard-workplace-header-tip-desc-sp">总消费金额: {{ psInfo.allConsumeCount }}</span>
<span class="dashboard-workplace-header-tip-desc-sp pb-1">余额: {{ psInfo.balance }}</span>
<span class="dashboard-workplace-header-tip-desc-sp pb-1">总计订单: {{ psInfo.allOrderCount }}</span>
<span class="dashboard-workplace-header-tip-desc-sp pb-1">总消费金额: {{ psInfo.allConsumeCount }}</span>
<span class="dashboard-workplace-header-tip-desc-sp">积分: {{ psInfo.integralCount }}</span>
<span class="dashboard-workplace-header-tip-desc-sp">本月订单: {{ psInfo.mothOrderCount }}</span>
<span class="dashboard-workplace-header-tip-desc-sp">本月消费金额: {{ psInfo.mothConsumeCount }}</span>
@@ -27,11 +27,12 @@
</el-menu>
</el-col>
<el-col :span="20">
<el-table :data="tableData.data" class="tabNumWidth" size="mini" v-loading="loading" max-height="400">
<el-table :data="tableData.data" class="tabNumWidth" v-loading="loading" max-height="400">
<el-table-column
:prop="item.key"
:label="item.title"
width="item.minWidth"
:show-overflow-tooltip="true"
v-for="(item, index) in columns" :key="index"
/>
</el-table>
@@ -196,7 +197,7 @@
},
{
title: '签到时间',
key: 'createDay',
key: 'createTime',
minWidth: 120
},
{
@@ -295,11 +296,19 @@
},
pageChange(page) {
this.tableFrom.page = page
this.getInfo()
if(this.tableFrom.type === '1'){
this.integral()
}else{
this.getInfo()
}
},
handleSizeChange(val) {
this.tableFrom.limit = val
this.getInfo()
if(this.tableFrom.type === '1'){
this.integral()
}else{
this.getInfo()
}
},
getHeader() {
topdetailApi({userId : this.uid}).then(res => {
@@ -312,8 +321,8 @@
<style scoped lang="scss">
.avatar{
width: 60px;
height: 60px;
width: 70px;
height: 70px;
border-radius: 50%;
overflow: hidden;
margin-left: 18px;
@@ -339,8 +348,10 @@
margin-top: -12px;
&-title {
font-size: 13px;
color: #000000;
margin-bottom: 12px;
font-weight: 600;
color: rgba(0, 0, 0, 0.85);
line-height: 18px;
padding: 10px 0 10px;
}
&-desc {
@@ -376,4 +387,16 @@
}
}
}
.pb-1{
padding-bottom: 10px;
}
.mr20{
margin: 0 20px;
}
.border_bottom{
border-bottom: 1px solid #E7EAEC;
}
.pb-24{
padding-bottom: 24px;
}
</style>