blog-admin-web/src/views/system/SystemUser.vue

190 lines
6.4 KiB
Vue

<template>
<div>
<el-form inline :model="search" @submit.prevent>
<el-form-item label="用户名/昵称">
<el-input v-model="search.username" />
</el-form-item>
</el-form>
<div class="btn-container">
<el-button type="primary" @click="add">添加</el-button>
<div class="search-btn">
<el-button type="primary" @click="loadDataBase(true)" icon="Search">搜索</el-button>
<el-button @click="reset" icon="RefreshLeft">重置</el-button>
</div>
</div>
<div class="table-container">
<el-table :data="systemUserData" v-loading="loading" stripe>
<el-table-column prop="username" label="用户名" />
<el-table-column prop="realname" label="昵称" />
<el-table-column prop="created_at" label="创建时间" >
<template #default="scope">
{{ datetimeFormat(scope.row.created_at) }}
</template>
</el-table-column>
<el-table-column prop="updated_at" label="更新时间" >
<template #default="scope">
{{ datetimeFormat(scope.row.updated_at) }}
</template>
</el-table-column>
<el-table-column label="操作" >
<template #default="scope">
<el-button link icon="Edit" @click="update(scope.row)" title="修改"></el-button>
<el-button link type="danger" icon="Delete" @click="remove(scope.row)" title="删除"></el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="page-container">
<el-pagination background
:page-sizes="$store.state.pageSizeOpts"
:layout="$store.state.pageLayout"
:current-page="search.pageNum"
:total="total"
@size-change="pageSizeChange"
@current-change="pageChange">
</el-pagination>
</div>
<el-dialog v-model="addModal" :title="modalTitle" >
<el-form ref="userForm" :model="formData" :rules="ruleValidate" :label-width="120">
<el-form-item label="用户名" prop="username">
<el-input v-model="formData.username" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="formData.password" type="password" />
</el-form-item>
<el-form-item label="昵称" prop="realname">
<el-input v-model="formData.realname" />
</el-form-item>
<el-form-item label="角色" prop="realname">
<el-select v-model="formData.role_ids" multiple >
<el-option v-for="role in roles" :key="role._id" :value="role._id" :label="role.name"></el-option>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="addModal = false">取消</el-button>
<el-button type="primary" @click="save" :loading="modalLoading">确定</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script lang="ts">
import { Options } from 'vue-class-component'
import BaseList from '../../model/baselist'
import { Page } from '../../model/common.dto'
import { SystemUserModel } from '../../model/system/system-user'
import { SystemRoleModel } from '../../model/system/system-role'
import { ElMessage, ElMessageBox } from 'element-plus'
import { VForm } from '../../types'
@Options({
name: 'SystemUser'
})
export default class SystemUser extends BaseList<SystemUserPage> {
get ruleValidate() {
return {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ validator: async (rule: object, value: string, callback: Function) => {
const data = await this.$http.get<any, any>('/api/v1/system/user/exists', {params: {username: value, id: this.formData._id}})
if(data.data.exists) {
callback(new Error('用户名已存在'))
} else {
callback()
}
}, trigger: 'blur'
}
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ min: 8, max: 16, message: '密码长度8~16位', trigger: 'blur' },
{ pattern: /^(?![\d]+$)(?![a-zA-Z]+$)(?![-=+_.,]+$)[\da-zA-Z-=+_.,]{8,16}$/, message: '密码由字母、数字、特殊字符中的任意两种组成', trigger: 'blur' }
],
}
}
search = new SystemUserPage()
systemUserData: SystemUserModel[] = []
roles: SystemRoleModel[] = []
addModal: boolean = false
modalTitle: string | null = null
formData: SystemUserModel = {
_id: null,
username: null,
password: null,
realname: null,
role_ids: []
}
async loadData() {
this.loading = true
const data = await this.$http.get<{params: SystemUserPage}, any>('/api/v1/system/user/list', {params:this.search})
this.loading = false
this.total = data.total
this.systemUserData = data.data
}
add() {
// 清空表单
this.formData = {
_id: null,
username: null,
password: null,
realname: null,
role_ids: []
}
this.modalTitle = '新增用户'
this.addModal = true
this.clearValidate()
}
update(row: SystemUserModel) {
this.formData._id = row._id
this.formData.username = row.username
this.formData.realname = row.realname
this.formData.role_ids = row.role_ids
this.modalTitle = '修改用户'
this.addModal = true
this.clearValidate()
}
async save() {
(this.$refs.userForm as VForm).validate(async (valid: boolean) => {
if (!valid) return
this.modalLoading = true
const data = await this.$http.post<SystemUserModel, any>('/api/v1/system/user/save', this.formData)
this.modalLoading = false
this.addModal = false
ElMessage.success(data.message)
this.loadData()
})
}
remove(row: SystemUserModel) {
ElMessageBox.confirm(`是否确认删除 ${row.username} 用户?`, '确认删除', {type: 'warning'}).then(async () => {
const data = await this.$http.delete<{params: {id: string}}, any>('/api/v1/system/user/delete', {params: {id: row._id}})
if(data.status) {
ElMessage.success(data.message)
this.loadData()
} else {
ElMessage.warning(data.message)
}
}).catch(() => {})
}
created() {
this.loadData()
this.$http.get<never, any>('/api/v1/system/role/listAll').then(data => {
this.roles = data
})
}
clearValidate() {
this.$nextTick(() => {
(this.$refs.userForm as VForm).clearValidate()
})
}
}
class SystemUserPage extends Page {
username?: string
reset() {
super.reset()
this.username = undefined
}
}
</script>