From 29cfed37f44c34ca6b3f33e67bab881da56bc6f9 Mon Sep 17 00:00:00 2001 From: Mouriya Date: Thu, 8 Aug 2024 13:47:39 +0900 Subject: [PATCH 01/10] =?UTF-8?q?pinia-plugin-persistedstate=20=E3=82=92?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=A6=20pinia=20=E3=81=AB?= =?UTF-8?q?=E6=B0=B8=E7=B6=9A=E6=80=A7=E3=82=92=E6=8F=90=E4=BE=9B=E3=81=97?= =?UTF-8?q?=E3=80=81authStore=20=E3=81=AB=20userId=20=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/package.json | 5 +- frontend/src/stores/index.ts | 2 + frontend/src/stores/useAuthStore.ts | 152 +++++++++++++--------------- 3 files changed, 78 insertions(+), 81 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 548b749..cbca6a3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,14 +12,15 @@ "dev": "quasar dev", "dev:local": "set \"LOCAL=true\" && quasar dev", "build": "set \"SOURCE_MAP=false\" && quasar build", - "build:dev":"set \"SOURCE_MAP=true\" && quasar build" - + "build:dev": "set \"SOURCE_MAP=true\" && quasar build" }, "dependencies": { "@quasar/extras": "^1.16.4", "@vueuse/core": "^10.9.0", "axios": "^1.4.0", + "jwt-decode": "^4.0.0", "pinia": "^2.1.7", + "pinia-plugin-persistedstate": "^3.2.1", "quasar": "^2.6.0", "uuid": "^9.0.0", "vue": "^3.0.0", diff --git a/frontend/src/stores/index.ts b/frontend/src/stores/index.ts index d30b7cf..9dae28c 100644 --- a/frontend/src/stores/index.ts +++ b/frontend/src/stores/index.ts @@ -1,6 +1,7 @@ import { store } from 'quasar/wrappers' import { createPinia } from 'pinia' import { Router } from 'vue-router'; +import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' /* * When adding new properties to stores, you should also @@ -24,6 +25,7 @@ declare module 'pinia' { export default store((/* { ssrContext } */) => { const pinia = createPinia() + pinia.use(piniaPluginPersistedstate) // You can add Pinia plugins here // pinia.use(SomePiniaPlugin) diff --git a/frontend/src/stores/useAuthStore.ts b/frontend/src/stores/useAuthStore.ts index a2c3f84..4d869a7 100644 --- a/frontend/src/stores/useAuthStore.ts +++ b/frontend/src/stores/useAuthStore.ts @@ -1,91 +1,85 @@ import { defineStore } from 'pinia'; import { api } from 'boot/axios'; -import {router} from 'src/router'; -import {IDomainInfo} from '../types/ActionTypes'; +import { router } from 'src/router'; +import { IDomainInfo } from '../types/ActionTypes'; +import { jwtDecode } from "jwt-decode"; - -export interface IUserState{ - token?:string; - returnUrl:string; - currentDomain:IDomainInfo; - LeftDrawer:boolean; +export interface IUserState { + token?: string; + returnUrl: string; + currentDomain: IDomainInfo; + LeftDrawer: boolean; + userId?:string; } -export const useAuthStore = defineStore({ - id: 'auth', - state: ():IUserState =>{ - const token=localStorage.getItem('token')||''; - if(token!==''){ - api.defaults.headers["Authorization"]='Bearer ' + token; +export const useAuthStore = defineStore('auth', { + state: (): IUserState => ({ + token: '', + returnUrl: '', + LeftDrawer: false, + currentDomain: {} as IDomainInfo, + userId:'' + }), + getters: { + toggleLeftDrawer(): boolean { + return this.LeftDrawer; + }, + }, + actions: { + toggleLeftMenu() { + this.LeftDrawer = !this.LeftDrawer; + }, + async login(username: string, password: string) { + const params = new URLSearchParams(); + params.append('username', username); + params.append('password', password); + try { + const result = await api.post(`api/token`, params); + console.info(result); + this.token = result.data.access_token; + this.userId=jwtDecode(result.data.access_token).sub + api.defaults.headers['Authorization'] = 'Bearer ' + this.token; + this.currentDomain = await this.getCurrentDomain(); + this.router.push(this.returnUrl || '/'); + return true; + } catch (e) { + console.error(e); + return false; } + }, + async getCurrentDomain(): Promise { + const activedomain = await api.get(`api/activedomain`); return { - token, - returnUrl: '', - LeftDrawer:false, - currentDomain: JSON.parse(localStorage.getItem('currentDomain')||"{}") - } + id: activedomain.data.id, + domainName: activedomain.data.name, + kintoneUrl: activedomain.data.url, + }; }, - getters:{ - toggleLeftDrawer():boolean{ - return this.LeftDrawer; + async getUserDomains(): Promise { + const resp = await api.get(`api/domain`); + const domains = resp.data as any[]; + return domains.map((data) => ({ + id: data.id, + domainName: data.name, + kintoneUrl: data.url, + })); + }, + logout() { + this.token = ''; + this.currentDomain = {} as IDomainInfo; // 清空当前域 + router.push('/login'); + }, + async setCurrentDomain(domain: IDomainInfo) { + if (domain.id === this.currentDomain.id) { + return; } + await api.put(`api/activedomain/${domain.id}`); + this.currentDomain = domain; }, - actions: { - toggleLeftMenu(){ - this.LeftDrawer=!this.LeftDrawer; - }, - async login(username:string, password:string) { - const params = new URLSearchParams(); - params.append('username', username); - params.append('password', password); - try{ - const result = await api.post(`api/token`,params); - console.info(result); - this.token =result.data.access_token; - localStorage.setItem('token', result.data.access_token); - api.defaults.headers["Authorization"]='Bearer ' + this.token; - this.currentDomain=await this.getCurrentDomain(); - localStorage.setItem('currentDomain',JSON.stringify(this.currentDomain)); - this.router.push(this.returnUrl || '/'); - return true; - }catch(e) - { - console.info(e); - return false; - } - }, - async getCurrentDomain():Promise{ - const activedomain = await api.get(`api/activedomain`); - return { - id:activedomain.data.id, - domainName:activedomain.data.name, - kintoneUrl:activedomain.data.url - } - }, - async getUserDomains():Promise{ - const resp = await api.get(`api/domain`); - const domains =resp.data as any[]; - return domains.map(data=>{ - return { - id:data.id, - domainName:data.name, - kintoneUrl:data.url - } - }); - }, - logout() { - this.token = undefined; - localStorage.removeItem('token'); - localStorage.removeItem('currentDomain'); - router.push('/login'); - }, - async setCurrentDomain(domain:IDomainInfo){ - if(domain.id===this.currentDomain.id){ - return; - } - await api.put(`api/activedomain/${domain.id}`); - this.currentDomain=domain; - localStorage.setItem('currentDomain',JSON.stringify(this.currentDomain)); - } + }, + persist: { + afterRestore: (ctx) => { + api.defaults.headers['Authorization'] = 'Bearer ' + ctx.store.token; } + }, }); From 43994ca213a53ef51b4be1680206348f73cba8df Mon Sep 17 00:00:00 2001 From: Mouriya Date: Thu, 8 Aug 2024 13:49:11 +0900 Subject: [PATCH 02/10] =?UTF-8?q?UserDomain=20=E4=B8=80=E6=8B=AC=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=20API=20=E3=82=92=E4=BF=AE=E6=AD=A3=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/api_v1/routers/platform.py | 2 +- backend/app/db/crud.py | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/backend/app/api/api_v1/routers/platform.py b/backend/app/api/api_v1/routers/platform.py index 0a3e421..2ab6b46 100644 --- a/backend/app/api/api_v1/routers/platform.py +++ b/backend/app/api/api_v1/routers/platform.py @@ -254,7 +254,7 @@ async def userdomain_details( async def create_userdomain( request: Request, userid: int, - domainids:list, + domainids:List[int] , db=Depends(get_db), ): try: diff --git a/backend/app/db/crud.py b/backend/app/db/crud.py index 0ee5161..c697446 100644 --- a/backend/app/db/crud.py +++ b/backend/app/db/crud.py @@ -224,16 +224,11 @@ def edit_domain( db.refresh(db_domain) return db_domain -def add_userdomain(db: Session, userid:int,domainids:list): - for domainid in domainids: - db_domain = models.UserDomain( - userid = userid, - domainid = domainid - ) - db.add(db_domain) +def add_userdomain(db: Session, userid:int,domainids:list[str]): + dbCommits = list(map(lambda domainid: models.UserDomain(userid = userid, domainid = domainid ), domainids)) + db.bulk_save_objects(dbCommits) db.commit() - db.refresh(db_domain) - return db_domain + return dbCommits def delete_userdomain(db: Session, userid: int,domainid: int): db_domain = db.query(models.UserDomain).filter(and_(models.UserDomain.userid == userid,models.UserDomain.domainid == domainid)).first() From ad96c923b26d180d5c91bd10e7a52ba8886db24f Mon Sep 17 00:00:00 2001 From: Mouriya Date: Thu, 8 Aug 2024 13:49:58 +0900 Subject: [PATCH 03/10] =?UTF-8?q?userdomain=20=E3=83=9A=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=81=AE=E6=9C=80=E9=81=A9=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/UserDomain.vue | 222 ++++++++---------------------- 1 file changed, 57 insertions(+), 165 deletions(-) diff --git a/frontend/src/pages/UserDomain.vue b/frontend/src/pages/UserDomain.vue index 38115bb..39406a4 100644 --- a/frontend/src/pages/UserDomain.vue +++ b/frontend/src/pages/UserDomain.vue @@ -1,127 +1,21 @@ - - - - - - From 914b0d85df62c733f52f5d163006ed274f780471 Mon Sep 17 00:00:00 2001 From: Mouriya Date: Thu, 8 Aug 2024 15:30:09 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=E3=83=89=E3=83=A1=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=83=9A=E3=83=BC=E3=82=B8=E3=82=92=E6=9C=80=E9=81=A9=E5=8C=96?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/core/security.py | 2 + backend/app/db/crud.py | 6 +- frontend/src/pages/TenantDomain.vue | 163 ++++++++++++++++++---------- 3 files changed, 109 insertions(+), 62 deletions(-) diff --git a/backend/app/core/security.py b/backend/app/core/security.py index 8e0f70f..20b1c95 100644 --- a/backend/app/core/security.py +++ b/backend/app/core/security.py @@ -35,6 +35,8 @@ def create_access_token(*, data: dict, expires_delta: timedelta = None): return encoded_jwt def chacha20Encrypt(plaintext:str, key=config.KINTONE_PSW_CRYPTO_KEY): + if plaintext is None or plaintext == '': + return None nonce = os.urandom(16) algorithm = algorithms.ChaCha20(key, nonce) cipher = Cipher(algorithm, mode=None) diff --git a/backend/app/db/crud.py b/backend/app/db/crud.py index c697446..2101ad9 100644 --- a/backend/app/db/crud.py +++ b/backend/app/db/crud.py @@ -216,9 +216,9 @@ def edit_domain( update_data = domain.dict(exclude_unset=True) for key, value in update_data.items(): - if(key != "id"): - setattr(db_domain, key, value) - + if key != "id" and not (key == "kintonepwd" and (value is None or value == "")): + setattr(db_domain, key, value) + print(str(db_domain)) db.add(db_domain) db.commit() db.refresh(db_domain) diff --git a/frontend/src/pages/TenantDomain.vue b/frontend/src/pages/TenantDomain.vue index 2819085..3b07c72 100644 --- a/frontend/src/pages/TenantDomain.vue +++ b/frontend/src/pages/TenantDomain.vue @@ -1,54 +1,90 @@ - +