From 7db4e38c6d967d511f0c1248bf22ceaf6a6f55d3 Mon Sep 17 00:00:00 2001 From: zhuguifei <zhuguifei@zhuguifeideiMac.local> Date: 星期五, 18 四月 2025 18:33:24 +0800 Subject: [PATCH] 配置http,完成登录信息缓存,添加部分pinia配置 --- eims-ui-mobile/src/store/access.ts | 2 eims-ui-mobile/src/service/menu.d.ts | 36 +++++++ eims-ui-mobile/src/interceptors/request.ts | 8 + eims-ui-mobile/src/static/menu/menu2.png | 0 eims-ui-mobile/src/service/login.d.ts | 71 ++++++++++++++ eims-ui-mobile/src/service/login.ts | 13 +- eims-ui-mobile/src/service/menu.ts | 6 + eims-ui-mobile/src/static/images/pic1.png | 0 eims-ui-mobile/src/store/user.ts | 11 +- eims-ui-mobile/src/pages/login/index.vue | 76 +++++++++++--- eims-ui-mobile/src/static/menu/menu1.png | 0 eims-ui-mobile/src/static/images/pic4.jpeg | 0 eims-ui-mobile/src/static/images/menu1.png | 0 eims-ui-mobile/src/static/images/pic3.png | 0 eims-ui-mobile/src/store/system-config.ts | 37 +++++++ eims-ui-mobile/src/static/images/pic2.jpg | 0 eims-ui-mobile/src/utils/http.ts | 4 eims-ui-mobile/src/pages/home/index.vue | 19 +-- eims-ui-mobile/src/store/index.ts | 1 19 files changed, 239 insertions(+), 45 deletions(-) diff --git a/eims-ui-mobile/src/interceptors/request.ts b/eims-ui-mobile/src/interceptors/request.ts index 1f84b31..5ea4b62 100644 --- a/eims-ui-mobile/src/interceptors/request.ts +++ b/eims-ui-mobile/src/interceptors/request.ts @@ -1,8 +1,9 @@ /* eslint-disable no-param-reassign */ import qs from 'qs' -import { useUserStore } from '@/store' +import { useAccessStore } from '@/store' import { platform } from '@/utils/platform' import { getEnvBaseUrl } from '@/utils' +const clientId = import.meta.env.VITE_APP_CLIENT_ID export type CustomRequestOptions = UniApp.RequestOptions & { query?: Record<string, any> @@ -50,10 +51,11 @@ ...options.header, } // 3. 娣诲姞 token 璇锋眰澶存爣璇� - const userStore = useUserStore() - const { token } = userStore.userInfo as unknown as IUserInfo + const accessStore = useAccessStore() + const token = accessStore.accessInfo.access_token if (token) { options.header.Authorization = `Bearer ${token}` + options.header.clientid = clientId } }, } diff --git a/eims-ui-mobile/src/pages/home/index.vue b/eims-ui-mobile/src/pages/home/index.vue index 636a1e2..cb1e18e 100644 --- a/eims-ui-mobile/src/pages/home/index.vue +++ b/eims-ui-mobile/src/pages/home/index.vue @@ -128,8 +128,7 @@ </template> <script lang="ts" setup> -import { TestEnum } from '@/typings' -import PLATFORM from '@/utils/platform' +import { getAllMenusApi } from '@/service/menu' defineOptions({ name: 'Home', @@ -137,14 +136,14 @@ // 鑾峰彇灞忓箷杈圭晫鍒板畨鍏ㄥ尯鍩熻窛绂� const { safeAreaInsets } = uni.getSystemInfoSync() -const author = ref('鑿查附') -const description = ref( - 'unibest 鏄竴涓泦鎴愪簡澶氱宸ュ叿鍜屾妧鏈殑 uniapp 寮�鍙戞ā鏉匡紝鐢� uniapp + Vue3 + Ts + Vite4 + UnoCss + UniUI + VSCode 鏋勫缓锛屾ā鏉垮叿鏈変唬鐮佹彁绀恒�佽嚜鍔ㄦ牸寮忓寲銆佺粺涓�閰嶇疆銆佷唬鐮佺墖娈电瓑鍔熻兘锛屽苟鍐呯疆浜嗚澶氬父鐢ㄧ殑鍩烘湰缁勪欢鍜屽熀鏈姛鑳斤紝璁╀綘缂栧啓 uniapp 鎷ユ湁 best 浣撻獙銆�', -) -// 娴嬭瘯 uni API 鑷姩寮曞叆 + +const getAllMenus = async () => { + const menuList = await getAllMenusApi() + console.error(menuList) +} + onLoad(() => { - console.log(author) - console.log(TestEnum.A) + // getAllMenus() }) const menuList = reactive([ @@ -161,7 +160,7 @@ ]) function handleUserInfo() { - console.error('12121') + getAllMenus() } diff --git a/eims-ui-mobile/src/pages/login/index.vue b/eims-ui-mobile/src/pages/login/index.vue index f26a05d..46626e7 100644 --- a/eims-ui-mobile/src/pages/login/index.vue +++ b/eims-ui-mobile/src/pages/login/index.vue @@ -13,7 +13,7 @@ <wd-cell-group border> <wd-input label="鐢ㄦ埛鍚�" - label-width="100px" + label-width="200rpx" prop="username" clearable v-model="model.username" @@ -22,7 +22,7 @@ /> <wd-input label="瀵嗙爜" - label-width="100px" + label-width="200rpx" prop="password" show-password clearable @@ -31,28 +31,43 @@ :rules="[{ required: true, message: '璇峰~鍐欏瘑鐮�' }]" /> </wd-cell-group> - <view class="footer mt-6"> - <wd-button type="primary" size="large" @click="handleSubmit" block>鎻愪氦</wd-button> + <view class="footer"> + <view class="w-full text-end"> + <wd-checkbox v-model="rember" shape="square" @change="handleChange"> + 璁颁綇瀵嗙爜 + </wd-checkbox> + </view> + <wd-button class="mt-6" type="primary" size="large" @click="handleSubmit" block> + 鎻愪氦 + </wd-button> </view> </wd-form> </template> <script setup lang="ts"> import { currRoute } from '@/utils' -import { useUserStore, useAccessStore } from '@/store' +import { useUserStore, useAccessStore, useSystemConfigStore } from '@/store' import { useToast } from 'wot-design-uni' -import { login } from '@/service/login' +import { login, getUserInfo } from '@/service/login' +import type { UserInfo } from '@/service/login.d' +import { TestEnum } from '@/typings' const userStore = useUserStore() const accessStore = useAccessStore() +const configStore = useSystemConfigStore() const { success: showSuccess } = useToast() const model = reactive<{ username: string password: string }>({ - username: 'admin', - password: 'admin123', + username: '', + password: '', }) +const rember = ref<boolean>(false) + +function handleChange({ value }) { + console.log(value) +} const form = ref() function handleSubmit() { @@ -67,21 +82,48 @@ console.log(error, 'error') }) } + +onLoad(() => { + const { remberPassword, username, password } = configStore.systemConfigInfo + if (remberPassword) { + rember.value = true + model.username = username + model.password = password + } +}) + const toLogin = async () => { + // 璁颁綇瀵嗙爜 + if (rember.value) { + configStore.setConfigInfo({ ...model, ...{ remberPassword: true } }) + } + const res = await login(model) - console.error(res) accessStore.setAccessInfo(res as any) - console.error(accessStore.accessInfo.access_token) - // userStore.setUserInfo({ nickname: '鑿查附', avatar: '', token: 'abcdef' }) + const backUserInfo: any = await getUserInfo() + /** + * 鐧诲綍瓒呮椂鐨勬儏鍐� + */ + if (!backUserInfo) { + throw new Error('鑾峰彇鐢ㄦ埛淇℃伅澶辫触.') + } + const { permissions = [], roles = [], user } = backUserInfo + /** + * 浠庡悗鍙皍ser -> vben user杞崲 + */ + const userInfo: UserInfo = { + avatar: user.avatar ?? '', + permissions, + realName: user.nickName, + roles, + userId: user.userId, + deptId: user.deptId, + username: user.userName, + } + userStore.setUserInfo(userInfo) const { query } = currRoute() - console.error(query.redirect) uni.switchTab({ url: query.redirect }) } - - - - - </script> <style scoped lang="scss"> diff --git a/eims-ui-mobile/src/service/login.d.ts b/eims-ui-mobile/src/service/login.d.ts index 04cec7d..1b73077 100644 --- a/eims-ui-mobile/src/service/login.d.ts +++ b/eims-ui-mobile/src/service/login.d.ts @@ -5,3 +5,74 @@ tenantId?: string; grantType?: string; } + + +export interface User { + avatar: string; + createTime: string; + deptId: number; + deptName: string; + email: string; + loginDate: string; + loginIp: string; + nickName: string; + phonenumber: string; + remark: string; + roles: Role[]; + sex: string; + status: string; + tenantId: string; + userId: number; + userName: string; + userType: string; +} + + +export interface UserInfoResp { + permissions: string[]; + roles: string[]; + user: User; +} + + + +interface BasicUserInfo { + /** + * 澶村儚 + */ + avatar: string; + /** + * 閮ㄩ棬id + */ + deptId: number; + /** + * 鐢ㄦ埛鏉冮檺 + */ + permissions: string[]; + /** + * 鐢ㄦ埛鏄电О + */ + realName: string; + /** + * 鐢ㄦ埛瑙掕壊 + */ + roles: string[]; + /** + * 鐢ㄦ埛id + */ + userId: number | string; + + /** + * 鐢ㄦ埛鍚� + */ + username: string; +} + + +/** 鐢ㄦ埛淇℃伅 */ +interface UserInfo extends BasicUserInfo { + /** + * 鎷撳睍浣跨敤 + */ + [key: string]: any; +} diff --git a/eims-ui-mobile/src/service/login.ts b/eims-ui-mobile/src/service/login.ts index 05a4c58..330a514 100644 --- a/eims-ui-mobile/src/service/login.ts +++ b/eims-ui-mobile/src/service/login.ts @@ -1,16 +1,11 @@ import { http } from '@/utils/http' -import type { LoginParams } from './login.d' +import type { LoginParams, UserInfoResp } from './login.d' const clientId = import.meta.env.VITE_APP_CLIENT_ID const DEFAULT_TENANT_ID = '000000' const GRANT_TYPE = 'password' -/** GET 璇锋眰 */ -export const getFooAPI = (name: string) => { - return http.get<LoginParams>('/foo', { name }) -} - -/** POST 璇锋眰 */ +/** get 璇锋眰 */ export const login = (params: LoginParams) => { const { username, password } = params // 鏋勯�犳柊鐨勮姹傚弬鏁帮紝閬垮厤鐩存帴淇敼鍘熷瀵硅薄 @@ -23,3 +18,7 @@ } return http.post<any>('/auth/login', requestData) } + +export const getUserInfo = () => { + return http.get<null | UserInfoResp>('/system/user/getInfo') +} diff --git a/eims-ui-mobile/src/service/menu.d.ts b/eims-ui-mobile/src/service/menu.d.ts new file mode 100644 index 0000000..05683d4 --- /dev/null +++ b/eims-ui-mobile/src/service/menu.d.ts @@ -0,0 +1,36 @@ +/** + * @description: 鑿滃崟meta + * @param title 鑿滃崟鍚� + * @param icon 鑿滃崟鍥炬爣 + * @param noCache 鏄惁涓嶇紦瀛� + * @param link 澶栭摼閾炬帴 + */ +export interface MenuMeta { + icon: string; + link?: string; + noCache: boolean; + title: string; +} + +/** + * @description: 鑿滃崟 + * @param name 鑿滃崟鍚� + * @param path 鑿滃崟璺緞 + * @param hidden 鏄惁闅愯棌 + * @param component 缁勪欢鍚嶇О Laout + * @param alwaysShow 鎬绘槸鏄剧ず + * @param query 璺敱鍙傛暟(json褰㈠紡) + * @param meta 璺敱淇℃伅 + * @param children 瀛愯矾鐢变俊鎭� + */ +export interface Menu { + alwaysShow?: boolean; + children: Menu[]; + component: string; + hidden: boolean; + meta: MenuMeta; + name: string; + path: string; + query?: string; + redirect?: string; +} diff --git a/eims-ui-mobile/src/service/menu.ts b/eims-ui-mobile/src/service/menu.ts new file mode 100644 index 0000000..852a126 --- /dev/null +++ b/eims-ui-mobile/src/service/menu.ts @@ -0,0 +1,6 @@ +import { http } from '@/utils/http' +import type { Menu } from './menu.d' + +export const getAllMenusApi = () => { + return http.get<Menu>('/system/menu/getRouters') +} diff --git a/eims-ui-mobile/src/static/images/menu1.png b/eims-ui-mobile/src/static/images/menu1.png new file mode 100644 index 0000000..6f2fa77 --- /dev/null +++ b/eims-ui-mobile/src/static/images/menu1.png Binary files differ diff --git a/eims-ui-mobile/src/static/images/pic1.png b/eims-ui-mobile/src/static/images/pic1.png new file mode 100644 index 0000000..90f69dd --- /dev/null +++ b/eims-ui-mobile/src/static/images/pic1.png Binary files differ diff --git a/eims-ui-mobile/src/static/images/pic2.jpg b/eims-ui-mobile/src/static/images/pic2.jpg new file mode 100644 index 0000000..f4134d9 --- /dev/null +++ b/eims-ui-mobile/src/static/images/pic2.jpg Binary files differ diff --git a/eims-ui-mobile/src/static/images/pic3.png b/eims-ui-mobile/src/static/images/pic3.png new file mode 100644 index 0000000..a15b54f --- /dev/null +++ b/eims-ui-mobile/src/static/images/pic3.png Binary files differ diff --git a/eims-ui-mobile/src/static/images/pic4.jpeg b/eims-ui-mobile/src/static/images/pic4.jpeg new file mode 100644 index 0000000..439d18e --- /dev/null +++ b/eims-ui-mobile/src/static/images/pic4.jpeg Binary files differ diff --git a/eims-ui-mobile/src/static/menu/menu1.png b/eims-ui-mobile/src/static/menu/menu1.png new file mode 100644 index 0000000..6f2fa77 --- /dev/null +++ b/eims-ui-mobile/src/static/menu/menu1.png Binary files differ diff --git a/eims-ui-mobile/src/static/menu/menu2.png b/eims-ui-mobile/src/static/menu/menu2.png new file mode 100644 index 0000000..5720ac0 --- /dev/null +++ b/eims-ui-mobile/src/static/menu/menu2.png Binary files differ diff --git a/eims-ui-mobile/src/store/access.ts b/eims-ui-mobile/src/store/access.ts index 5b7e266..1f0a631 100644 --- a/eims-ui-mobile/src/store/access.ts +++ b/eims-ui-mobile/src/store/access.ts @@ -44,7 +44,7 @@ } export const useAccessStore = defineStore( - 'access', + 'accessInfo', () => { const accessInfo = ref<AccessInfo>({ ...initState }) diff --git a/eims-ui-mobile/src/store/index.ts b/eims-ui-mobile/src/store/index.ts index 7eca81f..c3bf4d9 100644 --- a/eims-ui-mobile/src/store/index.ts +++ b/eims-ui-mobile/src/store/index.ts @@ -16,3 +16,4 @@ // 妯″潡缁熶竴瀵煎嚭 export * from './user' export * from './access' +export * from './system-config' diff --git a/eims-ui-mobile/src/store/system-config.ts b/eims-ui-mobile/src/store/system-config.ts new file mode 100644 index 0000000..024183f --- /dev/null +++ b/eims-ui-mobile/src/store/system-config.ts @@ -0,0 +1,37 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' + +const initState = { + remberPassword: false, + username: '', + password: '', +} + +export const useSystemConfigStore = defineStore( + 'systemConfig', + () => { + const systemConfigInfo = ref<any>({ ...initState }) + + const setConfigInfo = (val: any) => { + systemConfigInfo.value = val + } + + const clearConfigInfo = () => { + systemConfigInfo.value = { ...initState } + } + // 涓�鑸病鏈塺eset闇�姹傦紝涓嶉渶瑕佺殑鍙互鍒犻櫎 + const reset = () => { + systemConfigInfo.value = { ...initState } + } + + return { + systemConfigInfo, + setConfigInfo, + clearConfigInfo, + reset, + } + }, + { + persist: true, + }, +) diff --git a/eims-ui-mobile/src/store/user.ts b/eims-ui-mobile/src/store/user.ts index 82bd873..73058d3 100644 --- a/eims-ui-mobile/src/store/user.ts +++ b/eims-ui-mobile/src/store/user.ts @@ -1,14 +1,15 @@ import { defineStore } from 'pinia' import { ref } from 'vue' +import type { UserInfoResp, UserInfo } from '@/service/login.d' -const initState = { nickname: '', avatar: '' } +const initState = null export const useUserStore = defineStore( - 'user', + 'userInfo', () => { - const userInfo = ref<IUserInfo>({ ...initState }) + const userInfo = ref<UserInfo>({ ...initState }) - const setUserInfo = (val: IUserInfo) => { + const setUserInfo = (val: UserInfo) => { userInfo.value = val } @@ -19,13 +20,11 @@ const reset = () => { userInfo.value = { ...initState } } - const isLogined = computed(() => !!userInfo.value.token) return { userInfo, setUserInfo, clearUserInfo, - isLogined, reset, } }, diff --git a/eims-ui-mobile/src/utils/http.ts b/eims-ui-mobile/src/utils/http.ts index f98f884..4106b0b 100644 --- a/eims-ui-mobile/src/utils/http.ts +++ b/eims-ui-mobile/src/utils/http.ts @@ -1,4 +1,5 @@ import { CustomRequestOptions } from '@/interceptors/request' +import { useUserStore, useAccessStore } from '@/store' export const http = <T>(options: CustomRequestOptions) => { // 1. 杩斿洖 Promise 瀵硅薄 @@ -24,7 +25,8 @@ } } else if (res.statusCode === 401) { // 401閿欒 -> 娓呯悊鐢ㄦ埛淇℃伅锛岃烦杞埌鐧诲綍椤� - // userStore.clearUserInfo() + useAccessStore().clearAccessInfo() + useUserStore().clearUserInfo() uni.navigateTo({ url: '/pages/login/index' }) reject(res) } else { -- Gitblit v1.9.3