权限增删改查

This commit is contained in:
bunny 2025-07-13 22:50:40 +08:00
parent 7652b505f7
commit 90b6a285b3
7 changed files with 338 additions and 9 deletions

View File

@ -25,4 +25,9 @@ public class WebController {
public String showRolePage() {
return "rolePage";
}
@GetMapping("/permission")
public String showPermissionPage() {
return "permissionPage";
}
}

View File

@ -1,4 +1,4 @@
/* 提高 Antd Message 的 z-index */
/* 提高 Antd Message 的 z-index,让提示框为最上层 */
.ant-message {
z-index: 1100 !important;
}

View File

@ -0,0 +1,97 @@
const DialogPermission = defineComponent({
name: "DialogPermission",
template: `
<div class="modal fade" id="permissionBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1"
aria-labelledby="permissionBackdropLabel" ref="modalRef">
<div class="modal-dialog">
<div class="modal-content">
<!-- 头部 -->
<div class="modal-header">
<h5 class="modal-title">{{isAdd?"新增权限":"修改权限"}}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form @submit.prevent="onSubmit">
<!-- 内容 -->
<div class="modal-body">
<div class="mb-3">
<label class="form-label" for="dialogPermissionCode"><i class="fas fa-user-alt me-1"></i></label>
<input autocomplete="false" class="form-control" id="dialogPermissionCode" placeholder="请输入权限码"
type="text" v-model="form.permissionCode" required>
<div class="form-text">在这里输入你的权限码</div>
</div>
<div class="mb-3">
<label class="form-label" for="dialogDescription"><i class="fas fa-user-alt me-1"></i></label>
<input autocomplete="false" class="form-control" id="dialogDescription" placeholder="请输入描述"
type="text" v-model="form.description" required>
<div class="form-text">在这里输入你的描述</div>
</div>
<div class="mb-3">
<label class="form-label" for="dialogRemark"><i class="fas fa-user-alt me-1"></i></label>
<input autocomplete="false" class="form-control" id="dialogRemark" placeholder="请输入简述"
type="text" v-model="form.remark" required>
<div class="form-text">在这里输入你的简述</div>
</div>
</div>
<!-- 底部 -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button type="submit" class="btn btn-primary">确认</button>
</div>
</form>
</div>
</div>
</div>
`,
props: {
// 是否添加
isAdd: {type: Boolean, default: false},
// 权限信息
permissionInfo: {type: Object, required: true},
// 加载函数
onSearch: {type: Function, required: true},
},
data() {
return {
modalInstance: ref(null),
form: ref({}),
}
},
methods: {
async onSubmit() {
// 是否添加表单
const {code, message} = this.isAdd ?
await axiosInstance.post("/permission", this.form) :
await axiosInstance.put("/permission", this.form);
if (code === 200) {
antd.message.success(message);
// 关闭模态框
this.modalInstance.hide();
this.onSearch();
}
}
},
watch: {
permissionInfo(val) {
// 创建深拷贝,而不是直接赋值
this.form = JSON.parse(JSON.stringify(val));
}
},
mounted() {
// 初始化模态框实例
const modalEl = this.$refs.modalRef;
this.modalInstance = new bootstrap.Modal(modalEl, {
backdrop: 'static',
keyboard: false
});
},
beforeUnmount() {
// 组件销毁时清理模态框实例
if (this.modalInstance) {
this.modalInstance.dispose();
}
}
});

View File

