diff --git a/src/api/file.js b/src/api/file.js index b018c77..3999826 100644 --- a/src/api/file.js +++ b/src/api/file.js @@ -12,13 +12,15 @@ export function getUserCate() { } /** - * 获取所有文件 + * 获取所有文件(支持分页、分类、关键词,与后端 query 一致) + * @param {Object} [params] page, pageSize, cate, keyword * @returns {Promise} */ -export function getAllFiles() { +export function getAllFiles(params = {}) { return request({ url: "/platform/allfiles", - method: "get", + method: "get", + params, }); } @@ -85,13 +87,13 @@ export function getCateFiles(id, page = 1, pageSize = 24, keyword = "") { } /** - * 根据ID获取文件 - * @param {number|string} id 文件ID + * 根据文件 ID 获取单条文件信息(非分类列表) + * @param {number|string} id 文件主键 ID * @returns {Promise} */ export function getFileById(id) { return request({ - url: `/platform/catefiles`, + url: `/platform/file/${id}`, method: "get", }); } @@ -100,12 +102,17 @@ export function getFileById(id) { * 上传文件 * @param {FormData} formData 文件数据 * @param {Object} options 额外选项 - * @param {string} [options.cate] + * @param {string|number} [options.cate] 文件分组,0 为未分类 + * @param {string|number} [options.tuid] 租户用户 yz_tenant_user.id;租户侧上传时传,平台管理员不传 * @returns {Promise} */ export function uploadFile(formData, options = {}) { - if (options.cate) { - formData.append('cate', options.cate); + // 0 表示「未分类」,不能用 truthy 判断 + if (options.cate !== undefined && options.cate !== null && options.cate !== "") { + formData.append("cate", String(options.cate)); + } + if (options.tuid !== undefined && options.tuid !== null && options.tuid !== "") { + formData.append("tuid", String(options.tuid)); } return request({ @@ -151,7 +158,7 @@ export function deleteFile(id) { */ export function deleteFilePermanently(id) { return request({ - url: `/platform/deleteFilePermanently/${id}`, + url: `/platform/deletefilepermanently/${id}`, method: "delete", }); } @@ -177,7 +184,7 @@ export function moveFile(id, cate) { */ export function batchDeleteFiles(ids) { return request({ - url: "/platform/batchDeleteFiles", + url: "/platform/batchdeletefiles", method: "post", data: { ids }, }); diff --git a/src/api/login.js b/src/api/login.js index d591e4a..ae1d672 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -9,6 +9,14 @@ export function login(data) { }); } +/** 当前登录用户信息(含角色名称),需携带 token */ +export function getCurrentUser() { + return request({ + url: `/platform/currentUser`, + method: "get", + }); +} + // 发送登录验证码(手机号) export function sendLoginCode(data) { return request({ diff --git a/src/api/tenantUser.js b/src/api/tenantUser.js index 70501e5..16490b7 100644 --- a/src/api/tenantUser.js +++ b/src/api/tenantUser.js @@ -1,6 +1,6 @@ import request from "@/utils/request"; -// 获取租户用户列表 +/** 获取租户用户列表;params 可含 tid、uid、keyword(模糊匹配姓名/手机/邮箱/账号) */ export function getTenantUserList(params) { return request({ url: "/platform/tenantUser/list", @@ -9,7 +9,7 @@ export function getTenantUserList(params) { }); } -// 创建租户用户绑定关系 +/** 创建租户用户绑定(后端写入 yz_tenant_user) */ export function createTenantUser(data) { return request({ url: "/platform/tenantUser/create", diff --git a/src/components/CommonHeader.vue b/src/components/CommonHeader.vue index f380168..a5aa63d 100644 --- a/src/components/CommonHeader.vue +++ b/src/components/CommonHeader.vue @@ -43,6 +43,7 @@ {{ displayName }} + {{ roleLabel }} - - \ No newline at end of file +defineExpose({ open }); + + + diff --git a/src/views/basicSettings/tenants/index.vue b/src/views/basicSettings/tenants/index.vue index 7120969..616cdd0 100644 --- a/src/views/basicSettings/tenants/index.vue +++ b/src/views/basicSettings/tenants/index.vue @@ -111,14 +111,9 @@ }} - + - + @@ -98,7 +98,7 @@ interface User { phone: string; qq: string; sex: number; - group_id: number; + rid: number; status: number; last_login_ip: string; login_count: number; @@ -153,22 +153,22 @@ const fetchRoles = async () => { }; // 获取角色tag状态 -function getRoleTagType(group_id: number): string { +function getRoleTagType(rid: number): string { const typeMap: Record = { 1: "primary", 2: "success", 3: "warning", 4: "danger", }; - return typeMap[group_id] || "primary"; + return typeMap[rid] || "primary"; } // 获取角色tag文本 -function getRoleTagText(roles: Role[] | undefined, group_id: number): string { +function getRoleTagText(roles: Role[] | undefined, rid: number): string { if (!roles || !Array.isArray(roles)) { return "未知"; } - return roles.find((role) => role.id === group_id)?.name || "未知"; + return roles.find((role) => role.id === rid)?.name || "未知"; } // 获取用户列表 diff --git a/src/views/system/email/index.vue b/src/views/system/email/index.vue index 9ac62b5..b31e0f0 100644 --- a/src/views/system/email/index.vue +++ b/src/views/system/email/index.vue @@ -105,6 +105,9 @@ import { getEmailInfo, editEmailInfo, sendTestEmail } from "@/api/email"; const emailFormRef = ref(); +/** 是否已有数据库中的配置(允许保存时不重复填写密码) */ +const hasSavedConfig = ref(false); + const emailForm = reactive({ fromAddress: "", fromName: "", @@ -115,6 +118,18 @@ const emailForm = reactive({ timeout: 30 }); +const validatePassword = ( + _rule: unknown, + value: string, + callback: (e?: Error) => void +) => { + if (!hasSavedConfig.value && !String(value || "").trim()) { + callback(new Error("请输入授权码/密码")); + return; + } + callback(); +}; + const emailRules: FormRules = { fromAddress: [ { required: true, message: "请输入发件人邮箱", trigger: "blur" }, @@ -122,7 +137,7 @@ const emailRules: FormRules = { ], host: [{ required: true, message: "请输入 SMTP 主机", trigger: "blur" }], port: [{ required: true, message: "请输入 SMTP 端口", trigger: "blur" }], - password: [{ required: true, message: "请输入授权码/密码", trigger: "blur" }] + password: [{ validator: validatePassword, trigger: "blur" }] }; const testEmail = ref(""); @@ -130,6 +145,7 @@ const testEmail = ref(""); const loadEmailConfig = async () => { const res = await getEmailInfo(); if (res.code === 200 && Array.isArray(res.data) && res.data.length > 0) { + hasSavedConfig.value = true; const item = res.data[0]; emailForm.fromAddress = item.from_address || ""; emailForm.fromName = item.from_name || ""; @@ -138,6 +154,8 @@ const loadEmailConfig = async () => { emailForm.password = item.password || ""; emailForm.encryption = item.encryption || "ssl"; emailForm.timeout = item.timeout != null ? item.timeout : 30; + } else { + hasSavedConfig.value = false; } }; diff --git a/src/views/system/fileManager/components/uploadFile.vue b/src/views/system/fileManager/components/uploadFile.vue index 13a6eb7..fb2a58b 100644 --- a/src/views/system/fileManager/components/uploadFile.vue +++ b/src/views/system/fileManager/components/uploadFile.vue @@ -177,8 +177,8 @@ const submitUpload = async () => { try { const formData = new FormData(); formData.append("file", file.raw as File); - if (props.categoryId) { - formData.append("cate", props.categoryId.toString()); + if (props.categoryId !== undefined && props.categoryId !== null) { + formData.append("cate", String(props.categoryId)); } // 模拟上传进度 diff --git a/src/views/system/smssettings/tasklist.vue b/src/views/system/smssettings/tasklist.vue index d2a2b94..c3f7370 100644 --- a/src/views/system/smssettings/tasklist.vue +++ b/src/views/system/smssettings/tasklist.vue @@ -59,7 +59,6 @@ -