From c8787b43cde9039bf181f30175a3d9cc5a5f7194 Mon Sep 17 00:00:00 2001 From: ray <1490493387@qq.com> Date: Fri, 8 Nov 2024 07:44:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20:sparkles:=20=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E5=8F=B0=E9=A1=B5=E9=9D=A2=E5=92=8C=E7=94=A8=E6=88=B7=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E5=88=97=E8=A1=A8=E9=A1=B5=E9=9D=A2=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/{auth.ts => auth/index.ts} | 0 src/api/system/user.ts | 95 ++++++++++++++++ src/api/user.ts | 39 ------- src/pages.json | 12 ++ src/pages/login/index.vue | 34 +++--- src/pages/work/index.vue | 170 +++++++++++++---------------- src/pages/work/user/edit.vue | 13 +++ src/pages/work/user/index.vue | 100 ++++++++++++++++- src/static/icons/log.png | Bin 0 -> 4509 bytes src/static/icons/monitor.png | Bin 0 -> 3876 bytes src/static/icons/notice.png | Bin 6870 -> 4786 bytes src/static/icons/performance.png | Bin 0 -> 4940 bytes src/store/modules/user.ts | 21 ++-- src/utils/request.ts | 23 ++-- 14 files changed, 336 insertions(+), 171 deletions(-) rename src/api/{auth.ts => auth/index.ts} (100%) create mode 100644 src/api/system/user.ts delete mode 100644 src/api/user.ts create mode 100644 src/pages/work/user/edit.vue create mode 100644 src/static/icons/log.png create mode 100644 src/static/icons/monitor.png create mode 100644 src/static/icons/performance.png diff --git a/src/api/auth.ts b/src/api/auth/index.ts similarity index 100% rename from src/api/auth.ts rename to src/api/auth/index.ts diff --git a/src/api/system/user.ts b/src/api/system/user.ts new file mode 100644 index 0000000..b66d39b --- /dev/null +++ b/src/api/system/user.ts @@ -0,0 +1,95 @@ +import request from "@/utils/request"; + +const USER_BASE_URL = "/api/v1/users"; + +const UserAPI = { + /** + * 获取当前登录用户信息 + * + * @returns 登录用户昵称、头像信息,包括角色和权限 + */ + getUserInfo(): Promise { + return request({ + url: `${USER_BASE_URL}/me`, + method: "GET", + }); + }, + + /** + * 获取用户分页列表 + * + * @param queryParams 查询参数 + */ + getPage(queryParams: UserPageQuery) { + return request[]>>({ + url: `${USER_BASE_URL}/page`, + method: "GET", + data: queryParams, + }); + }, +}; +export default UserAPI; + +/** 登录用户信息 */ +export interface UserInfo { + /** 用户ID */ + userId?: number; + + /** 用户名 */ + username?: string; + + /** 昵称 */ + nickname?: string; + + /** 头像URL */ + avatar?: string; + + /** 角色 */ + roles: string[]; + + /** 权限 */ + perms: string[]; +} + +/** + * 用户分页查询对象 + */ +export interface UserPageQuery extends PageQuery { + /** 搜索关键字 */ + keywords?: string; + + /** 用户状态 */ + status?: number; + + /** 部门ID */ + deptId?: number; + + /** 开始时间 */ + createTime?: [string, string]; +} + +/** 用户分页对象 */ +export interface UserPageVO { + /** 用户头像URL */ + avatar?: string; + /** 创建时间 */ + createTime?: Date; + /** 部门名称 */ + deptName?: string; + /** 用户邮箱 */ + email?: string; + /** 性别 */ + gender?: number; + /** 用户ID */ + id?: number; + /** 手机号 */ + mobile?: string; + /** 用户昵称 */ + nickname?: string; + /** 角色名称,多个使用英文逗号(,)分割 */ + roleNames?: string; + /** 用户状态(1:启用;0:禁用) */ + status?: number; + /** 用户名 */ + username?: string; +} diff --git a/src/api/user.ts b/src/api/user.ts deleted file mode 100644 index 456cc61..0000000 --- a/src/api/user.ts +++ /dev/null @@ -1,39 +0,0 @@ -import request from "@/utils/request"; - -const USER_BASE_URL = "/api/v1/users"; - -const UserAPI = { - /** - * 获取当前登录用户信息 - * - * @returns 登录用户昵称、头像信息,包括角色和权限 - */ - getUserInfo(): Promise { - return request({ - url: `${USER_BASE_URL}/me`, - method: "GET", - }); - }, -}; -export default UserAPI; - -/** 登录用户信息 */ -export interface UserInfo { - /** 用户ID */ - userId?: number; - - /** 用户名 */ - username?: string; - - /** 昵称 */ - nickname?: string; - - /** 头像URL */ - avatar?: string; - - /** 角色 */ - roles: string[]; - - /** 权限 */ - perms: string[]; -} diff --git a/src/pages.json b/src/pages.json index d5f4381..c09cd1a 100644 --- a/src/pages.json +++ b/src/pages.json @@ -36,6 +36,18 @@ "style": { "navigationBarTitleText": "个人资料" } + }, + { + "path": "pages/work/user/index", + "style": { + "navigationBarTitleText": "用户管理" + } + }, + { + "path": "pages/work/user/edit", + "style": { + "navigationBarTitleText": "编辑用户" + } } ], "globalStyle": { diff --git a/src/pages/login/index.vue b/src/pages/login/index.vue index 16b5c8f..25791a6 100644 --- a/src/pages/login/index.vue +++ b/src/pages/login/index.vue @@ -47,23 +47,29 @@ const userStore = useUserStore(); // 登录处理 const handleLogin = () => { - loginFormRef.value - .validate() - .then(async ({ valid }: { valid: boolean }) => { - if (valid) { - try { - userStore.login(loginFormData.value).then(() => { - uni.showToast({ title: "登录成功", icon: "success" }); - uni.navigateBack(); + loginFormRef.value.validate().then(async ({ valid }: { valid: boolean }) => { + if (valid) { + try { + await userStore.login(loginFormData.value); // 等待登录和获取用户信息完成 + await userStore.getInfo(); // 等待用户信息获取完成 + uni.showToast({ title: "登录成功", icon: "success" }); + const pages = getCurrentPages(); // 获取当前的页面栈 + + console.log("pages", pages); + if (pages.length > 1) { + // 如果页面栈中有多个页面,则可以返回上一页 + uni.navigateBack(); + } else { + // 如果页面栈中只有一个页面(通常是首页),则可以跳转到指定页面,避免 navigateBack 无法返回的问题 + uni.reLaunch({ + url: "/pages/index/index", // 替换为你想要跳转的页面路径 }); - } catch (error: any) { - console.log("登录失败", error.message); } + } catch (error: any) { + console.log("登录失败", error.message); } - }) - .error(({ errors }: { errors: any }) => { - console.log("errors", errors); - }); + } + }); }; diff --git a/src/pages/work/index.vue b/src/pages/work/index.vue index 72747b0..3756da9 100644 --- a/src/pages/work/index.vue +++ b/src/pages/work/index.vue @@ -1,99 +1,87 @@ @@ -106,12 +94,6 @@ page { /* stylelint-enable selector-type-no-unknown */ .work { - padding: 20px 0; -} - -.slot-img { - width: 40px; - height: 40px; - border-radius: 4px; + padding: 40rpx 0; } diff --git a/src/pages/work/user/edit.vue b/src/pages/work/user/edit.vue new file mode 100644 index 0000000..c11c748 --- /dev/null +++ b/src/pages/work/user/edit.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/pages/work/user/index.vue b/src/pages/work/user/index.vue index eb3136b..ee067ca 100644 --- a/src/pages/work/user/index.vue +++ b/src/pages/work/user/index.vue @@ -1,9 +1,97 @@ - + diff --git a/src/static/icons/log.png b/src/static/icons/log.png new file mode 100644 index 0000000000000000000000000000000000000000..b8700a1dcd92b511c9837f7e2e221be1e6cee86d GIT binary patch literal 4509 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 b{D$7X&z-8jnnY*bw?N3+Mp{Lh4!8dc3gI>9 literal 0 HcmV?d00001 diff --git a/src/static/icons/monitor.png b/src/static/icons/monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..61004b2fccc2f9288f9dfe2444578712482201c8 GIT binary patch literal 3876 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 literal 6870 zcmV;{8Y$(8P)Py4kV!;ARCr$PT?>>PRhj<&>YhiE>FRlO&m>456B3e;n4m}?Aou`$p%533x(hC@ z#{;_OAOXb1<*~a!R#u6MoU;nYVNqQ_8<~nC(#Sny2OHep%K14tr6cLqW*BWG_e<W8l_G2&h*+GO)TYkNd;E zK^a6plk8QMVTBrz;>EfGV7KT#loRfTBBS7eZiGS6T^fj+lyQMD_1nKGEPee5Q6Azw) zlCS&-Y$w7$$C~ITf#%fuvEv*r_R$Cou(Qs?5iMF|>!)3vNB}h8O zw-ez`m+=wt4j{mcJK{;Y%K=fIiwGP+GF^NDoA^2b@9-QgQCKtr4E&ii+^9DO>j+Dr z2$D|mokY03=qO3WvLnEZyW&Z@qwI!QG$0TJ>1yYt(Fnc^;B1S2NilyTuu03~vvn=B z#ouNEz9&deim%ZK5BMEOvClpN#JDz=qzCQS^sa`l36e?i10Y=E9UP*`a|8$v>P>X5 z=XxzF^d&)tZt?vG0q0uuLy83(fei$FCg#K2jlLsD#^B3A_&yl*!H&6DZxaD^MCEEd zLF;VRbG5jy2$D|mDk6NtRgXouuMuFv4e=)WreBQo4M8#~z854XZ~f9R%4!E;jow6G zEUOJe%6&nQw80M%aFrhb5gUAiz{7fiK2>gO%1RJ*%P-r7N5QzX+(3waA0ohbyt5Zq zw6;=TxvVQ2LAZw-G6Q&m2xpbcdC}{C1eoyx`tZK^OzJ9!wPhhlA#bgQ^+JwvggkgU z6-oL`Tw0Fny`B?9$Pv5->IaLbcjdl2wki)CchEq?0Bnh1FRoWrX2$D(h`k`F6;f$PkjcSk^1YIqs$$x$w~jK_=t*~X++8I|x|3HC%h@V#TTNwY zW5x~fqtgBP)Z@k2$C^a zJz_6;tE@&*%DIWaCOtvRolxKiK_ug$6QK|pP9oq`2FH>KqH^WJ#8XZ>C$a8*@4oqv(oD*Kb zl1hDgp=g2(Jzlf5g0XkRb>meN2VTnKNDq&YH>I91+}SzEC!9D2$JpOk2B-P#VC|I zg9sdW$;7^mIZJTNTpq=YGo>f71lBl(OcS51ZzkJqwkU#R41O8%U}n+rI(nG#(!&F` z>YsU46{@Ee6)szP!djSs?Xd)%Vb?#~h-XrKGYDU`t4PWpN1%Oc9($ghcxW{mui58C z(6U5^S|zn34PVk5?LAR#iy&QH9FH<~OXl^G!i2Uz=8@WAk08kf5wyNb2vQpINawSd z)6hyiR^`|tNXFo=0Jz1fa49!70?5Qha>Z*31g=TV~1(KvV|In1sW3bHRz`Z zSuDVHyoinG6)X`%r3;-B!9iO_RB++WohA-$&Ert2xSql;bkmZA=}RJLnlD7Lik()A z>2-C~K3RE71W6lwHvzX!Caltb-nGlbfxqO79zvCh-?S#ejJHM5I9G@=8I}aBjwR?e z3*{y*Qh39o6J>j!VKN8&@bmr*W8d?6bhWuNl(Oq%W2=Ul=R{DWTl)QHSA1y7$C^+( zSqjrh5$x^c>rIAl-i-5GbUL=@vGVzfg~(87u0Hz7eXDZUH@Up>p~hsK!e1781a z4(T_1)@_Ufj{X+Hyo;(3t@Q(XKC^*wxt^rQ#06VU6=GG6^v4oAAZ zS)p>OIZbIGoc@6*YGRWP8k|xY6gd-~^c@$io`c+~MX@U=UV33?e=pMb>A_*$ku;-w z52I%Ch9@VwoVB4!!`IWGWd3Ozm+T*zEmk)!VO(7Kky? zr%1EwPk9{JVvi^@mPHDCCGrg+VB$i(nVuev$CyK`tiks&@C5-6g;TdXe`D?DpObi< zacLAYmRjEtS44T?k=(If#)>WT-xo#09P2u)$P8*32EG+f(DjxGk}-H6fK!9&tW$P# z4%qzP12~%Xe#PpdFIU@k!)|XxG8Ed$ zYft8&PUn{6tBn)R|NGL`VeQOG)al=O7Z*>+a$w|=&h7fB#110}Vi>%r8c-QaD*8K| zVr>0+d3ujw;O$P*#|oHQ*?M`swFQPHAFaaFr1T;xThED4xs5<1Yw&eyHeb=~0MPbS z9;sKXjp5zGO7$XVT^WV?Z?T`9p;mHX1g#g!vaedbjVI{-Va!LMFWC}-TtDN*AC$NE z7!Hmi$BegX$2JO!A&S~aeDM)$y~x|Iu0ph?ctRFqpAYM-)f4p5u?b?RJR6n$wQtK~ z&okxiJ;sZGB8=KqpZm^;<(@_LBG3H0HNww6KZ2IU(u?Q`I`&)Q*k95HpG|;zC90yo zSJn?8^M=2FPbi|C@!`m%yX?b(R6U55BPr@w{K891TO0^O<6&TVJVBe3FUJXz;#EZW zMi?9{)`wgl}FUq+=5apO6NW~|3V0=kW z($@wFV(|C>e*^hyUqro3MyQ0++a3+Z3f3@0ZV_b3$Eq;3vEnxjf1oGm)58RL9>DT4 zwM}2BReK+544SVOMe$sa8ipIT3PFye zDg+tCf(a`~o^%dw4`TJWiPf`M!xRyM3?iXUmQbdXZv8 zQz7$WUxsZblan4~WXodUVKv11B^V!YqtOLPX3z=ZB-Szq8A6lrE6NyL@tcGS4k3uF zVvX@jW}_mAydWh68PPVR2RR1E4n>fP-$j=mWaRHoA;@t&gdjs$$Pi10SYyrOgdjqY zliG#!Aku@J)F`9}ksd^PkO|g8g&;x@A&3yf(sqdqv1EuPL#zp?A_NhF2tkA(mU>fJ z#gbJlS;d-wDnbw;h!A8Fg2+)5Icg$DO~xik;i!omRuqB=LB=M?Mmg>-Lo69$jW@(n z$KB<^)F3*tQ79XQqj@rTVJgM`AkRD`o!;p=_Aw*Qt z21)xP1QCLaJv1t${YiK7xx|tGod!FL91cZ)DfmOXo$5Cvy@40a7W~ZoAq{q+ZD*y-$cx%z8_F zCLy^ng2oDY!?2LNdWayQ-Yo3vVeEb;=lkcKi)pmwsH2`nm~(y2 zSy>g%p5(+Q*uwgVr+P6;y&NTFg(2o1H0o1YE|$ZTZTxd_(y8z z&?8J;Rih^4fBwGA%3TF{l<;?ax;ixbB+U46JV~D%L6F`~zTRYf(@Rj@(xvt}R1YGb zcL=B+MD-+L_?U4+JV^yE9PdF4KAV7zVQ}!kmOS=t$cMp|!1yrp+z4hYjReNti40|6 zc|1XzMi4~(BP=`WyPwUWW2+g8Uxf9x{cF>0ljOY_H2LBwu%Ak9> z>-TvWJEaHlGLDJ)5zKv02zn64Iz36pI52`BX@jpL;9Fh->xQn^pUk0im-HZRU^|}7 zrnwqUyEyng2mxP+CFuU~dXR+xwtESz8@gWqZLV;IRzB|#XgW=Ux@Z;j?8SiOG(ulS{=FU#GllL-X zruQ&Aqp?2=Z2m9VNp}WKYf_f|bv0^Y*2?;{)P6ldC$;%836eJWJ~f;7sUw!m+V*G; zhdN~*VhOAg3r%a%u=t8#&p*`aZ7f08kA`AQf@C`Q0%&-uMBK_+{lMlt_B}825HEr- z^PC7~EDQMj!^DMpGd*pIAgWNt;C2AbUI6Td4$}lS|L0K*9Ckyx$Q(wXYAUeoZ>pgM z`(j~-o}iYoqB`#BvaG?kF>qIqn?mPnCSL!Y+zD|rhNrzZil%wNW(NVc#}ah6ErRqM z>WN4VR7Qp51LF|p>_N{sBc~<5lPNF^g zya-yB1bp5x2*^4;as2F+@%ENe7R<=rsLE>}`GtP`) zN?200m~*5iJ5ls)6bl zVQQ0xx@MqZmWJq*Nt;Y5{PVi*4n0BY{NcFYq~4}eyow0l@Y-_E^{M11lcF)URhiwu zk#5f|o>1YG20$-1!$1jG_zQ)JtYC`jk_f`gHQ7$|1<7%*Z5_x0U9Wkqbz*&u z^MI;g?`*pcXsijfMATmrK~&|e!FMxotLqjASV8wr;ApQu9H_1X8s_`M7Qb4-!0LE{ zZkxrF{zZf|KJwHZF)XNe$6LZ*}N z13Y52~y}q4E_p$TdWAK)H3;gK#|1s_=JlV1sYEW zA~ltYyk)=d(G&D#tEFubq`QslBQfj-5VxwJ63gWd1KqECM-oMjhSPxP)JjC#hR=ka z9AQplBc-j@vPFQ5^$n z>VfKMf?zQS5MfEIiMAD0x0p)9bynIKA8I>mPq;dVQUrK}*}CIZa3E1sk~O4Z>AL6i|0gVpO) zC3R<|IwSQ3fguDo=?Ply1R9PJq^q5mMkCnlgi#_x5GVx!Este&EwrT+8N+oQBZv~% zlj3VM!UIkiCNczpVh|w4wXq~USWMlq>NrY}!cZ&44}fruQwEA0LBKKsga`E|y4G@e z3k4k~NMX`$@N)#5YeByh5d@qz=|KuZErV4?Ms;3GK0&~31Xk(^awWl`YXm6_wJIg2mfPVM`QswMgd5^b z^i8)Qa+M%MllFT-lI+2)09LeI!WzA4O~5pb2$#*4g)M&MyRL7#FP z0Z#~0=t(;H7hqiKwnHMn0uW$4t|!Tpw&WQ>R0`9KfoF(tRt1DmTyzNmX1vhVi+8rR zk|*hKJtK(1i+i{sGk_u_Ul3$ypG2Nlm@HbA@^c%{6SxhDZwOMDmvr(f;tF^V(e0=PSUxju zh$r1UTV)p-UlF9xlMJ2${()qWw;RfUmnZaq@oBeCsT@@SG zK-FVl0|9@hCrCXx?yJw21UWW&@8k!-a(&lVEyihM7!T@6XRpaRX`-(QQs_-md<{z? z2q$Ci8(Ajf+Ij~QEV$vA?+K!u?rrC#W(41ryjyNGfwIWll*{9@jSi*eanpl95M&qt z$>8W_Q}9N%QyCAvv9^pyO^S6;+I7WG4$Qb)wM=S}=eeKY;o7Y3DJL?{R{?0+W3H$%feO2WDlT1078)6lS5Z=|o4 zCdNOtLq!k;YgZS?qb69Vy2h~O2b}-{RdIH}r=Pf@M{X0o?#Sr8~&oe2$41~`BvOH|Dv8@B+ zdwP-{vsgYf#VV2@!_n(G$gPnmu4Ldk0L`I^sxyvs5O9A!heztCQ=2m)gD0h;2{NKr z>EH`U!^ar-D*&ekFO;QQOoV+V%fF_2$*A2gr~(B*bT<>5e?7f8PCQOw8>Kg0JZ3Li(OxxJR7Hum25{pqs5ptx;5CTFFmzqLhgObszRbdvZNxz9x zn9xFm1Q?A&SzD~`$Lvs9kwEBThCz&WXn2!={U)%tFNZd-lRCQuoA1Q_AExj3hMefQ Qm;e9(07*qoM6N<$f@!y+&Hw-a diff --git a/src/static/icons/performance.png b/src/static/icons/performance.png new file mode 100644 index 0000000000000000000000000000000000000000..2a764c1267572e62fcc76ad23afafcdc5267505f GIT binary patch literal 4940 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 N`Z~s#N^Pg8{{To{89@L5 literal 0 HcmV?d00001 diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 7bd76b7..f12d133 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -1,6 +1,6 @@ import { defineStore } from "pinia"; import AuthAPI, { type LoginFormData } from "@/api/auth"; -import UserAPI, { type UserInfo } from "@/api/user"; +import UserAPI, { type UserInfo } from "@/api/system/user"; import { setToken, getUserInfo, setUserInfo, clearAll } from "@/utils/cache"; export const useUserStore = defineStore("user", () => { @@ -12,21 +12,28 @@ export const useUserStore = defineStore("user", () => { AuthAPI.login(data) .then((data) => { setToken(data.accessToken); - getInfo(); resolve(data); }) .catch((error) => { console.error("登录失败", error); - reject(error); // 将错误抛出 + reject(error); }); }); }; // 获取用户信息 const getInfo = () => { - UserAPI.getUserInfo().then((data) => { - setUserInfo(data); - userInfo.value = data; + return new Promise((resolve, reject) => { + UserAPI.getUserInfo() + .then((data) => { + setUserInfo(data); + userInfo.value = data; + resolve(data); + }) + .catch((error) => { + console.error("获取用户信息失败", error); + reject(error); + }); }); }; @@ -46,6 +53,6 @@ export const useUserStore = defineStore("user", () => { userInfo, login, logout, - getUserInfo, + getInfo, }; }); diff --git a/src/utils/request.ts b/src/utils/request.ts index bd1fb7b..5909a49 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -1,4 +1,4 @@ -import { getToken } from "@/utils/cache"; +import { getToken, clearAll } from "@/utils/cache"; import { ResultCodeEnum } from "@/enums/ResultCodeEnum"; export default function request(options: UniApp.RequestOptions): Promise { @@ -26,21 +26,14 @@ export default function request(options: UniApp.RequestOptions): Promise { } // 令牌失效或过期处理 else if (resData.code === ResultCodeEnum.TOKEN_INVALID) { - uni.showToast({ - title: resData.msg || "令牌无效或过期", - icon: "none", - duration: 2000, + console.log("令牌失效或过期处理"); + clearAll(); + // 跳转到登录页 + uni.reLaunch({ + url: "/pages/login/index", }); - - // 此处不强制跳转到登录页,可以让调用方决定下一步操作 - reject({ - message: resData.msg || "令牌无效或过期", - code: resData.code, - action: "TOKEN_INVALID", // 提供一个 action 用于后续调用方判断 - }); - } - // 其他业务处理失败 - else { + } else { + // 其他业务处理失败 uni.showToast({ title: resData.msg || "业务处理失败", icon: "none",