refactor: ♻️ eslint 代码规范调整

This commit is contained in:
ray
2024-10-13 10:42:48 +08:00
parent 72eb87d005
commit a4ef6eb696
66 changed files with 376 additions and 376 deletions

View File

@@ -2,9 +2,9 @@ import request from "@/utils/request";
const AUTH_BASE_URL = "/api/v1/auth"; const AUTH_BASE_URL = "/api/v1/auth";
class AuthAPI { const AuthAPI = {
/** 登录 接口*/ /** 登录 接口*/
static login(data: LoginData) { login(data: LoginData) {
const formData = new FormData(); const formData = new FormData();
formData.append("username", data.username); formData.append("username", data.username);
formData.append("password", data.password); formData.append("password", data.password);
@@ -18,24 +18,24 @@ class AuthAPI {
"Content-Type": "multipart/form-data", "Content-Type": "multipart/form-data",
}, },
}); });
} },
/** 注销 接口*/ /** 注销 接口*/
static logout() { logout() {
return request({ return request({
url: `${AUTH_BASE_URL}/logout`, url: `${AUTH_BASE_URL}/logout`,
method: "delete", method: "delete",
}); });
} },
/** 获取验证码 接口*/ /** 获取验证码 接口*/
static getCaptcha() { getCaptcha() {
return request<any, CaptchaResult>({ return request<any, CaptchaResult>({
url: `${AUTH_BASE_URL}/captcha`, url: `${AUTH_BASE_URL}/captcha`,
method: "get", method: "get",
}); });
} },
} };
export default AuthAPI; export default AuthAPI;

View File

