lgsso-sdk 1.0.4 → 1.0.5
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/README.md +22 -28
- package/dist/lgsso-sdk.js +1 -1
- package/package.json +1 -1
- package/src/index.d.ts +8 -3
- package/src/index.js +83 -58
- package/dist/lgsso-sdk.js.LICENSE.txt +0 -1
package/README.md
CHANGED
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
# lgsso-sdk
|
|
2
2
|
|
|
3
|
-
LG SSO登录工具库,用于处理单点登录流程、token
|
|
3
|
+
LG SSO登录工具库,用于处理单点登录流程、token管理和系统间跳转,支持Vue Router集成以确保路由状态同步。
|
|
4
4
|
|
|
5
|
-
## 安装
|
|
6
|
-
npm install lgsso-sdk --save
|
|
5
|
+
## 安装npm install lgsso-sdk --save
|
|
7
6
|
# 或
|
|
8
7
|
yarn add lgsso-sdk
|
|
9
|
-
|
|
10
|
-
## 引入
|
|
11
|
-
// ES模块引入
|
|
8
|
+
## 引入// ES模块引入
|
|
12
9
|
import lgsso from 'lgsso-sdk';
|
|
13
10
|
|
|
14
11
|
// CommonJS引入
|
|
15
12
|
const lgsso = require('lgsso-sdk').default;
|
|
16
|
-
|
|
17
13
|
## 初始化
|
|
18
|
-
|
|
14
|
+
### 基础初始化// 在应用入口处初始化
|
|
19
15
|
async function setupApp() {
|
|
20
16
|
const result = await lgsso.init({
|
|
21
17
|
logOutUrl: "http://lgsso2-watest.zlgx.com/",
|
|
@@ -42,40 +38,39 @@ async function setupApp() {
|
|
|
42
38
|
|
|
43
39
|
// 启动应用
|
|
44
40
|
setupApp();
|
|
41
|
+
### Vue Router集成(推荐)
|
|
42
|
+
为确保路由参数同步和重定向场景下的参数正确移除,建议传入Vue Router实例:
|
|
43
|
+
import router from './router'; // 导入你的Vue Router实例
|
|
45
44
|
|
|
45
|
+
async function setupApp() {
|
|
46
|
+
const result = await lgsso.init({
|
|
47
|
+
// ...其他配置
|
|
48
|
+
router: router, // 传入Vue Router实例
|
|
49
|
+
});
|
|
50
|
+
}
|
|
46
51
|
## 核心方法
|
|
47
52
|
|
|
48
|
-
### 1. 获取当前token
|
|
49
|
-
const token = lgsso.getToken();
|
|
53
|
+
### 1. 获取当前tokenconst token = lgsso.getToken();
|
|
50
54
|
if (token) {
|
|
51
55
|
console.log('当前token:', token);
|
|
52
56
|
} else {
|
|
53
57
|
console.log('未找到token');
|
|
54
58
|
}
|
|
55
|
-
|
|
56
|
-
### 2. 退出登录
|
|
57
|
-
async function handleLogout() {
|
|
59
|
+
### 2. 退出登录async function handleLogout() {
|
|
58
60
|
const result = await lgsso.logout();
|
|
59
61
|
if (result.code !== 0) {
|
|
60
62
|
console.error('退出失败:', result.msg);
|
|
61
63
|
}
|
|
62
64
|
}
|
|
63
|
-
|
|
64
|
-
### 3. 跳转到其他系统
|
|
65
|
-
async function goToOtherSystem() {
|
|
65
|
+
### 3. 跳转到其他系统async function goToOtherSystem() {
|
|
66
66
|
const result = await lgsso.toUrl('https://other-system.com');
|
|
67
67
|
if (result.code !== 0) {
|
|
68
68
|
console.error('跳转失败:', result.msg);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
|
|
72
|
-
### 4. 手动删除token
|
|
73
|
-
// 仅删除本地token,不调用退出接口
|
|
71
|
+
### 4. 手动删除token// 仅删除本地token,不调用退出接口
|
|
74
72
|
lgsso.removeToken();
|
|
75
|
-
|
|
76
|
-
### 5. 获取accessCode(通过token换取)
|
|
77
|
-
// 用于需要手动处理accessCode的场景(如服务端交互)
|
|
78
|
-
async function fetchAccessCode() {
|
|
73
|
+
### 5. 获取accessCode(通过token换取)async function fetchAccessCode() {
|
|
79
74
|
const result = await lgsso.getAccessCode();
|
|
80
75
|
if (result.code === 0) {
|
|
81
76
|
console.log('获取accessCode成功:', result.data);
|
|
@@ -84,7 +79,6 @@ async function fetchAccessCode() {
|
|
|
84
79
|
console.error('获取失败:', result.msg);
|
|
85
80
|
}
|
|
86
81
|
}
|
|
87
|
-
|
|
88
82
|
## 错误码说明
|
|
89
83
|
|
|
90
84
|
| 错误码 | 说明 |
|
|
@@ -98,13 +92,13 @@ async function fetchAccessCode() {
|
|
|
98
92
|
| -105 | 未配置refreshCodeApi |
|
|
99
93
|
| -106 | 未找到有效token |
|
|
100
94
|
| -107 | 跳转失败(接口请求错误) |
|
|
95
|
+
| -108 | 传入的router不是有效的Vue Router实例 |
|
|
101
96
|
| -200 | 非浏览器环境(调用了依赖window的方法) |
|
|
102
97
|
| -201 | 响应数据格式错误 |
|
|
103
98
|
| -202 | 请求超时 |
|
|
104
99
|
| -203 | 网络请求失败 |
|
|
105
100
|
|
|
106
|
-
##
|
|
107
|
-
# 安装依赖
|
|
101
|
+
## 构建与发布# 安装依赖
|
|
108
102
|
npm install
|
|
109
103
|
|
|
110
104
|
# 开发模式(实时监听)
|
|
@@ -115,5 +109,5 @@ npm run build
|
|
|
115
109
|
|
|
116
110
|
# 发布到npm(需先登录)
|
|
117
111
|
npm publish
|
|
118
|
-
|
|
119
|
-
|
|
112
|
+
构建后会在`dist`目录生成`lgsso-sdk.js`文件,可直接引入使用。
|
|
113
|
+
|
package/dist/lgsso-sdk.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see lgsso-sdk.js.LICENSE.txt */
|
|
2
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("lgssoSdk",[],t):"object"==typeof exports?exports.lgssoSdk=t():e.lgssoSdk=t()}(this,()=>(()=>{"use strict";var e={d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function n(){var e,t,r="function"==typeof Symbol?Symbol:{},c=r.iterator||"@@iterator",i=r.toStringTag||"@@toStringTag";function u(r,n,c,i){var u=n&&n.prototype instanceof s?n:s,f=Object.create(u.prototype);return o(f,"_invoke",function(r,n,o){var c,i,u,s=0,f=o||[],l=!1,p={p:0,n:0,v:e,a:y,f:y.bind(e,4),d:function(t,r){return c=t,i=0,u=e,p.n=r,a}};function y(r,n){for(i=r,u=n,t=0;!l&&s&&!o&&t<f.length;t++){var o,c=f[t],y=p.p,d=c[2];r>3?(o=d===n)&&(u=c[(i=c[4])?5:(i=3,3)],c[4]=c[5]=e):c[0]<=y&&((o=r<2&&y<c[1])?(i=0,p.v=n,p.n=c[1]):y<d&&(o=r<3||c[0]>n||n>d)&&(c[4]=r,c[5]=n,p.n=d,i=0))}if(o||r>1)return a;throw l=!0,n}return function(o,f,d){if(s>1)throw TypeError("Generator is already running");for(l&&1===f&&y(f,d),i=f,u=d;(t=i<2?e:u)||!l;){c||(i?i<3?(i>1&&(p.n=-1),y(i,u)):p.n=u:p.v=u);try{if(s=2,c){if(i||(o="next"),t=c[o]){if(!(t=t.call(c,u)))throw TypeError("iterator result is not an object");if(!t.done)return t;u=t.value,i<2&&(i=0)}else 1===i&&(t=c.return)&&t.call(c),i<2&&(u=TypeError("The iterator does not provide a '"+o+"' method"),i=1);c=e}else if((t=(l=p.n<0)?u:r.call(n,p))!==a)break}catch(t){c=e,i=1,u=t}finally{s=1}}return{value:t,done:l}}}(r,c,i),!0),f}var a={};function s(){}function f(){}function l(){}t=Object.getPrototypeOf;var p=[][c]?t(t([][c]())):(o(t={},c,function(){return this}),t),y=l.prototype=s.prototype=Object.create(p);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,o(e,i,"GeneratorFunction")),e.prototype=Object.create(y),e}return f.prototype=l,o(y,"constructor",l),o(l,"constructor",f),f.displayName="GeneratorFunction",o(l,i,"GeneratorFunction"),o(y),o(y,i,"Generator"),o(y,c,function(){return this}),o(y,"toString",function(){return"[object Generator]"}),(n=function(){return{w:u,m:d}})()}function o(e,t,r,n){var c=Object.defineProperty;try{c({},"",{})}catch(e){c=0}o=function(e,t,r,n){function i(t,r){o(e,t,function(e){return this._invoke(t,r,e)})}t?c?c(e,t,{value:r,enumerable:!n,configurable:!n,writable:!n}):e[t]=r:(i("next",0),i("throw",1),i("return",2))},o(e,t,r,n)}function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?c(Object(r),!0).forEach(function(t){u(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):c(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function u(e,t,n){return(t=function(e){var t=function(e){if("object"!=r(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=r(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==r(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t,r,n,o,c,i){try{var u=e[c](i),a=u.value}catch(e){return void r(e)}u.done?t(a):Promise.resolve(a).then(n,o)}function s(e){return f.apply(this,arguments)}function f(){var e;return e=n().m(function e(t){var r,o,c,u,a,s,f,l,p,y,d=arguments;return n().w(function(e){for(;;)switch(e.p=e.n){case 0:if(r=d.length>1&&void 0!==d[1]?d[1]:"GET",o=d.length>2&&void 0!==d[2]?d[2]:{},c=d.length>3&&void 0!==d[3]?d[3]:{},u=d.length>4&&void 0!==d[4]?d[4]:5e3,"undefined"!=typeof window){e.n=1;break}return e.a(2,{code:-200,msg:"request方法只能在浏览器环境使用",success:!1});case 1:return a=new AbortController,s=setTimeout(function(){return a.abort()},u),"GET"!==(f={method:r.toUpperCase(),headers:i({"Content-Type":"application/json"},c),signal:a.signal}).method&&o&&(f.body=JSON.stringify(o)),e.p=2,e.n=3,fetch(t,f);case 3:if(l=e.v,clearTimeout(s),l.ok){e.n=4;break}return e.a(2,{code:l.status,msg:"HTTP请求失败: ".concat(l.statusText),success:!1});case 4:return e.p=4,e.n=5,l.json();case 5:return p=e.v,e.a(2,p);case 6:return e.p=6,e.v,e.a(2,{code:-201,msg:"响应数据不是有效的JSON格式",success:!1});case 7:if(e.p=7,y=e.v,clearTimeout(s),"AbortError"!==y.name){e.n=8;break}return e.a(2,{code:-202,msg:"请求超时(".concat(u,"ms)"),success:!1});case 8:return e.a(2,{code:-203,msg:"网络请求失败: ".concat(y.message),success:!1});case 9:return e.a(2)}},e,null,[[4,6],[2,7]])}),f=function(){var t=this,r=arguments;return new Promise(function(n,o){var c=e.apply(t,r);function i(e){a(c,n,o,i,u,"next",e)}function u(e){a(c,n,o,i,u,"throw",e)}i(void 0)})},f.apply(this,arguments)}function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function p(){var e,t,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function c(r,n,o,c){var a=n&&n.prototype instanceof u?n:u,s=Object.create(a.prototype);return y(s,"_invoke",function(r,n,o){var c,u,a,s=0,f=o||[],l=!1,p={p:0,n:0,v:e,a:y,f:y.bind(e,4),d:function(t,r){return c=t,u=0,a=e,p.n=r,i}};function y(r,n){for(u=r,a=n,t=0;!l&&s&&!o&&t<f.length;t++){var o,c=f[t],y=p.p,d=c[2];r>3?(o=d===n)&&(a=c[(u=c[4])?5:(u=3,3)],c[4]=c[5]=e):c[0]<=y&&((o=r<2&&y<c[1])?(u=0,p.v=n,p.n=c[1]):y<d&&(o=r<3||c[0]>n||n>d)&&(c[4]=r,c[5]=n,p.n=d,u=0))}if(o||r>1)return i;throw l=!0,n}return function(o,f,d){if(s>1)throw TypeError("Generator is already running");for(l&&1===f&&y(f,d),u=f,a=d;(t=u<2?e:a)||!l;){c||(u?u<3?(u>1&&(p.n=-1),y(u,a)):p.n=a:p.v=a);try{if(s=2,c){if(u||(o="next"),t=c[o]){if(!(t=t.call(c,a)))throw TypeError("iterator result is not an object");if(!t.done)return t;a=t.value,u<2&&(u=0)}else 1===u&&(t=c.return)&&t.call(c),u<2&&(a=TypeError("The iterator does not provide a '"+o+"' method"),u=1);c=e}else if((t=(l=p.n<0)?a:r.call(n,p))!==i)break}catch(t){c=e,u=1,a=t}finally{s=1}}return{value:t,done:l}}}(r,o,c),!0),s}var i={};function u(){}function a(){}function s(){}t=Object.getPrototypeOf;var f=[][n]?t(t([][n]())):(y(t={},n,function(){return this}),t),l=s.prototype=u.prototype=Object.create(f);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,s):(e.__proto__=s,y(e,o,"GeneratorFunction")),e.prototype=Object.create(l),e}return a.prototype=s,y(l,"constructor",s),y(s,"constructor",a),a.displayName="GeneratorFunction",y(s,o,"GeneratorFunction"),y(l),y(l,o,"Generator"),y(l,n,function(){return this}),y(l,"toString",function(){return"[object Generator]"}),(p=function(){return{w:c,m:d}})()}function y(e,t,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(e){o=0}y=function(e,t,r,n){function c(t,r){y(e,t,function(e){return this._invoke(t,r,e)})}t?o?o(e,t,{value:r,enumerable:!n,configurable:!n,writable:!n}):e[t]=r:(c("next",0),c("throw",1),c("return",2))},y(e,t,r,n)}function d(e,t,r,n,o,c,i){try{var u=e[c](i),a=u.value}catch(e){return void r(e)}u.done?t(a):Promise.resolve(a).then(n,o)}function b(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var c=e.apply(t,r);function i(e){d(c,n,o,i,u,"next",e)}function u(e){d(c,n,o,i,u,"throw",e)}i(void 0)})}}function m(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function v(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?m(Object(r),!0).forEach(function(t){g(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):m(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function g(e,t,r){return(t=function(e){var t=function(e){if("object"!=l(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=l(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==l(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}e.r(t),e.d(t,{default:()=>x,getAccessCode:()=>G,getToken:()=>C,init:()=>P,logout:()=>K,removeToken:()=>A,toUrl:()=>E});var h=null;function w(){return"undefined"!=typeof window&&"undefined"!=typeof document}function O(e){return w()?new URLSearchParams(window.location.search).get(e):null}function j(e){if(w()){var t=new URLSearchParams(window.location.search);if(t.has(e)){t.delete(e);var r="".concat(window.location.pathname).concat(t.toString()?"?".concat(t.toString()):"");window.history.replaceState({},document.title,r)}}}function S(){return w()?window.location.href:""}function k(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=v(v({},{accessCodeKey:"accessCode",tokenKey:"scm_token",timeout:5e3,headers:{},tokenApi:"",refreshCodeApi:"",logoutApi:"",logOutUrl:""}),e);if("string"!=typeof t.accessCodeKey||""===t.accessCodeKey.trim())throw new Error("accessCodeKey必须是有效的字符串");if("string"!=typeof t.tokenKey||""===t.tokenKey.trim())throw new Error("tokenKey必须是有效的字符串");return t}function P(){return T.apply(this,arguments)}function T(){return T=b(p().m(function e(){var t,r,n,o,c=arguments;return p().w(function(e){for(;;)switch(e.p=e.n){case 0:if(t=c.length>0&&void 0!==c[0]?c[0]:{},e.p=1,h=k(t),r=O(h.accessCodeKey),j(h.accessCodeKey),h.tokenApi){e.n=2;break}return e.a(2,{code:-100,msg:"缺少tokenApi",success:!1});case 2:if(!h.tokenApi||!r){e.n=4;break}return e.n=3,s(h.tokenApi,"POST",{accessCode:r},h.headers,h.timeout);case 3:return 0===(n=e.v).code&&n.data&&localStorage.setItem(h.tokenKey,n.data),setTimeout(function(){return j(h.accessCodeKey)},300),e.a(2,n);case 4:C()||(window.location.href="".concat(h.logOutUrl,"?redirect_uri=").concat(encodeURIComponent(S())));case 5:return e.a(2,{code:0,msg:"",success:!0});case 6:return e.p=6,o=e.v,e.a(2,{code:-100,msg:"初始化失败: ".concat(o.message),success:!1})}},e,null,[[1,6]])})),T.apply(this,arguments)}function C(){return h&&w()?localStorage.getItem(h.tokenKey):null}function A(){h&&w()&&localStorage.removeItem(h.tokenKey)}function K(){return _.apply(this,arguments)}function _(){return(_=b(p().m(function e(){var t,r;return p().w(function(e){for(;;)switch(e.p=e.n){case 0:if(h){e.n=1;break}return e.a(2,{code:-101,msg:"请先调用init方法初始化",success:!1});case 1:if(h.logoutApi){e.n=2;break}return e.a(2,{code:-102,msg:"未配置logoutApi",success:!1});case 2:return e.p=2,e.n=3,s(h.logoutApi,"POST",{},v(v({},h.headers),{},g({},h.tokenKey,C())),h.timeout);case 3:return t=e.v,A(),h.logOutUrl&&w()&&(window.location.href="".concat(h.logOutUrl,"?redirect_uri=").concat(encodeURIComponent(S()))),e.a(2,t);case 4:return e.p=4,r=e.v,e.a(2,{code:-103,msg:"退出失败: ".concat(r.message),success:!1})}},e,null,[[2,4]])}))).apply(this,arguments)}function E(e){return U.apply(this,arguments)}function U(){return(U=b(p().m(function e(t){var r,n,o,c;return p().w(function(e){for(;;)switch(e.p=e.n){case 0:if(h){e.n=1;break}return e.a(2,{code:-101,msg:"请先调用init方法初始化",success:!1});case 1:if(t){e.n=2;break}return e.a(2,{code:-104,msg:"请提供跳转地址",success:!1});case 2:if(h.refreshCodeApi){e.n=3;break}return e.a(2,{code:-105,msg:"未配置refreshCodeApi",success:!1});case 3:if(r=C()){e.n=4;break}return h.logOutUrl&&w()&&(window.location.href="".concat(h.logOutUrl,"?redirect_uri=").concat(encodeURIComponent(S()))),e.a(2,{code:-106,msg:"未找到有效token",success:!1});case 4:return e.p=4,e.n=5,s(h.refreshCodeApi,"POST",{},v(v({},h.headers),{},g({},h.tokenKey,r)),h.timeout);case 5:return 0===(n=e.v).code&&n.data&&w()&&((o=new URL(t)).searchParams.set(h.accessCodeKey,n.data),window.location.href=o.toString()),e.a(2,n);case 6:return e.p=6,c=e.v,e.a(2,{code:-107,msg:"跳转失败: ".concat(c.message),success:!1})}},e,null,[[4,6]])}))).apply(this,arguments)}var G=function(){var e=b(p().m(function e(){var t;return p().w(function(e){for(;;)switch(e.n){case 0:if(h){e.n=1;break}return e.a(2,{code:-101,msg:"请先调用init方法初始化",success:!1});case 1:if(t=C()){e.n=2;break}return e.a(2,{code:-106,msg:"未找到有效token",success:!1});case 2:return e.n=3,s(h.refreshCodeApi,"POST",{},v(v({},h.headers),{},g({},h.tokenKey,t)),h.timeout);case 3:return e.a(2,e.v)}},e)}));return function(){return e.apply(this,arguments)}}();const x={init:P,getToken:C,removeToken:A,logout:K,toUrl:E,getAccessCode:G};return t})());
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("lgssoSdk",[],t):"object"==typeof exports?exports.lgssoSdk=t():e.lgssoSdk=t()}(this,()=>(()=>{"use strict";var e={d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function n(){var e,t,r="function"==typeof Symbol?Symbol:{},c=r.iterator||"@@iterator",i=r.toStringTag||"@@toStringTag";function u(r,n,c,i){var u=n&&n.prototype instanceof s?n:s,f=Object.create(u.prototype);return o(f,"_invoke",function(r,n,o){var c,i,u,s=0,f=o||[],l=!1,p={p:0,n:0,v:e,a:y,f:y.bind(e,4),d:function(t,r){return c=t,i=0,u=e,p.n=r,a}};function y(r,n){for(i=r,u=n,t=0;!l&&s&&!o&&t<f.length;t++){var o,c=f[t],y=p.p,d=c[2];r>3?(o=d===n)&&(u=c[(i=c[4])?5:(i=3,3)],c[4]=c[5]=e):c[0]<=y&&((o=r<2&&y<c[1])?(i=0,p.v=n,p.n=c[1]):y<d&&(o=r<3||c[0]>n||n>d)&&(c[4]=r,c[5]=n,p.n=d,i=0))}if(o||r>1)return a;throw l=!0,n}return function(o,f,d){if(s>1)throw TypeError("Generator is already running");for(l&&1===f&&y(f,d),i=f,u=d;(t=i<2?e:u)||!l;){c||(i?i<3?(i>1&&(p.n=-1),y(i,u)):p.n=u:p.v=u);try{if(s=2,c){if(i||(o="next"),t=c[o]){if(!(t=t.call(c,u)))throw TypeError("iterator result is not an object");if(!t.done)return t;u=t.value,i<2&&(i=0)}else 1===i&&(t=c.return)&&t.call(c),i<2&&(u=TypeError("The iterator does not provide a '"+o+"' method"),i=1);c=e}else if((t=(l=p.n<0)?u:r.call(n,p))!==a)break}catch(t){c=e,i=1,u=t}finally{s=1}}return{value:t,done:l}}}(r,c,i),!0),f}var a={};function s(){}function f(){}function l(){}t=Object.getPrototypeOf;var p=[][c]?t(t([][c]())):(o(t={},c,function(){return this}),t),y=l.prototype=s.prototype=Object.create(p);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,o(e,i,"GeneratorFunction")),e.prototype=Object.create(y),e}return f.prototype=l,o(y,"constructor",l),o(l,"constructor",f),f.displayName="GeneratorFunction",o(l,i,"GeneratorFunction"),o(y),o(y,i,"Generator"),o(y,c,function(){return this}),o(y,"toString",function(){return"[object Generator]"}),(n=function(){return{w:u,m:d}})()}function o(e,t,r,n){var c=Object.defineProperty;try{c({},"",{})}catch(e){c=0}o=function(e,t,r,n){function i(t,r){o(e,t,function(e){return this._invoke(t,r,e)})}t?c?c(e,t,{value:r,enumerable:!n,configurable:!n,writable:!n}):e[t]=r:(i("next",0),i("throw",1),i("return",2))},o(e,t,r,n)}function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?c(Object(r),!0).forEach(function(t){u(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):c(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function u(e,t,n){return(t=function(e){var t=function(e){if("object"!=r(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=r(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==r(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t,r,n,o,c,i){try{var u=e[c](i),a=u.value}catch(e){return void r(e)}u.done?t(a):Promise.resolve(a).then(n,o)}function s(e){return f.apply(this,arguments)}function f(){var e;return e=n().m(function e(t){var r,o,c,u,a,s,f,l,p,y,d=arguments;return n().w(function(e){for(;;)switch(e.p=e.n){case 0:if(r=d.length>1&&void 0!==d[1]?d[1]:"GET",o=d.length>2&&void 0!==d[2]?d[2]:{},c=d.length>3&&void 0!==d[3]?d[3]:{},u=d.length>4&&void 0!==d[4]?d[4]:5e3,"undefined"!=typeof window){e.n=1;break}return e.a(2,{code:-200,msg:"request方法只能在浏览器环境使用",success:!1});case 1:return a=new AbortController,s=setTimeout(function(){return a.abort()},u),"GET"!==(f={method:r.toUpperCase(),headers:i({"Content-Type":"application/json"},c),signal:a.signal}).method&&o&&(f.body=JSON.stringify(o)),e.p=2,e.n=3,fetch(t,f);case 3:if(l=e.v,clearTimeout(s),l.ok){e.n=4;break}return e.a(2,{code:l.status,msg:"HTTP请求失败: ".concat(l.statusText),success:!1});case 4:return e.p=4,e.n=5,l.json();case 5:return p=e.v,e.a(2,p);case 6:return e.p=6,e.v,e.a(2,{code:-201,msg:"响应数据不是有效的JSON格式",success:!1});case 7:if(e.p=7,y=e.v,clearTimeout(s),"AbortError"!==y.name){e.n=8;break}return e.a(2,{code:-202,msg:"请求超时(".concat(u,"ms)"),success:!1});case 8:return e.a(2,{code:-203,msg:"网络请求失败: ".concat(y.message),success:!1});case 9:return e.a(2)}},e,null,[[4,6],[2,7]])}),f=function(){var t=this,r=arguments;return new Promise(function(n,o){var c=e.apply(t,r);function i(e){a(c,n,o,i,u,"next",e)}function u(e){a(c,n,o,i,u,"throw",e)}i(void 0)})},f.apply(this,arguments)}function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function p(){var e,t,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function c(r,n,o,c){var a=n&&n.prototype instanceof u?n:u,s=Object.create(a.prototype);return y(s,"_invoke",function(r,n,o){var c,u,a,s=0,f=o||[],l=!1,p={p:0,n:0,v:e,a:y,f:y.bind(e,4),d:function(t,r){return c=t,u=0,a=e,p.n=r,i}};function y(r,n){for(u=r,a=n,t=0;!l&&s&&!o&&t<f.length;t++){var o,c=f[t],y=p.p,d=c[2];r>3?(o=d===n)&&(a=c[(u=c[4])?5:(u=3,3)],c[4]=c[5]=e):c[0]<=y&&((o=r<2&&y<c[1])?(u=0,p.v=n,p.n=c[1]):y<d&&(o=r<3||c[0]>n||n>d)&&(c[4]=r,c[5]=n,p.n=d,u=0))}if(o||r>1)return i;throw l=!0,n}return function(o,f,d){if(s>1)throw TypeError("Generator is already running");for(l&&1===f&&y(f,d),u=f,a=d;(t=u<2?e:a)||!l;){c||(u?u<3?(u>1&&(p.n=-1),y(u,a)):p.n=a:p.v=a);try{if(s=2,c){if(u||(o="next"),t=c[o]){if(!(t=t.call(c,a)))throw TypeError("iterator result is not an object");if(!t.done)return t;a=t.value,u<2&&(u=0)}else 1===u&&(t=c.return)&&t.call(c),u<2&&(a=TypeError("The iterator does not provide a '"+o+"' method"),u=1);c=e}else if((t=(l=p.n<0)?a:r.call(n,p))!==i)break}catch(t){c=e,u=1,a=t}finally{s=1}}return{value:t,done:l}}}(r,o,c),!0),s}var i={};function u(){}function a(){}function s(){}t=Object.getPrototypeOf;var f=[][n]?t(t([][n]())):(y(t={},n,function(){return this}),t),l=s.prototype=u.prototype=Object.create(f);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,s):(e.__proto__=s,y(e,o,"GeneratorFunction")),e.prototype=Object.create(l),e}return a.prototype=s,y(l,"constructor",s),y(s,"constructor",a),a.displayName="GeneratorFunction",y(s,o,"GeneratorFunction"),y(l),y(l,o,"Generator"),y(l,n,function(){return this}),y(l,"toString",function(){return"[object Generator]"}),(p=function(){return{w:c,m:d}})()}function y(e,t,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(e){o=0}y=function(e,t,r,n){function c(t,r){y(e,t,function(e){return this._invoke(t,r,e)})}t?o?o(e,t,{value:r,enumerable:!n,configurable:!n,writable:!n}):e[t]=r:(c("next",0),c("throw",1),c("return",2))},y(e,t,r,n)}function d(e,t,r,n,o,c,i){try{var u=e[c](i),a=u.value}catch(e){return void r(e)}u.done?t(a):Promise.resolve(a).then(n,o)}function b(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var c=e.apply(t,r);function i(e){d(c,n,o,i,u,"next",e)}function u(e){d(c,n,o,i,u,"throw",e)}i(void 0)})}}function m(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function v(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?m(Object(r),!0).forEach(function(t){g(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):m(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function g(e,t,r){return(t=function(e){var t=function(e){if("object"!=l(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=l(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==l(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}e.r(t),e.d(t,{default:()=>x,getAccessCode:()=>R,getToken:()=>E,init:()=>T,logout:()=>A,removeToken:()=>_,toUrl:()=>U});var h=null,w=null;function O(){return"undefined"!=typeof window&&"undefined"!=typeof document}function j(e){return O()?w&&void 0!==w.currentRoute.value.query[e]?w.currentRoute.value.query[e]:new URLSearchParams(window.location.search).get(e):null}function S(e){if(O()&&w){var t=v({},w.currentRoute.value.query);void 0!==t[e]&&(delete t[e],w.replace(v(v({},w.currentRoute.value),{},{query:t})).catch(function(e){e.message.includes("NavigationDuplicated")||console.error("移除参数失败:",e)}))}else!function(e){var t=new URLSearchParams(window.location.search);if(t.has(e)){t.delete(e);var r="".concat(window.location.pathname).concat(t.toString()?"?".concat(t.toString()):"");window.history.replaceState({},document.title,r)}}(e)}function k(){return O()?window.location.href:""}function P(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=v(v({},{accessCodeKey:"accessCode",tokenKey:"scm_token",timeout:5e3,headers:{},tokenApi:"",refreshCodeApi:"",logoutApi:"",logOutUrl:"",router:null}),e);if(t.router&&"function"!=typeof t.router.replace)throw new Error("传入的router必须是Vue Router实例");if("string"!=typeof t.accessCodeKey||""===t.accessCodeKey.trim())throw new Error("accessCodeKey必须是有效的字符串");if("string"!=typeof t.tokenKey||""===t.tokenKey.trim())throw new Error("tokenKey必须是有效的字符串");return t}function T(){return C.apply(this,arguments)}function C(){return C=b(p().m(function e(){var t,r,n,o,c,i=arguments;return p().w(function(e){for(;;)switch(e.p=e.n){case 0:if(t=i.length>0&&void 0!==i[0]?i[0]:{},e.p=1,h=P(t),w=h.router,r=j(h.accessCodeKey),w?n=w.afterEach(function(){S(h.accessCodeKey),n()}):setTimeout(function(){return S(h.accessCodeKey)},0),h.tokenApi){e.n=2;break}return e.a(2,{code:-100,msg:"缺少tokenApi",success:!1});case 2:if(!h.tokenApi||!r){e.n=4;break}return e.n=3,s(h.tokenApi,"POST",{accessCode:r},h.headers,h.timeout);case 3:return 0===(o=e.v).code&&o.data&&localStorage.setItem(h.tokenKey,o.data),e.a(2,o);case 4:E()||(window.location.href="".concat(h.logOutUrl,"?redirect_uri=").concat(encodeURIComponent(k())));case 5:return e.a(2,{code:0,msg:"",success:!0});case 6:return e.p=6,c=e.v,e.a(2,{code:-100,msg:"初始化失败: ".concat(c.message),success:!1})}},e,null,[[1,6]])})),C.apply(this,arguments)}function E(){return h&&O()?localStorage.getItem(h.tokenKey):null}function _(){h&&O()&&localStorage.removeItem(h.tokenKey)}function A(){return K.apply(this,arguments)}function K(){return(K=b(p().m(function e(){var t,r;return p().w(function(e){for(;;)switch(e.p=e.n){case 0:if(h){e.n=1;break}return e.a(2,{code:-101,msg:"请先调用init方法初始化",success:!1});case 1:if(h.logoutApi){e.n=2;break}return e.a(2,{code:-102,msg:"未配置logoutApi",success:!1});case 2:if(!E()){e.n=6;break}return e.p=3,e.n=4,s(h.logoutApi,"POST",{},v(v({},h.headers),{},g({},h.tokenKey,E())),h.timeout);case 4:return t=e.v,_(),h.logOutUrl&&O()&&(window.location.href="".concat(h.logOutUrl,"?redirect_uri=").concat(encodeURIComponent(k()))),e.a(2,t);case 5:return e.p=5,r=e.v,e.a(2,{code:-103,msg:"退出失败: ".concat(r.message),success:!1});case 6:_(),h.logOutUrl&&O()&&(window.location.href="".concat(h.logOutUrl,"?redirect_uri=").concat(encodeURIComponent(k())));case 7:return e.a(2)}},e,null,[[3,5]])}))).apply(this,arguments)}function U(e){return G.apply(this,arguments)}function G(){return(G=b(p().m(function e(t){var r,n,o,c;return p().w(function(e){for(;;)switch(e.p=e.n){case 0:if(h){e.n=1;break}return e.a(2,{code:-101,msg:"请先调用init方法初始化",success:!1});case 1:if(t){e.n=2;break}return e.a(2,{code:-104,msg:"请提供跳转地址",success:!1});case 2:if(h.refreshCodeApi){e.n=3;break}return e.a(2,{code:-105,msg:"未配置refreshCodeApi",success:!1});case 3:if(r=E()){e.n=4;break}return h.logOutUrl&&O()&&(window.location.href="".concat(h.logOutUrl,"?redirect_uri=").concat(encodeURIComponent(k()))),e.a(2,{code:-106,msg:"未找到有效token",success:!1});case 4:return e.p=4,e.n=5,s(h.refreshCodeApi,"POST",{},v(v({},h.headers),{},g({},h.tokenKey,r)),h.timeout);case 5:return 0===(n=e.v).code&&n.data&&O()&&((o=new URL(t)).searchParams.set(h.accessCodeKey,n.data),window.location.href=o.toString()),e.a(2,n);case 6:return e.p=6,c=e.v,e.a(2,{code:-107,msg:"跳转失败: ".concat(c.message),success:!1})}},e,null,[[4,6]])}))).apply(this,arguments)}var R=function(){var e=b(p().m(function e(){var t;return p().w(function(e){for(;;)switch(e.n){case 0:if(h){e.n=1;break}return e.a(2,{code:-101,msg:"请先调用init方法初始化",success:!1});case 1:if(t=E()){e.n=2;break}return e.a(2,{code:-106,msg:"未找到有效token",success:!1});case 2:return e.n=3,s(h.refreshCodeApi,"POST",{},v(v({},h.headers),{},g({},h.tokenKey,t)),h.timeout);case 3:return e.a(2,e.v)}},e)}));return function(){return e.apply(this,arguments)}}();const x={init:T,getToken:E,removeToken:_,logout:A,toUrl:U,getAccessCode:R};return t})());
|
package/package.json
CHANGED
package/src/index.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* @Author: Robin LEI
|
|
3
3
|
* @Date: 2025-08-14 17:52:46
|
|
4
|
-
* @LastEditTime: 2025-08-
|
|
5
|
-
* @FilePath: \lg-wms-admind:\业务代码\中联钢信\五服一管\
|
|
4
|
+
* @LastEditTime: 2025-08-20 17:54:25
|
|
5
|
+
* @FilePath: \lg-wms-admind:\业务代码\中联钢信\五服一管\lg-ssosdk\src\index.d.ts
|
|
6
6
|
*/
|
|
7
|
+
// import type { Router } from 'vue-router';
|
|
8
|
+
|
|
7
9
|
/**
|
|
8
10
|
* lgsso-sdk 类型定义
|
|
9
11
|
*/
|
|
@@ -26,6 +28,8 @@ declare namespace LgSso {
|
|
|
26
28
|
logoutApi?: string;
|
|
27
29
|
/** 退出后重定向的地址 */
|
|
28
30
|
logOutUrl?: string;
|
|
31
|
+
/** Vue Router实例(用于路由同步) */
|
|
32
|
+
router?: any;
|
|
29
33
|
}
|
|
30
34
|
|
|
31
35
|
/** 接口返回结果类型 */
|
|
@@ -84,4 +88,5 @@ interface LgSsoInstance {
|
|
|
84
88
|
declare const lgsso: LgSsoInstance;
|
|
85
89
|
|
|
86
90
|
export default lgsso;
|
|
87
|
-
export { LgSso };
|
|
91
|
+
export { LgSso };
|
|
92
|
+
|
package/src/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { request } from './api';
|
|
2
2
|
|
|
3
|
-
//
|
|
3
|
+
// 私有配置存储(新增router实例)
|
|
4
4
|
let config = null;
|
|
5
|
+
let router = null;
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* 检查是否在浏览器环境
|
|
@@ -11,23 +12,53 @@ function isBrowser() {
|
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
|
-
* 解析URL
|
|
15
|
+
* 解析URL中的查询参数(兼容Vue Router的query)
|
|
15
16
|
* @param {string} name - 参数名
|
|
16
17
|
* @returns {string|null} 参数值
|
|
17
18
|
*/
|
|
18
19
|
function getQueryParam(name) {
|
|
19
20
|
if (!isBrowser()) return null;
|
|
21
|
+
// 优先从Vue Router的当前路由中获取query(更准确)
|
|
22
|
+
if (router && router.currentRoute.value.query[name] !== undefined) {
|
|
23
|
+
return router.currentRoute.value.query[name];
|
|
24
|
+
}
|
|
25
|
+
// 降级使用原生URL解析
|
|
20
26
|
const params = new URLSearchParams(window.location.search);
|
|
21
27
|
return params.get(name);
|
|
22
28
|
}
|
|
23
29
|
|
|
24
30
|
/**
|
|
25
|
-
* 移除URL
|
|
31
|
+
* 移除URL中的指定参数(通过Vue Router API,确保状态同步)
|
|
26
32
|
* @param {string} name - 参数名
|
|
27
33
|
*/
|
|
28
34
|
function removeQueryParam(name) {
|
|
29
|
-
if (!isBrowser())
|
|
35
|
+
if (!isBrowser() || !router) {
|
|
36
|
+
// 无Vue Router时降级使用原生方法
|
|
37
|
+
_removeQueryParamNative(name);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// 使用Vue Router的replace方法修改query(核心逻辑)
|
|
42
|
+
const currentQuery = { ...router.currentRoute.value.query };
|
|
43
|
+
if (currentQuery[name] !== undefined) {
|
|
44
|
+
delete currentQuery[name]; // 删除目标参数
|
|
45
|
+
// 调用Vue Router的replace,确保路由状态同步
|
|
46
|
+
router.replace({
|
|
47
|
+
...router.currentRoute.value,
|
|
48
|
+
query: currentQuery
|
|
49
|
+
}).catch(err => {
|
|
50
|
+
// 忽略导航重复的错误
|
|
51
|
+
if (!err.message.includes('NavigationDuplicated')) {
|
|
52
|
+
console.error('移除参数失败:', err);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
30
57
|
|
|
58
|
+
/**
|
|
59
|
+
* 原生移除参数的降级方法(无Vue Router时使用)
|
|
60
|
+
*/
|
|
61
|
+
function _removeQueryParamNative(name) {
|
|
31
62
|
const params = new URLSearchParams(window.location.search);
|
|
32
63
|
if (params.has(name)) {
|
|
33
64
|
params.delete(name);
|
|
@@ -38,17 +69,14 @@ function removeQueryParam(name) {
|
|
|
38
69
|
|
|
39
70
|
/**
|
|
40
71
|
* 获取当前完整URL(包含所有参数)
|
|
41
|
-
* @returns {string} 当前完整URL(如 local.watest.zlgx.com:3000?a=1)
|
|
42
72
|
*/
|
|
43
73
|
function getCurrentUrlWithParams() {
|
|
44
74
|
if (!isBrowser()) return '';
|
|
45
|
-
return window.location.href;
|
|
75
|
+
return window.location.href;
|
|
46
76
|
}
|
|
47
77
|
|
|
48
78
|
/**
|
|
49
|
-
*
|
|
50
|
-
* @param {Object} options - 用户配置
|
|
51
|
-
* @returns {Object} 合并后的配置
|
|
79
|
+
* 验证并合并配置(新增router参数)
|
|
52
80
|
*/
|
|
53
81
|
function validateAndMergeConfig(options = {}) {
|
|
54
82
|
const defaults = {
|
|
@@ -59,12 +87,17 @@ function validateAndMergeConfig(options = {}) {
|
|
|
59
87
|
tokenApi: '',
|
|
60
88
|
refreshCodeApi: '',
|
|
61
89
|
logoutApi: '',
|
|
62
|
-
logOutUrl: ''
|
|
90
|
+
logOutUrl: '',
|
|
91
|
+
router: null // 允许传入Vue Router实例
|
|
63
92
|
};
|
|
64
93
|
|
|
65
94
|
const merged = { ...defaults, ...options };
|
|
95
|
+
// 验证router(如果传入则必须是Vue Router实例)
|
|
96
|
+
if (merged.router && typeof merged.router.replace !== 'function') {
|
|
97
|
+
throw new Error('传入的router必须是Vue Router实例');
|
|
98
|
+
}
|
|
66
99
|
|
|
67
|
-
//
|
|
100
|
+
// 基础验证(保持不变)
|
|
68
101
|
if (typeof merged.accessCodeKey !== 'string' || merged.accessCodeKey.trim() === '') {
|
|
69
102
|
throw new Error('accessCodeKey必须是有效的字符串');
|
|
70
103
|
}
|
|
@@ -76,16 +109,28 @@ function validateAndMergeConfig(options = {}) {
|
|
|
76
109
|
}
|
|
77
110
|
|
|
78
111
|
/**
|
|
79
|
-
* 初始化SDK
|
|
80
|
-
* @param {Object} options - 配置参数
|
|
81
|
-
* @returns {Promise<Object>} 接口返回结果
|
|
112
|
+
* 初始化SDK(新增路由钩子注册)
|
|
82
113
|
*/
|
|
83
114
|
export async function init(options = {}) {
|
|
84
115
|
try {
|
|
85
116
|
config = validateAndMergeConfig(options);
|
|
117
|
+
router = config.router; // 存储router实例
|
|
86
118
|
|
|
87
119
|
const accessCode = getQueryParam(config.accessCodeKey);
|
|
88
|
-
|
|
120
|
+
|
|
121
|
+
// 关键:在路由导航完成后再移除参数(确保重定向后执行)
|
|
122
|
+
if (router) {
|
|
123
|
+
// 注册一次afterEach钩子,移除参数后销毁
|
|
124
|
+
const removeHook = router.afterEach(() => {
|
|
125
|
+
removeQueryParam(config.accessCodeKey);
|
|
126
|
+
removeHook(); // 执行后立即销毁钩子,避免重复调用
|
|
127
|
+
});
|
|
128
|
+
} else {
|
|
129
|
+
// 无router时直接移除(可能需要延迟,应对原生重定向)
|
|
130
|
+
setTimeout(() => removeQueryParam(config.accessCodeKey), 0);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// 后续逻辑保持不变...
|
|
89
134
|
if (!config.tokenApi) {
|
|
90
135
|
return { code: -100, msg: `缺少tokenApi`, success: false };
|
|
91
136
|
}
|
|
@@ -102,10 +147,8 @@ export async function init(options = {}) {
|
|
|
102
147
|
if (result.code === 0 && result.data) {
|
|
103
148
|
localStorage.setItem(config.tokenKey, result.data);
|
|
104
149
|
}
|
|
105
|
-
setTimeout(() => removeQueryParam(config.accessCodeKey), 300);
|
|
106
150
|
return result;
|
|
107
151
|
} else if (!getToken()) {
|
|
108
|
-
// 跳转时携带完整URL参数(如 local.watest.zlgx.com:3000?a=1)
|
|
109
152
|
window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
|
|
110
153
|
}
|
|
111
154
|
|
|
@@ -115,27 +158,17 @@ export async function init(options = {}) {
|
|
|
115
158
|
}
|
|
116
159
|
}
|
|
117
160
|
|
|
118
|
-
|
|
119
|
-
* 获取localStorage中的token
|
|
120
|
-
* @returns {string|null} token值
|
|
121
|
-
*/
|
|
161
|
+
// 其他方法(getToken、removeToken、logout、toUrl、getAccessCode)保持不变...
|
|
122
162
|
export function getToken() {
|
|
123
163
|
if (!config || !isBrowser()) return null;
|
|
124
164
|
return localStorage.getItem(config.tokenKey);
|
|
125
165
|
}
|
|
126
166
|
|
|
127
|
-
/**
|
|
128
|
-
* 删除localStorage中的token
|
|
129
|
-
*/
|
|
130
167
|
export function removeToken() {
|
|
131
168
|
if (!config || !isBrowser()) return;
|
|
132
169
|
localStorage.removeItem(config.tokenKey);
|
|
133
170
|
}
|
|
134
171
|
|
|
135
|
-
/**
|
|
136
|
-
* 退出登录
|
|
137
|
-
* @returns {Promise<Object>} 接口返回结果
|
|
138
|
-
*/
|
|
139
172
|
export async function logout() {
|
|
140
173
|
if (!config) {
|
|
141
174
|
return { code: -101, msg: '请先调用init方法初始化', success: false };
|
|
@@ -144,34 +177,32 @@ export async function logout() {
|
|
|
144
177
|
if (!config.logoutApi) {
|
|
145
178
|
return { code: -102, msg: '未配置logoutApi', success: false };
|
|
146
179
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
180
|
+
if (getToken()) {
|
|
181
|
+
try {
|
|
182
|
+
const result = await request(
|
|
183
|
+
config.logoutApi,
|
|
184
|
+
'POST',
|
|
185
|
+
{},
|
|
186
|
+
{ ...config.headers, [config.tokenKey]: getToken() },
|
|
187
|
+
config.timeout
|
|
188
|
+
);
|
|
189
|
+
removeToken();
|
|
190
|
+
if (config.logOutUrl && isBrowser()) {
|
|
191
|
+
window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
|
|
192
|
+
}
|
|
193
|
+
return result;
|
|
194
|
+
} catch (error) {
|
|
195
|
+
return { code: -103, msg: `退出失败: ${error.message}`, success: false };
|
|
196
|
+
}
|
|
197
|
+
} else {
|
|
157
198
|
removeToken();
|
|
158
|
-
|
|
159
199
|
if (config.logOutUrl && isBrowser()) {
|
|
160
|
-
// 携带完整URL参数跳转
|
|
161
200
|
window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
|
|
162
201
|
}
|
|
163
|
-
|
|
164
|
-
return result;
|
|
165
|
-
} catch (error) {
|
|
166
|
-
return { code: -103, msg: `退出失败: ${error.message}`, success: false };
|
|
167
202
|
}
|
|
203
|
+
|
|
168
204
|
}
|
|
169
205
|
|
|
170
|
-
/**
|
|
171
|
-
* 用token换取新accessCode并跳转
|
|
172
|
-
* @param {string} redirectUrl - 目标跳转地址
|
|
173
|
-
* @returns {Promise<Object>} 接口返回结果
|
|
174
|
-
*/
|
|
175
206
|
export async function toUrl(redirectUrl) {
|
|
176
207
|
if (!config) {
|
|
177
208
|
return { code: -101, msg: '请先调用init方法初始化', success: false };
|
|
@@ -188,7 +219,6 @@ export async function toUrl(redirectUrl) {
|
|
|
188
219
|
const token = getToken();
|
|
189
220
|
if (!token) {
|
|
190
221
|
if (config.logOutUrl && isBrowser()) {
|
|
191
|
-
// 携带完整URL参数跳转
|
|
192
222
|
window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(getCurrentUrlWithParams())}`;
|
|
193
223
|
}
|
|
194
224
|
return { code: -106, msg: '未找到有效token', success: false };
|
|
@@ -215,15 +245,11 @@ export async function toUrl(redirectUrl) {
|
|
|
215
245
|
}
|
|
216
246
|
}
|
|
217
247
|
|
|
218
|
-
/**
|
|
219
|
-
* 获取accessCode(修复token未定义问题)
|
|
220
|
-
* @returns {Promise<Object>} 接口返回结果
|
|
221
|
-
*/
|
|
222
248
|
export const getAccessCode = async () => {
|
|
223
249
|
if (!config) {
|
|
224
250
|
return { code: -101, msg: '请先调用init方法初始化', success: false };
|
|
225
251
|
}
|
|
226
|
-
const token = getToken();
|
|
252
|
+
const token = getToken();
|
|
227
253
|
if (!token) {
|
|
228
254
|
return { code: -106, msg: '未找到有效token', success: false };
|
|
229
255
|
}
|
|
@@ -231,12 +257,11 @@ export const getAccessCode = async () => {
|
|
|
231
257
|
config.refreshCodeApi,
|
|
232
258
|
'POST',
|
|
233
259
|
{},
|
|
234
|
-
{ ...config.headers, [config.tokenKey]: token },
|
|
260
|
+
{ ...config.headers, [config.tokenKey]: token },
|
|
235
261
|
config.timeout
|
|
236
262
|
);
|
|
237
263
|
};
|
|
238
264
|
|
|
239
|
-
// 默认导出(修复方法名拼写错误:getCode → getAccessCode)
|
|
240
265
|
export default {
|
|
241
266
|
init,
|
|
242
267
|
getToken,
|
|
@@ -244,4 +269,4 @@ export default {
|
|
|
244
269
|
logout,
|
|
245
270
|
toUrl,
|
|
246
271
|
getAccessCode
|
|
247
|
-
};
|
|
272
|
+
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
|