mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-09-21 12:52:26 +00:00
@@ -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 '未知')
|
||||||
|
|
||||||
|
|||||||
@@ -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:操作日志
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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"
|
||||||
|
|||||||
@@ -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 # 关闭末尾空格修剪
|
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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,
|
||||||
// 侧边栏配色方案
|
// 侧边栏配色方案
|
||||||
|
|||||||
Vendored
+1
@@ -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
@@ -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;
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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组件 -->
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>({});
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>({});
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
// 构建配置
|
// 构建配置
|
||||||
|
|||||||
Reference in New Issue
Block a user