测试 #2

Merged
pog6ch8ae merged 2 commits from branch_cwy into main 3 months ago

@ -1,9 +1,14 @@
<template> 
<template>
<!-- 整体的应用容器 div -->
<div class="app-container">
<!-- 筛选搜索区域的卡片容器设置了阴影效果为无 -->
<el-card class="filter-container" shadow="never">
<div>
<!-- 搜索图标 -->
<i class="el-icon-search"></i>
<!-- 筛选搜索的文字提示 -->
<span>筛选搜索</span>
<!-- 查询搜索按钮设置了样式为右浮动按钮类型为主要primary点击时调用 handleSearchList 方法按钮大小为 small -->
<el-button
style="float:right"
type="primary"
@ -11,6 +16,7 @@
size="small">
查询搜索
</el-button>
<!-- 重置按钮设置了样式为右浮动且距离右侧 15px点击时调用 handleResetSearch 方法按钮大小为 small -->
<el-button
style="float:right;margin-right: 15px"
@click="handleResetSearch()"
@ -19,41 +25,57 @@
</el-button>
</div>
<div style="margin-top: 15px">
<!-- 内联表单绑定了 listQuery 数据对象表单大小为 small标签宽度为 140px -->
<el-form :inline="true" :model="listQuery" size="small" label-width="140px">
<!-- 表单项目标签为输入搜索 -->
<el-form-item label="输入搜索:">
<!-- 输入框双向绑定 listQuery.keyword设置了类名占位符以及可清空功能 -->
<el-input v-model="listQuery.keyword" class="input-width" placeholder="帐号/姓名" clearable></el-input>
</el-form-item>
</el-form>
</div>
</el-card>
<!-- 操作区域的卡片容器设置了阴影效果为无 -->
<el-card class="operate-container" shadow="never">
<!-- 图标 -->
<i class="el-icon-tickets"></i>
<!-- 数据列表的文字提示 -->
<span>数据列表</span>
<!-- 添加按钮大小为 mini设置了类名点击时调用 handleAdd 方法设置了左侧外边距为 20px -->
<el-button size="mini" class="btn-add" @click="handleAdd()" style="margin-left: 20px">添加</el-button>
</el-card>
<!-- 表格容器 div -->
<div class="table-container">
<!-- el-table 组件绑定了 list 数据用于展示表格内容设置了加载状态绑定宽度边框等属性 -->
<el-table ref="adminTable"
:data="list"
style="width: 100%;"
v-loading="listLoading" border>
<!-- 表格列标签为编号设置了宽度和内容居中对齐通过插槽作用域展示对应行数据的 id 属性 -->
<el-table-column label="编号" width="100" align="center">
<template slot-scope="scope">{{scope.row.id}}</template>
</el-table-column>
<!-- 表格列标签为帐号内容居中对齐通过插槽作用域展示对应行数据的 username 属性 -->
<el-table-column label="帐号" align="center">
<template slot-scope="scope">{{scope.row.username}}</template>
</el-table-column>
<!-- 表格列标签为姓名内容居中对齐通过插槽作用域展示对应行数据的 nickName 属性 -->
<el-table-column label="姓名" align="center">
<template slot-scope="scope">{{scope.row.nickName}}</template>
</el-table-column>
<!-- 表格列标签为邮箱内容居中对齐通过插槽作用域展示对应行数据的 email 属性 -->
<el-table-column label="邮箱" align="center">
<template slot-scope="scope">{{scope.row.email}}</template>
</el-table-column>
<!-- 表格列标签为添加时间设置了宽度和内容居中对齐通过插槽作用域展示对应行数据的 createTime 属性并使用了 formatDateTime 过滤器进行格式化 -->
<el-table-column label="添加时间" width="160" align="center">
<template slot-scope="scope">{{scope.row.createTime | formatDateTime}}</template>
</el-table-column>
<!-- 表格列标签为最后登录设置了宽度和内容居中对齐通过插槽作用域展示对应行数据的 loginTime 属性并使用了 formatDateTime 过滤器进行格式化 -->
<el-table-column label="最后登录" width="160" align="center">
<template slot-scope="scope">{{scope.row.loginTime | formatDateTime}}</template>
</el-table-column>
<!-- 表格列标签为是否启用设置了宽度和内容居中对齐通过插槽作用域展示对应行数据的 status 属性并使用 el-switch 组件进行切换操作绑定了相关的事件和值 -->
<el-table-column label="是否启用" width="140" align="center">
<template slot-scope="scope">
<el-switch
@ -64,6 +86,7 @@
</el-switch>
</template>
</el-table-column>
<!-- 表格列标签为操作设置了宽度和内容居中对齐通过插槽作用域展示操作按钮包括分配角色编辑删除按钮分别绑定了对应的点击事件方法 -->
<el-table-column label="操作" width="180" align="center">
<template slot-scope="scope">
<el-button size="mini"
@ -83,7 +106,9 @@
</el-table-column>
</el-table>
</div>
<!-- 分页容器 div -->
<div class="pagination-container">
<!-- el-pagination 分页组件设置了背景色相关页面切换事件绑定布局样式当前页每页数量可选每页数量数组以及总记录数等属性 -->
<el-pagination
background
@size-change="handleSizeChange"
@ -95,31 +120,39 @@
:total="total">
</el-pagination>
</div>
<!-- 编辑/添加用户的对话框组件根据 isEdit 变量来动态设置标题绑定了显示状态设置了宽度 -->
<el-dialog
:title="isEdit?'编辑用户':'添加用户'"
:visible.sync="dialogVisible"
width="40%">
<!-- 对话框内的表单绑定了 admin 数据对象设置了表单引用标签宽度和大小 -->
<el-form :model="admin"
ref="adminForm"
label-width="150px" size="small">
<!-- 表单项目标签为帐号输入框双向绑定 admin.username -->
<el-form-item label="帐号:">
<el-input v-model="admin.username" style="width: 250px"></el-input>
</el-form-item>
<!-- 表单项目标签为姓名输入框双向绑定 admin.nickName -->
<el-form-item label="姓名:">
<el-input v-model="admin.nickName" style="width: 250px"></el-input>
</el-form-item>
<!-- 表单项目标签为邮箱输入框双向绑定 admin.email -->
<el-form-item label="邮箱:">
<el-input v-model="admin.email" style="width: 250px"></el-input>
</el-form-item>
<!-- 表单项目标签为密码输入框双向绑定 admin.password设置了密码类型 -->
<el-form-item label="密码:">
<el-input v-model="admin.password" type="password" style="width: 250px"></el-input>
</el-form-item>
<!-- 表单项目标签为备注输入框双向绑定 admin.note设置了文本域类型和行数 -->
<el-form-item label="备注:">
<el-input v-model="admin.note"
type="textarea"
:rows="5"
style="width: 250px"></el-input>
</el-form-item>
<!-- 表单项目标签为是否启用使用单选按钮组绑定 admin.status -->
<el-form-item label="是否启用:">
<el-radio-group v-model="admin.status">
<el-radio :label="1"></el-radio>
@ -127,15 +160,18 @@
</el-radio-group>
</el-form-item>
</el-form>
<!-- 对话框底部的按钮区域通过插槽定义了取消和确定按钮分别绑定了对应的点击事件 -->
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false" size="small"> </el-button>
<el-button type="primary" @click="handleDialogConfirm()" size="small"> </el-button>
</span>
</el-dialog>
<!-- 分配角色的对话框组件设置了标题绑定了显示状态和宽度 -->
<el-dialog
title="分配角色"
:visible.sync="allocDialogVisible"
width="30%">
<!-- 多选的下拉选择框绑定了 allocRoleIds 数据设置了占位符大小和宽度通过循环渲染选项 -->
<el-select v-model="allocRoleIds" multiple placeholder="请选择" size="small" style="width: 80%">
<el-option
v-for="item in allRoleList"
@ -144,6 +180,7 @@
:value="item.id">
</el-option>
</el-select>
<!-- 对话框底部的按钮区域通过插槽定义了取消和确定按钮分别绑定了对应的点击事件 -->
<span slot="footer" class="dialog-footer">
<el-button @click="allocDialogVisible = false" size="small"> </el-button>
<el-button type="primary" @click="handleAllocDialogConfirm()" size="small"> </el-button>
@ -152,16 +189,21 @@
</div>
</template>
<script>
import {fetchList,createAdmin,updateAdmin,updateStatus,deleteAdmin,getRoleByAdmin,allocRole} from '@/api/login';
import {fetchAllRoleList} from '@/api/role';
import {formatDate} from '@/utils/date';
// @/api/login API
import {fetchList,createAdmin,updateAdmin,updateStatus,deleteAdmin,getRoleByAdmin,allocRole} from '@/api/login';
// @/api/role API
import {fetchAllRoleList} from '@/api/role';
// @/utils/date
import {formatDate} from '@/utils/date';
const defaultListQuery = {
//
const defaultListQuery = {
pageNum: 1,
pageSize: 10,
keyword: null
};
const defaultAdmin = {
};
// id
const defaultAdmin = {
id: null,
username: null,
password: null,
@ -169,65 +211,88 @@
email: null,
note: null,
status: 1
};
export default {
};
export default {
name: 'adminList',
data() {
return {
// defaultListQuery
listQuery: Object.assign({}, defaultListQuery),
//
list: null,
//
total: null,
//
listLoading: false,
// /
dialogVisible: false,
// defaultAdmin
admin: Object.assign({}, defaultAdmin),
//
isEdit: false,
//
allocDialogVisible: false,
// ID ID
allocRoleIds:[],
//
allRoleList:[],
// ID
allocAdminId:null
}
},
created() {
//
this.getList();
this.getAllRoleList();
},
filters: {
formatDateTime(time) {
// null 'N/A'
if (time == null || time === '') {
return 'N/A';
}
// Date
let date = new Date(time);
// 使 formatDate
return formatDate(date, 'yyyy-MM-dd hh:mm:ss')
}
},
methods: {
handleResetSearch() {
//
this.listQuery = Object.assign({}, defaultListQuery);
},
handleSearchList() {
// 1
this.listQuery.pageNum = 1;
this.getList();
},
handleSizeChange(val) {
// 1
this.listQuery.pageNum = 1;
this.listQuery.pageSize = val;
this.getList();
},
handleCurrentChange(val) {
//
this.listQuery.pageNum = val;
this.getList();
},
handleAdd() {
// /
this.dialogVisible = true;
this.isEdit = false;
this.admin = Object.assign({},defaultAdmin);
},
handleStatusChange(index, row) {
//
this.$confirm('是否要修改该状态?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// API ID
updateStatus(row.id, {status: row.status}).then(response => {
this.$message({
type: 'success',
@ -235,6 +300,7 @@
});
});
}).catch(() => {
//
this.$message({
type: 'info',
message: '取消修改'
@ -243,11 +309,13 @@
});
},
handleDelete(index, row) {
//
this.$confirm('是否要删除该用户?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// API ID
deleteAdmin(row.id).then(response => {
this.$message({
type: 'success',
@ -258,17 +326,22 @@
});
},
handleUpdate(index, row) {
// /
this.dialogVisible = true;
this.isEdit = true;
this.admin = Object.assign({},row);
},
handleDialogConfirm() {
//
this.$confirm('是否要确认?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
//
if (this.isEdit) {
// API ID
// /
updateAdmin(this.admin.id,this.admin).then(response => {
this.$message({
message: '修改成功!',
@ -278,6 +351,8 @@
this.getList();
})
} else {
// API
// /
createAdmin(this.admin).then(response => {
this.$message({
message: '添加成功!',
@ -290,14 +365,20 @@
})
},
handleAllocDialogConfirm(){
//
this.$confirm('是否要确认?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// URLSearchParams
let params = new URLSearchParams();
// ID
params.append("adminId", this.allocAdminId);
// ID
params.append("roleIds", this.allocRoleIds);
// API
//
allocRole(params).then(response => {
this.$message({
message: '分配成功!',
@ -308,28 +389,43 @@
})
},
handleSelectRole(index,row){
// ID
this.allocAdminId = row.id;
//
this.allocDialogVisible = true;
// ID
this.getRoleListByAdmin(row.id);
},
getList() {
//
this.listLoading = true;
// API
fetchList(this.listQuery).then(response => {
//
this.listLoading = false;
// list
this.list = response.data.list;
// total
this.total = response.data.total;
});
},
getAllRoleList() {
// API
fetchAllRoleList().then(response => {
// allRoleList 使
this.allRoleList = response.data;
});
},
getRoleListByAdmin(adminId) {
// API ID
getRoleByAdmin(adminId).then(response => {
//
let allocRoleList = response.data;
// ID
this.allocRoleIds=[];
//
if(allocRoleList!=null&&allocRoleList.length>0){
// ID ID
for(let i=0;i<allocRoleList.length;i++){
this.allocRoleIds.push(allocRoleList[i].id);
}
@ -337,8 +433,6 @@
});
}
}
}
}
</script>
<style></style>

@ -1,15 +1,20 @@
<template>
<!-- 使用 el-card 组件创建一个表单容器卡片设置阴影效果为无 -->
<el-card class="form-container" shadow="never">
<!-- el-form 表单组件绑定了 menu 数据对象作为表单数据模型同时指定了表单验证规则表单引用以及标签宽度 -->
<el-form :model="menu"
:rules="rules"
ref="menuFrom"
label-width="150px">
<!-- 表单项目标签为菜单名称并指定了对应的数据验证属性 prop title内部的输入框双向绑定 menu.title -->
<el-form-item label="菜单名称:" prop="title">
<el-input v-model="menu.title"></el-input>
</el-form-item>
<!-- 表单项目标签为上级菜单内部是一个下拉选择框双向绑定 menu.parentId设置了占位符 -->
<el-form-item label="上级菜单:">
<el-select v-model="menu.parentId"
placeholder="请选择菜单">
<!-- 通过 v-for 循环渲染下拉选项每个选项的 keylabel value 分别对应 item idtitle id数据来源于 selectMenuList -->
<el-option
v-for="item in selectMenuList"
:key="item.id"
@ -18,22 +23,27 @@
</el-option>
</el-select>
</el-form-item>
<!-- 表单项目标签为前端名称并指定了对应的数据验证属性 prop name内部的输入框双向绑定 menu.name -->
<el-form-item label="前端名称:" prop="name">
<el-input v-model="menu.name"></el-input>
</el-form-item>
<!-- 表单项目标签为前端图标并指定了对应的数据验证属性 prop icon内部包含一个输入框双向绑定 menu.icon 以及一个 svg-icon 组件用于根据输入的图标类名显示图标 -->
<el-form-item label="前端图标:" prop="icon">
<el-input v-model="menu.icon" style="width: 80%"></el-input>
<svg-icon style="margin-left: 8px" :icon-class="menu.icon"></svg-icon>
</el-form-item>
<!-- 表单项目标签为是否显示内部是一个单选按钮组双向绑定 menu.hidden用于选择是否显示该菜单 -->
<el-form-item label="是否显示:">
<el-radio-group v-model="menu.hidden">
<el-radio :label="0"></el-radio>
<el-radio :label="1"></el-radio>
</el-radio-group>
</el-form-item>
<!-- 表单项目标签为排序内部的输入框双向绑定 menu.sort -->
<el-form-item label="排序:">
<el-input v-model="menu.sort"></el-input>
</el-form-item>
<!-- 表单项目包含两个按钮提交按钮为主要类型primary点击时调用 onSubmit 方法并传入表单引用名重置按钮在非编辑状态!isEdit下显示点击时调用 resetForm 方法并传入表单引用名 -->
<el-form-item>
<el-button type="primary" @click="onSubmit('menuFrom')"></el-button>
<el-button v-if="!isEdit" @click="resetForm('menuFrom')"></el-button>
@ -41,20 +51,23 @@
</el-form>
</el-card>
</template>
<script>
import {fetchList, createMenu, updateMenu, getMenu} from '@/api/menu';
// @/api/menu API
import {fetchList, createMenu, updateMenu, getMenu} from '@/api/menu';
const defaultMenu = {
// ID
const defaultMenu = {
title: '',
parentId: 0,
name: '',
icon: '',
hidden: 0,
sort: 0
};
export default {
};
export default {
name: "MenuDetail",
// props isEdit false
props: {
isEdit: {
type: Boolean,
@ -63,8 +76,11 @@
},
data() {
return {
// defaultMenu
menu: Object.assign({}, defaultMenu),
// 使
selectMenuList: [],
//
rules: {
title: [
{required: true, message: '请输入菜单名称', trigger: 'blur'},
@ -82,31 +98,43 @@
}
},
created() {
// props isEdit
if (this.isEdit) {
// API ID menu
getMenu(this.$route.query.id).then(response => {
this.menu = response.data;
});
} else {
//
this.menu = Object.assign({}, defaultMenu);
}
//
this.getSelectMenuList();
},
methods: {
getSelectMenuList() {
// API 100
fetchList(0, {pageSize: 100, pageNum: 1}).then(response => {
// selectMenuList
this.selectMenuList = response.data.list;
// 便
this.selectMenuList.unshift({id: 0, title: '无上级菜单'});
});
},
onSubmit(formName) {
//
this.$refs[formName].validate((valid) => {
if (valid) {
//
this.$confirm('是否提交数据', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
//
if (this.isEdit) {
// API ID
// 1000
updateMenu(this.$route.query.id, this.menu).then(response => {
this.$message({
message: '修改成功',
@ -116,6 +144,8 @@
this.$router.back();
});
} else {
// API
// resetForm 1000
createMenu(this.menu).then(response => {
this.$refs[formName].resetFields();
this.resetForm(formName);
@ -130,6 +160,7 @@
});
} else {
// 1000 false
this.$message({
message: '验证失败',
type: 'error',
@ -140,14 +171,16 @@
});
},
resetForm(formName) {
//
this.$refs[formName].resetFields();
//
this.menu = Object.assign({}, defaultMenu);
//
this.getSelectMenuList();
},
}
}
}
</script>
<style scoped>
/* scoped 属性表示样式仅作用于当前组件内的元素,避免样式冲突 */
</style>

Loading…
Cancel
Save