|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484 |
- <template>
- <div class="app-container">
- <el-row :gutter="20">
- <!--侧边部门数据-->
- <el-col :xs="9" :sm="6" :md="5" :lg="4" :xl="4">
- <div class="head-container">
- <el-input
- v-model="deptName"
- clearable
- size="small"
- placeholder="输入部门名称搜索"
- prefix-icon="el-icon-search"
- class="filter-item"
- @input="getDeptDatas"
- />
- </div>
- <el-tree
- :data="deptDatas"
- :load="getDeptDatas"
- :props="defaultProps"
- :expand-on-click-node="false"
- lazy
- @node-click="handleNodeClick"
- />
- </el-col>
- <!--用户数据-->
- <el-col :xs="15" :sm="18" :md="19" :lg="20" :xl="20">
- <!--工具栏-->
- <div class="head-container">
- <div v-if="crud.props.searchToggle">
- <!-- 搜索 -->
- <el-input
- v-model="query.blurry"
- clearable
- size="small"
- placeholder="输入名称或者邮箱搜索"
- style="width: 200px;"
- class="filter-item"
- @keyup.enter.native="crud.toQuery"
- />
- <date-range-picker v-model="query.createTime" class="date-item" />
- <el-select
- v-model="query.enabled"
- clearable
- size="small"
- placeholder="状态"
- class="filter-item"
- style="width: 90px"
- @change="crud.toQuery"
- >
- <el-option
- v-for="item in enabledTypeOptions"
- :key="item.key"
- :label="item.display_name"
- :value="item.key"
- />
- </el-select>
- <rrOperation />
- </div>
- <crudOperation show="" :permission="permission" />
- </div>
- <!--表单渲染-->
- <el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="570px">
- <el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="66px">
- <el-form-item label="用户名" prop="username">
- <el-input v-model="form.username" @keydown.native="keydown($event)" />
- </el-form-item>
- <el-form-item label="电话" prop="phone">
- <el-input v-model.number="form.phone" />
- </el-form-item>
- <el-form-item label="昵称" prop="nickName">
- <el-input v-model="form.nickName" @keydown.native="keydown($event)" />
- </el-form-item>
- <el-form-item label="邮箱" prop="email">
- <el-input v-model="form.email" />
- </el-form-item>
- <el-form-item label="部门" prop="dept.id">
- <treeselect
- v-model="form.dept.id"
- :options="depts"
- :load-options="loadDepts"
- style="width: 178px"
- placeholder="选择部门"
- />
- </el-form-item>
- <el-form-item label="岗位" prop="jobs">
- <el-select
- v-model="jobDatas"
- style="width: 178px"
- multiple
- placeholder="请选择"
- @remove-tag="deleteTag"
- @change="changeJob"
- >
- <el-option
- v-for="item in jobs"
- :key="item.name"
- :label="item.name"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="性别">
- <el-radio-group v-model="form.gender" style="width: 178px">
- <el-radio label="男">男</el-radio>
- <el-radio label="女">女</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="状态">
- <el-radio-group v-model="form.enabled" :disabled="form.id === user.id">
- <el-radio
- v-for="item in dict.user_status"
- :key="item.id"
- :label="item.value"
- >{{ item.label }}</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item style="margin-bottom: 0;" label="角色" prop="roles">
- <el-select
- v-model="roleDatas"
- style="width: 437px"
- multiple
- placeholder="请选择"
- @remove-tag="deleteTag"
- @change="changeRole"
- >
- <el-option
- v-for="item in roles"
- :key="item.name"
- :disabled="level !== 1 && item.level <= level"
- :label="item.name"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-form>
- <div slot="footer" class="dialog-footer">
- <el-button type="text" @click="crud.cancelCU">取消</el-button>
- <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
- </div>
- </el-dialog>
- <!--表格渲染-->
- <el-table ref="table" v-loading="crud.loading" :data="crud.data" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
- <el-table-column :selectable="checkboxT" type="selection" width="55" />
- <el-table-column :show-overflow-tooltip="true" prop="username" label="用户名" />
- <el-table-column :show-overflow-tooltip="true" prop="nickName" label="昵称" />
- <el-table-column prop="gender" label="性别" />
- <el-table-column :show-overflow-tooltip="true" prop="phone" width="100" label="电话" />
- <el-table-column :show-overflow-tooltip="true" width="135" prop="email" label="邮箱" />
- <el-table-column :show-overflow-tooltip="true" prop="dept" label="部门">
- <template slot-scope="scope">
- <div>{{ scope.row.dept.name }}</div>
- </template>
- </el-table-column>
- <el-table-column label="状态" align="center" prop="enabled">
- <template slot-scope="scope">
- <el-switch
- v-model="scope.row.enabled"
- :disabled="user.id === scope.row.id"
- active-color="#409EFF"
- inactive-color="#F56C6C"
- @change="changeEnabled(scope.row, scope.row.enabled)"
- />
- </template>
- </el-table-column>
- <el-table-column :show-overflow-tooltip="true" prop="createTime" width="135" label="创建日期" />
- <el-table-column
- v-if="checkPer(['admin','user:edit','user:del'])"
- label="操作"
- width="115"
- align="center"
- fixed="right"
- >
- <template slot-scope="scope">
- <udOperation
- :data="scope.row"
- :permission="permission"
- :disabled-dle="scope.row.id === user.id"
- />
- </template>
- </el-table-column>
- </el-table>
- <!--分页组件-->
- <pagination />
- </el-col>
- </el-row>
- </div>
- </template>
-
- <script>
- import crudUser from '@/api/system/user'
- import { isvalidPhone } from '@/utils/validate'
- import { getDepts, getDeptSuperior } from '@/api/system/dept'
- import { getAll, getLevel } from '@/api/system/role'
- import { getAllJob } from '@/api/system/job'
- import CRUD, { presenter, header, form, crud } from '@crud/crud'
- import rrOperation from '@crud/RR.operation'
- import crudOperation from '@crud/CRUD.operation'
- import udOperation from '@crud/UD.operation'
- import pagination from '@crud/Pagination'
- import DateRangePicker from '@/components/DateRangePicker'
- import Treeselect from '@riophae/vue-treeselect'
- import { mapGetters } from 'vuex'
- import '@riophae/vue-treeselect/dist/vue-treeselect.css'
- import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
- let userRoles = []
- let userJobs = []
- const defaultForm = { id: null, username: null, nickName: null, gender: '男', email: null, enabled: 'false', roles: [], jobs: [], dept: { id: null }, phone: null }
- export default {
- name: 'User',
- components: { Treeselect, crudOperation, rrOperation, udOperation, pagination, DateRangePicker },
- cruds() {
- return CRUD({ title: '用户', url: 'api/users', crudMethod: { ...crudUser }})
- },
- mixins: [presenter(), header(), form(defaultForm), crud()],
- // 数据字典
- dicts: ['user_status'],
- data() {
- // 自定义验证
- const validPhone = (rule, value, callback) => {
- if (!value) {
- callback(new Error('请输入电话号码'))
- } else if (!isvalidPhone(value)) {
- callback(new Error('请输入正确的11位手机号码'))
- } else {
- callback()
- }
- }
- return {
- height: document.documentElement.clientHeight - 180 + 'px;',
- deptName: '', depts: [], deptDatas: [], jobs: [], level: 3, roles: [],
- jobDatas: [], roleDatas: [], // 多选时使用
- defaultProps: { children: 'children', label: 'name', isLeaf: 'leaf' },
- permission: {
- add: ['admin', 'user:add'],
- edit: ['admin', 'user:edit'],
- del: ['admin', 'user:del']
- },
- enabledTypeOptions: [
- { key: 'true', display_name: '激活' },
- { key: 'false', display_name: '锁定' }
- ],
- rules: {
- username: [
- { required: true, message: '请输入用户名', trigger: 'blur' },
- { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
- ],
- nickName: [
- { required: true, message: '请输入用户昵称', trigger: 'blur' },
- { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
- ],
- email: [
- { required: true, message: '请输入邮箱地址', trigger: 'blur' },
- { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' }
- ],
- phone: [
- { required: true, trigger: 'blur', validator: validPhone }
- ]
- }
- }
- },
- computed: {
- ...mapGetters([
- 'user'
- ])
- },
- created() {
- this.crud.msg.add = '新增成功,默认密码:123456'
- },
- mounted: function() {
- const that = this
- window.onresize = function temp() {
- that.height = document.documentElement.clientHeight - 180 + 'px;'
- }
- },
- methods: {
- // 禁止输入空格
- keydown(e) {
- if (e.keyCode === 32) {
- e.returnValue = false
- }
- },
- changeRole(value) {
- userRoles = []
- value.forEach(function(data, index) {
- const role = { id: data }
- userRoles.push(role)
- })
- },
- changeJob(value) {
- userJobs = []
- value.forEach(function(data, index) {
- const job = { id: data }
- userJobs.push(job)
- })
- },
- deleteTag(value) {
- userRoles.forEach(function(data, index) {
- if (data.id === value) {
- userRoles.splice(index, value)
- }
- })
- },
- // 新增与编辑前做的操作
- [CRUD.HOOK.afterToCU](crud, form) {
- this.getRoles()
- if (form.id == null) {
- this.getDepts()
- } else {
- this.getSupDepts(form.dept.id)
- }
- this.getRoleLevel()
- this.getJobs()
- form.enabled = form.enabled.toString()
- },
- // 新增前将多选的值设置为空
- [CRUD.HOOK.beforeToAdd]() {
- this.jobDatas = []
- this.roleDatas = []
- },
- // 初始化编辑时候的角色与岗位
- [CRUD.HOOK.beforeToEdit](crud, form) {
- this.getJobs(this.form.dept.id)
- this.jobDatas = []
- this.roleDatas = []
- userRoles = []
- userJobs = []
- const _this = this
- form.roles.forEach(function(role, index) {
- _this.roleDatas.push(role.id)
- const rol = { id: role.id }
- userRoles.push(rol)
- })
- form.jobs.forEach(function(job, index) {
- _this.jobDatas.push(job.id)
- const data = { id: job.id }
- userJobs.push(data)
- })
- },
- // 提交前做的操作
- [CRUD.HOOK.afterValidateCU](crud) {
- if (!crud.form.dept.id) {
- this.$message({
- message: '部门不能为空',
- type: 'warning'
- })
- return false
- } else if (this.jobDatas.length === 0) {
- this.$message({
- message: '岗位不能为空',
- type: 'warning'
- })
- return false
- } else if (this.roleDatas.length === 0) {
- this.$message({
- message: '角色不能为空',
- type: 'warning'
- })
- return false
- }
- crud.form.roles = userRoles
- crud.form.jobs = userJobs
- return true
- },
- // 获取左侧部门数据
- getDeptDatas(node, resolve) {
- const sort = 'id,desc'
- const params = { sort: sort }
- if (typeof node !== 'object') {
- if (node) {
- params['name'] = node
- }
- } else if (node.level !== 0) {
- params['pid'] = node.data.id
- }
- setTimeout(() => {
- getDepts(params).then(res => {
- if (resolve) {
- resolve(res.content)
- } else {
- this.deptDatas = res.content
- }
- })
- }, 100)
- },
- getDepts() {
- getDepts({ enabled: true }).then(res => {
- this.depts = res.content.map(function(obj) {
- if (obj.hasChildren) {
- obj.children = null
- }
- return obj
- })
- })
- },
- getSupDepts(deptId) {
- getDeptSuperior(deptId).then(res => {
- const date = res.content
- this.buildDepts(date)
- this.depts = date
- })
- },
- buildDepts(depts) {
- depts.forEach(data => {
- if (data.children) {
- this.buildDepts(data.children)
- }
- if (data.hasChildren && !data.children) {
- data.children = null
- }
- })
- },
- // 获取弹窗内部门数据
- loadDepts({ action, parentNode, callback }) {
- if (action === LOAD_CHILDREN_OPTIONS) {
- getDepts({ enabled: true, pid: parentNode.id }).then(res => {
- parentNode.children = res.content.map(function(obj) {
- if (obj.hasChildren) {
- obj.children = null
- }
- return obj
- })
- setTimeout(() => {
- callback()
- }, 200)
- })
- }
- },
- // 切换部门
- handleNodeClick(data) {
- if (data.pid === 0) {
- this.query.deptId = null
- } else {
- this.query.deptId = data.id
- }
- this.crud.toQuery()
- },
- // 改变状态
- changeEnabled(data, val) {
- this.$confirm('此操作将 "' + this.dict.label.user_status[val] + '" ' + data.username + ', 是否继续?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- }).then(() => {
- crudUser.edit(data).then(res => {
- this.crud.notify(this.dict.label.user_status[val] + '成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
- }).catch(() => {
- data.enabled = !data.enabled
- })
- }).catch(() => {
- data.enabled = !data.enabled
- })
- },
- // 获取弹窗内角色数据
- getRoles() {
- getAll().then(res => {
- this.roles = res
- }).catch(() => { })
- },
- // 获取弹窗内岗位数据
- getJobs() {
- getAllJob().then(res => {
- this.jobs = res.content
- }).catch(() => { })
- },
- // 获取权限级别
- getRoleLevel() {
- getLevel().then(res => {
- this.level = res.level
- }).catch(() => { })
- },
- checkboxT(row, rowIndex) {
- return row.id !== this.user.id
- }
- }
- }
- </script>
-
- <style rel="stylesheet/scss" lang="scss" scoped>
- ::v-deep .vue-treeselect__control,::v-deep .vue-treeselect__placeholder,::v-deep .vue-treeselect__single-value {
- height: 30px;
- line-height: 30px;
- }
- </style>
|