refactor: 移除ant-design-vue和tailwindcss依赖并优化样式

style: 统一使用css替换scss并调整组件样式
style: 优化组件布局和属性顺序
chore: 更新.gitignore和.eslintrc配置
This commit is contained in:
张翔
2026-03-13 09:55:05 +08:00
parent 9f8bf041c3
commit 2555bf5f55
17 changed files with 901 additions and 1313 deletions
+50 -12
View File
@@ -16,17 +16,51 @@
<el-icon><Search /></el-icon>
</template>
</el-input>
<el-button type="primary" @click="handleSearch">搜索</el-button>
<el-button
type="primary"
@click="handleSearch"
>
搜索
</el-button>
</div>
</div>
</template>
<el-table :data="dataSource" v-loading="loading" style="width: 100%" @sort-change="handleSortChange">
<el-table-column prop="id" label="ID" sortable="custom" />
<el-table-column prop="username" label="用户名" sortable="custom" />
<el-table-column prop="ip" label="IP地址" sortable="custom" />
<el-table-column prop="location" label="登录地点" sortable="custom" />
<el-table-column prop="browser" label="浏览器" sortable="custom" />
<el-table-column prop="os" label="操作系统" sortable="custom" />
<el-table
v-loading="loading"
:data="dataSource"
style="width: 100%"
@sort-change="handleSortChange"
>
<el-table-column
prop="id"
label="ID"
sortable="custom"
/>
<el-table-column
prop="username"
label="用户名"
sortable="custom"
/>
<el-table-column
prop="ip"
label="IP地址"
sortable="custom"
/>
<el-table-column
prop="location"
label="登录地点"
sortable="custom"
/>
<el-table-column
prop="browser"
label="浏览器"
sortable="custom"
/>
<el-table-column
prop="os"
label="操作系统"
sortable="custom"
/>
<el-table-column label="状态">
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'danger'">
@@ -34,17 +68,21 @@
</el-tag>
</template>
</el-table-column>
<el-table-column prop="loginTime" label="登录时间" sortable="custom" />
<el-table-column
prop="loginTime"
label="登录时间"
sortable="custom"
/>
</el-table>
<el-pagination
v-model:current-page="pagination.current"
v-model:page-size="pagination.pageSize"
:page-sizes="[10, 20, 50, 100]"
:total="pagination.total"
@current-change="handleTableChange"
@size-change="handleSizeChange"
layout="total, sizes, prev, pager, next, jumper"
style="margin-top: 16px; justify-content: flex-end"
@current-change="handleTableChange"
@size-change="handleSizeChange"
/>
</el-card>
</div>
@@ -111,7 +149,7 @@ const handleSortChange = ({ prop, order }: any) => {
onMounted(() => fetchData())
</script>
<style scoped lang="scss">
<style scoped lang="css">
.login-log {
.card-header {
display: flex;
@@ -16,16 +16,46 @@
<el-icon><Search /></el-icon>
</template>
</el-input>
<el-button type="primary" @click="handleSearch">搜索</el-button>
<el-button
type="primary"
@click="handleSearch"
>
搜索
</el-button>
</div>
</div>
</template>
<el-table :data="dataSource" v-loading="loading" style="width: 100%" @sort-change="handleSortChange">
<el-table-column prop="id" label="ID" sortable="custom" />
<el-table-column prop="username" label="操作人" sortable="custom" />
<el-table-column prop="operation" label="操作模块" sortable="custom" />
<el-table-column prop="method" label="请求方法" sortable="custom" />
<el-table-column prop="params" label="请求参数" :show-overflow-tooltip="true" />
<el-table
v-loading="loading"
:data="dataSource"
style="width: 100%"
@sort-change="handleSortChange"
>
<el-table-column
prop="id"
label="ID"
sortable="custom"
/>
<el-table-column
prop="username"
label="操作人"
sortable="custom"
/>
<el-table-column
prop="operation"
label="操作模块"
sortable="custom"
/>
<el-table-column
prop="method"
label="请求方法"
sortable="custom"
/>
<el-table-column
prop="params"
label="请求参数"
:show-overflow-tooltip="true"
/>
<el-table-column label="状态">
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'danger'">
@@ -33,18 +63,26 @@
</el-tag>
</template>
</el-table-column>
<el-table-column prop="duration" label="耗时(ms)" sortable="custom" />
<el-table-column prop="createdAt" label="操作时间" sortable="custom" />
<el-table-column
prop="duration"
label="耗时(ms)"
sortable="custom"
/>
<el-table-column
prop="createdAt"
label="操作时间"
sortable="custom"
/>
</el-table>
<el-pagination
v-model:current-page="pagination.current"
v-model:page-size="pagination.pageSize"
:page-sizes="[10, 20, 50, 100]"
:total="pagination.total"
@current-change="handleTableChange"
@size-change="handleSizeChange"
layout="total, sizes, prev, pager, next, jumper"
style="margin-top: 16px; justify-content: flex-end"
@current-change="handleTableChange"
@size-change="handleSizeChange"
/>
</el-card>
</div>
@@ -111,7 +149,7 @@ const handleSortChange = ({ prop, order }: any) => {
onMounted(() => fetchData())
</script>
<style scoped lang="scss">
<style scoped lang="css">
.operation-log {
.card-header {
display: flex;
@@ -4,14 +4,35 @@
<template #header>
<div class="card-title">
<span>参数配置</span>
<el-button type="primary" @click="handleAdd">新增配置</el-button>
<el-button
type="primary"
@click="handleAdd"
>
新增配置
</el-button>
</div>
</template>
<el-table :data="dataSource" v-loading="loading" style="width: 100%">
<el-table-column prop="id" label="ID" />
<el-table-column prop="configName" label="参数名称" />
<el-table-column prop="configKey" label="参数键名" />
<el-table-column prop="configValue" label="参数值" />
<el-table
v-loading="loading"
:data="dataSource"
style="width: 100%"
>
<el-table-column
prop="id"
label="ID"
/>
<el-table-column
prop="configName"
label="参数名称"
/>
<el-table-column
prop="configKey"
label="参数键名"
/>
<el-table-column
prop="configValue"
label="参数值"
/>
<el-table-column label="类型">
<template #default="{ row }">
<el-tag :type="row.configType === 'Y' ? '' : 'info'">
@@ -19,17 +40,41 @@
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="150">
<el-table-column
label="操作"
width="150"
>
<template #default="{ row }">
<el-button type="primary" link size="small" @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link size="small" @click="handleDelete(row)">删除</el-button>
<el-button
type="primary"
link
size="small"
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
size="small"
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-dialog v-model="modalVisible" :title="modalTitle" width="500px">
<el-form :model="formState" label-width="80px">
<el-dialog
v-model="modalVisible"
:title="modalTitle"
width="500px"
>
<el-form
:model="formState"
label-width="80px"
>
<el-form-item label="参数名称">
<el-input v-model="formState.configName" />
</el-form-item>
@@ -41,8 +86,15 @@
</el-form-item>
</el-form>
<template #footer>
<el-button @click="modalVisible = false">取消</el-button>
<el-button type="primary" @click="handleModalOk">确定</el-button>
<el-button @click="modalVisible = false">
取消
</el-button>
<el-button
type="primary"
@click="handleModalOk"
>
确定
</el-button>
</template>
</el-dialog>
</div>
@@ -91,7 +143,9 @@ const handleDelete = async (row: any) => {
await request.delete(`/config/${row.id}`)
ElMessage.success('删除成功')
fetchData()
} catch {}
} catch (error) {
console.error('删除配置失败:', error)
}
}
const handleModalOk = async () => {
@@ -112,7 +166,7 @@ const handleModalOk = async () => {
onMounted(() => fetchData())
</script>
<style scoped lang="scss">
<style scoped lang="css">
.config-management .card-title {
display: flex;
justify-content: space-between;
@@ -4,13 +4,31 @@
<template #header>
<div class="card-title">
<span>字典管理</span>
<el-button type="primary" @click="handleAdd">新增字典</el-button>
<el-button
type="primary"
@click="handleAdd"
>
新增字典
</el-button>
</div>
</template>
<el-table :data="dataSource" v-loading="loading" style="width: 100%">
<el-table-column prop="id" label="ID" />
<el-table-column prop="dictName" label="字典名称" />
<el-table-column prop="dictType" label="字典类型" />
<el-table
v-loading="loading"
:data="dataSource"
style="width: 100%"
>
<el-table-column
prop="id"
label="ID"
/>
<el-table-column
prop="dictName"
label="字典名称"
/>
<el-table-column
prop="dictType"
label="字典类型"
/>
<el-table-column label="状态">
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'danger'">
@@ -18,18 +36,45 @@
</el-tag>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" />
<el-table-column label="操作" width="200">
<el-table-column
prop="remark"
label="备注"
/>
<el-table-column
label="操作"
width="200"
>
<template #default="{ row }">
<el-button type="primary" link size="small" @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link size="small" @click="handleDelete(row)">删除</el-button>
<el-button
type="primary"
link
size="small"
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
size="small"
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-dialog v-model="modalVisible" :title="modalTitle" width="500px">
<el-form :model="formState" label-width="80px">
<el-dialog
v-model="modalVisible"
:title="modalTitle"
width="500px"
>
<el-form
:model="formState"
label-width="80px"
>
<el-form-item label="字典名称">
<el-input v-model="formState.dictName" />
</el-form-item>
@@ -38,17 +83,33 @@
</el-form-item>
<el-form-item label="状态">
<el-select v-model="formState.status">
<el-option value="0" label="正常" />
<el-option value="1" label="停用" />
<el-option
value="0"
label="正常"
/>
<el-option
value="1"
label="停用"
/>
</el-select>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="formState.remark" type="textarea" />
<el-input
v-model="formState.remark"
type="textarea"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="modalVisible = false">取消</el-button>
<el-button type="primary" @click="handleModalOk">确定</el-button>
<el-button @click="modalVisible = false">
取消
</el-button>
<el-button
type="primary"
@click="handleModalOk"
>
确定
</el-button>
</template>
</el-dialog>
</div>
@@ -94,10 +155,12 @@ const handleDelete = async (row: any) => {
cancelButtonText: '取消',
type: 'warning'
})
await request.delete(`/dict/types/${row.id}`)
await request.delete(`/dict/${row.id}`)
ElMessage.success('删除成功')
fetchData()
} catch {}
} catch (error) {
console.error('删除字典失败:', error)
}
}
const handleModalOk = async () => {
@@ -118,7 +181,7 @@ const handleModalOk = async () => {
onMounted(() => fetchData())
</script>
<style scoped lang="scss">
<style scoped lang="css">
.dict-management .card-title {
display: flex;
justify-content: space-between;
@@ -4,17 +4,33 @@
<template #header>
<div class="card-title">
<span>文件管理</span>
<el-upload :before-upload="handleUpload" :show-file-list="false">
<el-upload
:before-upload="handleUpload"
:show-file-list="false"
>
<el-button type="primary">
<el-icon><Upload /></el-icon> 上传文件
</el-button>
</el-upload>
</div>
</template>
<el-table :data="dataSource" v-loading="loading" style="width: 100%">
<el-table-column prop="id" label="ID" />
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="fileSize" label="文件大小" />
<el-table
v-loading="loading"
:data="dataSource"
style="width: 100%"
>
<el-table-column
prop="id"
label="ID"
/>
<el-table-column
prop="fileName"
label="文件名"
/>
<el-table-column
prop="fileSize"
label="文件大小"
/>
<el-table-column label="文件类型">
<template #default="{ row }">
<el-tag :type="getFileTypeTag(row.fileType)">
@@ -22,12 +38,35 @@
</el-tag>
</template>
</el-table-column>
<el-table-column prop="storageType" label="存储方式" />
<el-table-column prop="createdAt" label="上传时间" />
<el-table-column label="操作" width="150">
<el-table-column
prop="storageType"
label="存储方式"
/>
<el-table-column
prop="createdAt"
label="上传时间"
/>
<el-table-column
label="操作"
width="150"
>
<template #default="{ row }">
<el-button type="primary" link size="small" @click="handleDownload(row)">下载</el-button>
<el-button type="danger" link size="small" @click="handleDelete(row)">删除</el-button>
<el-button
type="primary"
link
size="small"
@click="handleDownload(row)"
>
下载
</el-button>
<el-button
type="danger"
link
size="small"
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
@@ -83,7 +122,9 @@ const handleDelete = async (row: any) => {
await request.delete(`/files/${row.id}`)
ElMessage.success('删除成功')
fetchData()
} catch {}
} catch (error) {
console.error('删除文件失败:', error)
}
}
const getFileTypeName = (fileType: string) => {
@@ -111,7 +152,7 @@ const getFileTypeTag = (fileType: string): '' | 'success' | 'warning' | 'danger'
onMounted(() => fetchData())
</script>
<style scoped lang="scss">
<style scoped lang="css">
.file-management .card-title {
display: flex;
justify-content: space-between;
@@ -4,60 +4,131 @@
<template #header>
<div class="card-title">
<span>通知公告</span>
<el-button type="primary" @click="handleAdd">新增公告</el-button>
<el-button
type="primary"
@click="handleAdd"
>
新增公告
</el-button>
</div>
</template>
<el-table :data="dataSource" v-loading="loading" style="width: 100%">
<el-table-column prop="id" label="ID" />
<el-table-column prop="noticeTitle" label="公告标题" />
<el-table-column label="公告类型" width="100">
<el-table
v-loading="loading"
:data="dataSource"
style="width: 100%"
>
<el-table-column
prop="id"
label="ID"
/>
<el-table-column
prop="noticeTitle"
label="公告标题"
/>
<el-table-column
label="公告类型"
width="100"
>
<template #default="{ row }">
<el-tag :type="row.noticeType === '1' ? '' : 'success'">
{{ row.noticeType === '1' ? '通知' : '公告' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="状态" width="80">
<el-table-column
label="状态"
width="80"
>
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'danger'">
{{ row.status === '0' ? '正常' : '停用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createdAt" label="发布时间" />
<el-table-column label="操作" width="150">
<el-table-column
prop="createdAt"
label="发布时间"
/>
<el-table-column
label="操作"
width="150"
>
<template #default="{ row }">
<el-button type="primary" link size="small" @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link size="small" @click="handleDelete(row)">删除</el-button>
<el-button
type="primary"
link
size="small"
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
size="small"
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-dialog v-model="modalVisible" :title="modalTitle" width="500px">
<el-form :model="formState" label-width="80px">
<el-dialog
v-model="modalVisible"
:title="modalTitle"
width="500px"
>
<el-form
:model="formState"
label-width="80px"
>
<el-form-item label="公告标题">
<el-input v-model="formState.noticeTitle" />
</el-form-item>
<el-form-item label="公告类型">
<el-select v-model="formState.noticeType">
<el-option value="1" label="通知" />
<el-option value="2" label="公告" />
<el-option
value="1"
label="通知"
/>
<el-option
value="2"
label="公告"
/>
</el-select>
</el-form-item>
<el-form-item label="公告内容">
<el-input v-model="formState.noticeContent" type="textarea" :rows="4" />
<el-input
v-model="formState.noticeContent"
type="textarea"
:rows="4"
/>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="formState.status">
<el-option value="0" label="正常" />
<el-option value="1" label="停用" />
<el-option
value="0"
label="正常"
/>
<el-option
value="1"
label="停用"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="modalVisible = false">取消</el-button>
<el-button type="primary" @click="handleModalOk">确定</el-button>
<el-button @click="modalVisible = false">
取消
</el-button>
<el-button
type="primary"
@click="handleModalOk"
>
确定
</el-button>
</template>
</el-dialog>
</div>
@@ -103,10 +174,12 @@ const handleDelete = async (row: any) => {
cancelButtonText: '取消',
type: 'warning'
})
await request.delete(`/notices/${row.id}`)
await request.delete(`/notice/${row.id}`)
ElMessage.success('删除成功')
fetchData()
} catch {}
} catch (error) {
console.error('删除通知失败:', error)
}
}
const handleModalOk = async () => {
@@ -127,7 +200,7 @@ const handleModalOk = async () => {
onMounted(() => fetchData())
</script>
<style scoped lang="scss">
<style scoped lang="css">
.notice-management .card-title {
display: flex;
justify-content: space-between;
@@ -3,7 +3,10 @@
<el-row :gutter="16">
<el-col :span="6">
<el-card v-loading="loading">
<el-statistic title="用户总数" :value="stats.userCount">
<el-statistic
title="用户总数"
:value="stats.userCount"
>
<template #prefix>
<el-icon><User /></el-icon>
</template>
@@ -12,7 +15,10 @@
</el-col>
<el-col :span="6">
<el-card v-loading="loading">
<el-statistic title="角色总数" :value="stats.roleCount">
<el-statistic
title="角色总数"
:value="stats.roleCount"
>
<template #prefix>
<el-icon><UserFilled /></el-icon>
</template>
@@ -21,7 +27,10 @@
</el-col>
<el-col :span="6">
<el-card v-loading="loading">
<el-statistic title="今日登录" :value="stats.todayLogin">
<el-statistic
title="今日登录"
:value="stats.todayLogin"
>
<template #prefix>
<el-icon><ArrowRight /></el-icon>
</template>
@@ -30,7 +39,10 @@
</el-col>
<el-col :span="6">
<el-card v-loading="loading">
<el-statistic title="操作日志" :value="stats.operationLog">
<el-statistic
title="操作日志"
:value="stats.operationLog"
>
<template #prefix>
<el-icon><Document /></el-icon>
</template>
@@ -38,9 +50,15 @@
</el-card>
</el-col>
</el-row>
<el-row :gutter="16" style="margin-top: 16px">
<el-row
:gutter="16"
style="margin-top: 16px"
>
<el-col :span="12">
<el-card title="最近登录" v-loading="loading">
<el-card
v-loading="loading"
title="最近登录"
>
<el-timeline>
<el-timeline-item
v-for="item in recentLogins"
@@ -54,12 +72,26 @@
</el-card>
</el-col>
<el-col :span="12">
<el-card title="系统信息" v-loading="loading">
<el-descriptions :column="1" border>
<el-descriptions-item label="系统版本">{{ systemInfo.version }}</el-descriptions-item>
<el-descriptions-item label="Java版本">{{ systemInfo.javaVersion }}</el-descriptions-item>
<el-descriptions-item label="前端框架">{{ systemInfo.frontendFramework }}</el-descriptions-item>
<el-descriptions-item label="数据库">{{ systemInfo.database }}</el-descriptions-item>
<el-card
v-loading="loading"
title="系统信息"
>
<el-descriptions
:column="1"
border
>
<el-descriptions-item label="系统版本">
{{ systemInfo.version }}
</el-descriptions-item>
<el-descriptions-item label="Java版本">
{{ systemInfo.javaVersion }}
</el-descriptions-item>
<el-descriptions-item label="前端框架">
{{ systemInfo.frontendFramework }}
</el-descriptions-item>
<el-descriptions-item label="数据库">
{{ systemInfo.database }}
</el-descriptions-item>
</el-descriptions>
</el-card>
</el-col>
@@ -127,7 +159,7 @@ onMounted(() => {
})
</script>
<style scoped lang="scss">
<style scoped lang="css">
.dashboard {
padding: 16px;
}
+19 -6
View File
@@ -6,25 +6,38 @@
</template>
<el-form
:model="formState"
@submit.prevent="onFinish"
label-position="top"
@submit.prevent="onFinish"
>
<el-form-item
label="用户名"
prop="username"
:rules="[{ required: true, message: '请输入用户名', trigger: 'blur' }]"
>
<el-input v-model="formState.username" placeholder="请输入用户名" />
<el-input
v-model="formState.username"
placeholder="请输入用户名"
/>
</el-form-item>
<el-form-item
label="密码"
prop="password"
:rules="[{ required: true, message: '请输入密码', trigger: 'blur' }]"
>
<el-input v-model="formState.password" type="password" placeholder="请输入密码" show-password />
<el-input
v-model="formState.password"
type="password"
placeholder="请输入密码"
show-password
/>
</el-form-item>
<el-form-item>
<el-button type="primary" native-type="submit" :loading="loading" style="width: 100%">
<el-button
type="primary"
native-type="submit"
:loading="loading"
style="width: 100%"
>
登录
</el-button>
</el-form-item>
@@ -63,13 +76,13 @@ const onFinish = async () => {
}
</script>
<style scoped lang="scss">
<style scoped lang="css">
.login-container {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background: var(--el-color-primary-light-9);
.login-card {
width: 400px;
@@ -4,56 +4,131 @@
<template #header>
<div class="card-title">
<span>菜单管理</span>
<el-button type="primary" @click="handleAdd">新增菜单</el-button>
<el-button
type="primary"
@click="handleAdd"
>
新增菜单
</el-button>
</div>
</template>
<el-table :data="dataSource" v-loading="loading" :pagination="false" row-key="id" style="width: 100%">
<el-table-column prop="menuName" label="菜单名称" />
<el-table-column label="菜单类型" width="100">
<el-table
v-loading="loading"
:data="dataSource"
:pagination="false"
row-key="id"
style="width: 100%"
>
<el-table-column
prop="menuName"
label="菜单名称"
/>
<el-table-column
label="菜单类型"
width="100"
>
<template #default="{ row }">
<el-tag :type="row.menuType === 'M' ? '' : row.menuType === 'C' ? 'success' : 'warning'">
{{ row.menuType === 'M' ? '目录' : row.menuType === 'C' ? '菜单' : '按钮' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="perms" label="权限标识" />
<el-table-column prop="component" label="组件" />
<el-table-column prop="orderNum" label="排序" width="80" />
<el-table-column label="状态" width="80">
<el-table-column
prop="perms"
label="权限标识"
/>
<el-table-column
prop="component"
label="组件"
/>
<el-table-column
prop="orderNum"
label="排序"
width="80"
/>
<el-table-column
label="状态"
width="80"
>
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'danger'">
{{ row.status === '0' ? '显示' : '隐藏' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="150">
<el-table-column
label="操作"
width="150"
>
<template #default="{ row }">
<el-button type="primary" link size="small" @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link size="small" @click="handleDelete(row)">删除</el-button>
<el-button
type="primary"
link
size="small"
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
size="small"
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-dialog v-model="modalVisible" :title="modalTitle" width="500px">
<el-form :model="formState" label-width="100px">
<el-dialog
v-model="modalVisible"
:title="modalTitle"
width="500px"
>
<el-form
:model="formState"
label-width="100px"
>
<el-form-item label="菜单名称">
<el-input v-model="formState.menuName" />
</el-form-item>
<el-form-item label="父级菜单">
<el-tree-select v-model="formState.parentId" :data="menuTree" placeholder="请选择父级菜单" clearable check-strictly />
<el-tree-select
v-model="formState.parentId"
:data="menuTree"
placeholder="请选择父级菜单"
clearable
check-strictly
/>
</el-form-item>
<el-form-item label="菜单类型">
<el-select v-model="formState.menuType">
<el-option value="M" label="目录" />
<el-option value="C" label="菜单" />
<el-option value="F" label="按钮" />
<el-option
value="M"
label="目录"
/>
<el-option
value="C"
label="菜单"
/>
<el-option
value="F"
label="按钮"
/>
</el-select>
</el-form-item>
<el-form-item label="路由地址" v-if="formState.menuType !== 'F'">
<el-form-item
v-if="formState.menuType !== 'F'"
label="路由地址"
>
<el-input v-model="formState.perms" />
</el-form-item>
<el-form-item label="组件路径" v-if="formState.menuType === 'C'">
<el-form-item
v-if="formState.menuType === 'C'"
label="组件路径"
>
<el-input v-model="formState.component" />
</el-form-item>
<el-form-item label="排序">
@@ -61,14 +136,27 @@
</el-form-item>
<el-form-item label="状态">
<el-select v-model="formState.status">
<el-option value="0" label="显示" />
<el-option value="1" label="隐藏" />
<el-option
value="0"
label="显示"
/>
<el-option
value="1"
label="隐藏"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="modalVisible = false">取消</el-button>
<el-button type="primary" @click="handleModalOk">确定</el-button>
<el-button @click="modalVisible = false">
取消
</el-button>
<el-button
type="primary"
@click="handleModalOk"
>
确定
</el-button>
</template>
</el-dialog>
</div>
@@ -125,7 +213,9 @@ const handleDelete = async (row: any) => {
await request.delete(`/menus/${row.id}`)
ElMessage.success('删除成功')
fetchData()
} catch {}
} catch (error) {
console.error('删除菜单失败:', error)
}
}
const handleModalOk = async () => {
@@ -146,7 +236,7 @@ const handleModalOk = async () => {
onMounted(() => fetchData())
</script>
<style scoped lang="scss">
<style scoped lang="css">
.menu-management .card-title {
display: flex;
justify-content: space-between;
@@ -16,16 +16,47 @@
<el-icon><Search /></el-icon>
</template>
</el-input>
<el-button type="primary" @click="handleSearch">搜索</el-button>
<el-button
type="primary"
@click="handleSearch"
>
搜索
</el-button>
</div>
<el-button type="primary" @click="handleAdd">新增角色</el-button>
<el-button
type="primary"
@click="handleAdd"
>
新增角色
</el-button>
</div>
</template>
<el-table :data="dataSource" v-loading="loading" style="width: 100%" @sort-change="handleSortChange">
<el-table-column prop="id" label="ID" sortable="custom" />
<el-table-column prop="roleName" label="角色名称" sortable="custom" />
<el-table-column prop="roleKey" label="角色标识" sortable="custom" />
<el-table-column prop="roleSort" label="排序" sortable="custom" />
<el-table
v-loading="loading"
:data="dataSource"
style="width: 100%"
@sort-change="handleSortChange"
>
<el-table-column
prop="id"
label="ID"
sortable="custom"
/>
<el-table-column
prop="roleName"
label="角色名称"
sortable="custom"
/>
<el-table-column
prop="roleKey"
label="角色标识"
sortable="custom"
/>
<el-table-column
prop="roleSort"
label="排序"
sortable="custom"
/>
<el-table-column label="状态">
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'danger'">
@@ -33,11 +64,30 @@
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createdAt" label="创建时间" sortable="custom" />
<el-table-column label="操作" width="200">
<el-table-column
prop="createdAt"
label="创建时间"
sortable="custom"
/>
<el-table-column
label="操作"
width="200"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-button
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
@@ -46,15 +96,22 @@
v-model:page-size="pagination.pageSize"
:page-sizes="[10, 20, 50, 100]"
:total="pagination.total"
@current-change="handleTableChange"
@size-change="handleSizeChange"
layout="total, sizes, prev, pager, next, jumper"
style="margin-top: 16px; justify-content: flex-end"
@current-change="handleTableChange"
@size-change="handleSizeChange"
/>
</el-card>
<el-dialog v-model="modalVisible" :title="modalTitle" width="500px">
<el-form :model="formState" label-width="80px">
<el-dialog
v-model="modalVisible"
:title="modalTitle"
width="500px"
>
<el-form
:model="formState"
label-width="80px"
>
<el-form-item label="角色名称">
<el-input v-model="formState.roleName" />
</el-form-item>
@@ -66,14 +123,27 @@
</el-form-item>
<el-form-item label="状态">
<el-select v-model="formState.status">
<el-option value="0" label="正常" />
<el-option value="1" label="禁用" />
<el-option
value="0"
label="正常"
/>
<el-option
value="1"
label="禁用"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="modalVisible = false">取消</el-button>
<el-button type="primary" @click="handleModalOk">确定</el-button>
<el-button @click="modalVisible = false">
取消
</el-button>
<el-button
type="primary"
@click="handleModalOk"
>
确定
</el-button>
</template>
</el-dialog>
</div>
@@ -164,7 +234,9 @@ const handleDelete = async (row: any) => {
await request.delete(`/roles/${row.id}`)
ElMessage.success('删除成功')
fetchData()
} catch {}
} catch (error) {
console.error('删除角色失败:', error)
}
}
const handleModalOk = async () => {
@@ -185,7 +257,7 @@ const handleModalOk = async () => {
onMounted(() => fetchData())
</script>
<style scoped lang="scss">
<style scoped lang="css">
.role-management {
.card-header {
display: flex;
@@ -16,33 +16,82 @@
<el-icon><Search /></el-icon>
</template>
</el-input>
<el-button type="primary" @click="handleSearch">搜索</el-button>
<el-button
type="primary"
@click="handleSearch"
>
搜索
</el-button>
</div>
<el-button type="primary" @click="handleAdd">新增用户</el-button>
<el-button
type="primary"
@click="handleAdd"
>
新增用户
</el-button>
</div>
</template>
<el-table
:data="dataSource"
v-loading="loading"
:data="dataSource"
style="width: 100%"
@sort-change="handleSortChange"
>
<el-table-column prop="id" label="ID" width="80" sortable="custom" />
<el-table-column prop="username" label="用户名" sortable="custom" />
<el-table-column prop="email" label="邮箱" sortable="custom" />
<el-table-column prop="phone" label="手机号" sortable="custom" />
<el-table-column label="状态" width="100">
<el-table-column
prop="id"
label="ID"
width="80"
sortable="custom"
/>
<el-table-column
prop="username"
label="用户名"
sortable="custom"
/>
<el-table-column
prop="email"
label="邮箱"
sortable="custom"
/>
<el-table-column
prop="phone"
label="手机号"
sortable="custom"
/>
<el-table-column
label="状态"
width="100"
>
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'danger'">
{{ row.status === '0' ? '正常' : '禁用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createdAt" label="创建时间" sortable="custom" />
<el-table-column label="操作" width="200">
<el-table-column
prop="createdAt"
label="创建时间"
sortable="custom"
/>
<el-table-column
label="操作"
width="200"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-button
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
@@ -51,10 +100,10 @@
v-model:page-size="pagination.pageSize"
:page-sizes="[10, 20, 50, 100]"
:total="pagination.total"
@current-change="handleTableChange"
@size-change="handleSizeChange"
layout="total, sizes, prev, pager, next, jumper"
style="margin-top: 16px; justify-content: flex-end"
@current-change="handleTableChange"
@size-change="handleSizeChange"
/>
</el-card>
@@ -78,14 +127,27 @@
</el-form-item>
<el-form-item label="状态">
<el-select v-model="formState.status">
<el-option value="0" label="正常" />
<el-option value="1" label="禁用" />
<el-option
value="0"
label="正常"
/>
<el-option
value="1"
label="禁用"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="handleModalCancel">取消</el-button>
<el-button type="primary" @click="handleModalOk">确定</el-button>
<el-button @click="handleModalCancel">
取消
</el-button>
<el-button
type="primary"
@click="handleModalOk"
>
确定
</el-button>
</template>
</el-dialog>
</div>
@@ -212,7 +274,7 @@ onMounted(() => {
})
</script>
<style scoped lang="scss">
<style scoped lang="css">
.user-management {
.card-header {
display: flex;