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 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
- 构建后会在`dist`目录生成`lgsso-sdk.js`文件,可直接引入使用。
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lgsso-sdk",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "LG SSO登录工具库,处理单点登录、token管理和系统间跳转",
5
5
  "main": "dist/lgsso-sdk.js",
6
6
  "types": "src/index.d.ts",
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-19 08:55:22
5
- * @FilePath: \lg-wms-admind:\业务代码\中联钢信\五服一管\complete-lgsso-sdk\src\index.d.ts
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()) return;
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; // 直接返回完整URL(含参数)
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
- removeQueryParam(config.accessCodeKey);
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
- try {
149
- const result = await request(
150
- config.logoutApi,
151
- 'POST',
152
- {},
153
- { ...config.headers, [config.tokenKey]: getToken() },
154
- config.timeout
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(); // 从localStorage获取token
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 }, // 使用获取到的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 */