fix(roles): 隐藏默认查看按钮并优化角色管理功能
- 在role-crud.ts中隐藏默认的查看按钮(view: { show: false })
- 优化RoleManage.vue的axios导入,仅导入isAxiosError
- 更新用户管理中的角色显示逻辑,确保正确显示角色名称
- 添加错误处理逻辑,显示友好的中文错误提示
- 更新相关构建文件和文档说明
This commit is contained in:
parent
3fc65697f0
commit
6620aec5a2
26
.trae/documents/debug_role_undefined_plan.md
Normal file
26
.trae/documents/debug_role_undefined_plan.md
Normal file
@ -0,0 +1,26 @@
|
||||
# 角色显示 undefined 深度排查修复计划
|
||||
|
||||
## 问题分析
|
||||
|
||||
角色依然显示 undefined,可能原因:
|
||||
|
||||
1. `transformRes` 函数可能重置了数据,导致 `role_name` 字段丢失
|
||||
2. FastCRUD 的 `dict-select` 类型本身就可以自动显示角色名称,不需要手动处理
|
||||
3. `formatter` 函数可能没有正确工作
|
||||
|
||||
## 修复方案
|
||||
|
||||
| 序号 | 文件 | 修改内容 |
|
||||
| :--- | :--- | :--- |
|
||||
| 1 | `frontend/src/modules/admin/views/users/user-crud.ts` | 简化实现,让 FastCRUD 的 dict 功能自动处理角色显示 |
|
||||
| 2 | `frontend/src/modules/admin/views/users/user-crud.ts` | 移除自定义的 role_name 处理逻辑,使用 FastCRUD 内置的 dict 功能 |
|
||||
|
||||
## 实施步骤
|
||||
|
||||
1. 修改 `role_id` 列配置,移除自定义 formatter,启用 `column.dict: true`
|
||||
2. 简化 `pageRequest`,移除手动设置 `role_name` 的逻辑
|
||||
3. 移除不再需要的 `roleDict` 和 `loadRoleDict` 相关代码
|
||||
|
||||
## 风险评估
|
||||
|
||||
- 低风险:利用 FastCRUD 内置功能,减少自定义代码
|
||||
20
.trae/documents/fix_role_api_method_plan.md
Normal file
20
.trae/documents/fix_role_api_method_plan.md
Normal file
@ -0,0 +1,20 @@
|
||||
# 角色接口请求方法修复计划
|
||||
|
||||
## 问题分析
|
||||
|
||||
用户列表页面无法显示,原因是获取角色列表时使用了 GET 方法调用 `/roles/` 接口,但后端只支持 POST 方法的 `/roles/search` 接口。
|
||||
|
||||
需要修改两个地方:
|
||||
1. `loadRoleDict` 函数中的 `http.get` 改为 `http.post("/roles/search", {})`
|
||||
2. `role_id` 列的 `dict.getData` 中的 `http.get` 改为 `http.post("/roles/search", {})`
|
||||
|
||||
## 修复方案
|
||||
|
||||
| 序号 | 文件 | 修改内容 |
|
||||
| :--- | :--- | :--- |
|
||||
| 1 | `frontend/src/modules/admin/views/users/user-crud.ts` | `loadRoleDict` 函数中 GET 改为 POST |
|
||||
| 2 | `frontend/src/modules/admin/views/users/user-crud.ts` | `role_id.dict.getData` 中 GET 改为 POST |
|
||||
|
||||
## 风险评估
|
||||
|
||||
- 低风险:仅修改请求方法,不影响核心逻辑
|
||||
34
.trae/documents/fix_role_display_error_plan.md
Normal file
34
.trae/documents/fix_role_display_error_plan.md
Normal file
@ -0,0 +1,34 @@
|
||||
# 用户管理页面角色显示和错误提示修复计划
|
||||
|
||||
## 问题分析
|
||||
|
||||
### 问题1:角色字段显示为ID而非名称
|
||||
|
||||
当前 `user-crud.ts` 中 `role_id` 字段配置存在以下问题:
|
||||
- 列类型使用 `dict-select`,但列表显示需要使用 `type: "dict"` 并配合 `column.dict` 配置
|
||||
- 字典数据需要提前加载或使用全局字典
|
||||
|
||||
### 问题2:错误提示未显示
|
||||
|
||||
当前代码通过 `throw new Error(message)` 抛出错误,但 FastCRUD 需要正确的错误处理配置才能显示提示框。需要在请求配置中添加错误处理函数。
|
||||
|
||||
## 修复方案
|
||||
|
||||
| 序号 | 文件 | 修改内容 |
|
||||
| :--- | :--- | :--- |
|
||||
| 1 | `frontend/src/modules/admin/views/users/user-crud.ts` | 修改 `role_id` 列配置,确保列表和表单正确显示角色名称 |
|
||||
| 2 | `frontend/src/modules/admin/views/users/user-crud.ts` | 添加全局错误处理配置,确保错误信息能在页面弹出提示 |
|
||||
|
||||
## 实施步骤
|
||||
|
||||
1. 修改 `role_id` 列的配置:
|
||||
- 将 `type` 改为 `"dict"` 或确保字典正确加载
|
||||
- 添加 `column.dict` 和 `form.dict` 配置
|
||||
|
||||
2. 添加错误处理配置:
|
||||
- 在 `request` 配置中添加 `onError` 或类似的错误处理函数
|
||||
- 使用 `ElMessage` 显示错误提示
|
||||
|
||||
## 风险评估
|
||||
|
||||
- 低风险:所有修改都是配置层面的调整,不涉及核心逻辑
|
||||
24
.trae/documents/fix_role_undefined_plan.md
Normal file
24
.trae/documents/fix_role_undefined_plan.md
Normal file
@ -0,0 +1,24 @@
|
||||
# 用户列表角色显示 undefined 修复计划
|
||||
|
||||
## 问题分析
|
||||
|
||||
用户列表的角色字段显示 `undefined`,但添加用户时显示正确。分析原因:
|
||||
|
||||
1. `getRoleName` 函数使用 `===` 比较,但用户数据中的 `role_id` 可能是字符串类型,而角色字典中的 `id` 是数字类型,导致比较失败
|
||||
2. `roleDict` 可能没有正确加载
|
||||
|
||||
## 修复方案
|
||||
|
||||
| 序号 | 文件 | 修改内容 |
|
||||
| :--- | :--- | :--- |
|
||||
| 1 | `frontend/src/modules/admin/views/users/user-crud.ts` | 修改 `getRoleName` 函数,处理类型不匹配问题 |
|
||||
| 2 | `frontend/src/modules/admin/views/users/user-crud.ts` | 优化 `pageRequest` 中的角色名称赋值逻辑 |
|
||||
|
||||
## 实施步骤
|
||||
|
||||
1. 修改 `getRoleName` 函数,使用宽松比较或类型转换
|
||||
2. 确保在 `pageRequest` 中正确处理用户数据
|
||||
|
||||
## 风险评估
|
||||
|
||||
- 低风险:仅修改数据处理逻辑,不影响核心功能
|
||||
29
.trae/documents/fix_ts_errors_plan.md
Normal file
29
.trae/documents/fix_ts_errors_plan.md
Normal file
@ -0,0 +1,29 @@
|
||||
# TypeScript 编译错误修复计划
|
||||
|
||||
## 问题分析
|
||||
|
||||
运行 `npm run build` 时出现 2 个 TypeScript 编译错误:
|
||||
|
||||
| 文件 | 错误 | 原因 |
|
||||
| :--- | :--- | :--- |
|
||||
| `RoleManage.vue:60` | `axios` is declared but its value is never read | `axios` 导入未使用(只用了 `isAxiosError`) |
|
||||
| `user-crud.ts:4` | `ElMessage` is declared but its value is never read | 之前计划添加错误处理时导入,但 FastCRUD 会自动处理错误提示 |
|
||||
|
||||
## 修复方案
|
||||
|
||||
移除未使用的导入:
|
||||
|
||||
1. `RoleManage.vue` - 改为只导入 `isAxiosError`
|
||||
2. `user-crud.ts` - 移除 `ElMessage` 导入
|
||||
|
||||
## 实施步骤
|
||||
|
||||
1. 修改 `frontend/src/modules/admin/views/roles/RoleManage.vue`
|
||||
- 将 `import axios, { isAxiosError } from "axios"` 改为 `import { isAxiosError } from "axios"`
|
||||
|
||||
2. 修改 `frontend/src/modules/admin/views/users/user-crud.ts`
|
||||
- 移除 `import { ElMessage } from "element-plus"`
|
||||
|
||||
## 风险评估
|
||||
|
||||
- 低风险:仅删除未使用的导入,不影响功能
|
||||
34
.trae/documents/fix_user_role_display_plan.md
Normal file
34
.trae/documents/fix_user_role_display_plan.md
Normal file
@ -0,0 +1,34 @@
|
||||
# 图书管理系统前端问题修复计划
|
||||
|
||||
## 问题分析
|
||||
|
||||
### 问题1:用户列表中角色字段显示为角色名称
|
||||
当前 `user-crud.ts` 中 `role_id` 字段使用了 `dict-select` 类型,但列显示可能没有正确转换角色ID为角色名称。需要添加 `column.dict` 配置。
|
||||
|
||||
### 问题2:用户添加时角色字段显示为角色名称
|
||||
添加表单中已经使用了 `dict-select`,但需要确认是否正确配置。
|
||||
|
||||
### 问题3:添加用户时后端错误没有中文提示
|
||||
`addRequest` 中没有错误处理,需要添加 try-catch 并显示中文错误提示。
|
||||
|
||||
### 问题4:角色页面有两个查看按钮
|
||||
`role-crud.ts` 中自定义了 `viewPerm` 按钮,但 FastCRUD 默认还会显示一个 `view` 按钮,需要禁用默认的 `view` 按钮。
|
||||
|
||||
## 修复方案
|
||||
|
||||
| 序号 | 文件 | 修改内容 |
|
||||
| :--- | :--- | :--- |
|
||||
| 1 | `frontend/src/modules/admin/views/users/user-crud.ts` | 在 `role_id` 列添加 `column.dict` 配置,使列表显示角色名称 |
|
||||
| 2 | `frontend/src/modules/admin/views/users/user-crud.ts` | 添加 `addRequest` 和 `editRequest` 的错误处理,显示中文错误提示 |
|
||||
| 3 | `frontend/src/modules/admin/views/roles/role-crud.ts` | 禁用默认的 `view` 按钮,保留自定义的 `viewPerm` 按钮 |
|
||||
|
||||
## 实施步骤
|
||||
|
||||
1. 修改 `user-crud.ts` 的 `role_id` 列配置,添加 `column.dict`
|
||||
2. 修改 `user-crud.ts` 的请求配置,添加错误处理
|
||||
3. 修改 `role-crud.ts` 的 `rowHandle.buttons` 配置,禁用默认 view 按钮
|
||||
|
||||
## 风险评估
|
||||
|
||||
- 低风险:所有修改都是配置层面的调整,不涉及核心逻辑
|
||||
- 需要确保后端 `/roles/` 接口返回正确的角色数据
|
||||
@ -1 +1 @@
|
||||
import{f as C,u as A,g as L,E as N,p as S,w as t,k as V,l as q,r as a,d as e,a as o,q as l,s as E,t as M,v as P,x as p,b as R,y as f,o as T,_ as D}from"./index-CRc7EmAb.js";const I={class:"right"},j={class:"nick"},z={class:"page-title-bar"},F={class:"page-title"},G={class:"page-content"},H=C({__name:"AdminLayout",setup(J){const u=V(),d=q(),s=A(),v=f(()=>u.path),g=f(()=>u.meta.title||"");L(async()=>{try{s.user||await s.fetchProfile()}catch{N.error("获取用户信息失败,请重新登录"),await s.logout(),d.replace({name:"admin-login",query:{redirect:u.fullPath}})}});async function x(){await s.logout(),d.push({name:"admin-login"})}return(K,n)=>{const i=a("el-icon"),r=a("el-menu-item"),y=a("el-menu"),h=a("el-aside"),k=a("el-button"),b=a("el-header"),w=a("router-view"),B=a("el-main"),c=a("el-container");return T(),S(c,{class:"admin-root"},{default:t(()=>[e(h,{width:"220px",class:"aside"},{default:t(()=>[n[3]||(n[3]=o("div",{class:"brand"},"BookSystem 管理",-1)),e(y,{"default-active":v.value,router:"","background-color":"#0f172a","text-color":"#e2e8f0","active-text-color":"#38bdf8"},{default:t(()=>[e(r,{index:"/admin/users",route:{name:"admin-users"}},{default:t(()=>[e(i,null,{default:t(()=>[e(l(E))]),_:1}),n[0]||(n[0]=o("span",null,"用户",-1))]),_:1}),e(r,{index:"/admin/roles",route:{name:"admin-roles"}},{default:t(()=>[e(i,null,{default:t(()=>[e(l(M))]),_:1}),n[1]||(n[1]=o("span",null,"角色",-1))]),_:1}),e(r,{index:"/admin/permissions",route:{name:"admin-permissions"}},{default:t(()=>[e(i,null,{default:t(()=>[e(l(P))]),_:1}),n[2]||(n[2]=o("span",null,"权限",-1))]),_:1})]),_:1},8,["default-active"])]),_:1}),e(c,null,{default:t(()=>[e(b,{class:"header"},{default:t(()=>{var _,m;return[o("div",I,[o("span",j,p(((_=l(s).user)==null?void 0:_.nickname)||((m=l(s).user)==null?void 0:m.username)),1),e(k,{type:"primary",link:"",onClick:x},{default:t(()=>[...n[4]||(n[4]=[R("退出",-1)])]),_:1})])]}),_:1}),e(B,{class:"main"},{default:t(()=>[o("div",z,[o("h1",F,p(g.value),1)]),o("div",G,[e(w)])]),_:1})]),_:1})]),_:1})}}}),Q=D(H,[["__scopeId","data-v-c0bd569a"]]);export{Q as default};
|
||||
import{f as C,u as A,g as L,E as N,p as S,w as t,k as V,l as q,r as a,d as e,a as o,q as l,s as E,t as M,v as P,x as p,b as R,y as f,o as T,_ as D}from"./index-BtuGmbJn.js";const I={class:"right"},j={class:"nick"},z={class:"page-title-bar"},F={class:"page-title"},G={class:"page-content"},H=C({__name:"AdminLayout",setup(J){const u=V(),d=q(),s=A(),v=f(()=>u.path),g=f(()=>u.meta.title||"");L(async()=>{try{s.user||await s.fetchProfile()}catch{N.error("获取用户信息失败,请重新登录"),await s.logout(),d.replace({name:"admin-login",query:{redirect:u.fullPath}})}});async function x(){await s.logout(),d.push({name:"admin-login"})}return(K,n)=>{const i=a("el-icon"),r=a("el-menu-item"),y=a("el-menu"),h=a("el-aside"),k=a("el-button"),b=a("el-header"),w=a("router-view"),B=a("el-main"),c=a("el-container");return T(),S(c,{class:"admin-root"},{default:t(()=>[e(h,{width:"220px",class:"aside"},{default:t(()=>[n[3]||(n[3]=o("div",{class:"brand"},"BookSystem 管理",-1)),e(y,{"default-active":v.value,router:"","background-color":"#0f172a","text-color":"#e2e8f0","active-text-color":"#38bdf8"},{default:t(()=>[e(r,{index:"/admin/users",route:{name:"admin-users"}},{default:t(()=>[e(i,null,{default:t(()=>[e(l(E))]),_:1}),n[0]||(n[0]=o("span",null,"用户",-1))]),_:1}),e(r,{index:"/admin/roles",route:{name:"admin-roles"}},{default:t(()=>[e(i,null,{default:t(()=>[e(l(M))]),_:1}),n[1]||(n[1]=o("span",null,"角色",-1))]),_:1}),e(r,{index:"/admin/permissions",route:{name:"admin-permissions"}},{default:t(()=>[e(i,null,{default:t(()=>[e(l(P))]),_:1}),n[2]||(n[2]=o("span",null,"权限",-1))]),_:1})]),_:1},8,["default-active"])]),_:1}),e(c,null,{default:t(()=>[e(b,{class:"header"},{default:t(()=>{var _,m;return[o("div",I,[o("span",j,p(((_=l(s).user)==null?void 0:_.nickname)||((m=l(s).user)==null?void 0:m.username)),1),e(k,{type:"primary",link:"",onClick:x},{default:t(()=>[...n[4]||(n[4]=[R("退出",-1)])]),_:1})])]}),_:1}),e(B,{class:"main"},{default:t(()=>[o("div",z,[o("h1",F,p(g.value),1)]),o("div",G,[e(w)])]),_:1})]),_:1})]),_:1})}}}),Q=D(H,[["__scopeId","data-v-c0bd569a"]]);export{Q as default};
|
||||
@ -1 +1 @@
|
||||
import{f as L,u as q,g as I,c as f,d as o,w as s,h as S,E as h,r as u,i,j,k as B,l as E,o as w,m as M,a as g,b as N,n as O,_ as T}from"./index-CRc7EmAb.js";const D={class:"login-wrap"},A={class:"captcha-row"},P=["src"],W={key:1,class:"captcha-placeholder"},X=L({__name:"LoginView",setup($){const y=B(),V=E(),v=q(),b=i(),m=i(!1),l=i(""),p=i(""),k="/api",a=j({username:"",password:"",captcha_code:""}),x={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}],captcha_code:[{required:!0,message:"请输入验证码",trigger:"blur"}]};async function _(){l.value.startsWith("blob:")&&URL.revokeObjectURL(l.value),l.value="",p.value="";const r=await S.get(`${k}/users/captcha`,{responseType:"blob",headers:{}}),e=r.headers["x-captcha-id"]||r.headers["X-Captcha-ID"];if(!e){h.error("未获取到验证码 ID,请检查后端 CORS expose_headers");return}p.value=e,l.value=URL.createObjectURL(r.data),a.captcha_code=""}async function R(){var e,n;if(!p.value){h.warning("请先加载验证码");return}const r=b.value;if(r){try{await r.validate()}catch{return}m.value=!0;try{const{data:t}=await O.post("/users/login",{username:a.username,password:a.password,captcha_id:p.value,captcha_code:a.captcha_code});v.setToken(t.access_token),await v.fetchProfile();const c=y.query.redirect||"/admin";await V.replace(c)}catch(t){const c=(n=(e=t==null?void 0:t.response)==null?void 0:e.data)==null?void 0:n.detail;h.error(typeof c=="string"?c:"登录失败"),await _()}finally{m.value=!1}}}return I(()=>{_()}),(r,e)=>{const n=u("el-input"),t=u("el-form-item"),c=u("el-button"),U=u("el-form"),C=u("el-card");return w(),f("div",D,[o(C,{class:"card",shadow:"hover"},{header:s(()=>[...e[4]||(e[4]=[g("span",{class:"card-title"},"管理后台登录",-1)])]),default:s(()=>[o(U,{ref_key:"formRef",ref:b,model:a,rules:x,"label-width":"88px",onSubmit:e[3]||(e[3]=M(()=>{},["prevent"]))},{default:s(()=>[o(t,{label:"用户名",prop:"username"},{default:s(()=>[o(n,{modelValue:a.username,"onUpdate:modelValue":e[0]||(e[0]=d=>a.username=d),autocomplete:"username"},null,8,["modelValue"])]),_:1}),o(t,{label:"密码",prop:"password"},{default:s(()=>[o(n,{modelValue:a.password,"onUpdate:modelValue":e[1]||(e[1]=d=>a.password=d),type:"password","show-password":"",autocomplete:"current-password"},null,8,["modelValue"])]),_:1}),o(t,{label:"验证码",prop:"captcha_code"},{default:s(()=>[g("div",A,[o(n,{modelValue:a.captcha_code,"onUpdate:modelValue":e[2]||(e[2]=d=>a.captcha_code=d),maxlength:"8",placeholder:"请输入验证码"},null,8,["modelValue"]),g("div",{class:"captcha-img",onClick:_},[l.value?(w(),f("img",{key:0,src:l.value,alt:"captcha"},null,8,P)):(w(),f("span",W,"点击获取"))])])]),_:1}),o(t,null,{default:s(()=>[o(c,{type:"primary",loading:m.value,style:{width:"100%"},onClick:R},{default:s(()=>[...e[5]||(e[5]=[N(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])]),_:1})])}}}),F=T(X,[["__scopeId","data-v-24c39918"]]);export{F as default};
|
||||
import{f as L,u as q,g as I,c as f,d as o,w as s,h as S,E as h,r as u,i,j,k as B,l as E,o as w,m as M,a as g,b as N,n as O,_ as T}from"./index-BtuGmbJn.js";const D={class:"login-wrap"},A={class:"captcha-row"},P=["src"],W={key:1,class:"captcha-placeholder"},X=L({__name:"LoginView",setup($){const y=B(),V=E(),v=q(),b=i(),m=i(!1),l=i(""),p=i(""),k="/api",a=j({username:"",password:"",captcha_code:""}),x={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}],captcha_code:[{required:!0,message:"请输入验证码",trigger:"blur"}]};async function _(){l.value.startsWith("blob:")&&URL.revokeObjectURL(l.value),l.value="",p.value="";const r=await S.get(`${k}/users/captcha`,{responseType:"blob",headers:{}}),e=r.headers["x-captcha-id"]||r.headers["X-Captcha-ID"];if(!e){h.error("未获取到验证码 ID,请检查后端 CORS expose_headers");return}p.value=e,l.value=URL.createObjectURL(r.data),a.captcha_code=""}async function R(){var e,n;if(!p.value){h.warning("请先加载验证码");return}const r=b.value;if(r){try{await r.validate()}catch{return}m.value=!0;try{const{data:t}=await O.post("/users/login",{username:a.username,password:a.password,captcha_id:p.value,captcha_code:a.captcha_code});v.setToken(t.access_token),await v.fetchProfile();const c=y.query.redirect||"/admin";await V.replace(c)}catch(t){const c=(n=(e=t==null?void 0:t.response)==null?void 0:e.data)==null?void 0:n.detail;h.error(typeof c=="string"?c:"登录失败"),await _()}finally{m.value=!1}}}return I(()=>{_()}),(r,e)=>{const n=u("el-input"),t=u("el-form-item"),c=u("el-button"),U=u("el-form"),C=u("el-card");return w(),f("div",D,[o(C,{class:"card",shadow:"hover"},{header:s(()=>[...e[4]||(e[4]=[g("span",{class:"card-title"},"管理后台登录",-1)])]),default:s(()=>[o(U,{ref_key:"formRef",ref:b,model:a,rules:x,"label-width":"88px",onSubmit:e[3]||(e[3]=M(()=>{},["prevent"]))},{default:s(()=>[o(t,{label:"用户名",prop:"username"},{default:s(()=>[o(n,{modelValue:a.username,"onUpdate:modelValue":e[0]||(e[0]=d=>a.username=d),autocomplete:"username"},null,8,["modelValue"])]),_:1}),o(t,{label:"密码",prop:"password"},{default:s(()=>[o(n,{modelValue:a.password,"onUpdate:modelValue":e[1]||(e[1]=d=>a.password=d),type:"password","show-password":"",autocomplete:"current-password"},null,8,["modelValue"])]),_:1}),o(t,{label:"验证码",prop:"captcha_code"},{default:s(()=>[g("div",A,[o(n,{modelValue:a.captcha_code,"onUpdate:modelValue":e[2]||(e[2]=d=>a.captcha_code=d),maxlength:"8",placeholder:"请输入验证码"},null,8,["modelValue"]),g("div",{class:"captcha-img",onClick:_},[l.value?(w(),f("img",{key:0,src:l.value,alt:"captcha"},null,8,P)):(w(),f("span",W,"点击获取"))])])]),_:1}),o(t,null,{default:s(()=>[o(c,{type:"primary",loading:m.value,style:{width:"100%"},onClick:R},{default:s(()=>[...e[5]||(e[5]=[N(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])]),_:1})])}}}),F=T(X,[["__scopeId","data-v-24c39918"]]);export{F as default};
|
||||
@ -1 +1 @@
|
||||
import{z as a,n as r,f as m,A as c,g as d,p,w as l,r as n,d as f,B as y,q as h,o as _}from"./index-CRc7EmAb.js";import{t as g}from"./list-query-4ZZvVtjn.js";const w=()=>({crudOptions:{pagination:{show:!1},search:{show:!0,options:{layout:"inline"},expand:!1},request:{transformQuery:({form:e})=>g(e,["name","code"]),pageRequest:async e=>{const{data:t}=await r.post("/permissions/search",e);return t},transformRes:({res:e})=>{const t=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(t.length,1),total:t.length,records:t}},addRequest:async({form:e})=>{await r.post("/permissions/",e)},editRequest:async({form:e,row:t})=>{t&&await r.put(`/permissions/${t.id}`,e)},delRequest:async({row:e})=>{e&&await r.delete(`/permissions/${e.id}`)}},rowHandle:{buttons:{edit:{text:"编辑"},remove:{text:"删除"}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},name:{title:"名称",key:"name",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},code:{title:"编码",key:"code",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},parentid:{title:"父级ID",key:"parentid",type:"number",form:{value:0,rules:[{required:!0,message:"必填"}]}},description:{title:"描述",key:"description",type:"textarea",column:{show:!1}},createtime:{title:"创建时间",key:"createtime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:s}){!t||e==null||(t[s]=a(e).format("YYYY-MM-DD HH:mm:ss"))}},updatetime:{title:"更新时间",key:"updatetime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:s}){!t||e==null||(t[s]=a(e).format("YYYY-MM-DD HH:mm:ss"))}}}}}),Y=m({__name:"PermissionManage",setup(e){const{crudBinding:t,crudRef:s,crudExpose:o}=c({createCrudOptions:w});return d(()=>{o.doRefresh()}),(x,k)=>{const i=n("fs-crud"),u=n("fs-page");return _(),p(u,null,{default:l(()=>[f(i,y({ref_key:"crudRef",ref:s},h(t)),null,16)]),_:1})}}});export{Y as default};
|
||||
import{z as a,n as r,f as m,A as c,g as d,p,w as l,r as n,d as f,B as y,q as h,o as _}from"./index-BtuGmbJn.js";import{t as g}from"./list-query-4ZZvVtjn.js";const w=()=>({crudOptions:{pagination:{show:!1},search:{show:!0,options:{layout:"inline"},expand:!1},request:{transformQuery:({form:e})=>g(e,["name","code"]),pageRequest:async e=>{const{data:t}=await r.post("/permissions/search",e);return t},transformRes:({res:e})=>{const t=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(t.length,1),total:t.length,records:t}},addRequest:async({form:e})=>{await r.post("/permissions/",e)},editRequest:async({form:e,row:t})=>{t&&await r.put(`/permissions/${t.id}`,e)},delRequest:async({row:e})=>{e&&await r.delete(`/permissions/${e.id}`)}},rowHandle:{buttons:{edit:{text:"编辑"},remove:{text:"删除"}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},name:{title:"名称",key:"name",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},code:{title:"编码",key:"code",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},parentid:{title:"父级ID",key:"parentid",type:"number",form:{value:0,rules:[{required:!0,message:"必填"}]}},description:{title:"描述",key:"description",type:"textarea",column:{show:!1}},createtime:{title:"创建时间",key:"createtime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:s}){!t||e==null||(t[s]=a(e).format("YYYY-MM-DD HH:mm:ss"))}},updatetime:{title:"更新时间",key:"updatetime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:s}){!t||e==null||(t[s]=a(e).format("YYYY-MM-DD HH:mm:ss"))}}}}}),Y=m({__name:"PermissionManage",setup(e){const{crudBinding:t,crudRef:s,crudExpose:o}=c({createCrudOptions:w});return d(()=>{o.doRefresh()}),(x,k)=>{const i=n("fs-crud"),u=n("fs-page");return _(),p(u,null,{default:l(()=>[f(i,y({ref_key:"crudRef",ref:s},h(t)),null,16)]),_:1})}}});export{Y as default};
|
||||
@ -1 +1 @@
|
||||
import{_ as n,c as r,a as s,b as t,d as l,w as d,r as i,o as a}from"./index-CRc7EmAb.js";const p={},u={class:"public-wrap"},m={class:"hint"};function f(_,o){const e=i("router-link");return a(),r("div",u,[o[5]||(o[5]=s("h1",null,"BookSystem",-1)),s("p",m,[o[1]||(o[1]=t(" 此处预留为",-1)),o[2]||(o[2]=s("strong",null,"无需登录",-1)),o[3]||(o[3]=t("的站点首页(图书浏览、门户等)。管理功能请前往 ",-1)),l(e,{to:"/admin/login"},{default:d(()=>[...o[0]||(o[0]=[t("管理后台",-1)])]),_:1}),o[4]||(o[4]=t("。 ",-1))])])}const x=n(p,[["render",f],["__scopeId","data-v-f5876933"]]);export{x as default};
|
||||
import{_ as n,c as r,a as s,b as t,d as l,w as d,r as i,o as a}from"./index-BtuGmbJn.js";const p={},u={class:"public-wrap"},m={class:"hint"};function f(_,o){const e=i("router-link");return a(),r("div",u,[o[5]||(o[5]=s("h1",null,"BookSystem",-1)),s("p",m,[o[1]||(o[1]=t(" 此处预留为",-1)),o[2]||(o[2]=s("strong",null,"无需登录",-1)),o[3]||(o[3]=t("的站点首页(图书浏览、门户等)。管理功能请前往 ",-1)),l(e,{to:"/admin/login"},{default:d(()=>[...o[0]||(o[0]=[t("管理后台",-1)])]),_:1}),o[4]||(o[4]=t("。 ",-1))])])}const x=n(p,[["render",f],["__scopeId","data-v-f5876933"]]);export{x as default};
|
||||
1
frontend/dist/assets/RoleManage-DQk3SaT5.css
vendored
1
frontend/dist/assets/RoleManage-DQk3SaT5.css
vendored
@ -1 +0,0 @@
|
||||
.dlg-role[data-v-714ba56c]{margin:0 0 12px;font-size:14px}.perm-tags[data-v-714ba56c]{display:flex;flex-wrap:wrap;gap:8px}.perm-tag[data-v-714ba56c]{margin:0}.perm-tree[data-v-714ba56c]{max-height:440px;overflow:auto;padding:8px 4px;border:1px solid var(--el-border-color-lighter);border-radius:8px;background:var(--el-fill-color-blank)}
|
||||
1
frontend/dist/assets/RoleManage-DVUY3tTJ.css
vendored
Normal file
1
frontend/dist/assets/RoleManage-DVUY3tTJ.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
.dlg-role[data-v-0e80fdd4]{margin:0 0 12px;font-size:14px}.perm-tags[data-v-0e80fdd4]{display:flex;flex-wrap:wrap;gap:8px}.perm-tag[data-v-0e80fdd4]{margin:0}.perm-tree[data-v-0e80fdd4]{max-height:440px;overflow:auto;padding:8px 4px;border:1px solid var(--el-border-color-lighter);border-radius:8px;background:var(--el-fill-color-blank)}
|
||||
1
frontend/dist/assets/RoleManage-DlN5c7Z4.js
vendored
Normal file
1
frontend/dist/assets/RoleManage-DlN5c7Z4.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/RoleManage-Dmqoc6FI.js
vendored
1
frontend/dist/assets/RoleManage-Dmqoc6FI.js
vendored
@ -1 +0,0 @@
|
||||
import{z as A,n as u,f as F,A as I,g as U,p as v,w as m,r as p,i,d as _,B as j,q as G,c as w,b as k,a as B,x,C as Y,F as L,D as Q,E as R,o as l,G as J,_ as W}from"./index-CRc7EmAb.js";import{t as X}from"./list-query-4ZZvVtjn.js";function Z(C){return()=>({crudOptions:{pagination:{show:!1},search:{show:!0,options:{layout:"inline"},expand:!1},request:{transformQuery:({form:t})=>X(t,["name"]),pageRequest:async t=>{const{data:s}=await u.post("/roles/search",t);return s},transformRes:({res:t})=>{const s=Array.isArray(t)?t:[];return{currentPage:1,pageSize:Math.max(s.length,1),total:s.length,records:s}},addRequest:async({form:t})=>{await u.post("/roles/",t)},editRequest:async({form:t,row:s})=>{s&&await u.put(`/roles/${s.id}`,t)},delRequest:async({row:t})=>{t&&await u.delete(`/roles/${t.id}`)}},rowHandle:{width:300,buttons:{viewPerm:{text:"查看",order:1,click:({row:t})=>{t&&C.onView(t)}},assignPerm:{text:"分配权限",order:2,click:({row:t})=>{t&&C.onAssign(t)}},edit:{text:"编辑",order:10},remove:{text:"删除",order:20}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},name:{title:"角色名称",key:"name",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},creator:{title:"创建人",key:"creator",type:"text"},createtime:{title:"创建时间",key:"createtime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:t,row:s,key:d}){!s||t==null||(s[d]=A(t).format("YYYY-MM-DD HH:mm:ss"))}},updatetime:{title:"更新时间",key:"updatetime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:t,row:s,key:d}){!s||t==null||(s[d]=A(t).format("YYYY-MM-DD HH:mm:ss"))}}}}})}const ee={key:0,class:"dlg-role"},te={key:1,class:"perm-tags"},se={key:0,class:"dlg-role"},ae=F({__name:"RoleManage",setup(C){const t=i(!1),s=i(!1),d=i(null),g=i([]),y=i(null),V=i([]),h=i(),b=i(!1),$={label:"label",children:"children"};function D(a){return a.map(e=>{var n;return{id:e.id,label:`${e.name}(${e.code})`,children:(n=e.children)!=null&&n.length?D(e.children):void 0}})}async function q(){const{data:a}=await u.get("/permissions/tree");V.value=D(a??[])}async function T(a){d.value=a,t.value=!0;try{const{data:e}=await u.get(`/permissions/role/${a.id}`);g.value=e.permissions??[]}catch{R.error("加载权限失败"),g.value=[]}}function H(a){y.value=a,s.value=!0}async function O(){var e,n;const a=y.value;if(a)try{const{data:f}=await u.get(`/permissions/role/${a.id}`),o=(f.permissions??[]).map(c=>c.id);await J(),(e=h.value)==null||e.setCheckedKeys(o)}catch{R.error("加载角色权限失败"),(n=h.value)==null||n.setCheckedKeys([])}}async function z(){var e,n,f;const a=y.value;if(a){b.value=!0;try{const o=((e=h.value)==null?void 0:e.getCheckedKeys(!1))??[];await u.post("/permissions/assign",{role_id:a.id,permission_ids:o}),R.success("保存成功"),s.value=!1,M.doRefresh()}catch(o){const c=(f=(n=o==null?void 0:o.response)==null?void 0:n.data)==null?void 0:f.detail;R.error(typeof c=="string"?c:"保存失败")}finally{b.value=!1}}}const{crudBinding:E,crudRef:N,crudExpose:M}=I({createCrudOptions:Z({onView:T,onAssign:H})});return U(async()=>{await q(),M.doRefresh()}),(a,e)=>{const n=p("fs-crud"),f=p("el-tag"),o=p("el-empty"),c=p("el-dialog"),S=p("el-tree"),P=p("el-button"),K=p("fs-page");return l(),v(K,null,{default:m(()=>[_(n,j({ref_key:"crudRef",ref:N},G(E)),null,16),_(c,{modelValue:t.value,"onUpdate:modelValue":e[0]||(e[0]=r=>t.value=r),title:"查看角色权限",width:"560px","destroy-on-close":"",onClosed:e[1]||(e[1]=r=>g.value=[])},{default:m(()=>[d.value?(l(),w("p",ee,[e[4]||(e[4]=k(" 角色:",-1)),B("strong",null,x(d.value.name),1)])):Y("",!0),g.value.length?(l(),w("div",te,[(l(!0),w(L,null,Q(g.value,r=>(l(),v(f,{key:r.id,class:"perm-tag",type:"info"},{default:m(()=>[k(x(r.name)+"("+x(r.code)+") ",1)]),_:2},1024))),128))])):(l(),v(o,{key:2,description:"暂未分配权限","image-size":72}))]),_:1},8,["modelValue"]),_(c,{modelValue:s.value,"onUpdate:modelValue":e[3]||(e[3]=r=>s.value=r),title:"分配权限",width:"640px","destroy-on-close":"",onOpen:O},{footer:m(()=>[_(P,{onClick:e[2]||(e[2]=r=>s.value=!1)},{default:m(()=>[...e[6]||(e[6]=[k("取消",-1)])]),_:1}),_(P,{type:"primary",loading:b.value,onClick:z},{default:m(()=>[...e[7]||(e[7]=[k(" 保存 ",-1)])]),_:1},8,["loading"])]),default:m(()=>[y.value?(l(),w("p",se,[e[5]||(e[5]=k(" 角色:",-1)),B("strong",null,x(y.value.name),1)])):Y("",!0),V.value.length?(l(),v(S,{key:1,ref_key:"permTreeRef",ref:h,class:"perm-tree",data:V.value,"show-checkbox":"","node-key":"id",props:$,"default-expand-all":"","check-strictly":!1},null,8,["data"])):(l(),v(o,{key:2,description:"暂无权限数据","image-size":64}))]),_:1},8,["modelValue"])]),_:1})}}}),re=W(ae,[["__scopeId","data-v-714ba56c"]]);export{re as default};
|
||||
1
frontend/dist/assets/UserManage-BUfO1ovq.js
vendored
Normal file
1
frontend/dist/assets/UserManage-BUfO1ovq.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
import{z as n,O as d,n as a,E as m,f as c,A as p,g as f,p as h,w as y,r as i,d as w,B as g,q as _,o as x}from"./index-BtuGmbJn.js";import{t as k}from"./list-query-4ZZvVtjn.js";const Y=()=>({crudOptions:{pagination:{show:!1},search:{show:!0},searchFormOptions:{inline:!0,labelWidth:"80px",col:{span:0}},request:{transformQuery:({form:e})=>k(e,["username","nickname","email","phone"]),pageRequest:async e=>{const{data:t}=await a.post("/users/search",e);return t},transformRes:({res:e})=>{const t=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(t.length,1),total:t.length,records:t}},onError:e=>{var s,r;let t="操作失败";if((r=(s=e.response)==null?void 0:s.data)!=null&&r.detail){const o=e.response.data.detail;typeof o=="string"&&(o.includes("at least 6 characters")?t="密码长度至少为6个字符":t=o)}else e.message&&(t=e.message);throw m.error(t),e},addRequest:async({form:e})=>{await a.post("/users/",e)},editRequest:async({form:e,row:t})=>{if(!t)return;const s={...e};s.password||delete s.password,await a.put(`/users/${t.id}`,s)},delRequest:async({row:e})=>{e&&await a.delete(`/users/${e.id}`)}},rowHandle:{buttons:{edit:{text:"编辑"},remove:{text:"删除"}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},username:{title:"登录名",key:"username",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},nickname:{title:"昵称",key:"nickname",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},password:{title:"密码",key:"password",type:"password",column:{show:!1},form:{show:!1},addForm:{show:!0,rules:[{required:!0,message:"新建用户需设置密码"}]},editForm:{show:!0,component:{placeholder:"不修改请留空"}}},email:{title:"邮箱",key:"email",type:"text",search:{show:!0}},phone:{title:"手机",key:"phone",type:"text",search:{show:!0}},wx_openid:{title:"微信OpenID",key:"wx_openid",type:"text",column:{show:!1}},avatar:{title:"头像",key:"avatar",type:"text",column:{show:!1}},role_id:{title:"角色",key:"role_id",type:"dict-select",dict:d({getData:async()=>{const{data:e}=await a.post("/roles/search",{});return e},value:"id",label:"name"}),column:{width:120,dict:!0},form:{rules:[{required:!0,message:"必选"}],value:2}},createtime:{title:"创建时间",key:"createtime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:s}){!t||e==null||(t[s]=n(e).format("YYYY-MM-DD HH:mm:ss"))}},updatetime:{title:"更新时间",key:"updatetime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:s}){!t||e==null||(t[s]=n(e).format("YYYY-MM-DD HH:mm:ss"))}},lastlogintime:{title:"最后登录",key:"lastlogintime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:s}){!t||e==null||(t[s]=n(e).format("YYYY-MM-DD HH:mm:ss"))}}}}}),R=c({__name:"UserManage",setup(e){const{crudBinding:t,crudRef:s,crudExpose:r}=p({createCrudOptions:Y});return f(()=>{r.doRefresh()}),(o,q)=>{const l=i("fs-crud"),u=i("fs-page");return x(),h(u,null,{default:y(()=>[w(l,g({ref_key:"crudRef",ref:s},_(t)),null,16)]),_:1})}}});export{R as default};
|
||||
1
frontend/dist/assets/UserManage-_ZRZv-72.js
vendored
1
frontend/dist/assets/UserManage-_ZRZv-72.js
vendored
@ -1 +0,0 @@
|
||||
import{z as a,O as l,n as r,f as m,A as d,g as c,p,w as f,r as o,d as h,B as y,q as w,o as g}from"./index-CRc7EmAb.js";import{t as _}from"./list-query-4ZZvVtjn.js";const x=()=>({crudOptions:{pagination:{show:!1},search:{show:!0},searchFormOptions:{inline:!0,labelWidth:"80px",col:{span:0}},request:{transformQuery:({form:e})=>_(e,["username","nickname","email","phone"]),pageRequest:async e=>{const{data:t}=await r.post("/users/search",e);return t},transformRes:({res:e})=>{const t=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(t.length,1),total:t.length,records:t}},addRequest:async({form:e})=>{await r.post("/users/",e)},editRequest:async({form:e,row:t})=>{if(!t)return;const s={...e};s.password||delete s.password,await r.put(`/users/${t.id}`,s)},delRequest:async({row:e})=>{e&&await r.delete(`/users/${e.id}`)}},rowHandle:{buttons:{edit:{text:"编辑"},remove:{text:"删除"}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},username:{title:"登录名",key:"username",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},nickname:{title:"昵称",key:"nickname",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},password:{title:"密码",key:"password",type:"password",column:{show:!1},form:{show:!1},addForm:{show:!0,rules:[{required:!0,message:"新建用户需设置密码"}]},editForm:{show:!0,component:{placeholder:"不修改请留空"}}},email:{title:"邮箱",key:"email",type:"text",search:{show:!0}},phone:{title:"手机",key:"phone",type:"text",search:{show:!0}},wx_openid:{title:"微信OpenID",key:"wx_openid",type:"text",column:{show:!1}},avatar:{title:"头像",key:"avatar",type:"text",column:{show:!1}},role_id:{title:"角色",key:"role_id",type:"dict-select",dict:l({getData:async()=>{const{data:e}=await r.get("/roles/");return e},value:"id",label:"name"}),form:{rules:[{required:!0,message:"必选"}],value:2}},createtime:{title:"创建时间",key:"createtime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:s}){!t||e==null||(t[s]=a(e).format("YYYY-MM-DD HH:mm:ss"))}},updatetime:{title:"更新时间",key:"updatetime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:s}){!t||e==null||(t[s]=a(e).format("YYYY-MM-DD HH:mm:ss"))}},lastlogintime:{title:"最后登录",key:"lastlogintime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:s}){!t||e==null||(t[s]=a(e).format("YYYY-MM-DD HH:mm:ss"))}}}}}),M=m({__name:"UserManage",setup(e){const{crudBinding:t,crudRef:s,crudExpose:n}=d({createCrudOptions:x});return c(()=>{n.doRefresh()}),(k,Y)=>{const u=o("fs-crud"),i=o("fs-page");return g(),p(i,null,{default:f(()=>[h(u,y({ref_key:"crudRef",ref:s},w(t)),null,16)]),_:1})}}});export{M as default};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
frontend/dist/index.html
vendored
2
frontend/dist/index.html
vendored
@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>BookSystem</title>
|
||||
<script type="module" crossorigin src="/assets/index-CRc7EmAb.js"></script>
|
||||
<script type="module" crossorigin src="/assets/index-BtuGmbJn.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-Cn04Rt7y.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
39
frontend/package-lock.json
generated
39
frontend/package-lock.json
generated
@ -668,9 +668,6 @@
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -685,9 +682,6 @@
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -702,9 +696,6 @@
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -719,9 +710,6 @@
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -736,9 +724,6 @@
|
||||
"loong64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -753,9 +738,6 @@
|
||||
"loong64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -770,9 +752,6 @@
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -787,9 +766,6 @@
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -804,9 +780,6 @@
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -821,9 +794,6 @@
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -838,9 +808,6 @@
|
||||
"s390x"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -855,9 +822,6 @@
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@ -872,9 +836,6 @@
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
||||
@ -57,7 +57,7 @@ import { nextTick, onMounted, ref } from "vue";
|
||||
import { useFs } from "@fast-crud/fast-crud";
|
||||
import { ElMessage } from "element-plus";
|
||||
import type { ElTree } from "element-plus";
|
||||
import axios, { isAxiosError } from "axios";
|
||||
import { isAxiosError } from "axios";
|
||||
import { http } from "@/modules/admin/api/http";
|
||||
import { buildRoleCrudOptions, type RoleRow } from "./role-crud";
|
||||
|
||||
|
||||
@ -58,6 +58,7 @@ export function buildRoleCrudOptions(h: RoleCrudHandlers): CreateCrudOptions<Rol
|
||||
rowHandle: {
|
||||
width: 300,
|
||||
buttons: {
|
||||
view: { show: false },
|
||||
viewPerm: {
|
||||
text: "查看",
|
||||
order: 1,
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import type { CreateCrudOptions } from "@fast-crud/fast-crud";
|
||||
import { dict } from "@fast-crud/fast-crud";
|
||||
import dayjs from "dayjs";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { http } from "@/modules/admin/api/http";
|
||||
import { toSearchParams } from "@/modules/admin/utils/list-query";
|
||||
|
||||
@ -49,6 +50,23 @@ export const createUserCrudOptions: CreateCrudOptions<UserRow> = () => {
|
||||
records,
|
||||
};
|
||||
},
|
||||
onError: (error: { response?: { data?: { detail?: string } }; message?: string }) => {
|
||||
let message = "操作失败";
|
||||
if (error.response?.data?.detail) {
|
||||
const detail = error.response.data.detail;
|
||||
if (typeof detail === "string") {
|
||||
if (detail.includes("at least 6 characters")) {
|
||||
message = "密码长度至少为6个字符";
|
||||
} else {
|
||||
message = detail;
|
||||
}
|
||||
}
|
||||
} else if (error.message) {
|
||||
message = error.message;
|
||||
}
|
||||
ElMessage.error(message);
|
||||
throw error;
|
||||
},
|
||||
addRequest: async ({ form }) => {
|
||||
await http.post("/users/", form);
|
||||
},
|
||||
@ -140,12 +158,16 @@ export const createUserCrudOptions: CreateCrudOptions<UserRow> = () => {
|
||||
type: "dict-select",
|
||||
dict: dict({
|
||||
getData: async () => {
|
||||
const { data } = await http.get<{ id: number; name: string }[]>("/roles/");
|
||||
const { data } = await http.post<{ id: number; name: string }[]>("/roles/search", {});
|
||||
return data;
|
||||
},
|
||||
value: "id",
|
||||
label: "name",
|
||||
}),
|
||||
column: {
|
||||
width: 120,
|
||||
dict: true,
|
||||
},
|
||||
form: {
|
||||
rules: [{ required: true, message: "必选" }],
|
||||
value: 2,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user