@ -16,10 +16,10 @@ const DialogRole = defineComponent({
<!-- 内容 -->
<div class="modal-body">
<div class="mb-3">
<label class="form-label" for="dialogRoleCode"><i class="fas fa-user-alt me-1"></i></label>
<label class="form-label" for="dialogRoleCode"><i class="fas fa-user-alt me-1"></i></label>
<input autocomplete="false" class="form-control" id="dialogRoleCode" placeholder="请输入角色名"
type="text" v-model="form.roleCode" required>
<div class="form-text">在这里输入你的角色</div>
<div class="form-text">在这里输入你的角色</div>
</div>
<div class="mb-3">
<label class="form-label" for="dialogDescription"><i class="fas fa-user-alt me-1"></i></label>

View File

@ -0,0 +1,227 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<!-- Bootstrap CSS -->
<link rel="stylesheet" th:href="@{/webjars/bootstrap/5.1.3/css/bootstrap.min.css}">
<!-- Font Awesome -->
<link rel="stylesheet" th:href="@{/webjars/font-awesome/5.15.4/css/all.min.css}">
<link rel="stylesheet" th:href="@{/src/lib/css/style.css}">
<link rel="stylesheet" th:href="@{/src/lib/css/tablePage.css}">
<!-- Vue3 -->
<script th:src="@{/src/lib/js/vue/vue.global.js}"></script>
<!-- Bootstrap JS Bundle with Popper -->
<script th:src="@{/webjars/bootstrap/5.1.3/js/bootstrap.bundle.min.js}"></script>
<!-- 本地引入 popper JS -->
<script th:src="@{/src/lib/js/boostrap/popper.min.js}"></script>
<!-- 本地引入 axios JS -->
<script th:src="@{/src/lib/js/axios/axios.min.js}"></script>
<!-- 引入dayjs -->
<script th:src="@{/src/lib/js/dayjs/dayjs.min.js}"></script>
<script th:src="@{/src/lib/js/dayjs/customParseFormat.js}"></script>
<script th:src="@{/src/lib/js/dayjs/weekday.js}"></script>
<script th:src="@{/src/lib/js/dayjs/localeData.js}"></script>
<script th:src="@{/src/lib/js/dayjs/weekOfYear.js}"></script>
<script th:src="@{/src/lib/js/dayjs/weekYear.js}"></script>
<script th:src="@{/src/lib/js/dayjs/advancedFormat.js}"></script>
<script th:src="@{/src/lib/js/dayjs/quarterOfYear.js}"></script>
<!-- 引入 antd JS -->
<script th:src="@{/src/lib/js/dayjs/antd.min.js}"></script>
<title>权限管理页面</title>
</head>
<body>
<div class="container-fluid" id="app">
<dialog-permission :is-add="isAdd" :on-search="onSearch"
:permission-info="permissionInfo"></dialog-permission>
<!-- 头部 -->
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<span><i class="fas fa-search me-2"></i>权限查询</span>
</div>
<div class="card-body">
<form @reset="onRest" @submit.prevent="onSearch">
<div class="row g-3 align-items-center">
<div class="col-md-4">
<label class="form-label" for="permissionCode"><i
class="fas fa-power-off me-1"></i>权限码</label>
<input autocomplete="false" class="form-control" id="permissionCode" placeholder="请输入权限码"
type="text" v-model="searchForm.permissionCode">
</div>
<div class="col-md-4">
<label class="form-label" for="description"><i class="fas fa-text-width me-1"></i>描述</label>
<input autocomplete="false" class="form-control" id="description" placeholder="请输入描述"
type="text" v-model="searchForm.description">
</div>
<div class="col-md-4">
<label class="form-label" for="remark"><i class="fas fa-info me-1"></i>简述</label>
<input autocomplete="false" class="form-control" id="remark" placeholder="请输入简述"
type="text" v-model="searchForm.remark">
</div>
<div class="col-md-4">
<div class="search-btn-group">
<button class="btn btn-primary" type="submit">
<i class="fas fa-search me-1"></i>查询
</button>
<button class="btn btn-outline-secondary" type="reset">
<i class="fas fa-redo me-1"></i>重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
<!-- 表格 -->
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<span><i class="fas fa-power-off me-2"></i>权限列表</span>
<button @click="onAdd" class="btn btn-sm btn-success"
data-bs-target="#permissionBackdrop" data-bs-toggle="modal">
<i class="fas fa-plus me-1"></i>新增权限
</button>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover">
<thead class="table-light">
<tr>
<th scope="col" width="5%">#</th>
<th scope="col" width="15%">权限名</th>
<th scope="col" width="15%">描述</th>
<th scope="col" width="15%">简述</th>
<th scope="col" width="15%">创建时间</th>
<th scope="col" width="15%">更新时间</th>
<th scope="col" width="20%">操作</th>
</tr>
</thead>
<tbody>
<tr :key="permission.id" v-for="(permission,index) in dataList">
<th scope="row">{{index + 1}}</th>
<td>{{permission.permissionCode}}</td>
<td>{{permission.description}}</td>
<td>{{permission.remark}}</td>
<td>{{formatDate(permission.createTime)}}</td>
<td>{{formatDate(permission.updateTime)}}</td>
<td>
<div class="btn-group btn-group-sm" role="group">
<button @click="onEdit(permission)" class="btn btn-outline-primary btn-action"
data-bs-target="#permissionBackdrop" data-bs-toggle="modal">
<i class="fas fa-edit"></i> 修改
</button>
<button @click="onDeleted(permission)" class="btn btn-outline-danger btn-action">
<i class="fas fa-trash"></i> 删除
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- 表格分页 -->
<pagination :on-search="onSearch" v-model:pagination="searchForm"></pagination>
</div>
</div>
</div>
</body>
<!-- 设置 popper 提示框 -->
<script th:src="@{/src/config/popper-config.js}"></script>
<!-- 加载全局axios配置 -->
<script th:src="@{/src/config/axios-config.js}"></script>
<!-- 分页 -->
<script th:src="@{/src/components/Pagination.js}"></script>
<!-- 权限表单 -->
<script th:src="@{/src/views/permission/DialogPermission.js}"></script>
<script>
const {createApp, ref} = Vue;
const app = createApp({
data() {
return {
// 查询表单
searchForm: ref({
permissionCode: undefined,
email: undefined,
pageNo: 1,
pageSize: 30,
pages: 0
}),
// 权限信息
permissionInfo: ref({}),
// 弹窗标题
isAdd: ref(false),
// 查询权限列表
dataList: ref([])
};
},
computed: {},
methods: {
/* 格式化时间 */
formatDate(date) {
return dayjs(date).format('YYYY-MM-DD HH:mm:ss');
},
/* 加载数据 */
async onSearch() {
const {pageNo, pageSize} = this.searchForm;
// 查询数据
const {data} = await axiosInstance.get(`/permission/${pageNo}/${pageSize}`, {params: this.searchForm})
// 赋值数据
this.dataList = data.list;
// 设置分页内容
this.searchForm.pageNo = data.pageNo;
this.searchForm.pageSize = data.pageSize;
this.searchForm.pages = data.pages;
},
/* 重制表单 */
onRest() {
this.searchForm.permissionCode = undefined;
this.searchForm.email = undefined;
this.onSearch();
},
/* 添加 */
onAdd() {
this.isAdd = true;
this.permissionInfo = {};
},
/* 修改 */
onEdit(permission) {
this.isAdd = false;
this.permissionInfo = permission;
},
/* 删除 */
async onDeleted(permission) {
const result = confirm("确认删除?");
if (!result) return false;
// 删除权限
const {code, message} = await axiosInstance.delete(`/permission`, {data: [permission.id]});
if (code === 200) {
await this.onSearch();
antd.message.success(message);
} else {
antd.message.error(message);
}
},
},
mounted() {
this.onSearch();
},
});
app.component('Pagination', Pagination)
app.component('DialogPermission', DialogPermission)
app.mount('#app');
</script>
</html>

View File

@ -29,11 +29,11 @@
<!-- 引入 antd JS -->
<script th:src="@{/src/lib/js/dayjs/antd.min.js}"></script>
<title>角色管理系统</title>
<title>角色管理页面</title>
</head>
<body>
<div class="container-fluid" id="app">
<dialog-role :is-add="dialogFormFlag" :on-search="onSearch" :role-info="roleInfo"></dialog-role>
<dialog-role :is-add="isAdd" :on-search="onSearch" :role-info="roleInfo"></dialog-role>
<!-- 头部 -->
<div class="card">
@ -152,7 +152,7 @@
// 角色信息
roleInfo: ref({}),
// 弹窗标题
dialogFormFlag: ref(false),
isAdd: ref(false),
// 查询角色列表
dataList: ref([])
};
@ -189,13 +189,13 @@
/* 添加 */
onAdd() {
this.dialogFormFlag = true;
this.isAdd = true;
this.roleInfo = {};
},
/* 修改 */
onEdit(roleInfo) {
this.dialogFormFlag = false;
this.isAdd = false;
this.roleInfo = roleInfo;
},

View File

@ -29,7 +29,7 @@
<!-- 引入 antd JS -->
<script th:src="@{/src/lib/js/dayjs/antd.min.js}"></script>
<title>用户管理系统</title>
<title>用户管理页面</title>
</head>
<body>
<div class="container-fluid" id="app">