@cgboiler/core 1.2.13 → 1.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var g=require('localforage');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var g__default=/*#__PURE__*/_interopDefault(g);g__default.default.config({name:"cgx",storeName:"cgx_store",driver:[g__default.default.INDEXEDDB,g__default.default.LOCALSTORAGE]});var c=async(t,e)=>{try{await g__default.default.setItem(t,e);}catch(r){console.error("Error saving data:",r);}},l=async t=>{try{return await g__default.default.getItem(t)}catch(e){return console.error("Error getting data:",e),null}},y=async t=>{try{await g__default.default.removeItem(t);}catch(e){console.error("Error removing data:",e);}},V=async()=>{try{await g__default.default.clear();}catch(t){console.error("Error clearing data:",t);}};var p="user_info",O=async t=>{await c(p,t);},K=async t=>{let e=await T();await c(p,{...e,token:t});},u=async()=>(await l(p))?.token,T=async()=>await l(p)||{},w=async t=>{let e=await T();await c(p,{...e,...t});},N=async()=>{await y(p);};var d=async(t,e={})=>{let{params:r,...s}=e,o=r?"?"+Object.entries(r).map(([m,P])=>`${m}=${encodeURIComponent(String(P))}`).join("&"):"",i=t+o,a=await u(),n=await fetch(i,{...s,headers:{"Content-Type":"application/json",token:a||"",...s.headers}});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);return await n.json()};function I(t){try{if(!t||typeof t!="string")throw new Error("\u65E0\u6548\u7684 JWT \u683C\u5F0F");let e=t.split(".");if(e.length!==3)throw new Error("JWT \u5FC5\u987B\u5305\u542B\u4E09\u4E2A\u90E8\u5206");let r=e[1],o=r.padEnd(r.length+(4-r.length%4)%4,"=").replace(/-/g,"+").replace(/_/g,"/"),i=atob(o);return JSON.parse(i)}catch(e){return console.error("\u89E3\u7801\u5931\u8D25:",e),null}}var h=t=>{let r=new URLSearchParams(window.location.search).get(t);if(r)return r;let s=window.location.hash;if(s){let i=(s.startsWith("#")?s.substring(1):s).match(/\?(.*)/);if(i&&i[1])return new URLSearchParams(i[1]).get(t)}return null},M=async()=>{let t=h("token"),e=h("user_id"),r=h("t"),s=new URL(window.location.href);s.searchParams.delete("token"),s.searchParams.delete("user_id"),s.searchParams.delete("t"),window.history.replaceState({},"",s.toString());let o=!!(t||e);if(r){let a=parseInt(r,10),n=Date.now(),f=a<1e10?a*1e3:a;Math.abs(n-f)>60*1e3*5&&(o=false);}o&&await w({...t&&{token:t},...e&&{userId:e}});let i=await u();if(i){let a=I(i);if(a){let{exp:n,companyId:f}=a,m=Math.floor(Date.now()/1e3);if(n&&n<=m)await w({token:"",userId:""});else {await w({companyId:f});return}}}window.location.replace(`${window.globalConfig.weiwoWeb}/#/auth?url=${window.location.href}`);};var x="userListCache",L="userListVersionCache",U=null,_=(t,e)=>{let r=`${window.globalConfig.wFlowApiTest}/v1`;return d(`${r}/oa/org/depts/users`,{params:{onlyVersion:t,companyId:e}})},v=t=>{let e=`${window.globalConfig.wFlowApiTest}/v1`;return d(`${e}/oa/org/depts/users`,{params:{companyId:t}})},b=async t=>{console.log("getUserList",t);let e=t?`${x}_${t}`:x,r=t?`${L}_${t}`:L,s=await l(e),o=await l(r);if(!t&&U&&s)return s;let a=(await _(true,t)).version;if(s&&o===a)return t||(U=o),s;{let n=await v(t);return await c(e,n.data),await c(r,n.version),t||(U=n.version),n.data}},j=async t=>(await b()).find(r=>r.id===t);var E="deptListCache",R="deptListVersionCache",S=null,D=(t,e)=>{let r=`${window.globalConfig.wFlowApiTest}/v1`;return d(`${r}/oa/org/allpartments`,{params:{onlyVersion:t,companyId:e}})},$=t=>{let e=`${window.globalConfig.wFlowApiTest}/v1`;return d(`${e}/oa/org/allpartments`,{params:{companyId:t}})},C=async t=>{let e=t?`${E}_${t}`:E,r=t?`${R}_${t}`:R,s=await l(e),o=await l(r);if(!t&&S&&s)return s;let a=(await D(true,t)).version;if(s&&o===a)return t||(S=o),s;{let n=await $(t);return await c(e,n.data),await c(r,n.version),t||(S=n.version),n.data}},Z=async t=>(await C()).find(r=>r.id===t);exports.clearStorage=V;exports.clearUserInfo=N;exports.fetchAllDept=$;exports.fetchAllUser=v;exports.fetchDeptVersion=D;exports.fetchUserVersion=_;exports.getDeptById=Z;exports.getDeptList=C;exports.getStorage=l;exports.getUserById=j;exports.getUserInfo=T;exports.getUserList=b;exports.getUserToken=u;exports.initApp=M;exports.initUserInfo=O;exports.removeStorage=y;exports.setStorage=c;exports.setUserToken=K;exports.updateUserInfo=w;exports.useFetch=d;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/storage.ts","../src/utils/user.ts","../src/utils/fetch.ts","../src/utils/initApp.ts","../src/utils/userList.ts","../src/utils/deptList.ts"],"names":["localforage","setStorage","key","value","error","getStorage","removeStorage","clearStorage","USER_INFO_KEY","initUserInfo","info","setUserToken","token","userInfo","getUserInfo","getUserToken","updateUserInfo","currentInfo","clearUserInfo","useFetch","url","config","params","restConfig","queryString","finalUrl","response","decodeJwtPayload","jwt","parts","encodedPayload","base64Payload","decodedJson","getUrlParam","paramName","paramFromSearch","hash","queryStringMatch","initApp","userId","t","shouldUpdate","timestamp","now","timestampMs","userToken","decodedToken","exp","companyId","currentTime","BASE_URL","USER_LIST_STORAGE_KEY","USER_LIST_VERSION_STORAGE_KEY","memoryVersion","fetchUserVersion","onlyVersion","fetchAllUser","getUserList","cachedUserList","cachedVersion","latestVersion","userListResponse","getUserById","user","DEPT_LIST_STORAGE_KEY","DEPT_LIST_VERSION_STORAGE_KEY","fetchDeptVersion","fetchAllDept","getDeptList","cachedDeptList","deptListResponse","getDeptById","deptId","dept"],"mappings":"0JAGAA,kBAAAA,CAAY,MAAA,CAAO,CACjB,IAAA,CAAM,KAAA,CACN,UAAW,WAAA,CACX,MAAA,CAAQ,CACNA,kBAAAA,CAAY,SAAA,CACZA,mBAAY,YACd,CACF,CAAC,CAAA,CAGM,IAAMC,EAAa,MAAOC,CAAAA,CAAaC,IAAe,CAC3D,GAAI,CACF,MAAMH,kBAAAA,CAAY,QAAQE,CAAAA,CAAKC,CAAK,EACtC,CAAA,MAASC,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,qBAAsBA,CAAK,EAC3C,CACF,CAAA,CAGaC,CAAAA,CAAa,MAAUH,CAAAA,EAAmC,CACrE,GAAI,CAEF,OADc,MAAMF,mBAAY,OAAA,CAAWE,CAAG,CAEhD,CAAA,MAASE,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,sBAAuBA,CAAK,CAAA,CACnC,IACT,CACF,CAAA,CAGaE,EAAgB,MAAOJ,CAAAA,EAAgB,CAClD,GAAI,CACF,MAAMF,kBAAAA,CAAY,UAAA,CAAWE,CAAG,EAClC,CAAA,MAASE,EAAO,CACd,OAAA,CAAQ,MAAM,sBAAA,CAAwBA,CAAK,EAC7C,CACF,CAAA,CAGaG,EAAe,SAAY,CACtC,GAAI,CACF,MAAMP,kBAAAA,CAAY,KAAA,GACpB,CAAA,MAASI,EAAO,CACd,OAAA,CAAQ,MAAM,sBAAA,CAAwBA,CAAK,EAC7C,CACF,MCpCMI,CAAAA,CAAgB,WAAA,CAMTC,EAAe,MAAOC,CAAAA,EAAmB,CACpD,MAAMT,CAAAA,CAAWO,EAAeE,CAAI,EACtC,EAMaC,CAAAA,CAAe,MAAOC,GAAkB,CACnD,IAAMC,EAAW,MAAMC,CAAAA,GACvB,MAAMb,CAAAA,CAAWO,EAAe,CAAE,GAAGK,EAAU,KAAA,CAAAD,CAAM,CAAC,EACxD,CAAA,CAMaG,EAAe,SAAA,CACT,MAAMV,CAAAA,CAAqBG,CAAa,CAAA,GACxC,KAAA,CAONM,EAAc,SACR,MAAMT,EAAqBG,CAAa,CAAA,EACtC,EAAC,CAOTQ,CAAAA,CAAiB,MAAON,CAAAA,EAA4B,CAC/D,IAAMO,CAAAA,CAAc,MAAMH,GAAY,CACtC,MAAMb,EAAWO,CAAAA,CAAe,CAAE,GAAGS,CAAAA,CAAa,GAAGP,CAAK,CAAC,EAC7D,CAAA,CAKaQ,EAAgB,SAAY,CACvC,MAAMZ,CAAAA,CAAcE,CAAa,EACnC,ECzDO,IAAMW,EAAW,MAAUC,CAAAA,CAAaC,EAAsB,EAAC,GAAM,CAC1E,GAAM,CAAE,MAAA,CAAAC,CAAAA,CAAQ,GAAGC,CAAW,EAAIF,CAAAA,CAG5BG,CAAAA,CAAcF,EAChB,GAAA,CACA,MAAA,CAAO,QAAQA,CAAM,CAAA,CAClB,IAAI,CAAC,CAACpB,EAAKC,CAAK,CAAA,GAAM,GAAGD,CAAG,CAAA,CAAA,EAAI,mBAAmB,MAAA,CAAOC,CAAK,CAAC,CAAC,CAAA,CAAE,EACnE,IAAA,CAAK,GAAG,EACX,EAAA,CAEEsB,CAAAA,CAAWL,EAAMI,CAAAA,CAGjBZ,CAAAA,CAAQ,MAAMG,CAAAA,EAAa,CAG3BW,EAAW,MAAM,KAAA,CAAMD,EAAU,CACrC,GAAGF,EACH,OAAA,CAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,KAAA,CAAOX,CAAAA,EAAS,GAChB,GAAGW,CAAAA,CAAW,OAChB,CACF,CAAC,EAED,GAAI,CAACG,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuBA,EAAS,MAAM,CAAA,CAAE,EAI1D,OADa,MAAMA,CAAAA,CAAS,IAAA,EAE9B,ECpCA,SAASC,CAAAA,CAAiBC,CAAAA,CAAa,CACrC,GAAI,CAEF,GAAI,CAACA,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,CACzB,MAAM,IAAI,KAAA,CAAM,qCAAY,CAAA,CAI9B,IAAMC,EAAQD,CAAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAC3B,GAAIC,CAAAA,CAAM,SAAW,CAAA,CACnB,MAAM,IAAI,KAAA,CAAM,sDAAc,EAIhC,IAAMC,CAAAA,CAAiBD,EAAM,CAAC,CAAA,CASxBE,EANuBD,CAAAA,CAAe,MAAA,CAC1CA,EAAe,MAAA,CAAA,CAAW,CAAA,CAAKA,EAAe,MAAA,CAAS,CAAA,EAAM,EAC7D,GACF,CAAA,CAG2C,QAAQ,IAAA,CAAM,GAAG,EAAE,OAAA,CAAQ,IAAA,CAAM,GAAG,CAAA,CAGzEE,CAAAA,CAAc,KAAKD,CAAa,CAAA,CAGtC,OAAO,IAAA,CAAK,KAAA,CAAMC,CAAW,CAC/B,CAAA,MAAS5B,EAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,2BAAA,CAASA,CAAK,CAAA,CACrB,IACT,CACF,KAGM6B,CAAAA,CAAeC,CAAAA,EAAqC,CAGxD,IAAMC,CAAAA,CADkB,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA,CAC1B,IAAID,CAAS,CAAA,CACrD,GAAIC,CAAAA,CACF,OAAOA,CAAAA,CAIT,IAAMC,CAAAA,CAAO,MAAA,CAAO,SAAS,IAAA,CAC7B,GAAIA,EAAM,CAER,IAAMC,GADcD,CAAAA,CAAK,UAAA,CAAW,GAAG,CAAA,CAAIA,CAAAA,CAAK,UAAU,CAAC,CAAA,CAAIA,GAC1B,KAAA,CAAM,QAAQ,EACnD,GAAIC,CAAAA,EAAoBA,CAAAA,CAAiB,CAAC,CAAA,CAExC,OADsB,IAAI,eAAA,CAAgBA,CAAAA,CAAiB,CAAC,CAAC,CAAA,CACxC,IAAIH,CAAS,CAEtC,CAEA,OAAO,IACT,EAGaI,CAAAA,CAAU,SAAY,CACjC,IAAM1B,CAAAA,CAAQqB,EAAY,OAAO,CAAA,CAC3BM,EAASN,CAAAA,CAAY,SAAS,EAC9BO,CAAAA,CAAIP,CAAAA,CAAY,GAAG,CAAA,CAGnBb,CAAAA,CAAM,IAAI,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA,CACxCA,EAAI,YAAA,CAAa,MAAA,CAAO,OAAO,CAAA,CAC/BA,CAAAA,CAAI,aAAa,MAAA,CAAO,SAAS,CAAA,CACjCA,CAAAA,CAAI,YAAA,CAAa,MAAA,CAAO,GAAG,CAAA,CAC3B,MAAA,CAAO,QAAQ,YAAA,CAAa,GAAI,EAAA,CAAIA,CAAAA,CAAI,UAAU,CAAA,CAElD,IAAIqB,CAAAA,CAAe,CAAC,EAAE7B,CAAAA,EAAS2B,CAAAA,CAAAA,CAC/B,GAAIC,CAAAA,CAAG,CACL,IAAME,CAAAA,CAAY,QAAA,CAASF,CAAAA,CAAG,EAAE,CAAA,CAC1BG,CAAAA,CAAM,KAAK,GAAA,EAAI,CAEfC,EAAcF,CAAAA,CAAY,IAAA,CAAcA,EAAY,GAAA,CAAOA,CAAAA,CAE7D,KAAK,GAAA,CAAIC,CAAAA,CAAMC,CAAW,CAAA,CAAI,EAAA,CAAK,IAAO,CAAA,GAC5CH,CAAAA,CAAe,KAAA,EAEnB,CAEIA,CAAAA,EACF,MAAMzB,EAAe,CACnB,GAAIJ,GAAS,CAAE,KAAA,CAAAA,CAAM,CAAA,CACrB,GAAI2B,GAAU,CAAE,MAAA,CAAAA,CAAO,CACzB,CAAC,EAGH,IAAMM,CAAAA,CAAY,MAAM9B,CAAAA,EAAa,CACrC,GAAI8B,CAAAA,CAAW,CACb,IAAMC,CAAAA,CAAenB,CAAAA,CAAiBkB,CAAS,CAAA,CAC/C,GAAIC,EAAc,CAChB,GAAM,CAAE,GAAA,CAAAC,CAAAA,CAAK,UAAAC,CAAU,CAAA,CAAIF,EACrBG,CAAAA,CAAc,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,EAAI,CAAI,GAAI,CAAA,CAChD,GAAIF,GAAOA,CAAAA,EAAOE,CAAAA,CAChB,MAAMjC,CAAAA,CAAe,CACnB,MAAO,EAAA,CACP,MAAA,CAAQ,EACV,CAAC,CAAA,CAAA,KACI,CACL,MAAMA,CAAAA,CAAe,CACnB,SAAA,CAAAgC,CACF,CAAC,CAAA,CACD,MACF,CACF,CACF,CAGA,MAAA,CAAO,SAAS,OAAA,CAAQ,CAAA,EAAG,OAAO,YAAA,CAAa,QAAQ,eAAe,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAE,EAC9F,EChHA,IAAME,CAAAA,CAAW,GAAG,MAAA,CAAO,YAAA,CAAa,QAAQ,CAAA,GAAA,CAAA,CA0B1CC,CAAAA,CAAwB,eAAA,CACxBC,CAAAA,CAAgC,sBAAA,CAGlCC,CAAAA,CAA+B,KAOtBC,CAAAA,CAAoBC,CAAAA,EACxBpC,EACL,CAAA,EAAG+B,CAAQ,sBACX,CAAE,MAAA,CAAQ,CAAE,WAAA,CAAAK,CAAY,CAAE,CAC5B,CAAA,CAOWC,EAAe,IACnBrC,CAAAA,CACL,GAAG+B,CAAQ,CAAA,mBAAA,CACb,EAOWO,CAAAA,CAAc,SAA6B,CACtD,IAAMC,CAAAA,CAAiB,MAAMrD,CAAAA,CAAmB8C,CAAqB,EAC/DQ,CAAAA,CAAgB,MAAMtD,EAAmB+C,CAA6B,CAAA,CAG5E,GAAIC,CAAAA,EAAiBK,CAAAA,CACnB,OAAOA,CAAAA,CAIT,IAAME,GADwB,MAAMN,CAAAA,CAAiB,IAAI,CAAA,EACb,OAAA,CAE5C,GAAII,GAAkBC,CAAAA,GAAkBC,CAAAA,CAEtC,OAAAP,CAAAA,CAAgBM,CAAAA,CACTD,EACF,CACL,IAAMG,EAAmB,MAAML,CAAAA,GAE/B,OAAA,MAAMvD,CAAAA,CAAWkD,EAAuBU,CAAAA,CAAiB,IAAI,EAC7D,MAAM5D,CAAAA,CAAWmD,CAAAA,CAA+BS,CAAAA,CAAiB,OAAO,CAAA,CAExER,EAAgBQ,CAAAA,CAAiB,OAAA,CAC1BA,EAAiB,IAC1B,CACF,EAOaC,CAAAA,CAAc,MAAOvB,IACf,MAAMkB,CAAAA,IACP,IAAA,CAAKM,CAAAA,EAAQA,EAAK,EAAA,GAAOxB,CAAM,EC5FjD,IAAMW,CAAAA,CAAW,CAAA,EAAG,MAAA,CAAO,YAAA,CAAa,QAAQ,MAgB1Cc,CAAAA,CAAwB,eAAA,CACxBC,EAAgC,sBAAA,CAGlCZ,CAAAA,CAA+B,KAOtBa,CAAAA,CAAoBX,CAAAA,EACxBpC,EACL,CAAA,EAAG+B,CAAQ,uBACX,CAAE,MAAA,CAAQ,CAAE,WAAA,CAAAK,CAAY,CAAE,CAC5B,CAAA,CAOWY,EAAe,IACnBhD,CAAAA,CACL,GAAG+B,CAAQ,CAAA,oBAAA,CACb,EAOWkB,CAAAA,CAAc,SAA6B,CACtD,IAAMC,CAAAA,CAAiB,MAAMhE,CAAAA,CAAmB2D,CAAqB,EAC/DL,CAAAA,CAAgB,MAAMtD,EAAmB4D,CAA6B,CAAA,CAG5E,GAAIZ,CAAAA,EAAiBgB,CAAAA,CACnB,OAAOA,CAAAA,CAIT,IAAMT,CAAAA,CAAAA,CADwB,MAAMM,CAAAA,CAAiB,IAAI,GACb,OAAA,CAE5C,GAAIG,GAAkBV,CAAAA,GAAkBC,CAAAA,CAEtC,OAAAP,CAAAA,CAAgBM,CAAAA,CACTU,EACF,CACL,IAAMC,EAAmB,MAAMH,CAAAA,GAE/B,OAAA,MAAMlE,CAAAA,CAAW+D,CAAAA,CAAuBM,CAAAA,CAAiB,IAAI,CAAA,CAC7D,MAAMrE,CAAAA,CAAWgE,CAAAA,CAA+BK,EAAiB,OAAO,CAAA,CAExEjB,EAAgBiB,CAAAA,CAAiB,OAAA,CAC1BA,EAAiB,IAC1B,CACF,EAOaC,EAAAA,CAAc,MAAOC,IACf,MAAMJ,CAAAA,IACP,IAAA,CAAKK,CAAAA,EAAQA,CAAAA,CAAK,EAAA,GAAOD,CAAM","file":"index.cjs","sourcesContent":["import localforage from 'localforage';\r\n\r\n// 配置localforage\r\nlocalforage.config({\r\n name: 'cgx',\r\n storeName: 'cgx_store',\r\n driver: [\r\n localforage.INDEXEDDB,\r\n localforage.LOCALSTORAGE,\r\n ],\r\n});\r\n\r\n// 存储数据\r\nexport const setStorage = async (key: string, value: any) => {\r\n try {\r\n await localforage.setItem(key, value);\r\n } catch (error) {\r\n console.error('Error saving data:', error);\r\n }\r\n};\r\n\r\n// 获取数据\r\nexport const getStorage = async <T>(key: string): Promise<T | null> => {\r\n try {\r\n const value = await localforage.getItem<T>(key);\r\n return value;\r\n } catch (error) {\r\n console.error('Error getting data:', error);\r\n return null;\r\n }\r\n};\r\n\r\n// 删除数据\r\nexport const removeStorage = async (key: string) => {\r\n try {\r\n await localforage.removeItem(key);\r\n } catch (error) {\r\n console.error('Error removing data:', error);\r\n }\r\n};\r\n\r\n// 清空所有数据\r\nexport const clearStorage = async () => {\r\n try {\r\n await localforage.clear();\r\n } catch (error) {\r\n console.error('Error clearing data:', error);\r\n }\r\n};","/**\r\n * 用户信息管理模块\r\n */\r\nimport { getStorage, setStorage, removeStorage } from './storage';\r\n\r\nexport interface UserInfo {\r\n token?: string;\r\n userId?: string;\r\n companyId?: string;\r\n [key: string]: any;\r\n}\r\n\r\nconst USER_INFO_KEY = 'user_info';\r\n\r\n/**\r\n * 初始化用户信息\r\n * @param info 用户信息对象\r\n */\r\nexport const initUserInfo = async (info: UserInfo) => {\r\n await setStorage(USER_INFO_KEY, info);\r\n};\r\n\r\n/**\r\n * 设置用户token\r\n * @param token 用户token\r\n */\r\nexport const setUserToken = async (token: string) => {\r\n const userInfo = await getUserInfo();\r\n await setStorage(USER_INFO_KEY, { ...userInfo, token });\r\n};\r\n\r\n/**\r\n * 获取用户token\r\n * @returns 用户token\r\n */\r\nexport const getUserToken = async (): Promise<string | undefined> => {\r\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\r\n return userInfo?.token;\r\n};\r\n\r\n/**\r\n * 获取用户信息\r\n * @returns 用户信息对象\r\n */\r\nexport const getUserInfo = async (): Promise<UserInfo> => {\r\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\r\n return userInfo || {};\r\n};\r\n\r\n/**\r\n * 更新用户信息\r\n * @param info 要更新的用户信息字段\r\n */\r\nexport const updateUserInfo = async (info: Partial<UserInfo>) => {\r\n const currentInfo = await getUserInfo();\r\n await setStorage(USER_INFO_KEY, { ...currentInfo, ...info });\r\n};\r\n\r\n/**\r\n * 清除用户信息\r\n */\r\nexport const clearUserInfo = async () => {\r\n await removeStorage(USER_INFO_KEY);\r\n};","import { getUserToken } from './user';\r\n\r\ninterface FetchConfig extends RequestInit {\r\n params?: Record<string, any>;\r\n}\r\n\r\nexport const useFetch = async <T>(url: string, config: FetchConfig = {}) => {\r\n const { params, ...restConfig } = config;\r\n\r\n // 处理查询参数\r\n const queryString = params\r\n ? '?' +\r\n Object.entries(params)\r\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\r\n .join('&')\r\n : '';\r\n\r\n const finalUrl = url + queryString;\r\n\r\n // 从 user.ts 获取 token\r\n const token = await getUserToken();\r\n\r\n // 发送请求\r\n const response = await fetch(finalUrl, {\r\n ...restConfig,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n token: token || '',\r\n ...restConfig.headers,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n return data as T;\r\n};\r\n","import { updateUserInfo, getUserToken } from './user';\r\n\r\nfunction decodeJwtPayload(jwt: string) {\r\n try {\r\n // 检查 JWT 格式\r\n if (!jwt || typeof jwt !== 'string') {\r\n throw new Error('无效的 JWT 格式');\r\n }\r\n\r\n // 分割 JWT 的三个部分\r\n const parts = jwt.split('.');\r\n if (parts.length !== 3) {\r\n throw new Error('JWT 必须包含三个部分');\r\n }\r\n\r\n // 提取中间的 Payload 部分\r\n const encodedPayload = parts[1];\r\n\r\n // 添加可能缺失的填充字符\r\n const paddedEncodedPayload = encodedPayload.padEnd(\r\n encodedPayload.length + ((4 - (encodedPayload.length % 4)) % 4),\r\n '='\r\n );\r\n\r\n // 将 Base64Url 转换为标准 Base64\r\n const base64Payload = paddedEncodedPayload.replace(/-/g, '+').replace(/_/g, '/');\r\n\r\n // 解码 Base64 字符串\r\n const decodedJson = atob(base64Payload);\r\n\r\n // 解析 JSON\r\n return JSON.parse(decodedJson);\r\n } catch (error) {\r\n console.error('解码失败:', error);\r\n return null;\r\n }\r\n}\r\n\r\n// 从URL中获取指定参数\r\nconst getUrlParam = (paramName: string): string | null => {\r\n // 检查search参数\r\n const urlParamsSearch = new URLSearchParams(window.location.search);\r\n const paramFromSearch = urlParamsSearch.get(paramName);\r\n if (paramFromSearch) {\r\n return paramFromSearch;\r\n }\r\n\r\n // 检查hash片段\r\n const hash = window.location.hash;\r\n if (hash) {\r\n const hashContent = hash.startsWith('#') ? hash.substring(1) : hash;\r\n const queryStringMatch = hashContent.match(/\\?(.*)/);\r\n if (queryStringMatch && queryStringMatch[1]) {\r\n const urlParamsHash = new URLSearchParams(queryStringMatch[1]);\r\n return urlParamsHash.get(paramName);\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\n// 初始化应用\r\nexport const initApp = async () => {\r\n const token = getUrlParam('token');\r\n const userId = getUrlParam('user_id');\r\n const t = getUrlParam('t');\r\n\r\n // 获取完token后从浏览器地址栏去掉token的信息\r\n const url = new URL(window.location.href);\r\n url.searchParams.delete('token');\r\n url.searchParams.delete('user_id');\r\n url.searchParams.delete('t');\r\n window.history.replaceState({}, '', url.toString());\r\n\r\n let shouldUpdate = !!(token || userId);\r\n if (t) {\r\n const timestamp = parseInt(t, 10);\r\n const now = Date.now();\r\n // 兼容秒级(10位)和毫秒级(13位)时间戳\r\n const timestampMs = timestamp < 10000000000 ? timestamp * 1000 : timestamp;\r\n // 超过五分钟,不再更新\r\n if (Math.abs(now - timestampMs) > 60 * 1000 * 5) {\r\n shouldUpdate = false;\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n await updateUserInfo({\r\n ...(token && { token }),\r\n ...(userId && { userId }),\r\n });\r\n }\r\n\r\n const userToken = await getUserToken();\r\n if (userToken) {\r\n const decodedToken = decodeJwtPayload(userToken);\r\n if (decodedToken) {\r\n const { exp, companyId } = decodedToken;\r\n const currentTime = Math.floor(Date.now() / 1000);\r\n if (exp && exp <= currentTime) {\r\n await updateUserInfo({\r\n token: '',\r\n userId: '',\r\n });\r\n } else {\r\n await updateUserInfo({\r\n companyId,\r\n });\r\n return;\r\n }\r\n }\r\n }\r\n // 声明全局配置类型\r\n\r\n window.location.replace(`${window.globalConfig.weiwoWeb}/#/auth?url=${window.location.href}`);\r\n};\r\n","import { useFetch } from './fetch';\r\nimport { getStorage, setStorage } from './storage';\r\n\r\nconst BASE_URL = `${window.globalConfig.wFlowApi}/v1`\r\n\r\ninterface User {\r\n companyId: string;\r\n id: string;\r\n name: string;\r\n deptId: string;\r\n mainDept: boolean;\r\n deptName: string;\r\n pinyin: string;\r\n py: string;\r\n type: null; // Or a more specific type if known\r\n avatar: string;\r\n gender: string;\r\n phone: string;\r\n email: string;\r\n position: string;\r\n status: number;\r\n selected: null; // Or a more specific type if known\r\n}\r\n\r\ninterface UserListResponse {\r\n data: User[];\r\n version: string;\r\n}\r\n\r\nconst USER_LIST_STORAGE_KEY = 'userListCache';\r\nconst USER_LIST_VERSION_STORAGE_KEY = 'userListVersionCache';\r\n\r\n// 内存缓存,在页面刷新前保持有效\r\nlet memoryVersion: string | null = null;\r\n\r\n/**\r\n * 获取用户列表,可选择是否只获取版本号\r\n * @param onlyVersion 是否只获取版本号\r\n * @returns 用户列表或只包含版本号\r\n */\r\nexport const fetchUserVersion = (onlyVersion: boolean) => {\r\n return useFetch<UserListResponse>(\r\n `${BASE_URL}/oa/org/depts/users`,\r\n { params: { onlyVersion } }\r\n );\r\n};\r\n\r\n/**\r\n * 获取所有用户列表\r\n * @returns 所有用户列表\r\n */\r\nexport const fetchAllUser = () => {\r\n return useFetch<UserListResponse>(\r\n `${BASE_URL}/oa/org/depts/users`\r\n );\r\n};\r\n\r\n/**\r\n * 获取并缓存用户列表\r\n * @returns 用户列表\r\n */\r\nexport const getUserList = async (): Promise<User[]> => {\r\n const cachedUserList = await getStorage<User[]>(USER_LIST_STORAGE_KEY);\r\n const cachedVersion = await getStorage<string>(USER_LIST_VERSION_STORAGE_KEY);\r\n\r\n // 如果内存中已有版本号,直接使用缓存的用户列表\r\n if (memoryVersion && cachedUserList) {\r\n return cachedUserList;\r\n }\r\n\r\n const latestVersionResponse = await fetchUserVersion(true);\r\n const latestVersion = latestVersionResponse.version;\r\n\r\n if (cachedUserList && cachedVersion === latestVersion) {\r\n // 更新内存缓存的版本号\r\n memoryVersion = cachedVersion;\r\n return cachedUserList;\r\n } else {\r\n const userListResponse = await fetchAllUser();\r\n // 更新存储缓存\r\n await setStorage(USER_LIST_STORAGE_KEY, userListResponse.data);\r\n await setStorage(USER_LIST_VERSION_STORAGE_KEY, userListResponse.version);\r\n // 更新内存缓存的版本号\r\n memoryVersion = userListResponse.version;\r\n return userListResponse.data;\r\n }\r\n};\r\n\r\n/**\r\n * 根据用户ID查询用户信息\r\n * @param userId 用户ID\r\n * @returns 匹配的用户信息或 undefined\r\n */\r\nexport const getUserById = async (userId: string): Promise<User | undefined> => {\r\n const userList = await getUserList();\r\n return userList.find(user => user.id === userId);\r\n};","import { useFetch } from './fetch';\r\nimport { getStorage, setStorage } from './storage';\r\n\r\nconst BASE_URL = `${window.globalConfig.wFlowApi}/v1`\r\n\r\ninterface Dept {\r\n companyId: string;\r\n deptName: string;\r\n id: string;\r\n leader: string;\r\n parentId: string;\r\n sort: number;\r\n}\r\n\r\ninterface DeptListResponse {\r\n data: Dept[];\r\n version: string;\r\n}\r\n\r\nconst DEPT_LIST_STORAGE_KEY = 'deptListCache';\r\nconst DEPT_LIST_VERSION_STORAGE_KEY = 'deptListVersionCache';\r\n\r\n// 内存缓存,在页面刷新前保持有效\r\nlet memoryVersion: string | null = null;\r\n\r\n/**\r\n * 获取部门列表版本号\r\n * @param onlyVersion 是否只获取版本号\r\n * @returns 部门列表版本号或完整数据\r\n */\r\nexport const fetchDeptVersion = (onlyVersion: boolean) => {\r\n return useFetch<DeptListResponse>(\r\n `${BASE_URL}/oa/org/allpartments`,\r\n { params: { onlyVersion } }\r\n );\r\n};\r\n\r\n/**\r\n * 获取所有部门列表\r\n * @returns 所有部门列表\r\n */\r\nexport const fetchAllDept = () => {\r\n return useFetch<DeptListResponse>(\r\n `${BASE_URL}/oa/org/allpartments`\r\n );\r\n};\r\n\r\n/**\r\n * 获取并缓存部门列表\r\n * @returns 部门列表\r\n */\r\nexport const getDeptList = async (): Promise<Dept[]> => {\r\n const cachedDeptList = await getStorage<Dept[]>(DEPT_LIST_STORAGE_KEY);\r\n const cachedVersion = await getStorage<string>(DEPT_LIST_VERSION_STORAGE_KEY);\r\n\r\n // 如果内存中已有版本号,直接使用缓存的部门列表\r\n if (memoryVersion && cachedDeptList) {\r\n return cachedDeptList;\r\n }\r\n\r\n const latestVersionResponse = await fetchDeptVersion(true);\r\n const latestVersion = latestVersionResponse.version;\r\n\r\n if (cachedDeptList && cachedVersion === latestVersion) {\r\n // 更新内存缓存的版本号\r\n memoryVersion = cachedVersion;\r\n return cachedDeptList;\r\n } else {\r\n const deptListResponse = await fetchAllDept();\r\n // 更新存储缓存\r\n await setStorage(DEPT_LIST_STORAGE_KEY, deptListResponse.data);\r\n await setStorage(DEPT_LIST_VERSION_STORAGE_KEY, deptListResponse.version);\r\n // 更新内存缓存的版本号\r\n memoryVersion = deptListResponse.version;\r\n return deptListResponse.data;\r\n }\r\n};\r\n\r\n/**\r\n * 根据部门ID查询部门信息\r\n * @param deptId 部门ID\r\n * @returns 匹配的部门信息或 undefined\r\n */\r\nexport const getDeptById = async (deptId: string): Promise<Dept | undefined> => {\r\n const deptList = await getDeptList();\r\n return deptList.find(dept => dept.id === deptId);\r\n};"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/storage.ts","../src/utils/user.ts","../src/utils/fetch.ts","../src/utils/initApp.ts","../src/utils/userList.ts","../src/utils/deptList.ts"],"names":["localforage","setStorage","key","value","error","getStorage","removeStorage","clearStorage","USER_INFO_KEY","initUserInfo","info","setUserToken","token","userInfo","getUserInfo","getUserToken","updateUserInfo","currentInfo","clearUserInfo","useFetch","url","config","params","restConfig","queryString","finalUrl","response","decodeJwtPayload","jwt","parts","encodedPayload","base64Payload","decodedJson","getUrlParam","paramName","paramFromSearch","hash","queryStringMatch","initApp","userId","t","shouldUpdate","timestamp","now","timestampMs","userToken","decodedToken","exp","companyId","currentTime","USER_LIST_STORAGE_KEY","USER_LIST_VERSION_STORAGE_KEY","memoryVersion","fetchUserVersion","onlyVersion","baseUrl","fetchAllUser","getUserList","storageKey","versionKey","cachedUserList","cachedVersion","latestVersion","userListResponse","getUserById","user","DEPT_LIST_STORAGE_KEY","DEPT_LIST_VERSION_STORAGE_KEY","fetchDeptVersion","fetchAllDept","getDeptList","cachedDeptList","deptListResponse","getDeptById","deptId","dept"],"mappings":"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","file":"index.cjs","sourcesContent":["import localforage from 'localforage';\r\n\r\n// 配置localforage\r\nlocalforage.config({\r\n name: 'cgx',\r\n storeName: 'cgx_store',\r\n driver: [\r\n localforage.INDEXEDDB,\r\n localforage.LOCALSTORAGE,\r\n ],\r\n});\r\n\r\n// 存储数据\r\nexport const setStorage = async (key: string, value: any) => {\r\n try {\r\n await localforage.setItem(key, value);\r\n } catch (error) {\r\n console.error('Error saving data:', error);\r\n }\r\n};\r\n\r\n// 获取数据\r\nexport const getStorage = async <T>(key: string): Promise<T | null> => {\r\n try {\r\n const value = await localforage.getItem<T>(key);\r\n return value;\r\n } catch (error) {\r\n console.error('Error getting data:', error);\r\n return null;\r\n }\r\n};\r\n\r\n// 删除数据\r\nexport const removeStorage = async (key: string) => {\r\n try {\r\n await localforage.removeItem(key);\r\n } catch (error) {\r\n console.error('Error removing data:', error);\r\n }\r\n};\r\n\r\n// 清空所有数据\r\nexport const clearStorage = async () => {\r\n try {\r\n await localforage.clear();\r\n } catch (error) {\r\n console.error('Error clearing data:', error);\r\n }\r\n};","/**\r\n * 用户信息管理模块\r\n */\r\nimport { getStorage, setStorage, removeStorage } from './storage';\r\n\r\nexport interface UserInfo {\r\n token?: string;\r\n userId?: string;\r\n companyId?: string;\r\n [key: string]: any;\r\n}\r\n\r\nconst USER_INFO_KEY = 'user_info';\r\n\r\n/**\r\n * 初始化用户信息\r\n * @param info 用户信息对象\r\n */\r\nexport const initUserInfo = async (info: UserInfo) => {\r\n await setStorage(USER_INFO_KEY, info);\r\n};\r\n\r\n/**\r\n * 设置用户token\r\n * @param token 用户token\r\n */\r\nexport const setUserToken = async (token: string) => {\r\n const userInfo = await getUserInfo();\r\n await setStorage(USER_INFO_KEY, { ...userInfo, token });\r\n};\r\n\r\n/**\r\n * 获取用户token\r\n * @returns 用户token\r\n */\r\nexport const getUserToken = async (): Promise<string | undefined> => {\r\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\r\n return userInfo?.token;\r\n};\r\n\r\n/**\r\n * 获取用户信息\r\n * @returns 用户信息对象\r\n */\r\nexport const getUserInfo = async (): Promise<UserInfo> => {\r\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\r\n return userInfo || {};\r\n};\r\n\r\n/**\r\n * 更新用户信息\r\n * @param info 要更新的用户信息字段\r\n */\r\nexport const updateUserInfo = async (info: Partial<UserInfo>) => {\r\n const currentInfo = await getUserInfo();\r\n await setStorage(USER_INFO_KEY, { ...currentInfo, ...info });\r\n};\r\n\r\n/**\r\n * 清除用户信息\r\n */\r\nexport const clearUserInfo = async () => {\r\n await removeStorage(USER_INFO_KEY);\r\n};","import { getUserToken } from './user';\r\n\r\ninterface FetchConfig extends RequestInit {\r\n params?: Record<string, any>;\r\n}\r\n\r\nexport const useFetch = async <T>(url: string, config: FetchConfig = {}) => {\r\n const { params, ...restConfig } = config;\r\n\r\n // 处理查询参数\r\n const queryString = params\r\n ? '?' +\r\n Object.entries(params)\r\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\r\n .join('&')\r\n : '';\r\n\r\n const finalUrl = url + queryString;\r\n\r\n // 从 user.ts 获取 token\r\n const token = await getUserToken();\r\n\r\n // 发送请求\r\n const response = await fetch(finalUrl, {\r\n ...restConfig,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n token: token || '',\r\n ...restConfig.headers,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n return data as T;\r\n};\r\n","import { updateUserInfo, getUserToken } from './user';\r\n\r\nfunction decodeJwtPayload(jwt: string) {\r\n try {\r\n // 检查 JWT 格式\r\n if (!jwt || typeof jwt !== 'string') {\r\n throw new Error('无效的 JWT 格式');\r\n }\r\n\r\n // 分割 JWT 的三个部分\r\n const parts = jwt.split('.');\r\n if (parts.length !== 3) {\r\n throw new Error('JWT 必须包含三个部分');\r\n }\r\n\r\n // 提取中间的 Payload 部分\r\n const encodedPayload = parts[1];\r\n\r\n // 添加可能缺失的填充字符\r\n const paddedEncodedPayload = encodedPayload.padEnd(\r\n encodedPayload.length + ((4 - (encodedPayload.length % 4)) % 4),\r\n '='\r\n );\r\n\r\n // 将 Base64Url 转换为标准 Base64\r\n const base64Payload = paddedEncodedPayload.replace(/-/g, '+').replace(/_/g, '/');\r\n\r\n // 解码 Base64 字符串\r\n const decodedJson = atob(base64Payload);\r\n\r\n // 解析 JSON\r\n return JSON.parse(decodedJson);\r\n } catch (error) {\r\n console.error('解码失败:', error);\r\n return null;\r\n }\r\n}\r\n\r\n// 从URL中获取指定参数\r\nconst getUrlParam = (paramName: string): string | null => {\r\n // 检查search参数\r\n const urlParamsSearch = new URLSearchParams(window.location.search);\r\n const paramFromSearch = urlParamsSearch.get(paramName);\r\n if (paramFromSearch) {\r\n return paramFromSearch;\r\n }\r\n\r\n // 检查hash片段\r\n const hash = window.location.hash;\r\n if (hash) {\r\n const hashContent = hash.startsWith('#') ? hash.substring(1) : hash;\r\n const queryStringMatch = hashContent.match(/\\?(.*)/);\r\n if (queryStringMatch && queryStringMatch[1]) {\r\n const urlParamsHash = new URLSearchParams(queryStringMatch[1]);\r\n return urlParamsHash.get(paramName);\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\n// 初始化应用\r\nexport const initApp = async () => {\r\n const token = getUrlParam('token');\r\n const userId = getUrlParam('user_id');\r\n const t = getUrlParam('t');\r\n\r\n // 获取完token后从浏览器地址栏去掉token的信息\r\n const url = new URL(window.location.href);\r\n url.searchParams.delete('token');\r\n url.searchParams.delete('user_id');\r\n url.searchParams.delete('t');\r\n window.history.replaceState({}, '', url.toString());\r\n\r\n let shouldUpdate = !!(token || userId);\r\n if (t) {\r\n const timestamp = parseInt(t, 10);\r\n const now = Date.now();\r\n // 兼容秒级(10位)和毫秒级(13位)时间戳\r\n const timestampMs = timestamp < 10000000000 ? timestamp * 1000 : timestamp;\r\n // 超过五分钟,不再更新\r\n if (Math.abs(now - timestampMs) > 60 * 1000 * 5) {\r\n shouldUpdate = false;\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n await updateUserInfo({\r\n ...(token && { token }),\r\n ...(userId && { userId }),\r\n });\r\n }\r\n\r\n const userToken = await getUserToken();\r\n if (userToken) {\r\n const decodedToken = decodeJwtPayload(userToken);\r\n if (decodedToken) {\r\n const { exp, companyId } = decodedToken;\r\n const currentTime = Math.floor(Date.now() / 1000);\r\n if (exp && exp <= currentTime) {\r\n await updateUserInfo({\r\n token: '',\r\n userId: '',\r\n });\r\n } else {\r\n await updateUserInfo({\r\n companyId,\r\n });\r\n return;\r\n }\r\n }\r\n }\r\n // 声明全局配置类型\r\n\r\n window.location.replace(`${window.globalConfig.weiwoWeb}/#/auth?url=${window.location.href}`);\r\n};\r\n","import { useFetch } from './fetch';\r\nimport { getStorage, setStorage } from './storage';\r\n\r\ninterface User {\r\n companyId: string;\r\n id: string;\r\n name: string;\r\n deptId: string;\r\n mainDept: boolean;\r\n deptName: string;\r\n pinyin: string;\r\n py: string;\r\n type: null; // Or a more specific type if known\r\n avatar: string;\r\n gender: string;\r\n phone: string;\r\n email: string;\r\n position: string;\r\n status: number;\r\n selected: null; // Or a more specific type if known\r\n}\r\n\r\ninterface UserListResponse {\r\n data: User[];\r\n version: string;\r\n}\r\n\r\nconst USER_LIST_STORAGE_KEY = 'userListCache';\r\nconst USER_LIST_VERSION_STORAGE_KEY = 'userListVersionCache';\r\n\r\n// 内存缓存,在页面刷新前保持有效\r\nlet memoryVersion: string | null = null;\r\n\r\n/**\r\n * 获取用户列表,可选择是否只获取版本号\r\n * @param onlyVersion 是否只获取版本号\r\n * @returns 用户列表或只包含版本号\r\n */\r\nexport const fetchUserVersion = (onlyVersion: boolean, companyId?: string) => {\r\n const baseUrl = `${window.globalConfig.wFlowApiTest}/v1`;\r\n return useFetch<UserListResponse>(`${baseUrl}/oa/org/depts/users`, {\r\n params: { onlyVersion, companyId },\r\n });\r\n};\r\n\r\n/**\r\n * 获取所有用户列表\r\n * @returns 所有用户列表\r\n */\r\nexport const fetchAllUser = (companyId?: string) => {\r\n const baseUrl = `${window.globalConfig.wFlowApiTest}/v1`;\r\n return useFetch<UserListResponse>(`${baseUrl}/oa/org/depts/users`, { params: { companyId } });\r\n};\r\n\r\n/**\r\n * 获取并缓存用户列表\r\n * @returns 用户列表\r\n */\r\nexport const getUserList = async (companyId?: string): Promise<User[]> => {\r\n console.log('getUserList', companyId);\r\n const storageKey = companyId ? `${USER_LIST_STORAGE_KEY}_${companyId}` : USER_LIST_STORAGE_KEY;\r\n const versionKey = companyId\r\n ? `${USER_LIST_VERSION_STORAGE_KEY}_${companyId}`\r\n : USER_LIST_VERSION_STORAGE_KEY;\r\n\r\n const cachedUserList = await getStorage<User[]>(storageKey);\r\n const cachedVersion = await getStorage<string>(versionKey);\r\n\r\n // 如果内存中已有版本号,直接使用缓存的用户列表\r\n // Note: Simple memory cache skip for specific companies to ensure correctness\r\n if (!companyId && memoryVersion && cachedUserList) {\r\n return cachedUserList;\r\n }\r\n\r\n const latestVersionResponse = await fetchUserVersion(true, companyId);\r\n const latestVersion = latestVersionResponse.version;\r\n\r\n if (cachedUserList && cachedVersion === latestVersion) {\r\n if (!companyId) memoryVersion = cachedVersion;\r\n return cachedUserList;\r\n } else {\r\n const userListResponse = await fetchAllUser(companyId);\r\n // 更新存储缓存\r\n await setStorage(storageKey, userListResponse.data);\r\n await setStorage(versionKey, userListResponse.version);\r\n // 更新内存缓存的版本号\r\n if (!companyId) memoryVersion = userListResponse.version;\r\n return userListResponse.data;\r\n }\r\n};\r\n\r\n/**\r\n * 根据用户ID查询用户信息\r\n * @param userId 用户ID\r\n * @returns 匹配的用户信息或 undefined\r\n */\r\nexport const getUserById = async (userId: string): Promise<User | undefined> => {\r\n const userList = await getUserList();\r\n return userList.find(user => user.id === userId);\r\n};\r\n","import { useFetch } from './fetch';\r\nimport { getStorage, setStorage } from './storage';\r\n\r\ninterface Dept {\r\n companyId: string;\r\n deptName: string;\r\n id: string;\r\n leader: string;\r\n parentId: string;\r\n sort: number;\r\n}\r\n\r\ninterface DeptListResponse {\r\n data: Dept[];\r\n version: string;\r\n}\r\n\r\nconst DEPT_LIST_STORAGE_KEY = 'deptListCache';\r\nconst DEPT_LIST_VERSION_STORAGE_KEY = 'deptListVersionCache';\r\n\r\n// 内存缓存,在页面刷新前保持有效\r\nlet memoryVersion: string | null = null;\r\n\r\n/**\r\n * 获取部门列表版本号\r\n * @param onlyVersion 是否只获取版本号\r\n * @returns 部门列表版本号或完整数据\r\n */\r\nexport const fetchDeptVersion = (onlyVersion: boolean, companyId?: string) => {\r\n const baseUrl = `${window.globalConfig.wFlowApiTest}/v1`;\r\n return useFetch<DeptListResponse>(`${baseUrl}/oa/org/allpartments`, {\r\n params: { onlyVersion, companyId },\r\n });\r\n};\r\n\r\n/**\r\n * 获取所有部门列表\r\n * @returns 所有部门列表\r\n */\r\nexport const fetchAllDept = (companyId?: string) => {\r\n const baseUrl = `${window.globalConfig.wFlowApiTest}/v1`;\r\n return useFetch<DeptListResponse>(`${baseUrl}/oa/org/allpartments`, { params: { companyId } });\r\n};\r\n\r\n/**\r\n * 获取并缓存部门列表\r\n * @returns 部门列表\r\n */\r\nexport const getDeptList = async (companyId?: string): Promise<Dept[]> => {\r\n const storageKey = companyId ? `${DEPT_LIST_STORAGE_KEY}_${companyId}` : DEPT_LIST_STORAGE_KEY;\r\n const versionKey = companyId\r\n ? `${DEPT_LIST_VERSION_STORAGE_KEY}_${companyId}`\r\n : DEPT_LIST_VERSION_STORAGE_KEY;\r\n\r\n const cachedDeptList = await getStorage<Dept[]>(storageKey);\r\n const cachedVersion = await getStorage<string>(versionKey);\r\n\r\n // 如果内存中已有版本号,直接使用缓存的部门列表\r\n if (!companyId && memoryVersion && cachedDeptList) {\r\n return cachedDeptList;\r\n }\r\n\r\n const latestVersionResponse = await fetchDeptVersion(true, companyId);\r\n const latestVersion = latestVersionResponse.version;\r\n\r\n if (cachedDeptList && cachedVersion === latestVersion) {\r\n if (!companyId) memoryVersion = cachedVersion;\r\n return cachedDeptList;\r\n } else {\r\n const deptListResponse = await fetchAllDept(companyId);\r\n // 更新存储缓存\r\n await setStorage(storageKey, deptListResponse.data);\r\n await setStorage(versionKey, deptListResponse.version);\r\n // 更新内存缓存的版本号\r\n if (!companyId) memoryVersion = deptListResponse.version;\r\n return deptListResponse.data;\r\n }\r\n};\r\n\r\n/**\r\n * 根据部门ID查询部门信息\r\n * @param deptId 部门ID\r\n * @returns 匹配的部门信息或 undefined\r\n */\r\nexport const getDeptById = async (deptId: string): Promise<Dept | undefined> => {\r\n const deptList = await getDeptList();\r\n return deptList.find(dept => dept.id === deptId);\r\n};\r\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -73,17 +73,17 @@ interface UserListResponse {
|
|
|
73
73
|
* @param onlyVersion 是否只获取版本号
|
|
74
74
|
* @returns 用户列表或只包含版本号
|
|
75
75
|
*/
|
|
76
|
-
declare const fetchUserVersion: (onlyVersion: boolean) => Promise<UserListResponse>;
|
|
76
|
+
declare const fetchUserVersion: (onlyVersion: boolean, companyId?: string) => Promise<UserListResponse>;
|
|
77
77
|
/**
|
|
78
78
|
* 获取所有用户列表
|
|
79
79
|
* @returns 所有用户列表
|
|
80
80
|
*/
|
|
81
|
-
declare const fetchAllUser: () => Promise<UserListResponse>;
|
|
81
|
+
declare const fetchAllUser: (companyId?: string) => Promise<UserListResponse>;
|
|
82
82
|
/**
|
|
83
83
|
* 获取并缓存用户列表
|
|
84
84
|
* @returns 用户列表
|
|
85
85
|
*/
|
|
86
|
-
declare const getUserList: () => Promise<User[]>;
|
|
86
|
+
declare const getUserList: (companyId?: string) => Promise<User[]>;
|
|
87
87
|
/**
|
|
88
88
|
* 根据用户ID查询用户信息
|
|
89
89
|
* @param userId 用户ID
|
|
@@ -108,17 +108,17 @@ interface DeptListResponse {
|
|
|
108
108
|
* @param onlyVersion 是否只获取版本号
|
|
109
109
|
* @returns 部门列表版本号或完整数据
|
|
110
110
|
*/
|
|
111
|
-
declare const fetchDeptVersion: (onlyVersion: boolean) => Promise<DeptListResponse>;
|
|
111
|
+
declare const fetchDeptVersion: (onlyVersion: boolean, companyId?: string) => Promise<DeptListResponse>;
|
|
112
112
|
/**
|
|
113
113
|
* 获取所有部门列表
|
|
114
114
|
* @returns 所有部门列表
|
|
115
115
|
*/
|
|
116
|
-
declare const fetchAllDept: () => Promise<DeptListResponse>;
|
|
116
|
+
declare const fetchAllDept: (companyId?: string) => Promise<DeptListResponse>;
|
|
117
117
|
/**
|
|
118
118
|
* 获取并缓存部门列表
|
|
119
119
|
* @returns 部门列表
|
|
120
120
|
*/
|
|
121
|
-
declare const getDeptList: () => Promise<Dept[]>;
|
|
121
|
+
declare const getDeptList: (companyId?: string) => Promise<Dept[]>;
|
|
122
122
|
/**
|
|
123
123
|
* 根据部门ID查询部门信息
|
|
124
124
|
* @param deptId 部门ID
|
package/dist/index.d.ts
CHANGED
|
@@ -73,17 +73,17 @@ interface UserListResponse {
|
|
|
73
73
|
* @param onlyVersion 是否只获取版本号
|
|
74
74
|
* @returns 用户列表或只包含版本号
|
|
75
75
|
*/
|
|
76
|
-
declare const fetchUserVersion: (onlyVersion: boolean) => Promise<UserListResponse>;
|
|
76
|
+
declare const fetchUserVersion: (onlyVersion: boolean, companyId?: string) => Promise<UserListResponse>;
|
|
77
77
|
/**
|
|
78
78
|
* 获取所有用户列表
|
|
79
79
|
* @returns 所有用户列表
|
|
80
80
|
*/
|
|
81
|
-
declare const fetchAllUser: () => Promise<UserListResponse>;
|
|
81
|
+
declare const fetchAllUser: (companyId?: string) => Promise<UserListResponse>;
|
|
82
82
|
/**
|
|
83
83
|
* 获取并缓存用户列表
|
|
84
84
|
* @returns 用户列表
|
|
85
85
|
*/
|
|
86
|
-
declare const getUserList: () => Promise<User[]>;
|
|
86
|
+
declare const getUserList: (companyId?: string) => Promise<User[]>;
|
|
87
87
|
/**
|
|
88
88
|
* 根据用户ID查询用户信息
|
|
89
89
|
* @param userId 用户ID
|
|
@@ -108,17 +108,17 @@ interface DeptListResponse {
|
|
|
108
108
|
* @param onlyVersion 是否只获取版本号
|
|
109
109
|
* @returns 部门列表版本号或完整数据
|
|
110
110
|
*/
|
|
111
|
-
declare const fetchDeptVersion: (onlyVersion: boolean) => Promise<DeptListResponse>;
|
|
111
|
+
declare const fetchDeptVersion: (onlyVersion: boolean, companyId?: string) => Promise<DeptListResponse>;
|
|
112
112
|
/**
|
|
113
113
|
* 获取所有部门列表
|
|
114
114
|
* @returns 所有部门列表
|
|
115
115
|
*/
|
|
116
|
-
declare const fetchAllDept: () => Promise<DeptListResponse>;
|
|
116
|
+
declare const fetchAllDept: (companyId?: string) => Promise<DeptListResponse>;
|
|
117
117
|
/**
|
|
118
118
|
* 获取并缓存部门列表
|
|
119
119
|
* @returns 部门列表
|
|
120
120
|
*/
|
|
121
|
-
declare const getDeptList: () => Promise<Dept[]>;
|
|
121
|
+
declare const getDeptList: (companyId?: string) => Promise<Dept[]>;
|
|
122
122
|
/**
|
|
123
123
|
* 根据部门ID查询部门信息
|
|
124
124
|
* @param deptId 部门ID
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import g from'localforage';g.config({name:"cgx",storeName:"cgx_store",driver:[g.INDEXEDDB,g.LOCALSTORAGE]});var c=async(t,e)=>{try{await g.setItem(t,e);}catch(r){console.error("Error saving data:",r);}},l=async t=>{try{return await g.getItem(t)}catch(e){return console.error("Error getting data:",e),null}},y=async t=>{try{await g.removeItem(t);}catch(e){console.error("Error removing data:",e);}},V=async()=>{try{await g.clear();}catch(t){console.error("Error clearing data:",t);}};var p="user_info",O=async t=>{await c(p,t);},K=async t=>{let e=await T();await c(p,{...e,token:t});},u=async()=>(await l(p))?.token,T=async()=>await l(p)||{},w=async t=>{let e=await T();await c(p,{...e,...t});},N=async()=>{await y(p);};var d=async(t,e={})=>{let{params:r,...s}=e,o=r?"?"+Object.entries(r).map(([m,P])=>`${m}=${encodeURIComponent(String(P))}`).join("&"):"",i=t+o,a=await u(),n=await fetch(i,{...s,headers:{"Content-Type":"application/json",token:a||"",...s.headers}});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);return await n.json()};function I(t){try{if(!t||typeof t!="string")throw new Error("\u65E0\u6548\u7684 JWT \u683C\u5F0F");let e=t.split(".");if(e.length!==3)throw new Error("JWT \u5FC5\u987B\u5305\u542B\u4E09\u4E2A\u90E8\u5206");let r=e[1],o=r.padEnd(r.length+(4-r.length%4)%4,"=").replace(/-/g,"+").replace(/_/g,"/"),i=atob(o);return JSON.parse(i)}catch(e){return console.error("\u89E3\u7801\u5931\u8D25:",e),null}}var h=t=>{let r=new URLSearchParams(window.location.search).get(t);if(r)return r;let s=window.location.hash;if(s){let i=(s.startsWith("#")?s.substring(1):s).match(/\?(.*)/);if(i&&i[1])return new URLSearchParams(i[1]).get(t)}return null},M=async()=>{let t=h("token"),e=h("user_id"),r=h("t"),s=new URL(window.location.href);s.searchParams.delete("token"),s.searchParams.delete("user_id"),s.searchParams.delete("t"),window.history.replaceState({},"",s.toString());let o=!!(t||e);if(r){let a=parseInt(r,10),n=Date.now(),f=a<1e10?a*1e3:a;Math.abs(n-f)>60*1e3*5&&(o=false);}o&&await w({...t&&{token:t},...e&&{userId:e}});let i=await u();if(i){let a=I(i);if(a){let{exp:n,companyId:f}=a,m=Math.floor(Date.now()/1e3);if(n&&n<=m)await w({token:"",userId:""});else {await w({companyId:f});return}}}window.location.replace(`${window.globalConfig.weiwoWeb}/#/auth?url=${window.location.href}`);};var x="userListCache",L="userListVersionCache",U=null,_=(t,e)=>{let r=`${window.globalConfig.wFlowApiTest}/v1`;return d(`${r}/oa/org/depts/users`,{params:{onlyVersion:t,companyId:e}})},v=t=>{let e=`${window.globalConfig.wFlowApiTest}/v1`;return d(`${e}/oa/org/depts/users`,{params:{companyId:t}})},b=async t=>{console.log("getUserList",t);let e=t?`${x}_${t}`:x,r=t?`${L}_${t}`:L,s=await l(e),o=await l(r);if(!t&&U&&s)return s;let a=(await _(true,t)).version;if(s&&o===a)return t||(U=o),s;{let n=await v(t);return await c(e,n.data),await c(r,n.version),t||(U=n.version),n.data}},j=async t=>(await b()).find(r=>r.id===t);var E="deptListCache",R="deptListVersionCache",S=null,D=(t,e)=>{let r=`${window.globalConfig.wFlowApiTest}/v1`;return d(`${r}/oa/org/allpartments`,{params:{onlyVersion:t,companyId:e}})},$=t=>{let e=`${window.globalConfig.wFlowApiTest}/v1`;return d(`${e}/oa/org/allpartments`,{params:{companyId:t}})},C=async t=>{let e=t?`${E}_${t}`:E,r=t?`${R}_${t}`:R,s=await l(e),o=await l(r);if(!t&&S&&s)return s;let a=(await D(true,t)).version;if(s&&o===a)return t||(S=o),s;{let n=await $(t);return await c(e,n.data),await c(r,n.version),t||(S=n.version),n.data}},Z=async t=>(await C()).find(r=>r.id===t);export{V as clearStorage,N as clearUserInfo,$ as fetchAllDept,v as fetchAllUser,D as fetchDeptVersion,_ as fetchUserVersion,Z as getDeptById,C as getDeptList,l as getStorage,j as getUserById,T as getUserInfo,b as getUserList,u as getUserToken,M as initApp,O as initUserInfo,y as removeStorage,c as setStorage,K as setUserToken,w as updateUserInfo,d as useFetch};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/storage.ts","../src/utils/user.ts","../src/utils/fetch.ts","../src/utils/initApp.ts","../src/utils/userList.ts","../src/utils/deptList.ts"],"names":["localforage","setStorage","key","value","error","getStorage","removeStorage","clearStorage","USER_INFO_KEY","initUserInfo","info","setUserToken","token","userInfo","getUserInfo","getUserToken","updateUserInfo","currentInfo","clearUserInfo","useFetch","url","config","params","restConfig","queryString","finalUrl","response","decodeJwtPayload","jwt","parts","encodedPayload","base64Payload","decodedJson","getUrlParam","paramName","paramFromSearch","hash","queryStringMatch","initApp","userId","t","shouldUpdate","timestamp","now","timestampMs","userToken","decodedToken","exp","companyId","currentTime","BASE_URL","USER_LIST_STORAGE_KEY","USER_LIST_VERSION_STORAGE_KEY","memoryVersion","fetchUserVersion","onlyVersion","fetchAllUser","getUserList","cachedUserList","cachedVersion","latestVersion","userListResponse","getUserById","user","DEPT_LIST_STORAGE_KEY","DEPT_LIST_VERSION_STORAGE_KEY","fetchDeptVersion","fetchAllDept","getDeptList","cachedDeptList","deptListResponse","getDeptById","deptId","dept"],"mappings":"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","file":"index.js","sourcesContent":["import localforage from 'localforage';\r\n\r\n// 配置localforage\r\nlocalforage.config({\r\n name: 'cgx',\r\n storeName: 'cgx_store',\r\n driver: [\r\n localforage.INDEXEDDB,\r\n localforage.LOCALSTORAGE,\r\n ],\r\n});\r\n\r\n// 存储数据\r\nexport const setStorage = async (key: string, value: any) => {\r\n try {\r\n await localforage.setItem(key, value);\r\n } catch (error) {\r\n console.error('Error saving data:', error);\r\n }\r\n};\r\n\r\n// 获取数据\r\nexport const getStorage = async <T>(key: string): Promise<T | null> => {\r\n try {\r\n const value = await localforage.getItem<T>(key);\r\n return value;\r\n } catch (error) {\r\n console.error('Error getting data:', error);\r\n return null;\r\n }\r\n};\r\n\r\n// 删除数据\r\nexport const removeStorage = async (key: string) => {\r\n try {\r\n await localforage.removeItem(key);\r\n } catch (error) {\r\n console.error('Error removing data:', error);\r\n }\r\n};\r\n\r\n// 清空所有数据\r\nexport const clearStorage = async () => {\r\n try {\r\n await localforage.clear();\r\n } catch (error) {\r\n console.error('Error clearing data:', error);\r\n }\r\n};","/**\r\n * 用户信息管理模块\r\n */\r\nimport { getStorage, setStorage, removeStorage } from './storage';\r\n\r\nexport interface UserInfo {\r\n token?: string;\r\n userId?: string;\r\n companyId?: string;\r\n [key: string]: any;\r\n}\r\n\r\nconst USER_INFO_KEY = 'user_info';\r\n\r\n/**\r\n * 初始化用户信息\r\n * @param info 用户信息对象\r\n */\r\nexport const initUserInfo = async (info: UserInfo) => {\r\n await setStorage(USER_INFO_KEY, info);\r\n};\r\n\r\n/**\r\n * 设置用户token\r\n * @param token 用户token\r\n */\r\nexport const setUserToken = async (token: string) => {\r\n const userInfo = await getUserInfo();\r\n await setStorage(USER_INFO_KEY, { ...userInfo, token });\r\n};\r\n\r\n/**\r\n * 获取用户token\r\n * @returns 用户token\r\n */\r\nexport const getUserToken = async (): Promise<string | undefined> => {\r\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\r\n return userInfo?.token;\r\n};\r\n\r\n/**\r\n * 获取用户信息\r\n * @returns 用户信息对象\r\n */\r\nexport const getUserInfo = async (): Promise<UserInfo> => {\r\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\r\n return userInfo || {};\r\n};\r\n\r\n/**\r\n * 更新用户信息\r\n * @param info 要更新的用户信息字段\r\n */\r\nexport const updateUserInfo = async (info: Partial<UserInfo>) => {\r\n const currentInfo = await getUserInfo();\r\n await setStorage(USER_INFO_KEY, { ...currentInfo, ...info });\r\n};\r\n\r\n/**\r\n * 清除用户信息\r\n */\r\nexport const clearUserInfo = async () => {\r\n await removeStorage(USER_INFO_KEY);\r\n};","import { getUserToken } from './user';\r\n\r\ninterface FetchConfig extends RequestInit {\r\n params?: Record<string, any>;\r\n}\r\n\r\nexport const useFetch = async <T>(url: string, config: FetchConfig = {}) => {\r\n const { params, ...restConfig } = config;\r\n\r\n // 处理查询参数\r\n const queryString = params\r\n ? '?' +\r\n Object.entries(params)\r\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\r\n .join('&')\r\n : '';\r\n\r\n const finalUrl = url + queryString;\r\n\r\n // 从 user.ts 获取 token\r\n const token = await getUserToken();\r\n\r\n // 发送请求\r\n const response = await fetch(finalUrl, {\r\n ...restConfig,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n token: token || '',\r\n ...restConfig.headers,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n return data as T;\r\n};\r\n","import { updateUserInfo, getUserToken } from './user';\r\n\r\nfunction decodeJwtPayload(jwt: string) {\r\n try {\r\n // 检查 JWT 格式\r\n if (!jwt || typeof jwt !== 'string') {\r\n throw new Error('无效的 JWT 格式');\r\n }\r\n\r\n // 分割 JWT 的三个部分\r\n const parts = jwt.split('.');\r\n if (parts.length !== 3) {\r\n throw new Error('JWT 必须包含三个部分');\r\n }\r\n\r\n // 提取中间的 Payload 部分\r\n const encodedPayload = parts[1];\r\n\r\n // 添加可能缺失的填充字符\r\n const paddedEncodedPayload = encodedPayload.padEnd(\r\n encodedPayload.length + ((4 - (encodedPayload.length % 4)) % 4),\r\n '='\r\n );\r\n\r\n // 将 Base64Url 转换为标准 Base64\r\n const base64Payload = paddedEncodedPayload.replace(/-/g, '+').replace(/_/g, '/');\r\n\r\n // 解码 Base64 字符串\r\n const decodedJson = atob(base64Payload);\r\n\r\n // 解析 JSON\r\n return JSON.parse(decodedJson);\r\n } catch (error) {\r\n console.error('解码失败:', error);\r\n return null;\r\n }\r\n}\r\n\r\n// 从URL中获取指定参数\r\nconst getUrlParam = (paramName: string): string | null => {\r\n // 检查search参数\r\n const urlParamsSearch = new URLSearchParams(window.location.search);\r\n const paramFromSearch = urlParamsSearch.get(paramName);\r\n if (paramFromSearch) {\r\n return paramFromSearch;\r\n }\r\n\r\n // 检查hash片段\r\n const hash = window.location.hash;\r\n if (hash) {\r\n const hashContent = hash.startsWith('#') ? hash.substring(1) : hash;\r\n const queryStringMatch = hashContent.match(/\\?(.*)/);\r\n if (queryStringMatch && queryStringMatch[1]) {\r\n const urlParamsHash = new URLSearchParams(queryStringMatch[1]);\r\n return urlParamsHash.get(paramName);\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\n// 初始化应用\r\nexport const initApp = async () => {\r\n const token = getUrlParam('token');\r\n const userId = getUrlParam('user_id');\r\n const t = getUrlParam('t');\r\n\r\n // 获取完token后从浏览器地址栏去掉token的信息\r\n const url = new URL(window.location.href);\r\n url.searchParams.delete('token');\r\n url.searchParams.delete('user_id');\r\n url.searchParams.delete('t');\r\n window.history.replaceState({}, '', url.toString());\r\n\r\n let shouldUpdate = !!(token || userId);\r\n if (t) {\r\n const timestamp = parseInt(t, 10);\r\n const now = Date.now();\r\n // 兼容秒级(10位)和毫秒级(13位)时间戳\r\n const timestampMs = timestamp < 10000000000 ? timestamp * 1000 : timestamp;\r\n // 超过五分钟,不再更新\r\n if (Math.abs(now - timestampMs) > 60 * 1000 * 5) {\r\n shouldUpdate = false;\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n await updateUserInfo({\r\n ...(token && { token }),\r\n ...(userId && { userId }),\r\n });\r\n }\r\n\r\n const userToken = await getUserToken();\r\n if (userToken) {\r\n const decodedToken = decodeJwtPayload(userToken);\r\n if (decodedToken) {\r\n const { exp, companyId } = decodedToken;\r\n const currentTime = Math.floor(Date.now() / 1000);\r\n if (exp && exp <= currentTime) {\r\n await updateUserInfo({\r\n token: '',\r\n userId: '',\r\n });\r\n } else {\r\n await updateUserInfo({\r\n companyId,\r\n });\r\n return;\r\n }\r\n }\r\n }\r\n // 声明全局配置类型\r\n\r\n window.location.replace(`${window.globalConfig.weiwoWeb}/#/auth?url=${window.location.href}`);\r\n};\r\n","import { useFetch } from './fetch';\r\nimport { getStorage, setStorage } from './storage';\r\n\r\nconst BASE_URL = `${window.globalConfig.wFlowApi}/v1`\r\n\r\ninterface User {\r\n companyId: string;\r\n id: string;\r\n name: string;\r\n deptId: string;\r\n mainDept: boolean;\r\n deptName: string;\r\n pinyin: string;\r\n py: string;\r\n type: null; // Or a more specific type if known\r\n avatar: string;\r\n gender: string;\r\n phone: string;\r\n email: string;\r\n position: string;\r\n status: number;\r\n selected: null; // Or a more specific type if known\r\n}\r\n\r\ninterface UserListResponse {\r\n data: User[];\r\n version: string;\r\n}\r\n\r\nconst USER_LIST_STORAGE_KEY = 'userListCache';\r\nconst USER_LIST_VERSION_STORAGE_KEY = 'userListVersionCache';\r\n\r\n// 内存缓存,在页面刷新前保持有效\r\nlet memoryVersion: string | null = null;\r\n\r\n/**\r\n * 获取用户列表,可选择是否只获取版本号\r\n * @param onlyVersion 是否只获取版本号\r\n * @returns 用户列表或只包含版本号\r\n */\r\nexport const fetchUserVersion = (onlyVersion: boolean) => {\r\n return useFetch<UserListResponse>(\r\n `${BASE_URL}/oa/org/depts/users`,\r\n { params: { onlyVersion } }\r\n );\r\n};\r\n\r\n/**\r\n * 获取所有用户列表\r\n * @returns 所有用户列表\r\n */\r\nexport const fetchAllUser = () => {\r\n return useFetch<UserListResponse>(\r\n `${BASE_URL}/oa/org/depts/users`\r\n );\r\n};\r\n\r\n/**\r\n * 获取并缓存用户列表\r\n * @returns 用户列表\r\n */\r\nexport const getUserList = async (): Promise<User[]> => {\r\n const cachedUserList = await getStorage<User[]>(USER_LIST_STORAGE_KEY);\r\n const cachedVersion = await getStorage<string>(USER_LIST_VERSION_STORAGE_KEY);\r\n\r\n // 如果内存中已有版本号,直接使用缓存的用户列表\r\n if (memoryVersion && cachedUserList) {\r\n return cachedUserList;\r\n }\r\n\r\n const latestVersionResponse = await fetchUserVersion(true);\r\n const latestVersion = latestVersionResponse.version;\r\n\r\n if (cachedUserList && cachedVersion === latestVersion) {\r\n // 更新内存缓存的版本号\r\n memoryVersion = cachedVersion;\r\n return cachedUserList;\r\n } else {\r\n const userListResponse = await fetchAllUser();\r\n // 更新存储缓存\r\n await setStorage(USER_LIST_STORAGE_KEY, userListResponse.data);\r\n await setStorage(USER_LIST_VERSION_STORAGE_KEY, userListResponse.version);\r\n // 更新内存缓存的版本号\r\n memoryVersion = userListResponse.version;\r\n return userListResponse.data;\r\n }\r\n};\r\n\r\n/**\r\n * 根据用户ID查询用户信息\r\n * @param userId 用户ID\r\n * @returns 匹配的用户信息或 undefined\r\n */\r\nexport const getUserById = async (userId: string): Promise<User | undefined> => {\r\n const userList = await getUserList();\r\n return userList.find(user => user.id === userId);\r\n};","import { useFetch } from './fetch';\r\nimport { getStorage, setStorage } from './storage';\r\n\r\nconst BASE_URL = `${window.globalConfig.wFlowApi}/v1`\r\n\r\ninterface Dept {\r\n companyId: string;\r\n deptName: string;\r\n id: string;\r\n leader: string;\r\n parentId: string;\r\n sort: number;\r\n}\r\n\r\ninterface DeptListResponse {\r\n data: Dept[];\r\n version: string;\r\n}\r\n\r\nconst DEPT_LIST_STORAGE_KEY = 'deptListCache';\r\nconst DEPT_LIST_VERSION_STORAGE_KEY = 'deptListVersionCache';\r\n\r\n// 内存缓存,在页面刷新前保持有效\r\nlet memoryVersion: string | null = null;\r\n\r\n/**\r\n * 获取部门列表版本号\r\n * @param onlyVersion 是否只获取版本号\r\n * @returns 部门列表版本号或完整数据\r\n */\r\nexport const fetchDeptVersion = (onlyVersion: boolean) => {\r\n return useFetch<DeptListResponse>(\r\n `${BASE_URL}/oa/org/allpartments`,\r\n { params: { onlyVersion } }\r\n );\r\n};\r\n\r\n/**\r\n * 获取所有部门列表\r\n * @returns 所有部门列表\r\n */\r\nexport const fetchAllDept = () => {\r\n return useFetch<DeptListResponse>(\r\n `${BASE_URL}/oa/org/allpartments`\r\n );\r\n};\r\n\r\n/**\r\n * 获取并缓存部门列表\r\n * @returns 部门列表\r\n */\r\nexport const getDeptList = async (): Promise<Dept[]> => {\r\n const cachedDeptList = await getStorage<Dept[]>(DEPT_LIST_STORAGE_KEY);\r\n const cachedVersion = await getStorage<string>(DEPT_LIST_VERSION_STORAGE_KEY);\r\n\r\n // 如果内存中已有版本号,直接使用缓存的部门列表\r\n if (memoryVersion && cachedDeptList) {\r\n return cachedDeptList;\r\n }\r\n\r\n const latestVersionResponse = await fetchDeptVersion(true);\r\n const latestVersion = latestVersionResponse.version;\r\n\r\n if (cachedDeptList && cachedVersion === latestVersion) {\r\n // 更新内存缓存的版本号\r\n memoryVersion = cachedVersion;\r\n return cachedDeptList;\r\n } else {\r\n const deptListResponse = await fetchAllDept();\r\n // 更新存储缓存\r\n await setStorage(DEPT_LIST_STORAGE_KEY, deptListResponse.data);\r\n await setStorage(DEPT_LIST_VERSION_STORAGE_KEY, deptListResponse.version);\r\n // 更新内存缓存的版本号\r\n memoryVersion = deptListResponse.version;\r\n return deptListResponse.data;\r\n }\r\n};\r\n\r\n/**\r\n * 根据部门ID查询部门信息\r\n * @param deptId 部门ID\r\n * @returns 匹配的部门信息或 undefined\r\n */\r\nexport const getDeptById = async (deptId: string): Promise<Dept | undefined> => {\r\n const deptList = await getDeptList();\r\n return deptList.find(dept => dept.id === deptId);\r\n};"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/storage.ts","../src/utils/user.ts","../src/utils/fetch.ts","../src/utils/initApp.ts","../src/utils/userList.ts","../src/utils/deptList.ts"],"names":["localforage","setStorage","key","value","error","getStorage","removeStorage","clearStorage","USER_INFO_KEY","initUserInfo","info","setUserToken","token","userInfo","getUserInfo","getUserToken","updateUserInfo","currentInfo","clearUserInfo","useFetch","url","config","params","restConfig","queryString","finalUrl","response","decodeJwtPayload","jwt","parts","encodedPayload","base64Payload","decodedJson","getUrlParam","paramName","paramFromSearch","hash","queryStringMatch","initApp","userId","t","shouldUpdate","timestamp","now","timestampMs","userToken","decodedToken","exp","companyId","currentTime","USER_LIST_STORAGE_KEY","USER_LIST_VERSION_STORAGE_KEY","memoryVersion","fetchUserVersion","onlyVersion","baseUrl","fetchAllUser","getUserList","storageKey","versionKey","cachedUserList","cachedVersion","latestVersion","userListResponse","getUserById","user","DEPT_LIST_STORAGE_KEY","DEPT_LIST_VERSION_STORAGE_KEY","fetchDeptVersion","fetchAllDept","getDeptList","cachedDeptList","deptListResponse","getDeptById","deptId","dept"],"mappings":"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","file":"index.js","sourcesContent":["import localforage from 'localforage';\r\n\r\n// 配置localforage\r\nlocalforage.config({\r\n name: 'cgx',\r\n storeName: 'cgx_store',\r\n driver: [\r\n localforage.INDEXEDDB,\r\n localforage.LOCALSTORAGE,\r\n ],\r\n});\r\n\r\n// 存储数据\r\nexport const setStorage = async (key: string, value: any) => {\r\n try {\r\n await localforage.setItem(key, value);\r\n } catch (error) {\r\n console.error('Error saving data:', error);\r\n }\r\n};\r\n\r\n// 获取数据\r\nexport const getStorage = async <T>(key: string): Promise<T | null> => {\r\n try {\r\n const value = await localforage.getItem<T>(key);\r\n return value;\r\n } catch (error) {\r\n console.error('Error getting data:', error);\r\n return null;\r\n }\r\n};\r\n\r\n// 删除数据\r\nexport const removeStorage = async (key: string) => {\r\n try {\r\n await localforage.removeItem(key);\r\n } catch (error) {\r\n console.error('Error removing data:', error);\r\n }\r\n};\r\n\r\n// 清空所有数据\r\nexport const clearStorage = async () => {\r\n try {\r\n await localforage.clear();\r\n } catch (error) {\r\n console.error('Error clearing data:', error);\r\n }\r\n};","/**\r\n * 用户信息管理模块\r\n */\r\nimport { getStorage, setStorage, removeStorage } from './storage';\r\n\r\nexport interface UserInfo {\r\n token?: string;\r\n userId?: string;\r\n companyId?: string;\r\n [key: string]: any;\r\n}\r\n\r\nconst USER_INFO_KEY = 'user_info';\r\n\r\n/**\r\n * 初始化用户信息\r\n * @param info 用户信息对象\r\n */\r\nexport const initUserInfo = async (info: UserInfo) => {\r\n await setStorage(USER_INFO_KEY, info);\r\n};\r\n\r\n/**\r\n * 设置用户token\r\n * @param token 用户token\r\n */\r\nexport const setUserToken = async (token: string) => {\r\n const userInfo = await getUserInfo();\r\n await setStorage(USER_INFO_KEY, { ...userInfo, token });\r\n};\r\n\r\n/**\r\n * 获取用户token\r\n * @returns 用户token\r\n */\r\nexport const getUserToken = async (): Promise<string | undefined> => {\r\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\r\n return userInfo?.token;\r\n};\r\n\r\n/**\r\n * 获取用户信息\r\n * @returns 用户信息对象\r\n */\r\nexport const getUserInfo = async (): Promise<UserInfo> => {\r\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\r\n return userInfo || {};\r\n};\r\n\r\n/**\r\n * 更新用户信息\r\n * @param info 要更新的用户信息字段\r\n */\r\nexport const updateUserInfo = async (info: Partial<UserInfo>) => {\r\n const currentInfo = await getUserInfo();\r\n await setStorage(USER_INFO_KEY, { ...currentInfo, ...info });\r\n};\r\n\r\n/**\r\n * 清除用户信息\r\n */\r\nexport const clearUserInfo = async () => {\r\n await removeStorage(USER_INFO_KEY);\r\n};","import { getUserToken } from './user';\r\n\r\ninterface FetchConfig extends RequestInit {\r\n params?: Record<string, any>;\r\n}\r\n\r\nexport const useFetch = async <T>(url: string, config: FetchConfig = {}) => {\r\n const { params, ...restConfig } = config;\r\n\r\n // 处理查询参数\r\n const queryString = params\r\n ? '?' +\r\n Object.entries(params)\r\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\r\n .join('&')\r\n : '';\r\n\r\n const finalUrl = url + queryString;\r\n\r\n // 从 user.ts 获取 token\r\n const token = await getUserToken();\r\n\r\n // 发送请求\r\n const response = await fetch(finalUrl, {\r\n ...restConfig,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n token: token || '',\r\n ...restConfig.headers,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n return data as T;\r\n};\r\n","import { updateUserInfo, getUserToken } from './user';\r\n\r\nfunction decodeJwtPayload(jwt: string) {\r\n try {\r\n // 检查 JWT 格式\r\n if (!jwt || typeof jwt !== 'string') {\r\n throw new Error('无效的 JWT 格式');\r\n }\r\n\r\n // 分割 JWT 的三个部分\r\n const parts = jwt.split('.');\r\n if (parts.length !== 3) {\r\n throw new Error('JWT 必须包含三个部分');\r\n }\r\n\r\n // 提取中间的 Payload 部分\r\n const encodedPayload = parts[1];\r\n\r\n // 添加可能缺失的填充字符\r\n const paddedEncodedPayload = encodedPayload.padEnd(\r\n encodedPayload.length + ((4 - (encodedPayload.length % 4)) % 4),\r\n '='\r\n );\r\n\r\n // 将 Base64Url 转换为标准 Base64\r\n const base64Payload = paddedEncodedPayload.replace(/-/g, '+').replace(/_/g, '/');\r\n\r\n // 解码 Base64 字符串\r\n const decodedJson = atob(base64Payload);\r\n\r\n // 解析 JSON\r\n return JSON.parse(decodedJson);\r\n } catch (error) {\r\n console.error('解码失败:', error);\r\n return null;\r\n }\r\n}\r\n\r\n// 从URL中获取指定参数\r\nconst getUrlParam = (paramName: string): string | null => {\r\n // 检查search参数\r\n const urlParamsSearch = new URLSearchParams(window.location.search);\r\n const paramFromSearch = urlParamsSearch.get(paramName);\r\n if (paramFromSearch) {\r\n return paramFromSearch;\r\n }\r\n\r\n // 检查hash片段\r\n const hash = window.location.hash;\r\n if (hash) {\r\n const hashContent = hash.startsWith('#') ? hash.substring(1) : hash;\r\n const queryStringMatch = hashContent.match(/\\?(.*)/);\r\n if (queryStringMatch && queryStringMatch[1]) {\r\n const urlParamsHash = new URLSearchParams(queryStringMatch[1]);\r\n return urlParamsHash.get(paramName);\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\n// 初始化应用\r\nexport const initApp = async () => {\r\n const token = getUrlParam('token');\r\n const userId = getUrlParam('user_id');\r\n const t = getUrlParam('t');\r\n\r\n // 获取完token后从浏览器地址栏去掉token的信息\r\n const url = new URL(window.location.href);\r\n url.searchParams.delete('token');\r\n url.searchParams.delete('user_id');\r\n url.searchParams.delete('t');\r\n window.history.replaceState({}, '', url.toString());\r\n\r\n let shouldUpdate = !!(token || userId);\r\n if (t) {\r\n const timestamp = parseInt(t, 10);\r\n const now = Date.now();\r\n // 兼容秒级(10位)和毫秒级(13位)时间戳\r\n const timestampMs = timestamp < 10000000000 ? timestamp * 1000 : timestamp;\r\n // 超过五分钟,不再更新\r\n if (Math.abs(now - timestampMs) > 60 * 1000 * 5) {\r\n shouldUpdate = false;\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n await updateUserInfo({\r\n ...(token && { token }),\r\n ...(userId && { userId }),\r\n });\r\n }\r\n\r\n const userToken = await getUserToken();\r\n if (userToken) {\r\n const decodedToken = decodeJwtPayload(userToken);\r\n if (decodedToken) {\r\n const { exp, companyId } = decodedToken;\r\n const currentTime = Math.floor(Date.now() / 1000);\r\n if (exp && exp <= currentTime) {\r\n await updateUserInfo({\r\n token: '',\r\n userId: '',\r\n });\r\n } else {\r\n await updateUserInfo({\r\n companyId,\r\n });\r\n return;\r\n }\r\n }\r\n }\r\n // 声明全局配置类型\r\n\r\n window.location.replace(`${window.globalConfig.weiwoWeb}/#/auth?url=${window.location.href}`);\r\n};\r\n","import { useFetch } from './fetch';\r\nimport { getStorage, setStorage } from './storage';\r\n\r\ninterface User {\r\n companyId: string;\r\n id: string;\r\n name: string;\r\n deptId: string;\r\n mainDept: boolean;\r\n deptName: string;\r\n pinyin: string;\r\n py: string;\r\n type: null; // Or a more specific type if known\r\n avatar: string;\r\n gender: string;\r\n phone: string;\r\n email: string;\r\n position: string;\r\n status: number;\r\n selected: null; // Or a more specific type if known\r\n}\r\n\r\ninterface UserListResponse {\r\n data: User[];\r\n version: string;\r\n}\r\n\r\nconst USER_LIST_STORAGE_KEY = 'userListCache';\r\nconst USER_LIST_VERSION_STORAGE_KEY = 'userListVersionCache';\r\n\r\n// 内存缓存,在页面刷新前保持有效\r\nlet memoryVersion: string | null = null;\r\n\r\n/**\r\n * 获取用户列表,可选择是否只获取版本号\r\n * @param onlyVersion 是否只获取版本号\r\n * @returns 用户列表或只包含版本号\r\n */\r\nexport const fetchUserVersion = (onlyVersion: boolean, companyId?: string) => {\r\n const baseUrl = `${window.globalConfig.wFlowApiTest}/v1`;\r\n return useFetch<UserListResponse>(`${baseUrl}/oa/org/depts/users`, {\r\n params: { onlyVersion, companyId },\r\n });\r\n};\r\n\r\n/**\r\n * 获取所有用户列表\r\n * @returns 所有用户列表\r\n */\r\nexport const fetchAllUser = (companyId?: string) => {\r\n const baseUrl = `${window.globalConfig.wFlowApiTest}/v1`;\r\n return useFetch<UserListResponse>(`${baseUrl}/oa/org/depts/users`, { params: { companyId } });\r\n};\r\n\r\n/**\r\n * 获取并缓存用户列表\r\n * @returns 用户列表\r\n */\r\nexport const getUserList = async (companyId?: string): Promise<User[]> => {\r\n console.log('getUserList', companyId);\r\n const storageKey = companyId ? `${USER_LIST_STORAGE_KEY}_${companyId}` : USER_LIST_STORAGE_KEY;\r\n const versionKey = companyId\r\n ? `${USER_LIST_VERSION_STORAGE_KEY}_${companyId}`\r\n : USER_LIST_VERSION_STORAGE_KEY;\r\n\r\n const cachedUserList = await getStorage<User[]>(storageKey);\r\n const cachedVersion = await getStorage<string>(versionKey);\r\n\r\n // 如果内存中已有版本号,直接使用缓存的用户列表\r\n // Note: Simple memory cache skip for specific companies to ensure correctness\r\n if (!companyId && memoryVersion && cachedUserList) {\r\n return cachedUserList;\r\n }\r\n\r\n const latestVersionResponse = await fetchUserVersion(true, companyId);\r\n const latestVersion = latestVersionResponse.version;\r\n\r\n if (cachedUserList && cachedVersion === latestVersion) {\r\n if (!companyId) memoryVersion = cachedVersion;\r\n return cachedUserList;\r\n } else {\r\n const userListResponse = await fetchAllUser(companyId);\r\n // 更新存储缓存\r\n await setStorage(storageKey, userListResponse.data);\r\n await setStorage(versionKey, userListResponse.version);\r\n // 更新内存缓存的版本号\r\n if (!companyId) memoryVersion = userListResponse.version;\r\n return userListResponse.data;\r\n }\r\n};\r\n\r\n/**\r\n * 根据用户ID查询用户信息\r\n * @param userId 用户ID\r\n * @returns 匹配的用户信息或 undefined\r\n */\r\nexport const getUserById = async (userId: string): Promise<User | undefined> => {\r\n const userList = await getUserList();\r\n return userList.find(user => user.id === userId);\r\n};\r\n","import { useFetch } from './fetch';\r\nimport { getStorage, setStorage } from './storage';\r\n\r\ninterface Dept {\r\n companyId: string;\r\n deptName: string;\r\n id: string;\r\n leader: string;\r\n parentId: string;\r\n sort: number;\r\n}\r\n\r\ninterface DeptListResponse {\r\n data: Dept[];\r\n version: string;\r\n}\r\n\r\nconst DEPT_LIST_STORAGE_KEY = 'deptListCache';\r\nconst DEPT_LIST_VERSION_STORAGE_KEY = 'deptListVersionCache';\r\n\r\n// 内存缓存,在页面刷新前保持有效\r\nlet memoryVersion: string | null = null;\r\n\r\n/**\r\n * 获取部门列表版本号\r\n * @param onlyVersion 是否只获取版本号\r\n * @returns 部门列表版本号或完整数据\r\n */\r\nexport const fetchDeptVersion = (onlyVersion: boolean, companyId?: string) => {\r\n const baseUrl = `${window.globalConfig.wFlowApiTest}/v1`;\r\n return useFetch<DeptListResponse>(`${baseUrl}/oa/org/allpartments`, {\r\n params: { onlyVersion, companyId },\r\n });\r\n};\r\n\r\n/**\r\n * 获取所有部门列表\r\n * @returns 所有部门列表\r\n */\r\nexport const fetchAllDept = (companyId?: string) => {\r\n const baseUrl = `${window.globalConfig.wFlowApiTest}/v1`;\r\n return useFetch<DeptListResponse>(`${baseUrl}/oa/org/allpartments`, { params: { companyId } });\r\n};\r\n\r\n/**\r\n * 获取并缓存部门列表\r\n * @returns 部门列表\r\n */\r\nexport const getDeptList = async (companyId?: string): Promise<Dept[]> => {\r\n const storageKey = companyId ? `${DEPT_LIST_STORAGE_KEY}_${companyId}` : DEPT_LIST_STORAGE_KEY;\r\n const versionKey = companyId\r\n ? `${DEPT_LIST_VERSION_STORAGE_KEY}_${companyId}`\r\n : DEPT_LIST_VERSION_STORAGE_KEY;\r\n\r\n const cachedDeptList = await getStorage<Dept[]>(storageKey);\r\n const cachedVersion = await getStorage<string>(versionKey);\r\n\r\n // 如果内存中已有版本号,直接使用缓存的部门列表\r\n if (!companyId && memoryVersion && cachedDeptList) {\r\n return cachedDeptList;\r\n }\r\n\r\n const latestVersionResponse = await fetchDeptVersion(true, companyId);\r\n const latestVersion = latestVersionResponse.version;\r\n\r\n if (cachedDeptList && cachedVersion === latestVersion) {\r\n if (!companyId) memoryVersion = cachedVersion;\r\n return cachedDeptList;\r\n } else {\r\n const deptListResponse = await fetchAllDept(companyId);\r\n // 更新存储缓存\r\n await setStorage(storageKey, deptListResponse.data);\r\n await setStorage(versionKey, deptListResponse.version);\r\n // 更新内存缓存的版本号\r\n if (!companyId) memoryVersion = deptListResponse.version;\r\n return deptListResponse.data;\r\n }\r\n};\r\n\r\n/**\r\n * 根据部门ID查询部门信息\r\n * @param deptId 部门ID\r\n * @returns 匹配的部门信息或 undefined\r\n */\r\nexport const getDeptById = async (deptId: string): Promise<Dept | undefined> => {\r\n const deptList = await getDeptList();\r\n return deptList.find(dept => dept.id === deptId);\r\n};\r\n"]}
|