Merge pull request #100 from 1014TaoTao/v2.0.0

feat: 优化前端组件样式及功能
This commit is contained in:
fastapiadmin
2025-07-26 11:51:36 +08:00
committed by GitHub
28 changed files with 190 additions and 290 deletions
@@ -23,7 +23,7 @@ class OperationLogModel(ModelBase):
request_browser = Column(String(64), nullable=True, comment="浏览器") request_browser = Column(String(64), nullable=True, comment="浏览器")
response_code = Column(Integer, nullable=True, comment="响应状态码") response_code = Column(Integer, nullable=True, comment="响应状态码")
response_json = Column(Text, nullable=True, comment="响应体") response_json = Column(Text, nullable=True, comment="响应体")
process_time = Column(Float, nullable=True, comment="处理时间") process_time = Column(String(20), nullable=True, comment="处理时间")
# 审计字段 # 审计字段
description = Column(Text, nullable=True, comment="备注说明") description = Column(Text, nullable=True, comment="备注说明")
@@ -18,7 +18,7 @@ class OperationLogCreateSchema(BaseModel):
request_browser: Optional[str] = Field(default=None, description="请求浏览器") request_browser: Optional[str] = Field(default=None, description="请求浏览器")
response_code: Optional[int] = Field(default=None, description="响应状态码") response_code: Optional[int] = Field(default=None, description="响应状态码")
response_json: Optional[str] = Field(default=None, description="响应 JSON 数据") response_json: Optional[str] = Field(default=None, description="响应 JSON 数据")
process_time: Optional[float] = Field(default=None, description="处理时间") process_time: Optional[str] = Field(default=None, description="处理时间")
description: Optional[str] = Field(default=None, max_length=255, description="备注") description: Optional[str] = Field(default=None, max_length=255, description="备注")
creator_id: Optional[int] = Field(default=None, description="创建人ID") creator_id: Optional[int] = Field(default=None, description="创建人ID")
@@ -414,13 +414,16 @@ class UserService:
# 定义字段映射 # 定义字段映射
mapping_dict = { mapping_dict = {
'id': '用户编号', 'id': '用户编号',
'avatar': '头像',
'username': '用户名称', 'username': '用户名称',
'name': '用户昵称', 'name': '用户昵称',
'dept_name': '部门', 'dept_name': '部门',
'email': '邮箱地址', 'email': '邮箱',
'mobile': '手机号', 'mobile': '手机号',
'gender': '性别', 'gender': '性别',
'status': '状态', 'status': '状态',
'is_superuser': '是否超级管理员',
'last_login': '最后登录时间',
'description': '备注', 'description': '备注',
'created_at': '创建时间', 'created_at': '创建时间',
'updated_at': '更新时间', 'updated_at': '更新时间',
@@ -431,7 +434,7 @@ class UserService:
# 复制数据并转换 # 复制数据并转换
data = user_list.copy() data = user_list.copy()
for item in data: for item in data:
item['status'] = '正常' if item.get('status') else '停用' item['status'] = '启用' if item.get('status') else '停用'
gender = item.get('gender') gender = item.get('gender')
item['gender'] = '' if gender == 1 else ('' if gender == 2 else '未知') item['gender'] = '' if gender == 1 else ('' if gender == 2 else '未知')
+1 -1
View File
@@ -57,7 +57,7 @@ class OperationLogRoute(APIRoute):
payload = str(oper_param) payload = str(oper_param)
response_data = response.body if "application/json" in response.headers.get("Content-Type", "") else b"{}" response_data = response.body if "application/json" in response.headers.get("Content-Type", "") else b"{}"
process_time = time.time() - start_time process_time = f"{(time.time() - start_time):.4f}s"
# 获取当前用户ID,如果是登录接口则为空 # 获取当前用户ID,如果是登录接口则为空
log_type = 1 # 1:登录日志 2:操作日志 log_type = 1 # 1:登录日志 2:操作日志
+1 -1
View File
@@ -29,7 +29,7 @@ ROOT_PATH = "/api/v1" # API路由前缀
DEMO_ENABLE = False # 是否启用演示模式 DEMO_ENABLE = False # 是否启用演示模式
# 数据库配置 # 数据库配置
DB_DRIVER = "mysql" # sqlite、mysql DB_DRIVER = "sqlite" # sqlite、mysql
# SQLite配置 # SQLite配置
SQLITE_DB_NAME = "dev_sql.db" SQLITE_DB_NAME = "dev_sql.db"
-15
View File
@@ -1,15 +0,0 @@
# http://editorconfig.org
root = true
# 表示所有文件适用
[*]
charset = utf-8 # 设置文件字符集为 utf-8
end_of_line = lf # 控制换行类型(lf | cr | crlf)
indent_style = space # 缩进风格(tab | space
indent_size = 2 # 缩进大小
insert_final_newline = true # 始终在文件末尾插入一个新行
# 表示仅 md 文件适用以下规则
[*.md]
max_line_length = off # 关闭最大行长度限制
trim_trailing_whitespace = false # 关闭末尾空格修剪
+1 -1
View File
@@ -58,7 +58,7 @@ export interface LogTable {
response_code?: number; response_code?: number;
request_payload?: string; request_payload?: string;
response_json?: string; response_json?: string;
process_time?: number; process_time?: string;
description?: string; description?: string;
created_at?: string; created_at?: string;
updated_at?: string; updated_at?: string;
+27 -39
View File
@@ -1,43 +1,31 @@
<template> <template>
<div> <el-form :model="crontabValueObj" ref="formRef" label-width="auto" label-suffix=":" :inline="true" class="flex">
<el-row :gutter="16"> <el-form-item label="秒" prop="second" style="width: 20%">
<el-col :span="4"> <el-select v-model:value="crontabValueObj.second" placeholder="秒">
<el-form-item label="秒"> <el-option v-for="second in seconds" :key="second" :value="second">{{ second }}</el-option>
<el-select v-model:value="crontabValueObj.second" placeholder="秒"> </el-select>
<el-option v-for="second in seconds" :key="second" :value="second">{{ second }}</el-option> </el-form-item>
</el-select> <el-form-item label="分" prop="min" style="width: 20%">
</el-form-item> <el-select v-model:value="crontabValueObj.min" placeholder="分">
</el-col> <el-option v-for="min in minutes" :key="min" :value="min">{{min}}</el-option>
<el-col :span="4"> </el-select>
<el-form-item label="分"> </el-form-item>
<el-select v-model:value="crontabValueObj.min" placeholder=""> <el-form-item label="时" prop="hour" style="width: 20%">
<el-option v-for="min in minutes" :key="min" :value="min">{{min}}</el-option> <el-select v-model:value="crontabValueObj.hour" placeholder="时">
</el-select> <el-option v-for="hour in hours" :key="hour" :value="hour">{{hour}}</el-option>
</el-form-item> </el-select>
</el-col> </el-form-item>
<el-col :span="4"> <el-form-item label="天" prop="day" style="width: 20%">
<el-form-item label=""> <el-select v-model:value="crontabValueObj.day" placeholder="">
<el-select v-model:value="crontabValueObj.hour" placeholder="时"> <el-option v-for="day in days" :key="day" :value="day">{{day}}</el-option>
<el-option v-for="hour in hours" :key="hour" :value="hour">{{hour}}</el-option> </el-select>
</el-select> </el-form-item>
</el-form-item> <el-form-item label="周" prop="week" style="width: 20%">
</el-col> <el-select v-model:value="crontabValueObj.week" placeholder="周">
<el-col :span="4"> <el-option v-for="week in weeks" :key="week" :value="week">{{week}}</el-option>
<el-form-item label="天"> </el-select>
<el-select v-model:value="crontabValueObj.day" placeholder="天"> </el-form-item>
<el-option v-for="day in days" :key="day" :value="day">{{day}}</el-option> </el-form>
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="周">
<el-select v-model:value="crontabValueObj.week" placeholder="周">
<el-option v-for="week in weeks" :key="week" :value="week">{{week}}</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</div>
</template> </template>
<script setup> <script setup>
+1 -1
View File
@@ -18,6 +18,6 @@ export const enum ResultEnum {
/** /**
* 访问令牌无效或过期 * 访问令牌无效或过期
*/ */
ACCESS_TOKEN_INVALID = 401, ACCESS_TOKEN_INVALID = 403,
} }
@@ -31,7 +31,12 @@
<div class="navbar-actions__item"> <div class="navbar-actions__item">
<el-dropdown trigger="click"> <el-dropdown trigger="click">
<div class="user-profile"> <div class="user-profile">
<img class="user-profile__avatar" :src="userStore.basicInfo.avatar" /> <template v-if="userStore.basicInfo.avatar">
<el-avatar :src="userStore.basicInfo.avatar" />
</template>
<template v-else>
<el-avatar icon="UserFilled" />
</template>
<span class="user-profile__name">{{ userStore.basicInfo.username }}</span> <span class="user-profile__name">{{ userStore.basicInfo.username }}</span>
</div> </div>
<template #dropdown> <template #dropdown>
+3
View File
@@ -6,6 +6,7 @@ import { setupStore } from "@/store";
import { setupElIcons } from "./icons"; import { setupElIcons } from "./icons";
import { setupPermission } from "./permission"; import { setupPermission } from "./permission";
import { InstallCodeMirror } from "codemirror-editor-vue3"; import { InstallCodeMirror } from "codemirror-editor-vue3";
import ElementPlus from 'element-plus'
export default { export default {
install(app: App<Element>) { install(app: App<Element>) {
@@ -21,5 +22,7 @@ export default {
setupPermission(); setupPermission();
// 注册 CodeMirror // 注册 CodeMirror
app.use(InstallCodeMirror); app.use(InstallCodeMirror);
// 注册 ElementPlus
app.use(ElementPlus);
}, },
}; };
+3 -2
View File
@@ -26,8 +26,9 @@ export const defaultSettings: AppSettings = {
language: LanguageEnum.ZH_CN, language: LanguageEnum.ZH_CN,
// 主题颜色 - 修改此值时需同步修改 src/styles/variables.scss // 主题颜色 - 修改此值时需同步修改 src/styles/variables.scss
themeColor: "#4080FF", themeColor: "#4080FF",
// 是否显示水印 // 是否显示水印 (修改默认开启水印)
showWatermark: false, // showWatermark: false,
showWatermark: true,
// 水印内容 // 水印内容
watermarkContent: pkg.name, watermarkContent: pkg.name,
// 侧边栏配色方案 // 侧边栏配色方案
+1
View File
@@ -85,6 +85,7 @@ declare module 'vue' {
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect'] ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload'] ElUpload: typeof import('element-plus/es')['ElUpload']
ElWatermark: typeof import('element-plus/es')['ElWatermark'] ElWatermark: typeof import('element-plus/es')['ElWatermark']
Vue3CronPlusPicker: typeof import('vue3-cron-plus-picker')['default']
FileUpload: typeof import('./src/components/Upload/FileUpload.vue')['default'] FileUpload: typeof import('./src/components/Upload/FileUpload.vue')['default']
Frame: typeof import('./src/components/Frame/index.vue')['default'] Frame: typeof import('./src/components/Frame/index.vue')['default']
Fullscreen: typeof import('./src/components/Fullscreen/index.vue')['default'] Fullscreen: typeof import('./src/components/Fullscreen/index.vue')['default']
+20
View File
@@ -0,0 +1,20 @@
declare module "vue3-cron-plus-picker" {
import { DefineComponent } from "vue";
export const Vue3CronPlusPicker: DefineComponent<{}, {}, any>;
export default Vue3CronPlusPicker;
}
declare module "vue3-cron-plus-picker/style.css" {
const content: any;
export default content;
}
declare module "vue3-cron-plus-picker/vue3-cron-plus-picker.js" {
import { DefineComponent } from "vue";
export const Vue3CronPlusPicker: DefineComponent<{}, {}, any>;
export default Vue3CronPlusPicker;
}
+8 -2
View File
@@ -12,9 +12,15 @@
<div class="user-info-header"> <div class="user-info-header">
<div class="avatar-wrapper"> <div class="avatar-wrapper">
<el-avatar <el-avatar
v-if="infoFormState.avatar"
:src="infoFormState.avatar" :src="infoFormState.avatar"
:size="120" :size="120"
/> />
<el-avatar
v-else
icon="UserFilled"
:size="120"
/>
<el-upload <el-upload
class="el-upload" class="el-upload"
@@ -115,7 +121,7 @@
<span>基本设置</span> <span>基本设置</span>
</template> </template>
<div> <div>
<el-form ref="ruleFormRef" :model="infoFormState" :rules="rules" :inline="true" label-suffix=":" label-width="auto" label-position="right"> <el-form ref="ruleFormRef" :model="infoFormState" :rules="rules" :inline="true" label-suffix=":">
<el-form-item label="姓名" name="name"> <el-form-item label="姓名" name="name">
<el-input v-model:value="infoFormState.name" placeholder="请输入姓名" prefix-icon="User" clearable /> <el-input v-model:value="infoFormState.name" placeholder="请输入姓名" prefix-icon="User" clearable />
@@ -152,7 +158,7 @@
<span>安全设置</span> <span>安全设置</span>
</template> </template>
<div> <div>
<el-form ref="ruleFormRef" :model="passwordFormState" :rules="resetPasswordRules" label-suffix=":" label-width="auto" label-position="right"> <el-form ref="ruleFormRef" :model="passwordFormState" :rules="resetPasswordRules" label-suffix=":">
<el-form-item label="当前密码" name="oldPassword"> <el-form-item label="当前密码" name="oldPassword">
<el-input v-model.trim="passwordFormState.oldPassword" :placeholder="t('login.password')" type="password" show-password clearable> <el-input v-model.trim="passwordFormState.oldPassword" :placeholder="t('login.password')" type="password" show-password clearable>
<template #prefix> <template #prefix>
+39 -60
View File
@@ -1,4 +1,4 @@
<!-- 公告通知配置 --> <!-- 定时任务 -->
<template> <template>
<div class="app-container"> <div class="app-container">
<!-- 搜索区域 --> <!-- 搜索区域 -->
@@ -232,7 +232,6 @@
<el-dialog <el-dialog
v-model="dialogVisible.visible" v-model="dialogVisible.visible"
:title="dialogVisible.title" :title="dialogVisible.title"
top="3vh"
@close="handleCloseDialog" @close="handleCloseDialog"
> >
<!-- 详情 --> <!-- 详情 -->
@@ -303,81 +302,55 @@
</template> </template>
<!-- 新增编辑表单 --> <!-- 新增编辑表单 -->
<template v-else> <template v-else>
<el-form <el-form ref="dataFormRef" :model="formData" :rules="rules" label-suffix=":" label-width="auto" inline>
ref="dataFormRef" <el-form-item label="任务名称" prop="name" style="width: 40%">
:model="formData" <el-input v-model="formData.name" placeholder="请输入任务名称" :maxlength="50"/>
:rules="rules"
label-suffix=":"
label-width="100px"
>
<el-form-item label="任务名称" prop="name">
<el-input
v-model="formData.name"
placeholder="请输入任务名称"
:maxlength="50"
/>
</el-form-item> </el-form-item>
<el-form-item label="任务函数" prop="func"> <el-form-item label="任务函数" prop="func" style="width: 40%">
<el-input <el-input v-model="formData.func" placeholder="请输入任务函数" :maxlength="50"/>
v-model="formData.func"
placeholder="请输入任务函数"
:maxlength="50"
/>
</el-form-item> </el-form-item>
<el-form-item label="存储器" prop="jobstore"> <el-form-item label="存储器" prop="jobstore" style="width: 40%">
<el-select v-model="formData.jobstore" placeholder="请选择存储器"> <el-select v-model="formData.jobstore" placeholder="请选择存储器" >
<el-option value="default" label="默认(Memory)" /> <el-option value="default" label="默认(Memory)" />
<el-option value="sqlalchemy" label="数据库" /> <el-option value="sqlalchemy" label="数据库" />
<el-option value="redis" label="Redis存储器" /> <el-option value="redis" label="Redis存储器" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="执行器" prop="executor"> <el-form-item label="执行器" prop="executor" style="width: 40%">
<el-select v-model="formData.executor" placeholder="请选择执行器"> <el-select v-model="formData.executor" placeholder="请选择执行器">
<el-option value="default" label="默认" /> <el-option value="default" label="默认" />
<el-option value="processpool" label="进程池" /> <el-option value="processpool" label="进程池" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="位置参数" prop="args"> <el-form-item label="位置参数" prop="args" style="width: 40%">
<el-input <el-input v-model="formData.args" placeholder="请输入位置参数" :maxlength="50"/>
v-model="formData.args"
placeholder="请输入位置参数"
:maxlength="50"
/>
</el-form-item> </el-form-item>
<el-form-item label="关键字参数" prop="kwargs"> <el-form-item label="关键字参数" prop="kwargs" style="width: 40%">
<el-input <el-input v-model="formData.kwargs" placeholder="请输入关键字参数" :maxlength="50"/>
v-model="formData.kwargs"
placeholder="请输入关键字参数"
:maxlength="50"
/>
</el-form-item> </el-form-item>
<el-form-item label="并发执行" prop="coalesce"> <el-form-item label="并发执行" prop="coalesce" style="width: 40%">
<el-radio-group v-model="formData.coalesce"> <el-radio-group v-model="formData.coalesce">
<el-radio :value="true"></el-radio> <el-radio :value="true"></el-radio>
<el-radio :value="false"></el-radio> <el-radio :value="false"></el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="最大实例数" prop="max_instances"> <el-form-item label="最大实例数" prop="max_instances" style="width: 40%">
<el-input-number <el-input-number v-model="formData.max_instances" controls-position="right" :min="1" :max="10"/>
v-model="formData.max_instances"
controls-position="right"
:min="1"
:max="10"
/>
</el-form-item> </el-form-item>
<el-form-item label="触发器" prop="trigger"> <el-form-item label="触发器" prop="trigger" style="width: 40%">
<el-select v-model="formData.trigger" placeholder="请选择触发器"> <el-select v-model="formData.trigger" placeholder="请选择触发器">
<el-option value="date" label="指定日期(date)" /> <el-option value="date" label="指定日期(date)" />
<el-option value="interval" label="间隔触发器(interval)" /> <el-option value="interval" label="间隔触发器(interval)" />
<el-option value="cron" label="cron表达式" /> <el-option value="cron" label="cron表达式" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 运行日期间隔时间或 Cron 表达式 --> <!-- 运行日期间隔时间或 Cron 表达式 -->
<el-form-item <el-form-item
v-if="formData.trigger === 'date'" v-if="formData.trigger === 'date'"
label="运行日期" label="运行日期"
prop="trigger_args"
:rules="[{ required: true, message: '请选择运行日期' }]" :rules="[{ required: true, message: '请选择运行日期' }]"
style="width: 40%"
> >
<el-date-picker <el-date-picker
v-model="formData.trigger_args" v-model="formData.trigger_args"
@@ -385,13 +358,14 @@
format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择运行日期" placeholder="请选择运行日期"
style="width: 100%"
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-else-if="formData.trigger === 'interval'" v-else-if="formData.trigger === 'interval'"
label="间隔时间" label="间隔时间"
prop="trigger_args"
:rules="[{ required: true, message: '请输入间隔时间' }]" :rules="[{ required: true, message: '请输入间隔时间' }]"
style="width: 40%"
> >
<el-input <el-input
v-model="formData.trigger_args" v-model="formData.trigger_args"
@@ -403,7 +377,9 @@
<el-form-item <el-form-item
v-else-if="formData.trigger === 'cron'" v-else-if="formData.trigger === 'cron'"
label="Cron表达式" label="Cron表达式"
prop="trigger_args"
:rules="[{ required: true, message: '请输入Cron表达式' }]" :rules="[{ required: true, message: '请输入Cron表达式' }]"
style="width: 40%"
> >
<el-input <el-input
v-model="formData.trigger_args" v-model="formData.trigger_args"
@@ -411,14 +387,15 @@
clearable clearable
readonly readonly
@click="handleShowCron" @click="handleShowCron"
> />
</el-input>
</el-form-item> </el-form-item>
<!-- 开始日期和结束日期 --> <!-- 开始日期和结束日期 -->
<el-form-item <el-form-item
v-if="formData.trigger && formData.trigger != 'date'" v-if="formData.trigger && formData.trigger != 'date'"
label="开始日期" label="开始日期"
prop="start_date"
:rules="[{ required: false, message: '请选择开始日期' }]" :rules="[{ required: false, message: '请选择开始日期' }]"
style="width: 40%"
> >
<el-date-picker <el-date-picker
v-model="formData.start_date" v-model="formData.start_date"
@@ -426,13 +403,14 @@
format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择开始日期" placeholder="请选择开始日期"
style="width: 100%"
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-if="formData.trigger && formData.trigger != 'date'" v-if="formData.trigger && formData.trigger != 'date'"
label="结束日期" label="结束日期"
prop="end_date"
:rules="[{ required: false, message: '请选择结束日期' }]" :rules="[{ required: false, message: '请选择结束日期' }]"
style="width: 40%"
> >
<el-date-picker <el-date-picker
v-model="formData.end_date" v-model="formData.end_date"
@@ -440,11 +418,10 @@
format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择结束日期" placeholder="请选择结束日期"
style="width: 100%"
/> />
</el-form-item> </el-form-item>
<el-form-item label="描述" prop="description"> <el-form-item label="描述" prop="description" style="width: 85%">
<el-input <el-input
v-model="formData.description" v-model="formData.description"
:rows="4" :rows="4"
@@ -460,6 +437,7 @@
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<!-- 详情弹窗不需要确定按钮的提交逻辑 --> <!-- 详情弹窗不需要确定按钮的提交逻辑 -->
<el-button @click="handleCloseDialog">取消</el-button>
<el-button <el-button
v-if="dialogVisible.type !== 'detail'" v-if="dialogVisible.type !== 'detail'"
type="primary" type="primary"
@@ -469,20 +447,21 @@
<el-button v-else type="primary" @click="handleCloseDialog" <el-button v-else type="primary" @click="handleCloseDialog"
>确定</el-button >确定</el-button
> >
<el-button @click="handleCloseDialog">取消</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<!-- 时间间隔组件 --> <!-- 时间间隔组件 -->
<el-dialog <el-dialog v-model="openIntervalTab" title="间隔时间设置" :width="700" align-center draggable>
v-model="openIntervalTab"
title="间隔时间设置"
:width="600"
:destroy-on-close="true"
@ok="handleIntervalConfirm"
>
<IntervalTab ref="intervalTabRef" /> <IntervalTab ref="intervalTabRef" />
<template #footer>
<div class="dialog-footer">
<el-button @click="openIntervalTab = false">取消</el-button>
<el-button type="primary" @click="handleIntervalConfirm">
确认
</el-button>
</div>
</template>
</el-dialog> </el-dialog>
<!-- core组件 --> <!-- core组件 -->
+1 -1
View File
@@ -170,9 +170,9 @@
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<!-- 详情弹窗不需要确定按钮的提交逻辑 --> <!-- 详情弹窗不需要确定按钮的提交逻辑 -->
<el-button @click="handleCloseDialog">取消</el-button>
<el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit">确定</el-button> <el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit">确定</el-button>
<el-button v-else type="primary" @click="handleCloseDialog">确定</el-button> <el-button v-else type="primary" @click="handleCloseDialog">确定</el-button>
<el-button @click="handleCloseDialog">取消</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
+1 -1
View File
@@ -163,9 +163,9 @@
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<!-- 详情弹窗不需要确定按钮的提交逻辑 --> <!-- 详情弹窗不需要确定按钮的提交逻辑 -->
<el-button @click="handleCloseDialog">取消</el-button>
<el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit">确定</el-button> <el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit">确定</el-button>
<el-button v-else type="primary" @click="handleCloseDialog">确定</el-button> <el-button v-else type="primary" @click="handleCloseDialog">确定</el-button>
<el-button @click="handleCloseDialog">取消</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
@@ -73,19 +73,7 @@
<el-button type="warning" icon="download" circle @click="handleExport" /> <el-button type="warning" icon="download" circle @click="handleExport" />
</el-tooltip> </el-tooltip>
<el-tooltip content="刷新"> <el-tooltip content="刷新">
<el-button type="primary" icon="refresh" circle @click="handleRefresh" /> <el-button type="default" icon="refresh" circle @click="handleRefresh" />
</el-tooltip>
<el-tooltip content="列表筛选">
<el-dropdown trigger="click">
<el-button type="default" icon="operation" circle />
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-for="column in tableColumns" :key="column.prop" :command="column">
<el-checkbox v-model="column.show">{{ column.label }}</el-checkbox>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
@@ -95,44 +83,44 @@
<template #empty> <template #empty>
<el-empty :image-size="80" description="暂无数据" /> <el-empty :image-size="80" description="暂无数据" />
</template> </template>
<el-table-column v-if="tableColumns.find(col => col.prop === 'selection')?.show" type="selection" min-width="55" align="center" /> <el-table-column type="selection" min-width="55" align="center" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'index')?.show" type="index" fixed label="序号" min-width="60"> <el-table-column type="index" fixed label="序号" min-width="60">
<template #default="scope"> <template #default="scope">
{{ (queryFormData.page_no - 1) * queryFormData.page_size + scope.$index + 1 }} {{ (queryFormData.page_no - 1) * queryFormData.page_size + scope.$index + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'dict_label')?.show" key="dict_label" label="标签" prop="dict_label" min-width="150" show-overflow-tooltip /> <el-table-column label="标签" prop="dict_label" min-width="150" show-overflow-tooltip />
<el-table-column v-if="tableColumns.find(col => col.prop === 'status')?.show" key="status" label="状态" prop="status" min-width="100" show-overflow-tooltip> <el-table-column label="状态" prop="status" min-width="100" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<el-tag :type="scope.row.status === true ? 'success' : 'danger'"> <el-tag :type="scope.row.status === true ? 'success' : 'danger'">
{{ scope.row.status ? "启用" : "停用" }} {{ scope.row.status ? "启用" : "停用" }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'dict_type')?.show" key="dict_type" label="类型" prop="dict_type" min-width="180" show-overflow-tooltip> <el-table-column label="类型" prop="dict_type" min-width="180" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<el-tag type="primary">{{ scope.row.dict_type }}</el-tag> <el-tag type="primary">{{ scope.row.dict_type }}</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'dict_value')?.show" key="dict_value" label="值" prop="dict_value" min-width="100" show-overflow-tooltip /> <el-table-column label="值" prop="dict_value" min-width="100" show-overflow-tooltip />
<el-table-column v-if="tableColumns.find(col => col.prop === 'css_class')?.show" key="css_class" label="样式属性" prop="css_class" min-width="100" show-overflow-tooltip /> <el-table-column label="样式属性" prop="css_class" min-width="100" show-overflow-tooltip />
<el-table-column v-if="tableColumns.find(col => col.prop === 'list_class')?.show" key="list_class" label="列表类样式" prop="list_class" min-width="100" show-overflow-tooltip /> <el-table-column label="列表类样式" prop="list_class" min-width="100" show-overflow-tooltip />
<el-table-column v-if="tableColumns.find(col => col.prop === 'dict_sort')?.show" key="dict_sort" label="排序" prop="dict_sort" min-width="60" /> <el-table-column label="排序" prop="dict_sort" min-width="60" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'is_default')?.show" key="is_default" label="是否默认" prop="is_default" min-width="100"> <el-table-column label="是否默认" prop="is_default" min-width="100">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.is_default" type="success"></el-tag> <el-tag v-if="scope.row.is_default" type="success"></el-tag>
<el-tag v-else type="danger"></el-tag> <el-tag v-else type="danger"></el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'description')?.show" key="description" label="描述" prop="description" min-width="100" show-overflow-tooltip/> <el-table-column label="描述" prop="description" min-width="100" show-overflow-tooltip/>
<el-table-column v-if="tableColumns.find(col => col.prop === 'created_at')?.show" key="created_at" label="创建时间" prop="created_at" min-width="200" sortable /> <el-table-column label="创建时间" prop="created_at" min-width="200" sortable />
<el-table-column v-if="tableColumns.find(col => col.prop === 'updated_at')?.show" key="updated_at" label="更新时间" prop="updated_at" min-width="200" sortable /> <el-table-column label="更新时间" prop="updated_at" min-width="200" sortable />
<el-table-column v-if="tableColumns.find(col => col.prop === 'creator')?.show" label="创建人" prop="creator" min-width="100"> <el-table-column label="创建人" prop="creator" min-width="100">
<template #default="scope"> <template #default="scope">
{{ scope.row.creator?.name }} {{ scope.row.creator?.name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'operation')?.show" fixed="right" label="操作" align="center" min-width="200"> <el-table-column fixed="right" label="操作" align="center" min-width="200">
<template #default="scope"> <template #default="scope">
<el-button type="info" size="small" link icon="document" @click="handleOpenDialog('detail', scope.row.id)">详情</el-button> <el-button type="info" size="small" link icon="document" @click="handleOpenDialog('detail', scope.row.id)">详情</el-button>
<el-button type="primary" size="small" link icon="edit" @click="handleOpenDialog('update', scope.row.id)">编辑</el-button> <el-button type="primary" size="small" link icon="edit" @click="handleOpenDialog('update', scope.row.id)">编辑</el-button>
@@ -219,9 +207,9 @@
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<!-- 详情弹窗不需要确定按钮的提交逻辑 --> <!-- 详情弹窗不需要确定按钮的提交逻辑 -->
<el-button @click="handleCloseDialog">取消</el-button>
<el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit">确定</el-button> <el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit">确定</el-button>
<el-button v-else type="primary" @click="handleCloseDialog">确定</el-button> <el-button v-else type="primary" @click="handleCloseDialog">确定</el-button>
<el-button @click="handleCloseDialog">取消</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
@@ -264,26 +252,6 @@ const drawerVisible = ref<boolean>(false);
// //
const pageTableData = ref<DictDataTable[]>([]); const pageTableData = ref<DictDataTable[]>([]);
//
const tableColumns = ref([
{ prop: 'selection', label: '选择框', show: true },
{ prop: 'index', label: '序号', show: true },
{ prop: 'dict_sort', label: '字典排序', show: true },
{ prop: 'dict_label', label: '字典标签', show: true },
{ prop: 'dict_type', label: '字典类型', show: true },
{ prop: 'dict_value', label: '字典键值', show: true },
{ prop: 'css_class', label: '样式属性', show: false },
{ prop: 'list_class', label: '表格回显属性', show: false },
{ prop: 'is_default', label: '是否默认', show: true },
{ prop: 'status', label: '状态', show: true },
{ prop: 'description', label: '描述', show: true },
{ prop: 'creator', label: '创建人', show: true },
{ prop: 'created_at', label: '创建时间', show: true },
{ prop: 'updated_at', label: '更新时间', show: true },
{ prop: 'operation', label: '操作', show: true }
])
// //
const detailFormData = ref<DictDataTable>({}); const detailFormData = ref<DictDataTable>({});
+1 -1
View File
@@ -185,9 +185,9 @@
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<!-- 详情弹窗不需要确定按钮的提交逻辑 --> <!-- 详情弹窗不需要确定按钮的提交逻辑 -->
<el-button @click="handleCloseDialog">取消</el-button>
<el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit">确定</el-button> <el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit">确定</el-button>
<el-button v-else type="primary" @click="handleCloseDialog">确定</el-button> <el-button v-else type="primary" @click="handleCloseDialog">确定</el-button>
<el-button @click="handleCloseDialog">取消</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
+15 -47
View File
@@ -65,19 +65,7 @@
<el-button type="warning" icon="download" circle @click="handleExport" /> <el-button type="warning" icon="download" circle @click="handleExport" />
</el-tooltip> </el-tooltip>
<el-tooltip content="刷新"> <el-tooltip content="刷新">
<el-button type="primary" icon="refresh" circle @click="handleRefresh" /> <el-button type="default" icon="refresh" circle @click="handleRefresh" />
</el-tooltip>
<el-tooltip content="列表筛选">
<el-dropdown trigger="click">
<el-button type="default" icon="operation" circle />
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-for="column in tableColumns" :key="column.prop" :command="column">
<el-checkbox v-model="column.show">{{ column.label }}</el-checkbox>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
@@ -87,46 +75,46 @@
<template #empty> <template #empty>
<el-empty :image-size="80" description="暂无数据" /> <el-empty :image-size="80" description="暂无数据" />
</template> </template>
<el-table-column v-if="tableColumns.find(col => col.prop === 'selection')?.show" prop='selection' type="selection" min-width="55" align="center" /> <el-table-column prop='selection' type="selection" min-width="55" align="center" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'index')?.show" type="index" fixed label="序号" min-width="60" > <el-table-column type="index" fixed label="序号" min-width="60" >
<template #default="scope"> <template #default="scope">
{{ (queryFormData.page_no - 1) * queryFormData.page_size + scope.$index + 1 }} {{ (queryFormData.page_no - 1) * queryFormData.page_size + scope.$index + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'type')?.show" label="日志类型" prop="type" min-width="100"> <el-table-column label="日志类型" prop="type" min-width="100">
<template #default="scope"> <template #default="scope">
<el-tag :type="scope.row.type === 1 ? 'success' : 'primary'"> <el-tag :type="scope.row.type === 1 ? 'success' : 'primary'">
{{ scope.row.type === 1 ? '登录日志' : '操作日志' }} {{ scope.row.type === 1 ? '登录日志' : '操作日志' }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'request_path')?.show" label="请求路径" prop="request_path" min-width="200" show-overflow-tooltip /> <el-table-column label="请求路径" prop="request_path" min-width="200" show-overflow-tooltip />
<el-table-column v-if="tableColumns.find(col => col.prop === 'request_method')?.show" label="请求方法" prop="request_method" min-width="100"> <el-table-column label="请求方法" prop="request_method" min-width="100">
<template #default="scope"> <template #default="scope">
<el-tag :type="getMethodType(scope.row.request_method)"> <el-tag :type="getMethodType(scope.row.request_method)">
{{ scope.row.request_method }} {{ scope.row.request_method }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'response_code')?.show" label="状态码" prop="response_code" min-width="100"> <el-table-column label="状态码" prop="response_code" min-width="100">
<template #default="scope"> <template #default="scope">
<el-tag :type="getStatusCodeType(scope.row.response_code)"> <el-tag :type="getStatusCodeType(scope.row.response_code)">
{{ scope.row.response_code }} {{ scope.row.response_code }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'request_ip')?.show" label="请求IP" prop="request_ip" min-width="180" show-overflow-tooltip> <el-table-column label="请求IP" prop="request_ip" min-width="180" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<el-text>{{ scope.row.request_ip }}</el-text> <el-text>{{ scope.row.request_ip }}</el-text>
<CopyButton v-if="scope.row.request_ip" :text="scope.row.request_ip" style="margin-left: 2px" /> <CopyButton v-if="scope.row.request_ip" :text="scope.row.request_ip" style="margin-left: 2px" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'process_time')?.show" label="处理时间" prop="process_time" min-width="120" /> <el-table-column label="处理时间" prop="process_time" min-width="120" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'request_browser')?.show" label="浏览器" prop="request_browser" min-width="220" show-overflow-tooltip/> <el-table-column label="浏览器" prop="request_browser" min-width="220" show-overflow-tooltip/>
<el-table-column v-if="tableColumns.find(col => col.prop === 'request_os')?.show" label="系统" prop="request_os" min-width="100" /> <el-table-column label="系统" prop="request_os" min-width="100" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'description')?.show" label="描述" prop="description" min-width="120" show-overflow-tooltip /> <el-table-column label="描述" prop="description" min-width="120" show-overflow-tooltip />
<el-table-column v-if="tableColumns.find(col => col.prop === 'created_at')?.show" label="创建时间" prop="created_at" min-width="200" sortable /> <el-table-column label="创建时间" prop="created_at" min-width="200" sortable />
<el-table-column v-if="tableColumns.find(col => col.prop === 'creator')?.show" label="创建人" prop="creator" min-width="120"> <el-table-column label="创建人" prop="creator" min-width="120">
<template #default="scope"> <template #default="scope">
{{ scope.row.creator?.name }} {{ scope.row.creator?.name }}
</template> </template>
@@ -187,8 +175,8 @@
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<!-- 详情弹窗不需要确定按钮的提交逻辑 --> <!-- 详情弹窗不需要确定按钮的提交逻辑 -->
<el-button type="primary" @click="handleCloseDialog">确定</el-button>
<el-button @click="handleCloseDialog">取消</el-button> <el-button @click="handleCloseDialog">取消</el-button>
<el-button type="primary" @click="handleCloseDialog">确定</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
@@ -216,26 +204,6 @@ const isExpandable = ref(true);
// //
const pageTableData = ref<LogTable[]>([]); const pageTableData = ref<LogTable[]>([]);
//
const tableColumns = ref([
{ prop: 'selection', label: '选择框', show: true },
{ prop: 'index', label: '序号', show: true },
{ prop: 'type', label: '日志类型', show: true },
{ prop: 'request_path', label: '请求路径', show: true },
{ prop: 'request_method', label: '请求方法', show: true },
{ prop: 'response_code', label: '响应状态码', show: true },
{ prop: 'request_ip', label: '请求IP', show: true },
{ prop: 'process_time', label: '处理时间', show: true },
{ prop: 'request_browser', label: '浏览器', show: true },
{ prop: 'request_os', label: '操作系统', show: true },
{ prop: 'login_location', label: '登录地点', show: true },
{ prop: 'description', label: '描述', show: true },
{ prop: 'creator', label: '创建人', show: true },
{ prop: 'created_at', label: '创建时间', show: true },
{ prop: 'updated_at', label: '更新时间', show: true },
{ prop: 'operation', label: '操作', show: true }
])
// //
const formData = ref<LogTable>({}); const formData = ref<LogTable>({});
+3 -9
View File
@@ -221,15 +221,9 @@
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<!-- 详情弹窗不需要确定按钮的提交逻辑 --> <!-- 详情弹窗不需要确定按钮的提交逻辑 -->
<el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit"> <el-button @click="handleCloseDialog">取消</el-button>
确定 <el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit">确定</el-button>
</el-button> <el-button v-else type="primary" @click="handleCloseDialog">确定</el-button>
<el-button v-else type="primary" @click="handleCloseDialog">
确定
</el-button>
<el-button @click="handleCloseDialog">
取消
</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
+1 -1
View File
@@ -176,9 +176,9 @@
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<!-- 详情弹窗不需要确定按钮的提交逻辑 --> <!-- 详情弹窗不需要确定按钮的提交逻辑 -->
<el-button @click="handleCloseDialog">取消</el-button>
<el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit">确定</el-button> <el-button v-if="dialogVisible.type !== 'detail'" type="primary" @click="handleSubmit">确定</el-button>
<el-button v-else type="primary" @click="handleCloseDialog">确定</el-button> <el-button v-else type="primary" @click="handleCloseDialog">确定</el-button>
<el-button @click="handleCloseDialog">取消</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
+1 -2
View File
@@ -196,11 +196,10 @@
</template> </template>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button type="primary" @click="handleSubmit"> </el-button>
<el-button @click="handleCloseDialog"> </el-button> <el-button @click="handleCloseDialog"> </el-button>
<el-button type="primary" @click="handleSubmit"> </el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
@@ -38,7 +38,7 @@ const deptOptions = ref<OptionType[]>([]); // 部门列表
const deptTreeRef = ref<TreeInstance>(); // const deptTreeRef = ref<TreeInstance>(); //
const deptName = ref(); // const deptName = ref(); //
const emits = defineEmits(["node-click"]); const emits = defineEmits(["node-click", "update:modelValue"]);
const deptId = useVModel(props, "modelValue", emits); const deptId = useVModel(props, "modelValue", emits);
@@ -30,6 +30,7 @@
<el-button v-if="resultData.length > 0" type="primary" @click="handleShowResult"> <el-button v-if="resultData.length > 0" type="primary" @click="handleShowResult">
错误信息 错误信息
</el-button> </el-button>
<el-button @click="handleClose"> </el-button>
<el-button <el-button
type="primary" type="primary"
:disabled="importFormData.files.length === 0" :disabled="importFormData.files.length === 0"
@@ -37,7 +38,6 @@
> >
</el-button> </el-button>
<el-button @click="handleClose"> </el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
+28 -48
View File
@@ -89,19 +89,7 @@
<el-button type="warning" icon="download" circle @click="handleOperation('export')" /> <el-button type="warning" icon="download" circle @click="handleOperation('export')" />
</el-tooltip> </el-tooltip>
<el-tooltip content="刷新"> <el-tooltip content="刷新">
<el-button type="primary" icon="refresh" circle @click="handleRefresh" /> <el-button type="default" icon="refresh" circle @click="handleRefresh" />
</el-tooltip>
<el-tooltip content="列表筛选">
<el-dropdown trigger="click">
<el-button type="default" icon="operation" circle />
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-for="column in tableColumns" :key="column.prop" :command="column">
<el-checkbox v-model="column.show">{{ column.label }}</el-checkbox>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
@@ -111,34 +99,39 @@
<template #empty> <template #empty>
<el-empty :image-size="80" description="暂无数据" /> <el-empty :image-size="80" description="暂无数据" />
</template> </template>
<el-table-column v-if="tableColumns.find(col => col.prop === 'selection')?.show" type="selection" min-width="55" align="center" /> <el-table-column type="selection" min-width="55" align="center" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'index')?.show" type="index" fixed label="序号" align="center" min-width="60" > <el-table-column type="index" fixed label="序号" align="center" min-width="60" >
<template #default="scope"> <template #default="scope">
{{ (queryFormData.page_no - 1) * queryFormData.page_size + scope.$index + 1 }} {{ (queryFormData.page_no - 1) * queryFormData.page_size + scope.$index + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'avatar')?.show" label="头像" prop="avatar" min-width="80" align="center"> <el-table-column label="头像" prop="avatar" min-width="80" align="center">
<template #default="scope"> <template #default="scope">
<el-avatar size="small" :src="scope.row.avatar" /> <template v-if="scope.row.avatar">
<el-avatar size="small" :src="scope.row.avatar" />
</template>
<template v-else>
<el-avatar size="small" icon="UserFilled" />
</template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'username')?.show" label="账号" prop="username" min-width="100" /> <el-table-column label="账号" prop="username" min-width="100" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'name')?.show" label="用户名" prop="name" min-width="100" /> <el-table-column label="用户名" prop="name" min-width="100" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'status')?.show" label="状态" prop="status" min-width="100"> <el-table-column label="状态" prop="status" min-width="100">
<template #default="scope"> <template #default="scope">
<el-tag :type="scope.row.status === true ? 'success' : 'danger'"> <el-tag :type="scope.row.status === true ? 'success' : 'danger'">
{{ scope.row.status === true ? "启用" : "停用" }} {{ scope.row.status === true ? "启用" : "停用" }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'is_superuser')?.show" label="是否超管" prop="is_superuser" min-width="100"> <el-table-column label="是否超管" prop="is_superuser" min-width="100">
<template #default="scope"> <template #default="scope">
<el-tag :type="scope.row.is_superuser ? 'success' : 'info'"> <el-tag :type="scope.row.is_superuser ? 'success' : 'info'">
{{ scope.row.is_superuser ? '是' : '否' }} {{ scope.row.is_superuser ? '是' : '否' }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'gender')?.show" label="性别" min-width="100"> <el-table-column label="性别" prop="gender" min-width="100">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.gender ==='0'" type="success"></el-tag> <el-tag v-if="scope.row.gender ==='0'" type="success"></el-tag>
<el-tag v-else-if="scope.row.gender ==='1'" type="warning"></el-tag> <el-tag v-else-if="scope.row.gender ==='1'" type="warning"></el-tag>
@@ -146,16 +139,16 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'mobile')?.show" label="手机号" prop="mobile" min-width="160" /> <el-table-column label="手机号" prop="mobile" min-width="160" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'email')?.show" label="邮箱" prop="email" min-width="160" /> <el-table-column label="邮箱" prop="email" min-width="160" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'created_at')?.show" label="创建时间" prop="created_at" min-width="200" /> <el-table-column label="创建时间" prop="created_at" min-width="200" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'updated_at')?.show" label="更新时间" prop="updated_at" min-width="200" /> <el-table-column label="更新时间" prop="updated_at" min-width="200" />
<el-table-column v-if="tableColumns.find(col => col.prop === 'creator')?.show" key="creator" label="创建人" min-width="120"> <el-table-column label="创建人" prop="creator" min-width="120">
<template #default="scope"> <template #default="scope">
{{ scope.row.creator?.name }} {{ scope.row.creator?.name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="tableColumns.find(col => col.prop === 'operation')?.show" fixed="right" label="操作" align="center" min-width="280"> <el-table-column fixed="right" label="操作" align="center" min-width="280">
<template #default="scope"> <template #default="scope">
<el-button type="warning" icon="RefreshLeft" size="small" link @click="hancleResetPassword(scope.row)">重置密码</el-button> <el-button type="warning" icon="RefreshLeft" size="small" link @click="hancleResetPassword(scope.row)">重置密码</el-button>
<el-button type="info" size="small" link icon="document" @click="handleOpenDialog('detail', scope.row.id)">详情</el-button> <el-button type="info" size="small" link icon="document" @click="handleOpenDialog('detail', scope.row.id)">详情</el-button>
@@ -180,7 +173,12 @@
<el-descriptions :column="2" border> <el-descriptions :column="2" border>
<el-descriptions-item label="编号" :span="2">{{ detailFormData.id }}</el-descriptions-item> <el-descriptions-item label="编号" :span="2">{{ detailFormData.id }}</el-descriptions-item>
<el-descriptions-item label="头像" :span="2"> <el-descriptions-item label="头像" :span="2">
<el-avatar :src="detailFormData.avatar" size="small"></el-avatar> <template v-if="detailFormData.avatar">
<el-avatar :src="detailFormData.avatar" size="small"></el-avatar>
</template>
<template v-else>
<el-avatar icon="UserFilled" size="small"></el-avatar>
</template>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="账号" :span="2">{{ detailFormData.username }}</el-descriptions-item> <el-descriptions-item label="账号" :span="2">{{ detailFormData.username }}</el-descriptions-item>
<el-descriptions-item label="用户名" :span="2">{{ detailFormData.name }}</el-descriptions-item> <el-descriptions-item label="用户名" :span="2">{{ detailFormData.name }}</el-descriptions-item>
@@ -342,25 +340,6 @@ const pageTableData = ref<UserInfo[]>([]);
// //
const detailFormData = ref<UserInfo>({}); const detailFormData = ref<UserInfo>({});
//
const tableColumns = ref([
{ prop: 'selection', label: '选择框', show: true },
{ prop: 'index', label: '序号', show: true },
{ prop: 'avatar', label: '头像', show: true },
{ prop: 'username', label: '账号', show: true },
{ prop: 'name', label: '用户名', show: true },
{ prop: 'gender', label: '性别', show: true },
{ prop: 'email', label: '邮箱', show: true },
{ prop: 'mobile', label: '手机号', show: true },
{ prop: 'is_superuser', label: '是否超管', show: true },
{ prop: 'status', label: '状态', show: true },
{ prop: 'description', label: '描述', show: true },
{ prop: 'created_at', label: '创建时间', show: true },
{ prop: 'updated_at', label: '更新时间', show: true },
{ prop: 'creator', label: '创建人', show: true },
{ prop: 'operation', label: '操作', show: true }
])
// //
const queryFormData = reactive<UserPageQuery>({ const queryFormData = reactive<UserPageQuery>({
page_no: 1, page_no: 1,
@@ -456,6 +435,7 @@ async function handleQuery() {
// //
async function handleResetQuery() { async function handleResetQuery() {
queryFormRef.value.resetFields(); queryFormRef.value.resetFields();
queryFormData.dept_id = undefined;
queryFormData.page_no = 1; queryFormData.page_no = 1;
loadingData(); loadingData();
} }
+1 -1
View File
@@ -187,7 +187,7 @@ export default defineConfig(({ mode }: ConfigEnv) => {
"element-plus/es/components/popconfirm/style/index", "element-plus/es/components/popconfirm/style/index",
"element-plus/es/components/container/style/index", "element-plus/es/components/container/style/index",
"element-plus/es/components/main/style/index", "element-plus/es/components/main/style/index",
"element-plus/es/components/aside/style/index" "element-plus/es/components/aside/style/index",
], ],
}, },
// 构建配置 // 构建配置