| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522 |
- <template>
- <div>
- <warning-bar title="注:右上角头像下拉可切换角色" />
- <div class="gva-table-box">
- <div class="gva-btn-list">
- <el-button
- type="primary"
- icon="plus"
- @click="addUser"
- >新增用户</el-button>
- </div>
- <el-table
- :data="tableData"
- row-key="ID"
- style="width: 100%"
- >
- <el-table-column
- align="left"
- label="头像"
- min-width="75"
- >
- <template #default="scope">
- <CustomPic
- style="margin-top:8px"
- :pic-src="scope.row.headerImg"
- />
- </template>
- </el-table-column>
- <el-table-column
- align="left"
- label="ID"
- min-width="50"
- prop="ID"
- />
- <el-table-column
- align="left"
- label="用户名"
- min-width="150"
- prop="userName"
- />
- <el-table-column
- align="left"
- label="昵称"
- min-width="120"
- prop="nickName"
- />
- <el-table-column
- align="left"
- label="手机号"
- min-width="120"
- prop="phone"
- />
- <el-table-column
- align="left"
- label="邮箱"
- min-width="180"
- prop="email"
- />
- <el-table-column
- align="left"
- label="用户角色"
- min-width="200"
- >
- <template #default="scope">
- <el-cascader
- v-model="scope.row.authorityId"
- :options="authOptions"
- :show-all-levels="false"
- collapse-tags
- :props="{ checkStrictly: true,label:'authorityName',value:'authorityId',disabled:'disabled',emitPath:false}"
- :clearable="false"
- @visible-change="(flag)=>{changeAuthority(scope.row,flag,0)}"
- />
- </template>
- </el-table-column>
- <el-table-column
- align="left"
- label="项目分配"
- min-width="260"
- prop="project"
- >
- <template #default="scope">
- <el-select
- v-model="scope.row.projectIds"
- multiple
- filterable
- collapse-tags
- placeholder="分配项目"
- style="width: 240px"
- @change="changeProjectId(scope.row.ID,scope.row.projectIds)"
- >
- <el-option
- v-for="item in projects"
- :key="item.ID"
- :label="item.projectName"
- :value="item.ID"
- />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column
- align="left"
- label="启用"
- min-width="80"
- >
- <template #default="scope">
- <el-switch
- v-model="scope.row.enable"
- inline-prompt
- :active-value="1"
- :inactive-value="2"
- @change="()=>{switchEnable(scope.row)}"
- />
- </template>
- </el-table-column>
- <el-table-column
- label="操作"
- min-width="250"
- fixed="right"
- >
- <template #default="scope">
- <el-button
- type="primary"
- link
- icon="delete"
- @click="deleteUserFunc(scope.row)"
- >删除</el-button>
- <el-button
- type="primary"
- link
- icon="edit"
- @click="openEdit(scope.row)"
- >编辑</el-button>
- <el-button
- type="primary"
- link
- icon="magic-stick"
- @click="resetPasswordFunc(scope.row)"
- >重置密码</el-button>
- </template>
- </el-table-column>
- </el-table>
- <div class="gva-pagination">
- <el-pagination
- :current-page="page"
- :page-size="pageSize"
- :page-sizes="[10, 30, 50, 100]"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- @current-change="handleCurrentChange"
- @size-change="handleSizeChange"
- />
- </div>
- </div>
- <el-drawer
- v-model="addUserDialog"
- size="60%"
- :show-close="false"
- :close-on-press-escape="false"
- :close-on-click-modal="false"
- >
- <template #header>
- <div class="flex justify-between items-center">
- <span class="text-lg">用户</span>
- <div>
- <el-button @click="closeAddUserDialog">取 消</el-button>
- <el-button
- type="primary"
- @click="enterAddUserDialog"
- >确 定</el-button>
- </div>
- </div>
- </template>
- <el-form
- ref="userForm"
- :rules="rules"
- :model="userInfo"
- label-width="80px"
- >
- <el-form-item
- v-if="dialogFlag === 'add'"
- label="用户名"
- prop="userName"
- >
- <el-input v-model="userInfo.userName" />
- </el-form-item>
- <el-form-item
- v-if="dialogFlag === 'add'"
- label="密码"
- prop="password"
- >
- <el-input v-model="userInfo.password" />
- </el-form-item>
- <el-form-item
- label="昵称"
- prop="nickName"
- >
- <el-input v-model="userInfo.nickName" />
- </el-form-item>
- <el-form-item
- label="手机号"
- prop="phone"
- >
- <el-input v-model="userInfo.phone" />
- </el-form-item>
- <el-form-item
- label="邮箱"
- prop="email"
- >
- <el-input v-model="userInfo.email" />
- </el-form-item>
- <el-form-item
- label="用户角色"
- prop="authorityId"
- >
- <el-cascader
- v-model="userInfo.authorityId"
- style="width:100%"
- :options="authOptions"
- :show-all-levels="false"
- :props="{ checkStrictly: true,label:'authorityName',value:'authorityId',disabled:'disabled',emitPath:false}"
- :clearable="false"
- />
- </el-form-item>
- <el-form-item
- label="启用"
- prop="disabled"
- >
- <el-switch
- v-model="userInfo.enable"
- inline-prompt
- :active-value="1"
- :inactive-value="2"
- />
- </el-form-item>
- <el-form-item
- label="头像"
- label-width="80px"
- >
- <SelectImage
- v-model="userInfo.headerImg"
- />
- </el-form-item>
- </el-form>
- </el-drawer>
- </div>
- </template>
- <script setup>
- import {
- getUserList,
- setUserAuthorities,
- register,
- deleteUser
- } from '@/api/user'
- import { getAuthorityList } from '@/api/authority'
- import CustomPic from '@/components/customPic/index.vue'
- import WarningBar from '@/components/warningBar/warningBar.vue'
- import { setUserInfo, resetPassword, getProjectList, changeProjects } from '@/api/user.js'
- import { nextTick, ref } from 'vue'
- import { ElMessage, ElMessageBox } from 'element-plus'
- import SelectImage from '@/components/selectImage/selectImage.vue'
- defineOptions({
- name: 'User',
- })
- const path = ref(import.meta.env.VITE_BASE_API + '/')
- // 初始化相关
- const setAuthorityOptions = (AuthorityData, optionsData) => {
- AuthorityData &&
- AuthorityData.forEach(item => {
- if (item.children && item.children.length) {
- const option = {
- authorityId: item.authorityId,
- authorityName: item.authorityName,
- children: []
- }
- setAuthorityOptions(item.children, option.children)
- optionsData.push(option)
- } else {
- const option = {
- authorityId: item.authorityId,
- authorityName: item.authorityName
- }
- optionsData.push(option)
- }
- })
- }
- const page = ref(1)
- const total = ref(0)
- const pageSize = ref(10)
- const tableData = ref([])
- // 分页
- const handleSizeChange = (val) => {
- pageSize.value = val
- getTableData()
- }
- const handleCurrentChange = (val) => {
- page.value = val
- getTableData()
- }
- // 查询
- const getTableData = async() => {
- const table = await getUserList({ page: page.value, pageSize: pageSize.value })
- if (table.code === 0) {
- tableData.value = table.data.list
- total.value = table.data.total
- page.value = table.data.page
- pageSize.value = table.data.pageSize
- }
- tableData.value && tableData.value.forEach((user) => {
- user.projectIds = user.projects && user.projects.map(i => {
- return i.ID
- })
- })
- }
- const projects = ref()
- const changeProjectId = async(userId, arr) => {
- var res = await changeProjects({ Id: userId, ProIds: arr })
- if (res.code === 0) {
- ElMessage({
- type: 'success',
- message: res.msg,
- })
- } else {
- ElMessage({
- type: 'error',
- message: res.msg,
- })
- }
- }
- const initPage = async() => {
- getTableData()
- const res = await getAuthorityList({ page: 1, pageSize: 999 })
- setOptions(res.data.list)
- const response = await getProjectList()
- projects.value = response.data
- }
- initPage()
- const resetPasswordFunc = (row) => {
- ElMessageBox.confirm(
- '是否将此用户密码重置为123456?',
- '警告',
- {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning',
- }
- ).then(async() => {
- const res = await resetPassword({
- ID: row.ID,
- })
- if (res.code === 0) {
- ElMessage({
- type: 'success',
- message: res.msg,
- })
- } else {
- ElMessage({
- type: 'error',
- message: res.msg,
- })
- }
- })
- }
- const authOptions = ref([])
- const setOptions = (authData) => {
- authOptions.value = []
- setAuthorityOptions(authData, authOptions.value)
- }
- const deleteUserFunc = async(row) => {
- ElMessageBox.confirm('确定要删除吗?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- }).then(async() => {
- const res = await deleteUser({ id: row.ID })
- if (res.code === 0) {
- ElMessage.success('删除成功')
- await getTableData()
- }
- })
- }
- // 弹窗相关
- const userInfo = ref({
- username: '',
- password: '',
- nickName: '',
- headerImg: '',
- authorityId: '',
- enable: 1,
- })
- const rules = ref({
- userName: [
- { required: true, message: '请输入用户名', trigger: 'blur' },
- { min: 5, message: '最低5位字符', trigger: 'blur' }
- ],
- password: [
- { required: true, message: '请输入用户密码', trigger: 'blur' },
- { min: 6, message: '最低6位字符', trigger: 'blur' }
- ],
- nickName: [
- { required: true, message: '请输入用户昵称', trigger: 'blur' }
- ],
- phone: [
- { pattern: /^1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\d{8}$/, message: '请输入合法手机号', trigger: 'blur' },
- ],
- email: [
- { pattern: /^([0-9A-Za-z\-_.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/g, message: '请输入正确的邮箱', trigger: 'blur' },
- ],
- authorityId: [
- { required: true, message: '请选择用户角色', trigger: 'blur' }
- ]
- })
- const userForm = ref(null)
- const enterAddUserDialog = async() => {
- userForm.value.validate(async valid => {
- if (valid) {
- const req = {
- ...userInfo.value
- }
- if (dialogFlag.value === 'add') {
- const res = await register(req)
- if (res.code === 0) {
- ElMessage({ type: 'success', message: '创建成功' })
- await getTableData()
- closeAddUserDialog()
- }
- }
- if (dialogFlag.value === 'edit') {
- const res = await setUserInfo(req)
- if (res.code === 0) {
- ElMessage({ type: 'success', message: '编辑成功' })
- await getTableData()
- closeAddUserDialog()
- }
- }
- }
- })
- }
- const addUserDialog = ref(false)
- const closeAddUserDialog = () => {
- userForm.value.resetFields()
- userInfo.value.headerImg = ''
- userInfo.value.authorityIds = []
- addUserDialog.value = false
- }
- const dialogFlag = ref('add')
- const addUser = () => {
- dialogFlag.value = 'add'
- addUserDialog.value = true
- }
- const tempAuth = {}
- const changeAuthority = async(row, flag, removeAuth) => {
- await nextTick()
- const res = await setUserAuthorities({
- ID: row.ID,
- authorityId: row.authorityId
- })
- if (res.code === 0) {
- ElMessage({ type: 'success', message: '角色设置成功' })
- } else {
- if (!removeAuth) {
- row.authorityIds = [...tempAuth[row.ID]]
- delete tempAuth[row.ID]
- } else {
- row.authorityIds = [removeAuth, ...row.authorityIds]
- }
- }
- }
- const openEdit = (row) => {
- dialogFlag.value = 'edit'
- userInfo.value = JSON.parse(JSON.stringify(row))
- addUserDialog.value = true
- }
- const switchEnable = async(row) => {
- userInfo.value = JSON.parse(JSON.stringify(row))
- await nextTick()
- const req = {
- ...userInfo.value
- }
- const res = await setUserInfo(req)
- if (res.code === 0) {
- ElMessage({ type: 'success', message: `${req.enable === 2 ? '禁用' : '启用'}成功` })
- await getTableData()
- userInfo.value.headerImg = ''
- userInfo.value.authorityIds = []
- }
- }
- </script>
- <style lang="scss">
- .header-img-box {
- @apply w-52 h-52 border border-solid border-gray-300 rounded-xl flex justify-center items-center cursor-pointer;
- }
- </style>
|