From 28013b0e8e5d9238c209f6d43c99896d0973ca91 Mon Sep 17 00:00:00 2001 From: zy7y <13271962515@163.com> Date: Sun, 11 Sep 2022 22:50:39 +0800 Subject: [PATCH] feat: axios loading & message --- backend/controller/common.py | 2 +- backend/controller/user.py | 4 +++- backend/core/events.py | 3 ++- backend/core/resp.py | 2 +- backend/mini.db | Bin 4096 -> 45056 bytes backend/mini.db-shm | Bin 0 -> 32768 bytes backend/mini.db-wal | 0 backend/schemas/common.py | 2 +- backend/schemas/user.py | 2 +- frontend/src/main.js | 6 ++++-- frontend/src/router/index.js | 4 ++++ frontend/src/service/request.js | 27 ++++++++++++++------------- frontend/src/service/user.js | 9 +++++++++ frontend/src/stores/index.js | 8 ++++++++ frontend/src/stores/user.js | 30 +++++++++++++++++++++++++----- frontend/src/views/login.vue | 7 +++++-- 16 files changed, 78 insertions(+), 28 deletions(-) create mode 100644 backend/mini.db-shm create mode 100644 backend/mini.db-wal create mode 100644 frontend/src/service/user.js create mode 100644 frontend/src/stores/index.js diff --git a/backend/controller/common.py b/backend/controller/common.py index 01f25ca..0831659 100644 --- a/backend/controller/common.py +++ b/backend/controller/common.py @@ -12,5 +12,5 @@ async def login(auth_data: LoginForm) -> Response[LoginResult]: user_obj = await get_user({"username": auth_data.username}) if user_obj: if verify_password(auth_data.password, user_obj.password): - return dict(id=user_obj.id, access_token=generate_token(user_obj.username)) + return Response(data=LoginResult(id=user_obj.id, token=generate_token(auth_data.username))) return Response(msg="账号或密码错误") diff --git a/backend/controller/user.py b/backend/controller/user.py index 2366224..dada934 100644 --- a/backend/controller/user.py +++ b/backend/controller/user.py @@ -1,16 +1,18 @@ from core.resp import Response from core.router import Router +from core.security import get_password_hash from dbhelper.user import get_user_info, get_users, insert_user from schemas.common import ListAll from schemas.user import UserAdd, UserInfo, UserList, UserQuery -user = Router(prefix="/users", tags=["用户管理"]) +user = Router(prefix="/user", tags=["用户管理"]) @user.post("", summary="用户添加") async def user_add(data: UserAdd) -> Response[UserInfo]: roles = data.rids del data.rids + user.password = get_password_hash(user.password) return await insert_user(data, roles) diff --git a/backend/core/events.py b/backend/core/events.py index 7458491..ef1194a 100644 --- a/backend/core/events.py +++ b/backend/core/events.py @@ -4,8 +4,9 @@ from tortoise import Tortoise async def init_orm(): """初始化orm""" await Tortoise.init( - db_url="sqlite://mini.db", modules={"models": ["models"]} + db_url="sqlite://mini.db", modules={"models": ["models"]}, ) + await Tortoise.generate_schemas() async def close_orm(): diff --git a/backend/core/resp.py b/backend/core/resp.py index 7f61e7a..bf79afd 100644 --- a/backend/core/resp.py +++ b/backend/core/resp.py @@ -28,5 +28,5 @@ class Msg(enum.Enum): class Response(GenericModel, Generic[T]): code: Status = Status.OK - msg: Union[Msg, str] = Msg.OK data: Optional[T] + msg: Union[Msg, str] = Msg.OK diff --git a/backend/mini.db b/backend/mini.db index e2a2455a104f1cf6a5d6b143f3ac8831aaaf3ab5..1975609e80f9898e768ddaaacd2002cc6b7e989e 100644 GIT binary patch literal 45056 zcmeI)>rYc>90%}TxK)sT$jtTWMifzwhbkZf6jiqH$#3jyCWhxQ;9dRlrJ?UF@1 zl(9L7ab9B7MPoL7Gr`5-CX2q_AF(%v9%{1e#olZ$_dKVU)0=V2d|}Ax^#dxHCfJs9VinQ%13#hEU}UWH1f_>f@~3WbV1c9BP6Ya%b|3UA1>vgGxvUaAxw zW1sA9`aq#k|Eg%&YPsCfu1Pij-E^$}kEY#qqhu#G2teTf3!Kq3YApwp>Gy&{fKLVk zNnb1#^Ce<@)E5o=62XAa%=Z|0L&@HGe%GMOYVlZ^5$BL~lF_|7myQ{8GP<(7I_98` z6stSJ=%VCFzw~Z%qxQf7<+3u)P0#aXY0KVd@|Ail19oe5p&Ev4q$xVmDvx#8>SD%S zBMyseim_Rz7>n04HsT~DIIK<&;~XOouiegc9%8nB+I)HCA#zm= z*zKe!IWaS2J!bLRJ&b|o+x}uhJe!vD`J+4+=SlUR5r@_7u{g#_dkQ%Qy)GB2*e4$& zC1h4^W;UOS*Ee2Xe=L_13I~ES!T(f{c=NG%ZN0J}s!J_OPJmRJy?;6T`47Q>Tp{g@ z>U7&z9*8SXq;wknxpx{Hwe9W7m0e|hROp_j+C4*h8l6(nyY#{mxDc;nCM>SO;}+LJ zLyunWA+K}fgx5;LEBpAn%<2=lmxQ2yt~{fW)sqOLadiLd%%zKR(g+ueErz3{SBrHR zdrK;j@~kay-;twtaLnoUxGXeU=*20I0r~d&jD3D?n$t1)29is-a3Xq*zO$)8JJ_yN zNJB_$VViSi*XIwyyTktHEjBcHgsnte|5Y4m66YfTrlS9~GzLqf-I zHqZ2!>ClkhD7tmntkU}0!9$uUBoIN>5%h1T z3)&gg(?xdmR_5Z>ks&EaV(Lci`|ZkfTiKd|!u#T>2pJn#1IJI(-lF^JYDY(9ayd5g zJ*cB)(YTOeUq7yD&>lXloXU+Pxj`t#FC=)u&*#Ua!drD&XjB|LNQ*l{lIoY+l+x(* zWqomUqE#2#ttu-;TIA$ghFPy-)~gbiLG;nwrJ zVtP#;xFTG9Rvxwtbas<64u z)P62dvNq!)K{=Crp5j;EW>)W2wu11@hD&GtVkJ`Y?AjCY(Wm0IpEJL#%1w{*r;>6N z-Q`(wHHhEe%dFhU-hGgL_AHlIqu))Z@4fUFHV8lf0uX=z1Rwwb2tWV=5P$##cB%mV z`(N4mr-J-og8&2|009U<00Izz00bZa0SG`~#|X42)$K}p?+d+4L9L?{F%|G%^P z6K4Yf2tWV=5P$##AOHafKmY;|s3m~!|7)pW9|Rx(0SG_<0uX=z1Rwwb2tZ(G3DCd) z)q6%2tqXg8BTv{M009U<00Izz00bZa0SG_<0pTe{xJ8jVNUzM}>M zV=(ozrhXIK(bLPC`??OZY(LAs?szN_;iK7&^IK1!?l(^FHyHODq9)eX8w(8bld0+C zz-jkz%0J$bJlQioWaE27Trw_nx?QJSj;@a*#+2=J++wkF>3u4xNo}>7#F{#cW>c5h z_=+Y~9FOy{I3E>%ypUbHnr~C@lxNO9K9@M=buZdOrWyaq&Pa?Gy4iVWk9Uw4LIKx}n3;_s000Izz00bZa0SG_<0uX?}TPo13)+(jXQ`8!Dn=Vxv8fq32(_Nnj2?09pD5a{vGU diff --git a/backend/mini.db-shm b/backend/mini.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10 GIT binary patch literal 32768 zcmeIuAr62r3 import('@/views/login.vue') diff --git a/frontend/src/service/request.js b/frontend/src/service/request.js index e8f52a0..9921270 100644 --- a/frontend/src/service/request.js +++ b/frontend/src/service/request.js @@ -1,34 +1,35 @@ import axios from "axios"; -import {message, ElLoading} from 'element-plus' -import userStore from '@/stores/user' +import { ElMessage, ElLoading } from 'element-plus' +import {userStore} from '@/stores/user' - -const store = userStore() +let loading export default (config) => { const instance = axios.create({ baseURL: import.meta.env.VITE_BASE_URL, - timeout: 5000, + timeout: 10000, }) instance.interceptors.request.use(config => { - ElLoading.service({ - title: '请求中.' + loading = ElLoading.service({ + lock: true, + text: '请求中...', + background: 'rabg(0,0,0,0.7)' }) - config.headers.Authorization = store.accessToken + config.headers.Authorization = userStore().accessToken return config }) instance.interceptors.response.use(res => { - if (res.data.code !== 20000 ){ - message.error(res.data.msg) + if (res.data.code !== 200 ){ + ElMessage.error(res.data.msg) } - ElLoading.close() + loading.close() return res.data }, err => { - message.error(err) - ElLoading.close() + ElMessage.error(err) + loading.close() return Promise.reject(err) }) diff --git a/frontend/src/service/user.js b/frontend/src/service/user.js new file mode 100644 index 0000000..d8a7032 --- /dev/null +++ b/frontend/src/service/user.js @@ -0,0 +1,9 @@ +import request from "./request"; + +export function login(data) { + return request({ + url: "/login", + method: 'post', + data + }); +} diff --git a/frontend/src/stores/index.js b/frontend/src/stores/index.js new file mode 100644 index 0000000..9702c0e --- /dev/null +++ b/frontend/src/stores/index.js @@ -0,0 +1,8 @@ +import { createPinia } from 'pinia' +import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' + +const pinia = createPinia() +pinia.use(piniaPluginPersistedstate) + + +export default pinia \ No newline at end of file diff --git a/frontend/src/stores/user.js b/frontend/src/stores/user.js index 096fb84..efe1226 100644 --- a/frontend/src/stores/user.js +++ b/frontend/src/stores/user.js @@ -1,14 +1,25 @@ import { ref, computed } from 'vue' import { defineStore } from 'pinia' +import { ElMessage } from 'element-plus' +import {login} from '@/service/user' export const userStore = defineStore('user', () => { - const info = ref({}) + const uid = ref(0) const token = ref("") - const accessToken = computed(() => 'Bearer ' + token) + const accessToken = computed(() => 'Bearer ' + token.value) - return { info, token, accessToken } + // 非setup语法时的actions + const loginAction = async (data) => { + const res = await login(data) + token.value = res.data.token + uid.value = res.data.id + // 弹框提示登录成功 + ElMessage.success("登录成功.") + } + + return { uid, token, accessToken, loginAction } }, { - persist: true, + persist: true, // 解决pinia刷新时数据丢失问题 }) // export const userStore = defineStore('user',{ @@ -19,5 +30,14 @@ export const userStore = defineStore('user', () => { // accessToken() { // return `Bearer ${this.token}` // } -// } +// }, +// actions: { +// async loginAction(data){ +// const res = await login(data) +// console.log(res) +// this.token = res.data.token +// // uid.value = res.data.id +// } +// }, +// persist: true // }) \ No newline at end of file diff --git a/frontend/src/views/login.vue b/frontend/src/views/login.vue index 0818047..29669dc 100644 --- a/frontend/src/views/login.vue +++ b/frontend/src/views/login.vue @@ -2,6 +2,9 @@ import { User, Lock } from '@element-plus/icons-vue' import {ref,reactive} from 'vue' + import { userStore } from '@/stores/user'; + + const store = userStore() // 表单配置 const rules = { username: [ @@ -26,8 +29,8 @@ if (!formEl) return formEl.validate( valid => { if (valid) { - // 验证通过 - console.log('submit!') + // 验证通过,执行登录逻辑 + store.loginAction(formData) } }) }