@@ -2,55 +2,55 @@ import request from "@/utils/request";
const GENERATOR_BASE_URL = "/api/v1/codegen"; const GENERATOR_BASE_URL = "/api/v1/codegen";
class GeneratorAPI { const GeneratorAPI = {
/** 获取数据表分页列表 */ /** 获取数据表分页列表 */
static getTablePage(params: TablePageQuery) { getTablePage(params: TablePageQuery) {
return request<any, PageResult<TablePageVO[]>>({ return request<any, PageResult<TablePageVO[]>>({
url: `${GENERATOR_BASE_URL}/table/page`, url: `${GENERATOR_BASE_URL}/table/page`,
method: "get", method: "get",
params: params, params: params,
}); });
} },
/** 获取代码生成配置 */ /** 获取代码生成配置 */
static getGenConfig(tableName: string) { getGenConfig(tableName: string) {
return request<any, GenConfigForm>({ return request<any, GenConfigForm>({
url: `${GENERATOR_BASE_URL}/${tableName}/config`, url: `${GENERATOR_BASE_URL}/${tableName}/config`,
method: "get", method: "get",
}); });
} },
/** 获取代码生成配置 */ /** 获取代码生成配置 */
static saveGenConfig(tableName: string, data: GenConfigForm) { saveGenConfig(tableName: string, data: GenConfigForm) {
return request({ return request({
url: `${GENERATOR_BASE_URL}/${tableName}/config`, url: `${GENERATOR_BASE_URL}/${tableName}/config`,
method: "post", method: "post",
data: data, data: data,
}); });
} },
/** 获取代码生成预览数据 */ /** 获取代码生成预览数据 */
static getPreviewData(tableName: string) { getPreviewData(tableName: string) {
return request<any, GeneratorPreviewVO[]>({ return request<any, GeneratorPreviewVO[]>({
url: `${GENERATOR_BASE_URL}/${tableName}/preview`, url: `${GENERATOR_BASE_URL}/${tableName}/preview`,
method: "get", method: "get",
}); });
} },
/** 重置代码生成配置 */ /** 重置代码生成配置 */
static resetGenConfig(tableName: string) { resetGenConfig(tableName: string) {
return request({ return request({
url: `${GENERATOR_BASE_URL}/${tableName}/config`, url: `${GENERATOR_BASE_URL}/${tableName}/config`,
method: "delete", method: "delete",
}); });
} },
/** /**
* 下载 ZIP 文件 * 下载 ZIP 文件
* @param url * @param url
* @param fileName * @param fileName
*/ */
static download(tableName: string) { download(tableName: string) {
return request({ return request({
url: `${GENERATOR_BASE_URL}/${tableName}/download`, url: `${GENERATOR_BASE_URL}/${tableName}/download`,
method: "get", method: "get",
@@ -68,8 +68,8 @@ class GeneratorAPI {
a.click(); a.click();
window.URL.revokeObjectURL(url); window.URL.revokeObjectURL(url);
}); });
} },
} };
export default GeneratorAPI; export default GeneratorAPI;

View File

@@ -2,36 +2,36 @@ import request from "@/utils/request";
const CONFIG_BASE_URL = "/api/v1/config"; const CONFIG_BASE_URL = "/api/v1/config";
class ConfigAPI { const ConfigAPI = {
/** 获取系统配置分页数据 */ /** 获取系统配置分页数据 */
static getPage(queryParams?: ConfigPageQuery) { getPage(queryParams?: ConfigPageQuery) {
return request<any, PageResult<ConfigPageVO[]>>({ return request<any, PageResult<ConfigPageVO[]>>({
url: `${CONFIG_BASE_URL}/page`, url: `${CONFIG_BASE_URL}/page`,
method: "get", method: "get",
params: queryParams, params: queryParams,
}); });
} },
/** /**
* 获取系统配置表单数据 * 获取系统配置表单数据
* *
* @param id ConfigID * @param id ConfigID
* @returns Config表单数据 * @returns Config表单数据
*/ */
static getFormData(id: number) { getFormData(id: number) {
return request<any, ConfigForm>({ return request<any, ConfigForm>({
url: `${CONFIG_BASE_URL}/${id}/form`, url: `${CONFIG_BASE_URL}/${id}/form`,
method: "get", method: "get",
}); });
} },
/** 添加系统配置*/ /** 添加系统配置*/
static add(data: ConfigForm) { add(data: ConfigForm) {
return request({ return request({
url: `${CONFIG_BASE_URL}`, url: `${CONFIG_BASE_URL}`,
method: "post", method: "post",
data: data, data: data,
}); });
} },
/** /**
* 更新系统配置 * 更新系统配置
@@ -39,33 +39,33 @@ class ConfigAPI {
* @param id ConfigID * @param id ConfigID
* @param data Config表单数据 * @param data Config表单数据
*/ */
static update(id: number, data: ConfigForm) { update(id: number, data: ConfigForm) {
return request({ return request({
url: `${CONFIG_BASE_URL}/${id}`, url: `${CONFIG_BASE_URL}/${id}`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** /**
* 删除系统配置 * 删除系统配置
* *
* @param ids 系统配置ID * @param ids 系统配置ID
*/ */
static deleteById(id: number) { deleteById(id: number) {
return request({ return request({
url: `${CONFIG_BASE_URL}/${id}`, url: `${CONFIG_BASE_URL}/${id}`,
method: "delete", method: "delete",
}); });
} },
static refreshCache() { refreshCache() {
return request({ return request({
url: `${CONFIG_BASE_URL}`, url: `${CONFIG_BASE_URL}`,
method: "patch", method: "patch",
}); });
} },
} };
export default ConfigAPI; export default ConfigAPI;

View File

@@ -2,28 +2,28 @@ import request from "@/utils/request";
const DEPT_BASE_URL = "/api/v1/dept"; const DEPT_BASE_URL = "/api/v1/dept";
class DeptAPI { const DeptAPI = {
/** /**
* 获取部门列表 * 获取部门列表
* *
* @param queryParams 查询参数(可选) * @param queryParams 查询参数(可选)
* @returns 部门树形表格数据 * @returns 部门树形表格数据
*/ */
static getList(queryParams?: DeptQuery) { getList(queryParams?: DeptQuery) {
return request<any, DeptVO[]>({ return request<any, DeptVO[]>({
url: `${DEPT_BASE_URL}`, url: `${DEPT_BASE_URL}`,
method: "get", method: "get",
params: queryParams, params: queryParams,
}); });
} },
/** 获取部门下拉列表 */ /** 获取部门下拉列表 */
static getOptions() { getOptions() {
return request<any, OptionType[]>({ return request<any, OptionType[]>({
url: `${DEPT_BASE_URL}/options`, url: `${DEPT_BASE_URL}/options`,
method: "get", method: "get",
}); });
} },
/** /**
* 获取部门表单数据 * 获取部门表单数据
@@ -31,12 +31,12 @@ class DeptAPI {
* @param id 部门ID * @param id 部门ID
* @returns 部门表单数据 * @returns 部门表单数据
*/ */
static getFormData(id: number) { getFormData(id: number) {
return request<any, DeptForm>({ return request<any, DeptForm>({
url: `${DEPT_BASE_URL}/${id}/form`, url: `${DEPT_BASE_URL}/${id}/form`,
method: "get", method: "get",
}); });
} },
/** /**
* 新增部门 * 新增部门
@@ -44,13 +44,13 @@ class DeptAPI {
* @param data 部门表单数据 * @param data 部门表单数据
* @returns 请求结果 * @returns 请求结果
*/ */
static add(data: DeptForm) { add(data: DeptForm) {
return request({ return request({
url: `${DEPT_BASE_URL}`, url: `${DEPT_BASE_URL}`,
method: "post", method: "post",
data: data, data: data,
}); });
} },
/** /**
* 修改部门 * 修改部门
@@ -59,13 +59,13 @@ class DeptAPI {
* @param data 部门表单数据 * @param data 部门表单数据
* @returns 请求结果 * @returns 请求结果
*/ */
static update(id: number, data: DeptForm) { update(id: number, data: DeptForm) {
return request({ return request({
url: `${DEPT_BASE_URL}/${id}`, url: `${DEPT_BASE_URL}/${id}`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** /**
* 删除部门 * 删除部门
@@ -73,13 +73,13 @@ class DeptAPI {
* @param ids 部门ID多个以英文逗号(,)分隔 * @param ids 部门ID多个以英文逗号(,)分隔
* @returns 请求结果 * @returns 请求结果
*/ */
static deleteByIds(ids: string) { deleteByIds(ids: string) {
return request({ return request({
url: `${DEPT_BASE_URL}/${ids}`, url: `${DEPT_BASE_URL}/${ids}`,
method: "delete", method: "delete",
}); });
} },
} };
export default DeptAPI; export default DeptAPI;

View File

@@ -2,20 +2,20 @@ import request from "@/utils/request";
const DICT_DATA_BASE_URL = "/api/v1/dict-data"; const DICT_DATA_BASE_URL = "/api/v1/dict-data";
class DictDataAPI { const DictDataAPI = {
/** /**
* 获取字典分页列表 * 获取字典分页列表
* *
* @param queryParams 查询参数 * @param queryParams 查询参数
* @returns 字典分页结果 * @returns 字典分页结果
*/ */
static getPage(queryParams: DictDataPageQuery) { getPage(queryParams: DictDataPageQuery) {
return request<any, PageResult<DictDataPageVO[]>>({ return request<any, PageResult<DictDataPageVO[]>>({
url: `${DICT_DATA_BASE_URL}/page`, url: `${DICT_DATA_BASE_URL}/page`,
method: "get", method: "get",
params: queryParams, params: queryParams,
}); });
} },
/** /**
* 获取字典数据表单 * 获取字典数据表单
@@ -23,25 +23,25 @@ class DictDataAPI {
* @param id 字典ID * @param id 字典ID
* @returns 字典数据表单 * @returns 字典数据表单
*/ */
static getFormData(id: number) { getFormData(id: number) {
return request<any, ResponseData<DictDataForm>>({ return request<any, ResponseData<DictDataForm>>({
url: `${DICT_DATA_BASE_URL}/${id}/form`, url: `${DICT_DATA_BASE_URL}/${id}/form`,
method: "get", method: "get",
}); });
} },
/** /**
* 新增字典数据 * 新增字典数据
* *
* @param data 字典数据 * @param data 字典数据
*/ */
static add(data: DictDataForm) { add(data: DictDataForm) {
return request({ return request({
url: `${DICT_DATA_BASE_URL}`, url: `${DICT_DATA_BASE_URL}`,
method: "post", method: "post",
data: data, data: data,
}); });
} },
/** /**
* 修改字典数据 * 修改字典数据
@@ -49,25 +49,25 @@ class DictDataAPI {
* @param id 字典ID * @param id 字典ID
* @param data 字典数据 * @param data 字典数据
*/ */
static update(id: number, data: DictDataForm) { update(id: number, data: DictDataForm) {
return request({ return request({
url: `${DICT_DATA_BASE_URL}/${id}`, url: `${DICT_DATA_BASE_URL}/${id}`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** /**
* 删除字典 * 删除字典
* *
* @param ids 字典ID多个以英文逗号(,)分隔 * @param ids 字典ID多个以英文逗号(,)分隔
*/ */
static deleteByIds(ids: string) { deleteByIds(ids: string) {
return request({ return request({
url: `${DICT_DATA_BASE_URL}/${ids}`, url: `${DICT_DATA_BASE_URL}/${ids}`,
method: "delete", method: "delete",
}); });
} },
/** /**
* 获取字典的数据项 * 获取字典的数据项
@@ -75,13 +75,13 @@ class DictDataAPI {
* @param dictCode 字典编码 * @param dictCode 字典编码
* @returns 字典数据项 * @returns 字典数据项
*/ */
static getOptions(dictCode: string) { getOptions(dictCode: string) {
return request<any, OptionType[]>({ return request<any, OptionType[]>({
url: `${DICT_DATA_BASE_URL}/${dictCode}/options`, url: `${DICT_DATA_BASE_URL}/${dictCode}/options`,
method: "get", method: "get",
}); });
} },
} };
export default DictDataAPI; export default DictDataAPI;

View File

@@ -2,20 +2,20 @@ import request from "@/utils/request";
const DICT_BASE_URL = "/api/v1/dict"; const DICT_BASE_URL = "/api/v1/dict";
class DictAPI { const DictAPI = {
/** /**
* 获取字典分页列表 * 获取字典分页列表
* *
* @param queryParams 查询参数 * @param queryParams 查询参数
* @returns 字典分页结果 * @returns 字典分页结果
*/ */
static getPage(queryParams: DictPageQuery) { getPage(queryParams: DictPageQuery) {
return request<any, PageResult<DictPageVO[]>>({ return request<any, PageResult<DictPageVO[]>>({
url: `${DICT_BASE_URL}/page`, url: `${DICT_BASE_URL}/page`,
method: "get", method: "get",
params: queryParams, params: queryParams,
}); });
} },
/** /**
* 获取字典表单数据 * 获取字典表单数据
@@ -23,25 +23,25 @@ class DictAPI {
* @param id 字典ID * @param id 字典ID
* @returns 字典表单数据 * @returns 字典表单数据
*/ */
static getFormData(id: number) { getFormData(id: number) {
return request<any, ResponseData<DictForm>>({ return request<any, ResponseData<DictForm>>({
url: `${DICT_BASE_URL}/${id}/form`, url: `${DICT_BASE_URL}/${id}/form`,
method: "get", method: "get",
}); });
} },
/** /**
* 新增字典 * 新增字典
* *
* @param data 字典表单数据 * @param data 字典表单数据
*/ */
static add(data: DictForm) { add(data: DictForm) {
return request({ return request({
url: `${DICT_BASE_URL}`, url: `${DICT_BASE_URL}`,
method: "post", method: "post",
data: data, data: data,
}); });
} },
/** /**
* 修改字典 * 修改字典
@@ -49,38 +49,38 @@ class DictAPI {
* @param id 字典ID * @param id 字典ID
* @param data 字典表单数据 * @param data 字典表单数据
*/ */
static update(id: number, data: DictForm) { update(id: number, data: DictForm) {
return request({ return request({
url: `${DICT_BASE_URL}/${id}`, url: `${DICT_BASE_URL}/${id}`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** /**
* 删除字典 * 删除字典
* *
* @param ids 字典ID多个以英文逗号(,)分隔 * @param ids 字典ID多个以英文逗号(,)分隔
*/ */
static deleteByIds(ids: string) { deleteByIds(ids: string) {
return request({ return request({
url: `${DICT_BASE_URL}/${ids}`, url: `${DICT_BASE_URL}/${ids}`,
method: "delete", method: "delete",
}); });
} },
/** /**
* 获取字典列表 * 获取字典列表
* *
* @returns 字典列表 * @returns 字典列表
*/ */
static getList() { getList() {
return request<any, OptionType[]>({ return request<any, OptionType[]>({
url: `${DICT_BASE_URL}/list`, url: `${DICT_BASE_URL}/list`,
method: "get", method: "get",
}); });
} },
} };
export default DictAPI; export default DictAPI;

View File

@@ -1,17 +1,17 @@
import request from "@/utils/request"; import request from "@/utils/request";
class FileAPI { const FileAPI = {
/** /**
* 文件上传地址 * 文件上传地址
*/ */
static uploadUrl = import.meta.env.VITE_APP_BASE_API + "/api/v1/files"; uploadUrl: import.meta.env.VITE_APP_BASE_API + "/api/v1/files",
/** /**
* 上传文件 * 上传文件
* *
* @param file * @param file
*/ */
static upload(file: File) { upload(file: File) {
const formData = new FormData(); const formData = new FormData();
formData.append("file", file); formData.append("file", file);
return request<any, FileInfo>({ return request<any, FileInfo>({
@@ -22,27 +22,27 @@ class FileAPI {
"Content-Type": "multipart/form-data", "Content-Type": "multipart/form-data",
}, },
}); });
} },
/** /**
* 删除文件 * 删除文件
* *
* @param filePath 文件完整路径 * @param filePath 文件完整路径
*/ */
static deleteByPath(filePath?: string) { deleteByPath(filePath?: string) {
return request({ return request({
url: "/api/v1/files", url: "/api/v1/files",
method: "delete", method: "delete",
params: { filePath: filePath }, params: { filePath: filePath },
}); });
} },
/** /**
* 下载文件 * 下载文件
* @param url * @param url
* @param fileName * @param fileName
*/ */
static downloadFile(url: string, fileName?: string) { downloadFile(url: string, fileName?: string) {
return request({ return request({
url: url, url: url,
method: "get", method: "get",
@@ -56,8 +56,8 @@ class FileAPI {
a.click(); a.click();
window.URL.revokeObjectURL(url); window.URL.revokeObjectURL(url);
}); });
} },
} };
export default FileAPI; export default FileAPI;

View File

@@ -2,19 +2,19 @@ import request from "@/utils/request";
const LOG_BASE_URL = "/api/v1/logs"; const LOG_BASE_URL = "/api/v1/logs";
class LogAPI { const LogAPI = {
/** /**
* 获取日志分页列表 * 获取日志分页列表
* *
* @param queryParams 查询参数 * @param queryParams 查询参数
*/ */
static getPage(queryParams: LogPageQuery) { getPage(queryParams: LogPageQuery) {
return request<any, PageResult<LogPageVO[]>>({ return request<any, PageResult<LogPageVO[]>>({
url: `${LOG_BASE_URL}/page`, url: `${LOG_BASE_URL}/page`,
method: "get", method: "get",
params: queryParams, params: queryParams,
}); });
} },
/** /**
* 获取访问趋势 * 获取访问趋势
@@ -22,13 +22,13 @@ class LogAPI {
* @param queryParams * @param queryParams
* @returns * @returns
*/ */
static getVisitTrend(queryParams: VisitTrendQuery) { getVisitTrend(queryParams: VisitTrendQuery) {
return request<any, VisitTrendVO>({ return request<any, VisitTrendVO>({
url: `${LOG_BASE_URL}/visit-trend`, url: `${LOG_BASE_URL}/visit-trend`,
method: "get", method: "get",
params: queryParams, params: queryParams,
}); });
} },
/** /**
* 获取访问统计 * 获取访问统计
@@ -36,13 +36,13 @@ class LogAPI {
* @param queryParams * @param queryParams
* @returns * @returns
*/ */
static getVisitStats() { getVisitStats() {
return request<any, VisitStatsVO[]>({ return request<any, VisitStatsVO[]>({
url: `${LOG_BASE_URL}/visit-stats`, url: `${LOG_BASE_URL}/visit-stats`,
method: "get", method: "get",
}); });
} },
} };
export default LogAPI; export default LogAPI;

View File

@@ -2,7 +2,7 @@ import request from "@/utils/request";
// 菜单基础URL // 菜单基础URL
const MENU_BASE_URL = "/api/v1/menus"; const MENU_BASE_URL = "/api/v1/menus";
class MenuAPI { const MenuAPI = {
/** /**
* 获取当前用户的路由列表 * 获取当前用户的路由列表
* <p/> * <p/>
@@ -10,12 +10,12 @@ class MenuAPI {
* *
* @returns 路由列表 * @returns 路由列表
*/ */
static getRoutes() { getRoutes() {
return request<any, RouteVO[]>({ return request<any, RouteVO[]>({
url: `${MENU_BASE_URL}/routes`, url: `${MENU_BASE_URL}/routes`,
method: "get", method: "get",
}); });
} },
/** /**
* 获取菜单树形列表 * 获取菜单树形列表
@@ -23,38 +23,38 @@ class MenuAPI {
* @param queryParams 查询参数 * @param queryParams 查询参数
* @returns 菜单树形列表 * @returns 菜单树形列表
*/ */
static getList(queryParams: MenuQuery) { getList(queryParams: MenuQuery) {
return request<any, MenuVO[]>({ return request<any, MenuVO[]>({
url: `${MENU_BASE_URL}`, url: `${MENU_BASE_URL}`,
method: "get", method: "get",
params: queryParams, params: queryParams,
}); });
} },
/** /**
* 获取菜单下拉数据源 * 获取菜单下拉数据源
* *
* @returns 菜单下拉数据源 * @returns 菜单下拉数据源
*/ */
static getOptions(onlyParent?: boolean) { getOptions(onlyParent?: boolean) {
return request<any, OptionType[]>({ return request<any, OptionType[]>({
url: `${MENU_BASE_URL}/options`, url: `${MENU_BASE_URL}/options`,
method: "get", method: "get",
params: { onlyParent: onlyParent }, params: { onlyParent: onlyParent },
}); });
} },
/** /**
* 获取菜单表单数据 * 获取菜单表单数据
* *
* @param id 菜单ID * @param id 菜单ID
*/ */
static getFormData(id: number) { getFormData(id: number) {
return request<any, MenuForm>({ return request<any, MenuForm>({
url: `${MENU_BASE_URL}/${id}/form`, url: `${MENU_BASE_URL}/${id}/form`,
method: "get", method: "get",
}); });
} },
/** /**
* 添加菜单 * 添加菜单
@@ -62,13 +62,13 @@ class MenuAPI {
* @param data 菜单表单数据 * @param data 菜单表单数据
* @returns 请求结果 * @returns 请求结果
*/ */
static add(data: MenuForm) { add(data: MenuForm) {
return request({ return request({
url: `${MENU_BASE_URL}`, url: `${MENU_BASE_URL}`,
method: "post", method: "post",
data: data, data: data,
}); });
} },
/** /**
* 修改菜单 * 修改菜单
@@ -77,13 +77,13 @@ class MenuAPI {
* @param data 菜单表单数据 * @param data 菜单表单数据
* @returns 请求结果 * @returns 请求结果
*/ */
static update(id: string, data: MenuForm) { update(id: string, data: MenuForm) {
return request({ return request({
url: `${MENU_BASE_URL}/${id}`, url: `${MENU_BASE_URL}/${id}`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** /**
* 删除菜单 * 删除菜单
@@ -91,17 +91,17 @@ class MenuAPI {
* @param id 菜单ID * @param id 菜单ID
* @returns 请求结果 * @returns 请求结果
*/ */
static deleteById(id: number) { deleteById(id: number) {
return request({ return request({
url: `${MENU_BASE_URL}/${id}`, url: `${MENU_BASE_URL}/${id}`,
method: "delete", method: "delete",
}); });
} },
} };
export default MenuAPI; export default MenuAPI;
import { MenuTypeEnum } from "@/enums/MenuTypeEnum"; import type { MenuTypeEnum } from "@/enums/MenuTypeEnum";
/** 菜单查询参数 */ /** 菜单查询参数 */
export interface MenuQuery { export interface MenuQuery {

View File

@@ -2,15 +2,15 @@ import request from "@/utils/request";
const NOTICE_BASE_URL = "/api/v1/notices"; const NOTICE_BASE_URL = "/api/v1/notices";
class NoticeAPI { const NoticeAPI = {
/** 获取通知公告分页数据 */ /** 获取通知公告分页数据 */
static getPage(queryParams?: NoticePageQuery) { getPage(queryParams?: NoticePageQuery) {
return request<any, PageResult<NoticePageVO[]>>({ return request<any, PageResult<NoticePageVO[]>>({
url: `${NOTICE_BASE_URL}/page`, url: `${NOTICE_BASE_URL}/page`,
method: "get", method: "get",
params: queryParams, params: queryParams,
}); });
} },
/** /**
* 获取通知公告表单数据 * 获取通知公告表单数据
@@ -18,12 +18,12 @@ class NoticeAPI {
* @param id NoticeID * @param id NoticeID
* @returns Notice表单数据 * @returns Notice表单数据
*/ */
static getFormData(id: number) { getFormData(id: number) {
return request<any, NoticeForm>({ return request<any, NoticeForm>({
url: `${NOTICE_BASE_URL}/${id}/form`, url: `${NOTICE_BASE_URL}/${id}/form`,
method: "get", method: "get",
}); });
} },
/** /**
* 添加通知公告 * 添加通知公告
@@ -31,13 +31,13 @@ class NoticeAPI {
* @param data Notice表单数据 * @param data Notice表单数据
* @returns * @returns
*/ */
static add(data: NoticeForm) { add(data: NoticeForm) {
return request({ return request({
url: `${NOTICE_BASE_URL}`, url: `${NOTICE_BASE_URL}`,
method: "post", method: "post",
data: data, data: data,
}); });
} },
/** /**
* 更新通知公告 * 更新通知公告
@@ -45,25 +45,25 @@ class NoticeAPI {
* @param id NoticeID * @param id NoticeID
* @param data Notice表单数据 * @param data Notice表单数据
*/ */
static update(id: number, data: NoticeForm) { update(id: number, data: NoticeForm) {
return request({ return request({
url: `${NOTICE_BASE_URL}/${id}`, url: `${NOTICE_BASE_URL}/${id}`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** /**
* 批量删除通知公告,多个以英文逗号(,)分割 * 批量删除通知公告,多个以英文逗号(,)分割
* *
* @param ids 通知公告ID字符串多个以英文逗号(,)分割 * @param ids 通知公告ID字符串多个以英文逗号(,)分割
*/ */
static deleteByIds(ids: string) { deleteByIds(ids: string) {
return request({ return request({
url: `${NOTICE_BASE_URL}/${ids}`, url: `${NOTICE_BASE_URL}/${ids}`,
method: "delete", method: "delete",
}); });
} },
/** /**
* 发布通知 * 发布通知
@@ -71,12 +71,12 @@ class NoticeAPI {
* @param id 被发布的通知公告id * @param id 被发布的通知公告id
* @returns * @returns
*/ */
static publish(id: number) { publish(id: number) {
return request({ return request({
url: `${NOTICE_BASE_URL}/${id}/publish`, url: `${NOTICE_BASE_URL}/${id}/publish`,
method: "patch", method: "patch",
}); });
} },
/** /**
* 撤回通知 * 撤回通知
@@ -84,41 +84,41 @@ class NoticeAPI {
* @param id 撤回的通知id * @param id 撤回的通知id
* @returns * @returns
*/ */
static revoke(id: number) { revoke(id: number) {
return request({ return request({
url: `${NOTICE_BASE_URL}/${id}/revoke`, url: `${NOTICE_BASE_URL}/${id}/revoke`,
method: "patch", method: "patch",
}); });
} },
/** /**
* 查看通知 * 查看通知
* *
* @param id * @param id
*/ */
static getDetail(id: string) { getDetail(id: string) {
return request<any, NoticeDetailVO>({ return request<any, NoticeDetailVO>({
url: `${NOTICE_BASE_URL}/${id}/detail`, url: `${NOTICE_BASE_URL}/${id}/detail`,
method: "get", method: "get",
}); });
} },
/* 全部已读 */ /* 全部已读 */
static readAll() { readAll() {
return request({ return request({
url: `${NOTICE_BASE_URL}/read-all`, url: `${NOTICE_BASE_URL}/read-all`,
method: "put", method: "put",
}); });
} },
/** 获取我的通知分页列表 */ /** 获取我的通知分页列表 */
static getMyNoticePage(queryParams?: NoticePageQuery) { getMyNoticePage(queryParams?: NoticePageQuery) {
return request<any, PageResult<NoticePageVO[]>>({ return request<any, PageResult<NoticePageVO[]>>({
url: `${NOTICE_BASE_URL}/my-page`, url: `${NOTICE_BASE_URL}/my-page`,
method: "get", method: "get",
params: queryParams, params: queryParams,
}); });
} },
} };
export default NoticeAPI; export default NoticeAPI;
@@ -197,27 +197,3 @@ export interface NoticeDetailVO {
/** 发布状态 */ /** 发布状态 */
publishStatus?: number; publishStatus?: number;
} }
/** 用户通知分页列表 */
interface UserNoticePageVO {
/** 通知ID */
id: number;
/** 通知标题 */
title: string;
/** 通知类型 */
typeLabel: string;
/** 发布人姓名 */
publisherName: string;
/** 通知级别 */
levelLabel: string;
/** 发布时间 */
publishTime: string;
/** 是否已读 */
isReadLabel: string;
}

View File

@@ -2,36 +2,35 @@ import request from "@/utils/request";
const ROLE_BASE_URL = "/api/v1/roles"; const ROLE_BASE_URL = "/api/v1/roles";
class RoleAPI { const RoleAPI = {
/** 获取角色分页数据 */ /** 获取角色分页数据 */
static getPage(queryParams?: RolePageQuery) { getPage(queryParams?: RolePageQuery) {
return request<any, PageResult<RolePageVO[]>>({ return request<any, PageResult<RolePageVO[]>>({
url: `${ROLE_BASE_URL}/page`, url: `${ROLE_BASE_URL}/page`,
method: "get", method: "get",
params: queryParams, params: queryParams,
}); });
} },
/** 获取角色下拉数据源 */ /** 获取角色下拉数据源 */
static getOptions() { getOptions() {
return request<any, OptionType[]>({ return request<any, OptionType[]>({
url: `${ROLE_BASE_URL}/options`, url: `${ROLE_BASE_URL}/options`,
method: "get", method: "get",
}); });
} },
/** /**
* 获取角色的菜单ID集合 * 获取角色的菜单ID集合
* *
* @param roleId 角色ID * @param roleId 角色ID
* @returns 角色的菜单ID集合 * @returns 角色的菜单ID集合
*/ */
static getRoleMenuIds(roleId: number) { getRoleMenuIds(roleId: number) {
return request<any, number[]>({ return request<any, number[]>({
url: `${ROLE_BASE_URL}/${roleId}/menuIds`, url: `${ROLE_BASE_URL}/${roleId}/menuIds`,
method: "get", method: "get",
}); });
} },
/** /**
* 分配菜单权限 * 分配菜单权限
@@ -39,13 +38,13 @@ class RoleAPI {
* @param roleId 角色ID * @param roleId 角色ID
* @param data 菜单ID集合 * @param data 菜单ID集合
*/ */
static updateRoleMenus(roleId: number, data: number[]) { updateRoleMenus(roleId: number, data: number[]) {
return request({ return request({
url: `${ROLE_BASE_URL}/${roleId}/menus`, url: `${ROLE_BASE_URL}/${roleId}/menus`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** /**
* 获取角色表单数据 * 获取角色表单数据
@@ -53,21 +52,21 @@ class RoleAPI {
* @param id 角色ID * @param id 角色ID
* @returns 角色表单数据 * @returns 角色表单数据
*/ */
static getFormData(id: number) { getFormData(id: number) {
return request<any, RoleForm>({ return request<any, RoleForm>({
url: `${ROLE_BASE_URL}/${id}/form`, url: `${ROLE_BASE_URL}/${id}/form`,
method: "get", method: "get",
}); });
} },
/** 添加角色 */ /** 添加角色 */
static add(data: RoleForm) { add(data: RoleForm) {
return request({ return request({
url: `${ROLE_BASE_URL}`, url: `${ROLE_BASE_URL}`,
method: "post", method: "post",
data: data, data: data,
}); });
} },
/** /**
* 更新角色 * 更新角色
@@ -75,26 +74,26 @@ class RoleAPI {
* @param id 角色ID * @param id 角色ID
* @param data 角色表单数据 * @param data 角色表单数据
*/ */
static update(id: number, data: RoleForm) { update(id: number, data: RoleForm) {
return request({ return request({
url: `${ROLE_BASE_URL}/${id}`, url: `${ROLE_BASE_URL}/${id}`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** /**
* 批量删除角色,多个以英文逗号(,)分割 * 批量删除角色,多个以英文逗号(,)分割
* *
* @param ids 角色ID字符串多个以英文逗号(,)分割 * @param ids 角色ID字符串多个以英文逗号(,)分割
*/ */
static deleteByIds(ids: string) { deleteByIds(ids: string) {
return request({ return request({
url: `${ROLE_BASE_URL}/${ids}`, url: `${ROLE_BASE_URL}/${ids}`,
method: "delete", method: "delete",
}); });
} },
} };
export default RoleAPI; export default RoleAPI;

View File

@@ -1,33 +1,32 @@
import request from "@/utils/request"; import request from "@/utils/request";
import { AxiosPromise, AxiosResponse } from "axios";
const USER_BASE_URL = "/api/v1/users"; const USER_BASE_URL = "/api/v1/users";
class UserAPI { const UserAPI = {
/** /**
* 获取当前登录用户信息 * 获取当前登录用户信息
* *
* @returns 登录用户昵称、头像信息,包括角色和权限 * @returns 登录用户昵称、头像信息,包括角色和权限
*/ */
static getInfo() { getInfo() {
return request<any, UserInfo>({ return request<any, UserInfo>({
url: `${USER_BASE_URL}/me`, url: `${USER_BASE_URL}/me`,
method: "get", method: "get",
}); });
} },
/** /**
* 获取用户分页列表 * 获取用户分页列表
* *
* @param queryParams 查询参数 * @param queryParams 查询参数
*/ */
static getPage(queryParams: UserPageQuery) { getPage(queryParams: UserPageQuery) {
return request<any, PageResult<UserPageVO[]>>({ return request<any, PageResult<UserPageVO[]>>({
url: `${USER_BASE_URL}/page`, url: `${USER_BASE_URL}/page`,
method: "get", method: "get",
params: queryParams, params: queryParams,
}); });
} },
/** /**
* 获取用户表单详情 * 获取用户表单详情
@@ -35,25 +34,25 @@ class UserAPI {
* @param userId 用户ID * @param userId 用户ID
* @returns 用户表单详情 * @returns 用户表单详情
*/ */
static getFormData(userId: number) { getFormData(userId: number) {
return request<any, UserForm>({ return request<any, UserForm>({
url: `${USER_BASE_URL}/${userId}/form`, url: `${USER_BASE_URL}/${userId}/form`,
method: "get", method: "get",
}); });
} },
/** /**
* 添加用户 * 添加用户
* *
* @param data 用户表单数据 * @param data 用户表单数据
*/ */
static add(data: UserForm) { add(data: UserForm) {
return request({ return request({
url: `${USER_BASE_URL}`, url: `${USER_BASE_URL}`,
method: "post", method: "post",
data: data, data: data,
}); });
} },
/** /**
* 修改用户 * 修改用户
@@ -61,13 +60,13 @@ class UserAPI {
* @param id 用户ID * @param id 用户ID
* @param data 用户表单数据 * @param data 用户表单数据
*/ */
static update(id: number, data: UserForm) { update(id: number, data: UserForm) {
return request({ return request({
url: `${USER_BASE_URL}/${id}`, url: `${USER_BASE_URL}/${id}`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** /**
* 修改用户密码 * 修改用户密码
@@ -75,48 +74,48 @@ class UserAPI {
* @param id 用户ID * @param id 用户ID
* @param password 新密码 * @param password 新密码
*/ */
static resetPassword(id: number, password: string) { resetPassword(id: number, password: string) {
return request({ return request({
url: `${USER_BASE_URL}/${id}/password/reset`, url: `${USER_BASE_URL}/${id}/password/reset`,
method: "put", method: "put",
params: { password: password }, params: { password: password },
}); });
} },
/** /**
* 批量删除用户,多个以英文逗号(,)分割 * 批量删除用户,多个以英文逗号(,)分割
* *
* @param ids 用户ID字符串多个以英文逗号(,)分割 * @param ids 用户ID字符串多个以英文逗号(,)分割
*/ */
static deleteByIds(ids: string) { deleteByIds(ids: string) {
return request({ return request({
url: `${USER_BASE_URL}/${ids}`, url: `${USER_BASE_URL}/${ids}`,
method: "delete", method: "delete",
}); });
} },
/** 下载用户导入模板 */ /** 下载用户导入模板 */
static downloadTemplate() { downloadTemplate() {
return request({ return request({
url: `${USER_BASE_URL}/template`, url: `${USER_BASE_URL}/template`,
method: "get", method: "get",
responseType: "arraybuffer", responseType: "arraybuffer",
}); });
} },
/** /**
* 导出用户 * 导出用户
* *
* @param queryParams 查询参数 * @param queryParams 查询参数
*/ */
static export(queryParams: UserPageQuery) { export(queryParams: UserPageQuery) {
return request({ return request({
url: `${USER_BASE_URL}/export`, url: `${USER_BASE_URL}/export`,
method: "get", method: "get",
params: queryParams, params: queryParams,
responseType: "arraybuffer", responseType: "arraybuffer",
}); });
} },
/** /**
* 导入用户 * 导入用户
@@ -124,7 +123,7 @@ class UserAPI {
* @param deptId 部门ID * @param deptId 部门ID
* @param file 导入文件 * @param file 导入文件
*/ */
static import(deptId: number, file: File) { import(deptId: number, file: File) {
const formData = new FormData(); const formData = new FormData();
formData.append("file", file); formData.append("file", file);
return request({ return request({
@@ -136,33 +135,33 @@ class UserAPI {
"Content-Type": "multipart/form-data", "Content-Type": "multipart/form-data",
}, },
}); });
} },
/** 获取个人中心用户信息 */ /** 获取个人中心用户信息 */
static getProfile() { getProfile() {
return request<any, UserProfileVO>({ return request<any, UserProfileVO>({
url: `${USER_BASE_URL}/profile`, url: `${USER_BASE_URL}/profile`,
method: "get", method: "get",
}); });
} },
/** 修改个人中心用户信息 */ /** 修改个人中心用户信息 */
static updateProfile(data: UserProfileForm) { updateProfile(data: UserProfileForm) {
return request({ return request({
url: `${USER_BASE_URL}/profile`, url: `${USER_BASE_URL}/profile`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** 修改个人中心用户密码 */ /** 修改个人中心用户密码 */
static changePassword(data: PasswordChangeForm) { changePassword(data: PasswordChangeForm) {
return request({ return request({
url: `${USER_BASE_URL}/password`, url: `${USER_BASE_URL}/password`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** /**
* 发送手机/邮箱验证码 * 发送手机/邮箱验证码
@@ -170,42 +169,42 @@ class UserAPI {
* @param contact 联系方式 手机号/邮箱 * @param contact 联系方式 手机号/邮箱
* @param contactType 联系方式类型 MOBILE:手机;EMAIL:邮箱 * @param contactType 联系方式类型 MOBILE:手机;EMAIL:邮箱
*/ */
static sendVerificationCode(contact: string, contactType: string) { sendVerificationCode(contact: string, contactType: string) {
return request({ return request({
url: `${USER_BASE_URL}/send-verification-code`, url: `${USER_BASE_URL}/send-verification-code`,
method: "get", method: "get",
params: { contact: contact, contactType: contactType }, params: { contact: contact, contactType: contactType },
}); });
} },
/** 绑定个人中心用户手机 */ /** 绑定个人中心用户手机 */
static bindMobile(data: MobileBindingForm) { bindMobile(data: MobileBindingForm) {
return request({ return request({
url: `${USER_BASE_URL}/mobile`, url: `${USER_BASE_URL}/mobile`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** 绑定个人中心用户邮箱 */ /** 绑定个人中心用户邮箱 */
static bindEmail(data: EmailBindingForm) { bindEmail(data: EmailBindingForm) {
return request({ return request({
url: `${USER_BASE_URL}/email`, url: `${USER_BASE_URL}/email`,
method: "put", method: "put",
data: data, data: data,
}); });
} },
/** /**
* 获取用户下拉列表 * 获取用户下拉列表
*/ */
static getOptions() { getOptions() {
return request<any, OptionType[]>({ return request<any, OptionType[]>({
url: `${USER_BASE_URL}/options`, url: `${USER_BASE_URL}/options`,
method: "get", method: "get",
}); });
} },
} };
export default UserAPI; export default UserAPI;

View File

@@ -1,6 +1,6 @@
<template> <template>
<component :is="linkType" v-bind="linkProps(to)"> <component :is="linkType" v-bind="linkProps(to)">
<slot></slot> <slot />
</component> </component>
</template> </template>

View File

@@ -98,30 +98,30 @@
<!-- 导出 --> <!-- 导出 -->
<template v-else-if="item === 'exports'"> <template v-else-if="item === 'exports'">
<el-button <el-button
v-hasPerm="[`${contentConfig.pageName}:export`]"
icon="download" icon="download"
circle circle
title="导出" title="导出"
v-hasPerm="[`${contentConfig.pageName}:export`]"
@click="handleToolbar(item)" @click="handleToolbar(item)"
/> />
</template> </template>
<!-- 导入 --> <!-- 导入 -->
<template v-else-if="item === 'imports'"> <template v-else-if="item === 'imports'">
<el-button <el-button
v-hasPerm="[`${contentConfig.pageName}:import`]"
icon="upload" icon="upload"
circle circle
title="导入" title="导入"
v-hasPerm="[`${contentConfig.pageName}:import`]"
@click="handleToolbar(item)" @click="handleToolbar(item)"
/> />
</template> </template>
<!-- 搜索 --> <!-- 搜索 -->
<template v-else-if="item === 'search'"> <template v-else-if="item === 'search'">
<el-button <el-button
v-hasPerm="[`${contentConfig.pageName}:query`]"
icon="search" icon="search"
circle circle
title="搜索" title="搜索"
v-hasPerm="[`${contentConfig.pageName}:query`]"
@click="handleToolbar(item)" @click="handleToolbar(item)"
/> />
</template> </template>
@@ -130,10 +130,10 @@
<template v-else-if="typeof item === 'object'"> <template v-else-if="typeof item === 'object'">
<template v-if="item.auth"> <template v-if="item.auth">
<el-button <el-button
v-hasPerm="[`${contentConfig.pageName}:${item.auth}`]"
:icon="item.icon" :icon="item.icon"
circle circle
:title="item.title" :title="item.title"
v-hasPerm="[`${contentConfig.pageName}:${item.auth}`]"
@click="handleToolbar(item.name)" @click="handleToolbar(item.name)"
/> />
</template> </template>
@@ -332,7 +332,7 @@
:name="col.slotName ?? col.prop" :name="col.slotName ?? col.prop"
:prop="col.prop" :prop="col.prop"
v-bind="scope" v-bind="scope"
></slot> />
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
@@ -437,9 +437,9 @@
> >
<el-form-item label="文件名" prop="files"> <el-form-item label="文件名" prop="files">
<el-upload <el-upload
class="w-full"
ref="uploadRef" ref="uploadRef"
v-model:file-list="importFormData.files" v-model:file-list="importFormData.files"
class="w-full"
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
:drag="true" :drag="true"
:limit="1" :limit="1"

View File

@@ -11,7 +11,7 @@
<el-col v-show="!item.hidden" v-bind="item.col"> <el-col v-show="!item.hidden" v-bind="item.col">
<el-form-item :label="item.label" :prop="item.prop"> <el-form-item :label="item.label" :prop="item.prop">
<!-- Label --> <!-- Label -->
<template #label v-if="item.tips"> <template v-if="item.tips" #label>
<span> <span>
{{ item.label }} {{ item.label }}
<el-tooltip <el-tooltip
@@ -89,7 +89,7 @@
:prop="item.prop" :prop="item.prop"
:formData="formData" :formData="formData"
:attrs="item.attrs" :attrs="item.attrs"
></slot> />
</template> </template>
</el-form-item> </el-form-item>
</el-col> </el-col>

View File

@@ -20,7 +20,7 @@
<el-col v-show="!item.hidden" v-bind="item.col"> <el-col v-show="!item.hidden" v-bind="item.col">
<el-form-item :label="item.label" :prop="item.prop"> <el-form-item :label="item.label" :prop="item.prop">
<!-- Label --> <!-- Label -->
<template #label v-if="item.tips"> <template v-if="item.tips" #label>
<span> <span>
{{ item.label }} {{ item.label }}
<el-tooltip <el-tooltip
@@ -69,8 +69,8 @@
<!-- switch 开关 --> <!-- switch 开关 -->
<template v-else-if="item.type === 'switch'"> <template v-else-if="item.type === 'switch'">
<el-switch <el-switch
inline-prompt
v-model="formData[item.prop]" v-model="formData[item.prop]"
inline-prompt
v-bind="item.attrs" v-bind="item.attrs"
/> />
</template> </template>
@@ -122,7 +122,7 @@
:prop="item.prop" :prop="item.prop"
:formData="formData" :formData="formData"
:attrs="item.attrs" :attrs="item.attrs"
></slot> />
</template> </template>
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -165,7 +165,7 @@
<el-col v-show="!item.hidden" v-bind="item.col"> <el-col v-show="!item.hidden" v-bind="item.col">
<el-form-item :label="item.label" :prop="item.prop"> <el-form-item :label="item.label" :prop="item.prop">
<!-- Label --> <!-- Label -->
<template #label v-if="item.tips"> <template v-if="item.tips" #label>
<span> <span>
{{ item.label }} {{ item.label }}
<el-tooltip <el-tooltip
@@ -220,8 +220,8 @@
<!-- switch 开关 --> <!-- switch 开关 -->
<template v-else-if="item.type === 'switch'"> <template v-else-if="item.type === 'switch'">
<el-switch <el-switch
inline-prompt
v-model="formData[item.prop]" v-model="formData[item.prop]"
inline-prompt
v-bind="item.attrs" v-bind="item.attrs"
/> />
</template> </template>
@@ -273,7 +273,7 @@
:prop="item.prop" :prop="item.prop"
:formData="formData" :formData="formData"
:attrs="item.attrs" :attrs="item.attrs"
></slot> />
</template> </template>
</el-form-item> </el-form-item>
</el-col> </el-col>

View File

@@ -1,9 +1,9 @@
<template> <template>
<el-card <el-card
shadow="never"
class="mb-[10px]"
v-show="visible" v-show="visible"
v-hasPerm="[`${searchConfig.pageName}:query`]" v-hasPerm="[`${searchConfig.pageName}:query`]"
shadow="never"
class="mb-[10px]"
> >
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<template v-for="(item, index) in formItems" :key="item.prop"> <template v-for="(item, index) in formItems" :key="item.prop">
@@ -13,7 +13,7 @@
:prop="item.prop" :prop="item.prop"
> >
<!-- Label --> <!-- Label -->
<template #label v-if="item.tips"> <template v-if="item.tips" #label>
<span> <span>
{{ item.label }} {{ item.label }}
<el-tooltip <el-tooltip
@@ -41,8 +41,8 @@
<div class="flex-center"> <div class="flex-center">
<el-tag <el-tag
v-for="tag in inputTagMap[item.prop].data" v-for="tag in inputTagMap[item.prop].data"
class="mr-2"
:key="tag" :key="tag"
class="mr-2"
:closable="true" :closable="true"
v-bind="inputTagMap[item.prop].tagAttrs" v-bind="inputTagMap[item.prop].tagAttrs"
@close="handleCloseTag(item.prop, tag)" @close="handleCloseTag(item.prop, tag)"

View File

@@ -7,10 +7,10 @@ import type {
TableProps, TableProps,
ColProps, ColProps,
} from "element-plus"; } from "element-plus";
import PageContent from "./PageContent.vue"; import type PageContent from "./PageContent.vue";
import PageForm from "./PageForm.vue"; import type PageForm from "./PageForm.vue";
import PageModal from "./PageModal.vue"; import type PageModal from "./PageModal.vue";
import PageSearch from "./PageSearch.vue"; import type PageSearch from "./PageSearch.vue";
export type PageSearchInstance = InstanceType<typeof PageSearch>; export type PageSearchInstance = InstanceType<typeof PageSearch>;
export type PageContentInstance = InstanceType<typeof PageContent>; export type PageContentInstance = InstanceType<typeof PageContent>;

View File

@@ -1,6 +1,6 @@
<!-- 复制组件 --> <!-- 复制组件 -->
<template> <template>
<el-button link @click="handleClipboard" :style="style"> <el-button link :style="style" @click="handleClipboard">
<slot> <slot>
<el-icon><DocumentCopy color="var(--el-color-primary)" /></el-icon> <el-icon><DocumentCopy color="var(--el-color-primary)" /></el-icon>
</slot> </slot>

View File

@@ -3,8 +3,8 @@
<el-popover :visible="popoverVisible" :width="width" placement="bottom-end"> <el-popover :visible="popoverVisible" :width="width" placement="bottom-end">
<template #reference> <template #reference>
<el-input <el-input
class="reference"
v-model="selectedIcon" v-model="selectedIcon"
class="reference"
readonly readonly
placeholder="点击选择图标" placeholder="点击选择图标"
@click="popoverVisible = !popoverVisible" @click="popoverVisible = !popoverVisible"

View File

@@ -41,9 +41,9 @@
{{ item.title }} {{ item.title }}
</li> </li>
</ul> </ul>
<div class="search-space" v-else>暂无数据</div> <div v-else class="search-space">暂无数据</div>
</div> </div>
<template #footer></template> <template #footer />
</el-dialog> </el-dialog>
</div> </div>
</template> </template>

View File

@@ -3,8 +3,8 @@
<el-dropdown class="flex-center wh-full align-middle"> <el-dropdown class="flex-center wh-full align-middle">
<div class="wh-full"> <div class="wh-full">
<el-badge <el-badge
:offset="[-10, 15]"
v-if="notices.length > 0" v-if="notices.length > 0"
:offset="[-10, 15]"
:value="notices.length" :value="notices.length"
:max="99" :max="99"
class="wh-full" class="wh-full"
@@ -26,23 +26,23 @@
<el-tab-pane label="通知" name="notice"> <el-tab-pane label="通知" name="notice">
<template v-if="notices.length > 0"> <template v-if="notices.length > 0">
<div <div
class="w400px flex-x-between p-1"
v-for="(item, index) in notices" v-for="(item, index) in notices"
:key="index" :key="index"
class="w400px flex-x-between p-1"
> >
<div class="flex-center"> <div class="flex-center">
<DictLabel <DictLabel
code="notice_type"
v-model="item.type" v-model="item.type"
code="notice_type"
size="small" size="small"
class="mr-1" class="mr-1"
/> />
<el-text <el-text
type="primary" type="primary"
@click="readNotice(item.id)"
size="small" size="small"
class="w200px cursor-pointer" class="w200px cursor-pointer"
truncated truncated
@click="readNotice(item.id)"
> >
{{ item.title }} {{ item.title }}
</el-text> </el-text>
@@ -78,20 +78,20 @@
<el-tab-pane label="消息" name="message"> <el-tab-pane label="消息" name="message">
<template v-if="messages.length > 0"> <template v-if="messages.length > 0">
<div <div
class="w400px flex-x-between p-1"
v-for="(item, index) in messages" v-for="(item, index) in messages"
:key="index" :key="index"
class="w400px flex-x-between p-1"
> >
<div> <div>
<DictLabel <DictLabel
code="notice_type"
v-model="item.type" v-model="item.type"
code="notice_type"
size="small" size="small"
/> />
<el-link <el-link
type="primary" type="primary"
@click="readNotice(item.id)"
class="ml-1" class="ml-1"
@click="readNotice(item.id)"
> >
{{ item.title }} {{ item.title }}
</el-link> </el-link>
@@ -128,20 +128,20 @@
<el-tab-pane label="待办" name="task"> <el-tab-pane label="待办" name="task">
<template v-if="tasks.length > 0"> <template v-if="tasks.length > 0">
<div <div
class="w400px flex-x-between p-1"
v-for="(item, index) in tasks" v-for="(item, index) in tasks"
:key="index" :key="index"
class="w400px flex-x-between p-1"
> >
<div> <div>
<DictLabel <DictLabel
code="notice_type"
v-model="item.type" v-model="item.type"
code="notice_type"
size="small" size="small"
/> />
<el-link <el-link
type="primary" type="primary"
@click="readNotice(item.id)"
class="ml-1" class="ml-1"
@click="readNotice(item.id)"
> >
{{ item.title }} {{ item.title }}
</el-link> </el-link>

View File

@@ -123,7 +123,7 @@
:name="col.slotName ?? col.prop" :name="col.slotName ?? col.prop"
:prop="col.prop" :prop="col.prop"
v-bind="scope" v-bind="scope"
></slot> />
</template> </template>
</el-table-column> </el-table-column>
</template> </template>

View File

@@ -19,13 +19,13 @@
:limit="props.limit" :limit="props.limit"
> >
<el-button <el-button
type="primary"
v-if="props.showUploadBtn" v-if="props.showUploadBtn"
type="primary"
:disabled="fileList.length >= props.limit" :disabled="fileList.length >= props.limit"
> >
{{ props.uploadBtnText }} {{ props.uploadBtnText }}
</el-button> </el-button>
<template #tip v-if="props.showTip"> <template v-if="props.showTip" #tip>
<div class="el-upload__tip"> <div class="el-upload__tip">
{{ props.tip }} {{ props.tip }}
</div> </div>
@@ -36,8 +36,8 @@
<el-icon><Document /></el-icon> <el-icon><Document /></el-icon>
<span class="el-upload-list__item-file-name">{{ file.name }}</span> <span class="el-upload-list__item-file-name">{{ file.name }}</span>
<span <span
class="el-icon--close"
v-if="props.showDelBtn" v-if="props.showDelBtn"
class="el-icon--close"
@click.stop="handleRemove(file)" @click.stop="handleRemove(file)"
> >
<el-icon><Close /></el-icon> <el-icon><Close /></el-icon>
@@ -47,13 +47,13 @@
</template> </template>
</el-upload> </el-upload>
<el-progress <el-progress
v-if="showUploadPercent"
:style="{ :style="{
display: showUploadPercent ? 'inline-flex' : 'none', display: showUploadPercent ? 'inline-flex' : 'none',
width: '100%', width: '100%',
}" }"
:percentage="uploadPercent" :percentage="uploadPercent"
:color="customColorMethod" :color="customColorMethod"
v-if="showUploadPercent"
/> />
</div> </div>
</template> </template>

View File

@@ -39,9 +39,9 @@
<el-image-viewer <el-image-viewer
v-if="viewVisible" v-if="viewVisible"
:zoom-rate="1.2" :zoom-rate="1.2"
@close="closePreview"
:initialIndex="initialIndex" :initialIndex="initialIndex"
:url-list="viewFileList" :url-list="viewFileList"
@close="closePreview"
/> />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

View File

@@ -1,5 +1,5 @@
import { hasAuth } from "@/plugins/permission"; import { hasAuth } from "@/plugins/permission";
import { Directive, DirectiveBinding } from "vue"; import type { Directive, DirectiveBinding } from "vue";
/** /**
* 按钮权限 * 按钮权限
@@ -10,7 +10,9 @@ export const hasPerm: Directive = {
const { value: requiredPerms } = binding; const { value: requiredPerms } = binding;
if (requiredPerms) { if (requiredPerms) {
if (!hasAuth(requiredPerms)) { if (!hasAuth(requiredPerms)) {
el.parentNode && el.parentNode.removeChild(el); if (el.parentNode) {
el.parentNode.removeChild(el);
}
} }
} else { } else {
throw new Error( throw new Error(
@@ -29,7 +31,9 @@ export const hasRole: Directive = {
const { value: requiredRoles } = binding; const { value: requiredRoles } = binding;
if (requiredRoles) { if (requiredRoles) {
if (!hasAuth(requiredRoles, "role")) { if (!hasAuth(requiredRoles, "role")) {
el.parentNode && el.parentNode.removeChild(el); if (el.parentNode) {
el.parentNode.removeChild(el);
}
} }
} else { } else {
throw new Error("need roles! Like v-has-role=\"['admin','test']\""); throw new Error("need roles! Like v-has-role=\"['admin','test']\"");

View File

@@ -6,8 +6,8 @@
:class="{ 'is-active': modelValue === LayoutEnum.LEFT }" :class="{ 'is-active': modelValue === LayoutEnum.LEFT }"
@click="updateValue(LayoutEnum.LEFT)" @click="updateValue(LayoutEnum.LEFT)"
> >
<div></div> <div />
<div></div> <div />
</div> </div>
</el-tooltip> </el-tooltip>
@@ -17,8 +17,8 @@
:class="{ 'is-active': modelValue === LayoutEnum.TOP }" :class="{ 'is-active': modelValue === LayoutEnum.TOP }"
@click="updateValue(LayoutEnum.TOP)" @click="updateValue(LayoutEnum.TOP)"
> >
<div></div> <div />
<div></div> <div />
</div> </div>
</el-tooltip> </el-tooltip>
@@ -28,8 +28,8 @@
:class="{ 'is-active': modelValue === LayoutEnum.MIX }" :class="{ 'is-active': modelValue === LayoutEnum.MIX }"
@click="updateValue(LayoutEnum.MIX)" @click="updateValue(LayoutEnum.MIX)"
> >
<div></div> <div />
<div></div> <div />
</div> </div>
</el-tooltip> </el-tooltip>
</div> </div>

View File

@@ -1,9 +1,9 @@
<template> <template>
<div class="logo-container"> <div class="logo-container">
<transition enter-active-class="animate__animated animate__fadeInLeft"> <transition enter-active-class="animate__animated animate__fadeInLeft">
<router-link class="wh-full flex-center" to="/" :key="+collapse"> <router-link :key="+collapse" class="wh-full flex-center" to="/">
<img :src="logo" class="logo-image" /> <img :src="logo" class="logo-image" />
<span class="logo-title" v-if="!collapse"> <span v-if="!collapse" class="logo-title">
{{ defaultSettings.title }} {{ defaultSettings.title }}
</span> </span>
</router-link> </router-link>

View File

@@ -59,7 +59,7 @@ const topMenus = ref<RouteRecordRaw[]>([]);
// 获取当前路由路径的顶部菜单路径 // 获取当前路由路径的顶部菜单路径
const activeTopMenuPath = const activeTopMenuPath =
useRoute().path.split("/").filter(Boolean).length > 1 useRoute().path.split("/").filter(Boolean).length > 1
? useRoute().path.match(/^\/[^\/]+/)?.[0] || "/" ? useRoute().path.match(/^\/[^/]+/)?.[0] || "/"
: "/"; : "/";
// 设置当前激活的顶部菜单路径 // 设置当前激活的顶部菜单路径

View File

@@ -6,8 +6,8 @@
@wheel.prevent="handleScroll" @wheel.prevent="handleScroll"
> >
<router-link <router-link
ref="tagRef"
v-for="tag in visitedViews" v-for="tag in visitedViews"
ref="tagRef"
:key="tag.fullPath" :key="tag.fullPath"
:class="'tags-item ' + (tagsViewStore.isActive(tag) ? 'active' : '')" :class="'tags-item ' + (tagsViewStore.isActive(tag) ? 'active' : '')"
:to="{ path: tag.path, query: tag.query }" :to="{ path: tag.path, query: tag.query }"
@@ -16,8 +16,8 @@
> >
{{ translateRouteTitle(tag.title) }} {{ translateRouteTitle(tag.title) }}
<el-icon <el-icon
class="tag-close-icon"
v-if="!isAffix(tag)" v-if="!isAffix(tag)"
class="tag-close-icon"
@click.prevent.stop="closeSelectedTag(tag)" @click.prevent.stop="closeSelectedTag(tag)"
> >
<Close /> <Close />

View File

@@ -5,7 +5,7 @@
v-if="isMobile && isOpenSidebar" v-if="isMobile && isOpenSidebar"
class="wh-full fixed-lt z-999 bg-black bg-opacity-30" class="wh-full fixed-lt z-999 bg-black bg-opacity-30"
@click="handleOutsideClick" @click="handleOutsideClick"
></div> />
<!-- 公用侧边栏 --> <!-- 公用侧边栏 -->
<Sidebar class="sidebar-container" /> <Sidebar class="sidebar-container" />

View File

@@ -1,4 +1,4 @@
import { import type {
NavigationGuardNext, NavigationGuardNext,
RouteLocationNormalized, RouteLocationNormalized,
RouteRecordRaw, RouteRecordRaw,
@@ -49,6 +49,7 @@ export function setupPermission() {
); );
next({ ...to, replace: true }); next({ ...to, replace: true });
} catch (error) { } catch (error) {
console.error(error);
// 移除 token 并重定向到登录页,携带当前页面路由作为跳转参数 // 移除 token 并重定向到登录页,携带当前页面路由作为跳转参数
await userStore.resetToken(); await userStore.resetToken();
redirectToLogin(to, next); redirectToLogin(to, next);

View File

@@ -1,5 +1,9 @@
import type { App } from "vue"; import type { App } from "vue";
import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router"; import {
createRouter,
createWebHashHistory,
type RouteRecordRaw,
} from "vue-router";
export const Layout = () => import("@/layout/index.vue"); export const Layout = () => import("@/layout/index.vue");

View File

@@ -1,7 +1,7 @@
import { RouteRecordRaw } from "vue-router"; import type { RouteRecordRaw } from "vue-router";
import { constantRoutes } from "@/router"; import { constantRoutes } from "@/router";
import { store } from "@/store"; import { store } from "@/store";
import MenuAPI, { RouteVO } from "@/api/menu"; import MenuAPI, { type RouteVO } from "@/api/menu";
const modules = import.meta.glob("../../views/**/**.vue"); const modules = import.meta.glob("../../views/**/**.vue");
const Layout = () => import("@/layout/index.vue"); const Layout = () => import("@/layout/index.vue");
@@ -65,7 +65,7 @@ const transformRoutes = (routes: RouteVO[]) => {
if (component) { if (component) {
tmpRoute.component = component; tmpRoute.component = component;
} else { } else {
tmpRoute.component = modules[`../../views/error-page/404.vue`]; tmpRoute.component = modules["../../views/error-page/404.vue"];
} }
} }

View File

@@ -57,11 +57,12 @@ export const useTagsViewStore = defineStore("tagsView", () => {
const viewName = view.name; const viewName = view.name;
return new Promise((resolve) => { return new Promise((resolve) => {
const index = cachedViews.value.indexOf(viewName); const index = cachedViews.value.indexOf(viewName);
index > -1 && cachedViews.value.splice(index, 1); if (index > -1) {
cachedViews.value.splice(index, 1);
}
resolve([...cachedViews.value]); resolve([...cachedViews.value]);
}); });
} }
function delOtherVisitedViews(view: TagView) { function delOtherVisitedViews(view: TagView) {
return new Promise((resolve) => { return new Promise((resolve) => {
visitedViews.value = visitedViews.value.filter((v) => { visitedViews.value = visitedViews.value.filter((v) => {

5
src/types/env.d.ts vendored
View File

@@ -1,9 +1,8 @@
// https://cn.vitejs.dev/guide/env-and-mode // https://cn.vitejs.dev/guide/env-and-mode
declare module "*.vue" { declare module "*.vue" {
import { DefineComponent } from "vue"; import type { DefineComponent } from "vue";
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types const component: DefineComponent<object, object, any>;
const component: DefineComponent<{}, {}, any>;
export default component; export default component;
} }

View File

@@ -1,4 +1,4 @@
const TOKEN_KEY = "v3-admin-token"; const TOKEN_KEY = "admin-token";
function getToken(): string { function getToken(): string {
return localStorage.getItem(TOKEN_KEY) || ""; return localStorage.getItem(TOKEN_KEY) || "";

View File

@@ -1,4 +1,7 @@
import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios"; import axios, {
type InternalAxiosRequestConfig,
type AxiosResponse,
} from "axios";
import { useUserStoreHook } from "@/store/modules/user"; import { useUserStoreHook } from "@/store/modules/user";
import { ResultEnum } from "@/enums/ResultEnum"; import { ResultEnum } from "@/enums/ResultEnum";
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";

View File

@@ -5,13 +5,22 @@ class WebSocketManager {
private client: Client | null = null; private client: Client | null = null;
private messageHandlers: Map<string, ((message: string) => void)[]> = private messageHandlers: Map<string, ((message: string) => void)[]> =
new Map(); new Map();
private reconnectAttempts = 0;
constructor() {} private maxReconnectAttempts = 3; // 自定义最大重试次数
private reconnectDelay = 5000; // 重试延迟(单位:毫秒)
// 初始化 WebSocket 客户端 // 初始化 WebSocket 客户端
setupWebSocket() { setupWebSocket() {
const endpoint = import.meta.env.VITE_APP_WS_ENDPOINT; const endpoint = import.meta.env.VITE_APP_WS_ENDPOINT;
// 如果没有配置 WebSocket 端点或显式关闭,直接返回
if (!endpoint) {
console.log(
"WebSocket 已被禁用,如需打开请在配置文件中配置 VITE_APP_WS_ENDPOINT"
);
return;
}
if (this.client && this.client.connected) { if (this.client && this.client.connected) {
console.log("客户端已存在并且连接正常"); console.log("客户端已存在并且连接正常");
return this.client; return this.client;
@@ -24,8 +33,10 @@ class WebSocketManager {
}, },
heartbeatIncoming: 30000, heartbeatIncoming: 30000,
heartbeatOutgoing: 30000, heartbeatOutgoing: 30000,
reconnectDelay: 0, // 设置为 0 禁用重连
onConnect: () => { onConnect: () => {
console.log(`连接到 WebSocket 服务器: ${endpoint}`); console.log(`连接到 WebSocket 服务器: ${endpoint}`);
this.reconnectAttempts = 0; // 重置重连计数
this.messageHandlers.forEach((handlers, topic) => { this.messageHandlers.forEach((handlers, topic) => {
handlers.forEach((handler) => { handlers.forEach((handler) => {
this.subscribeToTopic(topic, handler); this.subscribeToTopic(topic, handler);
@@ -38,6 +49,13 @@ class WebSocketManager {
}, },
onDisconnect: () => { onDisconnect: () => {
console.log(`WebSocket 连接已断开: ${endpoint}`); console.log(`WebSocket 连接已断开: ${endpoint}`);
this.reconnectAttempts++;
if (this.reconnectAttempts < this.maxReconnectAttempts) {
console.log(`正在尝试重连... 尝试次数: ${this.reconnectAttempts}`);
} else {
console.log("重连次数已达上限,停止重连");
this.client?.deactivate();
}
}, },
}); });

View File

@@ -91,8 +91,8 @@
<el-drawer <el-drawer
v-model="dialog.visible" v-model="dialog.visible"
:title="dialog.title" :title="dialog.title"
@close="dialog.visible = false"
size="80%" size="80%"
@close="dialog.visible = false"
> >
<el-steps :active="active" align-center finish-status="success" simple> <el-steps :active="active" align-center finish-status="success" simple>
<el-step title="基础配置" /> <el-step title="基础配置" />
@@ -196,7 +196,7 @@
</el-row> </el-row>
</el-form> </el-form>
<div class="elTableCustom" v-show="active == 1"> <div v-show="active == 1" class="elTableCustom">
<el-table <el-table
v-loading="loading" v-loading="loading"
row-key="id" row-key="id"
@@ -249,8 +249,8 @@
<div class="flex-y-center"> <div class="flex-y-center">
<span>查询</span> <span>查询</span>
<el-checkbox <el-checkbox
class="ml-1"
v-model="isCheckAllQuery" v-model="isCheckAllQuery"
class="ml-1"
@change="toggleCheckAll('isShowInQuery', isCheckAllQuery)" @change="toggleCheckAll('isShowInQuery', isCheckAllQuery)"
/> />
</div> </div>
@@ -269,8 +269,8 @@
<div class="flex-y-center"> <div class="flex-y-center">
<span>列表</span> <span>列表</span>
<el-checkbox <el-checkbox
class="ml-1"
v-model="isCheckAllList" v-model="isCheckAllList"
class="ml-1"
@change="toggleCheckAll('isShowInList', isCheckAllList)" @change="toggleCheckAll('isShowInList', isCheckAllList)"
/> />
</div> </div>
@@ -290,8 +290,8 @@
<div class="flex-y-center"> <div class="flex-y-center">
<span>表单</span> <span>表单</span>
<el-checkbox <el-checkbox
class="ml-1"
v-model="isCheckAllForm" v-model="isCheckAllForm"
class="ml-1"
@change="toggleCheckAll('isShowInForm', isCheckAllForm)" @change="toggleCheckAll('isShowInForm', isCheckAllForm)"
/> />
</div> </div>
@@ -309,10 +309,10 @@
<el-table-column label="必填" width="70"> <el-table-column label="必填" width="70">
<template #default="scope"> <template #default="scope">
<el-checkbox <el-checkbox
v-if="scope.row.isShowInForm == 1"
v-model="scope.row.isRequired" v-model="scope.row.isRequired"
:true-value="1" :true-value="1"
:false-value="0" :false-value="0"
v-if="scope.row.isShowInForm == 1"
/> />
<span v-else>-</span> <span v-else>-</span>
</template> </template>
@@ -321,9 +321,9 @@
<el-table-column label="查询方式" min-width="120"> <el-table-column label="查询方式" min-width="120">
<template #default="scope"> <template #default="scope">
<el-select <el-select
v-if="scope.row.isShowInQuery === 1"
v-model="scope.row.queryType" v-model="scope.row.queryType"
placeholder="请选择" placeholder="请选择"
v-if="scope.row.isShowInQuery === 1"
> >
<el-option <el-option
v-for="(item, key) in queryTypeOptions" v-for="(item, key) in queryTypeOptions"
@@ -339,12 +339,12 @@
<el-table-column label="表单类型" min-width="120"> <el-table-column label="表单类型" min-width="120">
<template #default="scope"> <template #default="scope">
<el-select <el-select
v-model="scope.row.formType"
placeholder="请选择"
v-if=" v-if="
scope.row.isShowInQuery === 1 || scope.row.isShowInQuery === 1 ||
scope.row.isShowInForm === 1 scope.row.isShowInForm === 1
" "
v-model="scope.row.formType"
placeholder="请选择"
> >
<el-option <el-option
v-for="(item, key) in formTypeOptions" v-for="(item, key) in formTypeOptions"
@@ -397,7 +397,7 @@
<el-col :span="18"> <el-col :span="18">
<el-scrollbar max-height="72vh"> <el-scrollbar max-height="72vh">
<div class="absolute-rt z-36 right-5 top-2"> <div class="absolute-rt z-36 right-5 top-2">
<el-link @click="handleCopyCode" type="primary"> <el-link type="primary" @click="handleCopyCode">
<el-icon> <el-icon>
<CopyDocument /> <CopyDocument />
</el-icon> </el-icon>
@@ -406,10 +406,10 @@
</div> </div>
<Codemirror <Codemirror
ref="cmRef"
v-model:value="code" v-model:value="code"
:options="cmOptions" :options="cmOptions"
border border
ref="cmRef"
:readonly="true" :readonly="true"
height="100%" height="100%"
width="100%" width="100%"
@@ -420,7 +420,7 @@
</div> </div>
<template #footer> <template #footer>
<el-button type="success" @click="handlePrevClick" v-if="active !== 0"> <el-button v-if="active !== 0" type="success" @click="handlePrevClick">
<el-icon> <el-icon>
<Back /> <Back />
</el-icon> </el-icon>
@@ -515,7 +515,7 @@ const prevBtnText = ref("");
const nextBtnText = ref("下一步,字段配置"); const nextBtnText = ref("下一步,字段配置");
const active = ref(0); const active = ref(0);
const currentTableName = ref(""); const currentTableName = ref("");
const sortFlag = ref<Object>(); const sortFlag = ref<object>();
// 查询是否全选 // 查询是否全选
const isCheckAllQuery = ref(false); const isCheckAllQuery = ref(false);

View File

@@ -27,7 +27,7 @@
</div> </div>
</template> </template>
<div :id="id" :class="className" :style="{ height, width }"></div> <div :id="id" :class="className" :style="{ height, width }" />
</el-card> </el-card>
</template> </template>
@@ -190,7 +190,7 @@ const handleDownloadChart = () => {
if (ctx) { if (ctx) {
ctx.drawImage(img, 0, 0, img.width, img.height); ctx.drawImage(img, 0, 0, img.width, img.height);
const link = document.createElement("a"); const link = document.createElement("a");
link.download = `访问趋势.png`; link.download = "访问趋势.png";
link.href = canvas.toDataURL("image/png", 0.9); link.href = canvas.toDataURL("image/png", 0.9);
document.body.appendChild(link); document.body.appendChild(link);
link.click(); link.click();

View File

@@ -66,11 +66,11 @@
</el-col> </el-col>
<el-col <el-col
v-for="(item, index) in visitStatsList"
:key="index"
:xs="24" :xs="24"
:sm="12" :sm="12"
:lg="6" :lg="6"
v-for="(item, index) in visitStatsList"
:key="index"
> >
<el-skeleton :loading="visitStatsLoading" :rows="5" animated> <el-skeleton :loading="visitStatsLoading" :rows="5" animated>
<template #template> <template #template>
@@ -169,7 +169,7 @@
:key="index" :key="index"
class="flex-y-center py-3" class="flex-y-center py-3"
> >
<DictLabel code="notice_type" v-model="item.type" size="small" /> <DictLabel v-model="item.type" code="notice_type" size="small" />
<el-text <el-text
truncated truncated
class="!mx-2 flex-1 !text-xs !text-[var(--el-text-color-secondary)]" class="!mx-2 flex-1 !text-xs !text-[var(--el-text-color-secondary)]"

View File

@@ -6,7 +6,7 @@
width="100%" width="100%"
height="100%" height="100%"
frameborder="0" frameborder="0"
></iframe> />
</div> </div>
</template> </template>

View File

@@ -6,7 +6,7 @@
width="100%" width="100%"
height="100%" height="100%"
frameborder="0" frameborder="0"
></iframe> />
</div> </div>
</template> </template>

View File

@@ -6,7 +6,7 @@
width="100%" width="100%"
height="100%" height="100%"
frameborder="0" frameborder="0"
></iframe> />
</div> </div>
</template> </template>

View File

@@ -8,7 +8,7 @@ const contentConfig: IContentConfig = {
toolbar: [], toolbar: [],
indexAction: function (params) { indexAction: function (params) {
// 模拟发起网络请求获取列表数据 // 模拟发起网络请求获取列表数据
// console.log("indexAction:", params); console.log("indexAction:", params);
return Promise.resolve({ return Promise.resolve({
total: 2, total: 2,
list: [ list: [
@@ -76,7 +76,7 @@ const contentConfig: IContentConfig = {
align: "center", align: "center",
prop: "gender", prop: "gender",
templet: "list", templet: "list",
selectList: { 0: "女", 1: "男" }, selectList: { "0": "女", "1": "男" },
}, },
{ {
label: "自定义", label: "自定义",

View File

@@ -48,7 +48,6 @@ import SvgIcon from "@/components/SvgIcon/index.vue";
import * as ElementPlusIconsVue from "@element-plus/icons-vue"; import * as ElementPlusIconsVue from "@element-plus/icons-vue";
defineOptions({ defineOptions({
// eslint-disable-next-line
name: "Icons", name: "Icons",
inheritAttrs: false, inheritAttrs: false,
}); });

View File

@@ -1,9 +1,6 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<iframe <iframe src="https://juejin.cn/post/7228990409909108793" frameborder="0" />
src="https://juejin.cn/post/7228990409909108793"
frameborder="0"
></iframe>
</div> </div>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@@ -151,7 +151,7 @@ function paint(
@touchstart="onEventStart" @touchstart="onEventStart"
@touchmove.stop.prevent="onEventMove" @touchmove.stop.prevent="onEventMove"
@touchend="onEventEnd" @touchend="onEventEnd"
></canvas> />
<img v-if="imgUrl" :src="imgUrl" alt="签名" /> <img v-if="imgUrl" :src="imgUrl" alt="签名" />
</div> </div>
</template> </template>

View File

@@ -17,25 +17,25 @@
<el-button <el-button
type="primary" type="primary"
class="ml-5" class="ml-5"
@click="connectWebSocket"
:disabled="isConnected" :disabled="isConnected"
@click="connectWebSocket"
> >
连接 连接
</el-button> </el-button>
<el-button <el-button
type="danger" type="danger"
@click="disconnectWebSocket"
:disabled="!isConnected" :disabled="!isConnected"
@click="disconnectWebSocket"
> >
断开 断开
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="8" class="text-right"> <el-col :span="8" class="text-right">
连接状态 连接状态
<el-tag class="ml-2" type="success" v-if="isConnected"> <el-tag v-if="isConnected" class="ml-2" type="success">
已连接 已连接
</el-tag> </el-tag>
<el-tag class="ml-2" type="info" v-else>已断开</el-tag> <el-tag v-else class="ml-2" type="info">已断开</el-tag>
</el-col> </el-col>
</el-row> </el-row>
</el-card> </el-card>
@@ -43,10 +43,10 @@
<el-card class="mt-5"> <el-card class="mt-5">
<el-form label-width="90px"> <el-form label-width="90px">
<el-form-item label="消息内容"> <el-form-item label="消息内容">
<el-input type="textarea" v-model="topicMessage" /> <el-input v-model="topicMessage" type="textarea" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="sendToAll" type="primary">发送广播</el-button> <el-button type="primary" @click="sendToAll">发送广播</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@@ -54,13 +54,13 @@
<el-card class="mt-5"> <el-card class="mt-5">
<el-form label-width="90px"> <el-form label-width="90px">
<el-form-item label="消息内容"> <el-form-item label="消息内容">
<el-input type="textarea" v-model="queneMessage" /> <el-input v-model="queneMessage" type="textarea" />
</el-form-item> </el-form-item>
<el-form-item label="消息接收人"> <el-form-item label="消息接收人">
<el-input v-model="receiver" /> <el-input v-model="receiver" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="sendToUser" type="primary"> <el-button type="primary" @click="sendToUser">
发送点对点消息 发送点对点消息
</el-button> </el-button>
</el-form-item> </el-form-item>

View File

@@ -7,7 +7,7 @@ defineOptions({
}); });
const state = reactive({ const state = reactive({
errGif: new URL(`../../assets/images/401.gif`, import.meta.url).href, errGif: new URL("../../assets/images/401.gif", import.meta.url).href,
ewizardClap: ewizardClap:
"https://wpimg.wallstcn.com/007ef517-bafd-4066-aae4-6883632d9646", "https://wpimg.wallstcn.com/007ef517-bafd-4066-aae4-6883632d9646",
dialogVisible: false, dialogVisible: false,

View File

@@ -100,11 +100,11 @@
:placeholder="$t('login.password')" :placeholder="$t('login.password')"
type="password" type="password"
name="password" name="password"
@keyup="checkCapslock"
@keyup.enter="handleLoginSubmit"
size="large" size="large"
class="h-[48px] pr-2" class="h-[48px] pr-2"
show-password show-password
@keyup="checkCapslock"
@keyup.enter="handleLoginSubmit"
/> />
</div> </div>
</el-form-item> </el-form-item>
@@ -124,9 +124,9 @@
/> />
<el-image <el-image
@click="getCaptcha"
:src="captchaBase64" :src="captchaBase64"
class="captcha-image" class="captcha-image"
@click="getCaptcha"
/> />
</div> </div>
</el-form-item> </el-form-item>
@@ -223,10 +223,10 @@ const captchaBase64 = ref();
// 登录表单ref // 登录表单ref
const loginFormRef = ref<FormInstance>(); const loginFormRef = ref<FormInstance>();
const logo = ref(new URL(`../../assets/logo.png`, import.meta.url).href); const logo = ref(new URL("../../assets/logo.png", import.meta.url).href);
const loginImage = ref( const loginImage = ref(
new URL(`../../assets/images/login-image.svg`, import.meta.url).href new URL("../../assets/images/login-image.svg", import.meta.url).href
); );
const loginData = ref<LoginData>({ const loginData = ref<LoginData>({

View File

@@ -17,8 +17,8 @@
@click="triggerFileUpload" @click="triggerFileUpload"
/> />
<input <input
type="file"
ref="fileInput" ref="fileInput"
type="file"
style="display: none" style="display: none"
@change="handleFileChange" @change="handleFileChange"
/> />
@@ -105,8 +105,8 @@
type="primary" type="primary"
plain plain
size="small" size="small"
@click="() => handleOpenDialog(DialogType.PASSWORD)"
class="ml-5" class="ml-5"
@click="() => handleOpenDialog(DialogType.PASSWORD)"
> >
修改 修改
</el-button> </el-button>
@@ -122,22 +122,22 @@
</span> </span>
<span v-else>未绑定手机</span> <span v-else>未绑定手机</span>
<el-button <el-button
v-if="userProfile.mobile"
type="primary" type="primary"
plain plain
size="small" size="small"
@click="() => handleOpenDialog(DialogType.MOBILE)"
class="ml-5" class="ml-5"
v-if="userProfile.mobile" @click="() => handleOpenDialog(DialogType.MOBILE)"
> >
更换 更换
</el-button> </el-button>
<el-button <el-button
v-else
type="primary" type="primary"
plain plain
size="small" size="small"
@click="() => handleOpenDialog(DialogType.MOBILE)"
class="ml-5" class="ml-5"
v-else @click="() => handleOpenDialog(DialogType.MOBILE)"
> >
绑定 绑定
</el-button> </el-button>
@@ -152,22 +152,22 @@
</span> </span>
<span v-else>未绑定邮箱</span> <span v-else>未绑定邮箱</span>
<el-button <el-button
v-if="userProfile.email"
type="primary" type="primary"
plain plain
size="small" size="small"
@click="() => handleOpenDialog(DialogType.EMAIL)"
class="ml-5" class="ml-5"
v-if="userProfile.email" @click="() => handleOpenDialog(DialogType.EMAIL)"
> >
更换 更换
</el-button> </el-button>
<el-button <el-button
v-else
type="primary" type="primary"
plain plain
size="small" size="small"
@click="() => handleOpenDialog(DialogType.EMAIL)"
class="ml-5" class="ml-5"
v-else @click="() => handleOpenDialog(DialogType.EMAIL)"
> >
绑定 绑定
</el-button> </el-button>
@@ -178,12 +178,12 @@
</el-tabs> </el-tabs>
<!-- 弹窗 --> <!-- 弹窗 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" :width="500"> <el-dialog v-model="dialog.visible" :title="dialog.title" :width="500">
<!-- 账号资料 --> <!-- 账号资料 -->
<el-form <el-form
v-if="dialog.type === DialogType.ACCOUNT" v-if="dialog.type === DialogType.ACCOUNT"
:model="userProfileForm"
ref="userProfileFormRef" ref="userProfileFormRef"
:model="userProfileForm"
:label-width="100" :label-width="100"
> >
<el-form-item label="昵称"> <el-form-item label="昵称">
@@ -197,29 +197,29 @@
<!-- 修改密码 --> <!-- 修改密码 -->
<el-form <el-form
v-if="dialog.type === DialogType.PASSWORD" v-if="dialog.type === DialogType.PASSWORD"
ref="passwordChangeFormRef"
:model="passwordChangeForm" :model="passwordChangeForm"
:rules="passwordChangeRules" :rules="passwordChangeRules"
ref="passwordChangeFormRef"
:label-width="100" :label-width="100"
> >
<el-form-item label="原密码" prop="oldPassword"> <el-form-item label="原密码" prop="oldPassword">
<el-input <el-input
type="password"
v-model="passwordChangeForm.oldPassword" v-model="passwordChangeForm.oldPassword"
type="password"
show-password show-password
/> />
</el-form-item> </el-form-item>
<el-form-item label="新密码" prop="newPassword"> <el-form-item label="新密码" prop="newPassword">
<el-input <el-input
type="password"
v-model="passwordChangeForm.newPassword" v-model="passwordChangeForm.newPassword"
type="password"
show-password show-password
/> />
</el-form-item> </el-form-item>
<el-form-item label="确认密码" prop="confirmPassword"> <el-form-item label="确认密码" prop="confirmPassword">
<el-input <el-input
type="password"
v-model="passwordChangeForm.confirmPassword" v-model="passwordChangeForm.confirmPassword"
type="password"
show-password show-password
/> />
</el-form-item> </el-form-item>
@@ -227,9 +227,9 @@
<!-- 绑定手机 --> <!-- 绑定手机 -->
<el-form <el-form
v-else-if="dialog.type === DialogType.MOBILE" v-else-if="dialog.type === DialogType.MOBILE"
ref="mobileBindingFormRef"
:model="mobileBindingForm" :model="mobileBindingForm"
:rules="mobileBindingRules" :rules="mobileBindingRules"
ref="mobileBindingFormRef"
:label-width="100" :label-width="100"
> >
<el-form-item label="手机号码" prop="mobile"> <el-form-item label="手机号码" prop="mobile">
@@ -257,9 +257,9 @@
<!-- 绑定邮箱 --> <!-- 绑定邮箱 -->
<el-form <el-form
v-else-if="dialog.type === DialogType.EMAIL" v-else-if="dialog.type === DialogType.EMAIL"
ref="emailBindingFormRef"
:model="emailBindingForm" :model="emailBindingForm"
:rules="emailBindingRules" :rules="emailBindingRules"
ref="emailBindingFormRef"
:label-width="100" :label-width="100"
> >
<el-form-item label="邮箱" prop="email"> <el-form-item label="邮箱" prop="email">

View File

@@ -1,5 +1,5 @@
<template> <template>
<div></div> <div />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

View File

@@ -31,8 +31,8 @@
<el-card shadow="never" class="table-container"> <el-card shadow="never" class="table-container">
<template #header> <template #header>
<el-button <el-button
type="success"
v-hasPerm="['sys:config:add']" v-hasPerm="['sys:config:add']"
type="success"
@click="handleOpenDialog()" @click="handleOpenDialog()"
> >
<template #icon> <template #icon>
@@ -41,8 +41,8 @@
新增 新增
</el-button> </el-button>
<el-button <el-button
color="#626aef"
v-hasPerm="['sys:config:refresh']" v-hasPerm="['sys:config:refresh']"
color="#626aef"
@click="handleRefreshCache" @click="handleRefreshCache"
> >
<el-icon><RefreshLeft /></el-icon> <el-icon><RefreshLeft /></el-icon>
@@ -85,10 +85,10 @@
<el-table-column fixed="right" label="操作" width="220"> <el-table-column fixed="right" label="操作" width="220">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-hasPerm="['sys:config:update']"
type="primary" type="primary"
size="small" size="small"
link link
v-hasPerm="['sys:config:update']"
@click="handleOpenDialog(scope.row.id)" @click="handleOpenDialog(scope.row.id)"
> >
<template #icon> <template #icon>
@@ -97,10 +97,10 @@
编辑 编辑
</el-button> </el-button>
<el-button <el-button
v-hasPerm="['sys:config:delete']"
type="danger" type="danger"
size="small" size="small"
link link
v-hasPerm="['sys:config:delete']"
@click="handleDelete(scope.row.id)" @click="handleDelete(scope.row.id)"
> >
<template #icon> <template #icon>

View File

@@ -303,7 +303,7 @@ function handleDelete(deptId?: number) {
return; return;
} }
ElMessageBox.confirm(`确认删除已选中的数据项?`, "警告", { ElMessageBox.confirm("确认删除已选中的数据项?", "警告", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning", type: "warning",

View File

@@ -148,8 +148,8 @@
<el-form-item label="备注"> <el-form-item label="备注">
<el-input <el-input
type="textarea"
v-model="formData.remark" v-model="formData.remark"
type="textarea"
placeholder="请输入备注" placeholder="请输入备注"
/> />
</el-form-item> </el-form-item>

View File

@@ -12,9 +12,9 @@
</el-form-item> </el-form-item>
<el-form-item prop="createTime" label="操作时间"> <el-form-item prop="createTime" label="操作时间">
<el-date-picker <el-date-picker
v-model="queryParams.createTime"
:editable="false" :editable="false"
class="!w-[240px]" class="!w-[240px]"
v-model="queryParams.createTime"
type="daterange" type="daterange"
range-separator="~" range-separator="~"
start-placeholder="开始时间" start-placeholder="开始时间"

View File

@@ -41,11 +41,11 @@
highlight-current-row highlight-current-row
row-key="id" row-key="id"
:expand-row-keys="['1']" :expand-row-keys="['1']"
@row-click="handleRowClick"
:tree-props="{ :tree-props="{
children: 'children', children: 'children',
hasChildren: 'hasChildren', hasChildren: 'hasChildren',
}" }"
@row-click="handleRowClick"
> >
<el-table-column label="菜单名称" min-width="200"> <el-table-column label="菜单名称" min-width="200">
<template #default="scope"> <template #default="scope">
@@ -165,8 +165,8 @@
<el-drawer <el-drawer
v-model="dialog.visible" v-model="dialog.visible"
:title="dialog.title" :title="dialog.title"
@close="handleCloseDialog"
size="50%" size="50%"
@close="handleCloseDialog"
> >
<el-form <el-form
ref="menuFormRef" ref="menuFormRef"
@@ -339,11 +339,11 @@
/> />
<el-icon <el-icon
class="ml-2 cursor-pointer color-[var(--el-color-success)]"
style="vertical-align: -0.15em"
v-if=" v-if="
formData.params.indexOf(item) === formData.params.length - 1 formData.params.indexOf(item) === formData.params.length - 1
" "
class="ml-2 cursor-pointer color-[var(--el-color-success)]"
style="vertical-align: -0.15em"
@click="formData.params.push({ key: '', value: '' })" @click="formData.params.push({ key: '', value: '' })"
> >
<CirclePlusFilled /> <CirclePlusFilled />
@@ -459,7 +459,7 @@
<script setup lang="ts"> <script setup lang="ts">
defineOptions({ defineOptions({
name: "Menu", name: "SysMenu",
inheritAttrs: false, inheritAttrs: false,
}); });

View File

@@ -12,12 +12,12 @@
<span>通知公告详情</span> <span>通知公告详情</span>
<div class="dialog-toolbar"> <div class="dialog-toolbar">
<!-- 全屏/退出全屏按钮 --> <!-- 全屏/退出全屏按钮 -->
<el-button @click="toggleFullscreen" circle> <el-button circle @click="toggleFullscreen">
<SvgIcon v-if="isFullscreen" icon-class="fullscreen-exit" /> <SvgIcon v-if="isFullscreen" icon-class="fullscreen-exit" />
<SvgIcon v-else icon-class="fullscreen" /> <SvgIcon v-else icon-class="fullscreen" />
</el-button> </el-button>
<!-- 关闭按钮 --> <!-- 关闭按钮 -->
<el-button @click="handleClose" circle> <el-button circle @click="handleClose">
<template #icon> <template #icon>
<Close /> <Close />
</template> </template>
@@ -46,7 +46,7 @@
{{ notice.publishTime }} {{ notice.publishTime }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="公告内容:"> <el-descriptions-item label="公告内容:">
<div v-html="notice.content"></div> <div v-html="notice.content" />
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-dialog> </el-dialog>

View File

@@ -73,7 +73,7 @@
<el-table-column label="通知标题" prop="title" min-width="200" /> <el-table-column label="通知标题" prop="title" min-width="200" />
<el-table-column align="center" label="通知类型" width="150"> <el-table-column align="center" label="通知类型" width="150">
<template #default="scope"> <template #default="scope">
<DictLabel :code="'notice_type'" v-model="scope.row.type" /> <DictLabel v-model="scope.row.type" :code="'notice_type'" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@@ -84,7 +84,7 @@
/> />
<el-table-column align="center" label="通知等级" width="100"> <el-table-column align="center" label="通知等级" width="100">
<template #default="scope"> <template #default="scope">
<DictLabel code="notice_level" v-model="scope.row.level" /> <DictLabel v-model="scope.row.level" code="notice_level" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@@ -140,8 +140,8 @@
<el-button <el-button
type="primary" type="primary"
size="small" size="small"
@click="openNoticeDetailDialog(scope.row.id)"
link link
@click="openNoticeDetailDialog(scope.row.id)"
> >
查看 查看
</el-button> </el-button>
@@ -223,16 +223,16 @@
</el-form-item> </el-form-item>
<el-form-item label="通知类型" prop="type"> <el-form-item label="通知类型" prop="type">
<dictionary <dictionary
v-model="formData.type"
type="button" type="button"
code="notice_type" code="notice_type"
v-model="formData.type"
/> />
</el-form-item> </el-form-item>
<el-form-item label="通知等级" prop="level"> <el-form-item label="通知等级" prop="level">
<dictionary <dictionary
v-model="formData.level"
type="button" type="button"
code="notice_level" code="notice_level"
v-model="formData.level"
/> />
</el-form-item> </el-form-item>
<el-form-item label="目标类型" prop="targetType"> <el-form-item label="目标类型" prop="targetType">
@@ -242,9 +242,9 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-if="formData.targetType == 2"
label="指定用户" label="指定用户"
prop="targetUserIds" prop="targetUserIds"
v-if="formData.targetType == 2"
> >
<el-select <el-select
v-model="formData.targetUserIds" v-model="formData.targetUserIds"

View File

@@ -38,7 +38,7 @@
<el-table-column label="通知标题" prop="title" min-width="200" /> <el-table-column label="通知标题" prop="title" min-width="200" />
<el-table-column align="center" label="通知类型" width="150"> <el-table-column align="center" label="通知类型" width="150">
<template #default="scope"> <template #default="scope">
<DictLabel code="notice_type" v-model="scope.row.type" /> <DictLabel v-model="scope.row.type" code="notice_type" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@@ -49,12 +49,12 @@
/> />
<el-table-column align="center" label="通知等级" width="100"> <el-table-column align="center" label="通知等级" width="100">
<template #default="scope"> <template #default="scope">
<DictLabel code="notice_level" v-model="scope.row.level" /> <DictLabel v-model="scope.row.level" code="notice_level" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
align="center"
key="releaseTime" key="releaseTime"
align="center"
label="发布时间" label="发布时间"
prop="publishTime" prop="publishTime"
width="150" width="150"

View File

@@ -185,8 +185,8 @@
</el-button> </el-button>
<el-checkbox <el-checkbox
v-model="parentChildLinked" v-model="parentChildLinked"
@change="handleparentChildLinkedChange"
class="ml-5" class="ml-5"
@change="handleparentChildLinkedChange"
> >
父子联动 父子联动
</el-checkbox> </el-checkbox>

View File

@@ -3,7 +3,7 @@
<el-card shadow="never"> <el-card shadow="never">
<el-input v-model="deptName" placeholder="部门名称" clearable> <el-input v-model="deptName" placeholder="部门名称" clearable>
<template #prefix> <template #prefix>
<Search /> <el-icon><Search /></el-icon>
</template> </template>
</el-input> </el-input>

View File

@@ -16,9 +16,9 @@
> >
<el-form-item label="文件名" prop="files"> <el-form-item label="文件名" prop="files">
<el-upload <el-upload
class="w-full"
ref="uploadRef" ref="uploadRef"
v-model:file-list="importFormData.files" v-model:file-list="importFormData.files"
class="w-full"
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
:drag="true" :drag="true"
:limit="1" :limit="1"

View File

@@ -35,9 +35,9 @@
<el-form-item label="创建时间"> <el-form-item label="创建时间">
<el-date-picker <el-date-picker
v-model="queryParams.createTime"
:editable="false" :editable="false"
class="!w-[240px]" class="!w-[240px]"
v-model="queryParams.createTime"
type="daterange" type="daterange"
range-separator="~" range-separator="~"
start-placeholder="开始时间" start-placeholder="开始时间"