w-web-sso 1.0.0

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.
Files changed (102) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.js +55 -0
  4. package/.github/workflows/ci-test.yml +24 -0
  5. package/.jsdoc +25 -0
  6. package/.vscode/launch.json +20 -0
  7. package/LICENSE +21 -0
  8. package/README.md +25 -0
  9. package/SECURITY.md +5 -0
  10. package/babel.config.js +15 -0
  11. package/dist/css/app.969ad1db.css +1 -0
  12. package/dist/index.tmp +3 -0
  13. package/dist/js/app-legacy.ff64be1c.js +2 -0
  14. package/dist/js/app-legacy.ff64be1c.js.map +1 -0
  15. package/dist/js/app.ff64be1c.js +2 -0
  16. package/dist/js/app.ff64be1c.js.map +1 -0
  17. package/dist/js/chunk-vendors-legacy.0bb7a31b.js +13 -0
  18. package/dist/js/chunk-vendors-legacy.0bb7a31b.js.map +1 -0
  19. package/dist/js/chunk-vendors.0bb7a31b.js +13 -0
  20. package/dist/js/chunk-vendors.0bb7a31b.js.map +1 -0
  21. package/dist/w-web-sso.umd.js +7 -0
  22. package/dist/w-web-sso.umd.js.map +1 -0
  23. package/docs/WWebSso.html +938 -0
  24. package/docs/WWebSso.mjs.html +721 -0
  25. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  26. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  27. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  28. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  29. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  30. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  31. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  32. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  33. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  34. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  35. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  36. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  37. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  38. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  39. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  40. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  41. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  42. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  43. package/docs/index.html +84 -0
  44. package/docs/scripts/collapse.js +39 -0
  45. package/docs/scripts/commonNav.js +28 -0
  46. package/docs/scripts/linenumber.js +25 -0
  47. package/docs/scripts/nav.js +12 -0
  48. package/docs/scripts/polyfill.js +4 -0
  49. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  50. package/docs/scripts/prettify/lang-css.js +2 -0
  51. package/docs/scripts/prettify/prettify.js +28 -0
  52. package/docs/scripts/search.js +99 -0
  53. package/docs/styles/jsdoc.css +776 -0
  54. package/docs/styles/prettify.css +80 -0
  55. package/g.backupDb.mjs +10 -0
  56. package/g.getSettings.mjs +17 -0
  57. package/g.initialData.mjs +94 -0
  58. package/g.initialTestData.mjs +21 -0
  59. package/g.mOrm.mjs +24 -0
  60. package/g.provideUsers.mjs +45 -0
  61. package/package.json +70 -0
  62. package/public/index.html +30 -0
  63. package/script.txt +22 -0
  64. package/server/WWebSso.mjs +649 -0
  65. package/server/hashPassword.mjs +27 -0
  66. package/server/proc.mjs +543 -0
  67. package/server/provideUsers.mjs +68 -0
  68. package/src/App.vue +123 -0
  69. package/src/components/Common/CheckYes.vue +85 -0
  70. package/src/components/Common/CheckYesNo.vue +91 -0
  71. package/src/components/Common/LabelItem.vue +106 -0
  72. package/src/components/Common/LoadingWinBar.vue +115 -0
  73. package/src/components/Layout.vue +160 -0
  74. package/src/components/LayoutContent.vue +193 -0
  75. package/src/components/LayoutContentUsers.vue +498 -0
  76. package/src/components/LayoutState.vue +91 -0
  77. package/src/components/PageLogin.vue +524 -0
  78. package/src/components/VeUser.vue +446 -0
  79. package/src/components/ruleGroup.vue +645 -0
  80. package/src/main.js +97 -0
  81. package/src/plugins/mDataSelectorSchema.mjs +30 -0
  82. package/src/plugins/mDataSupport.mjs +23 -0
  83. package/src/plugins/mShare.mjs +229 -0
  84. package/src/plugins/mUI.mjs +229 -0
  85. package/src/schema/gi.mjs +8 -0
  86. package/src/schema/index.mjs +18 -0
  87. package/src/schema/tables/tokens.mjs +70 -0
  88. package/src/schema/tables/users.mjs +110 -0
  89. package/src/store/actions.mjs +1 -0
  90. package/src/store/getters.mjs +1 -0
  91. package/src/store/index.mjs +25 -0
  92. package/src/store/mutations.mjs +333 -0
  93. package/src/store/types.mjs +15 -0
  94. package/srv.mjs +84 -0
  95. package/tableTags-web-sso.json +1 -0
  96. package/test/all.test.mjs +10 -0
  97. package/toolg/addVersion.mjs +4 -0
  98. package/toolg/cleanFolder.mjs +4 -0
  99. package/toolg/gDistRollup.mjs +36 -0
  100. package/toolg/genEntry.mjs +23 -0
  101. package/toolg/modifyReadme.mjs +4 -0
  102. package/vue.config.js +15 -0
@@ -0,0 +1,91 @@
1
+ <template>
2
+ <div
3
+ :style="`position:absolute; top:0px; left:0px; width:100%; height:100%; transition:all 0.5s linear; display:flex; align-items:center; justify-content:center;`"
4
+ >
5
+
6
+ <template v-if="connState==='已連線' || connState==='連線中...'">
7
+
8
+ <img style="width:100px; height:100px;" :src="img_connection">
9
+
10
+ <div style="margin-left:10px;">
11
+ <div style="color:#aaa;">
12
+ {{connState}}
13
+ </div>
14
+ </div>
15
+
16
+ </template>
17
+
18
+ <template v-else-if="connState==='已登出'">
19
+
20
+ <img style="width:75px; height:75px;" :src="img_logout">
21
+
22
+ <div style="margin-left:10px;">
23
+ <div style="color:#aaa;">
24
+ {{connState}}
25
+ </div>
26
+ </div>
27
+
28
+ </template>
29
+
30
+ <template v-else-if="connState==='無法連線'">
31
+
32
+ <img style="width:75px; height:75px;" :src="img_dissconnection">
33
+
34
+ <div style="margin-left:10px;">
35
+ <div style="color:#aaa;">
36
+ {{connState}}
37
+ </div>
38
+ </div>
39
+
40
+ </template>
41
+
42
+ <template v-else>
43
+
44
+ <img style="width:75px; height:75px;" :src="img_deny">
45
+
46
+ <div style="margin-left:10px;">
47
+ <div style="color:#aaa;">
48
+ {{connState}}
49
+ </div>
50
+ </div>
51
+
52
+ </template>
53
+
54
+ </div>
55
+ </template>
56
+
57
+ <script>
58
+ import get from 'lodash-es/get.js'
59
+
60
+
61
+ export default {
62
+ components: {
63
+ },
64
+ props: {
65
+ },
66
+ data: function() {
67
+ return {
68
+ img_connection: `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+DQo8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSIxMy44MTkzIiBmaWxsPSJub25lIiBzdHJva2U9IiM1ZjJhNjIiIHN0cm9rZS13aWR0aD0iMiI+DQogIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9InIiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjEuMjY1ODIyNzg0ODEwMTI2NHMiIHZhbHVlcz0iMDs0NCIga2V5VGltZXM9IjA7MSIga2V5U3BsaW5lcz0iMCAwLjIgMC44IDEiIGNhbGNNb2RlPSJzcGxpbmUiIGJlZ2luPSItMC42MzI5MTEzOTI0MDUwNjMycyI+PC9hbmltYXRlPg0KICA8YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJvcGFjaXR5IiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgZHVyPSIxLjI2NTgyMjc4NDgxMDEyNjRzIiB2YWx1ZXM9IjE7MCIga2V5VGltZXM9IjA7MSIga2V5U3BsaW5lcz0iMC4yIDAgMC44IDEiIGNhbGNNb2RlPSJzcGxpbmUiIGJlZ2luPSItMC42MzI5MTEzOTI0MDUwNjMycyI+PC9hbmltYXRlPg0KPC9jaXJjbGU+DQo8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSIzNS44MTY1IiBmaWxsPSJub25lIiBzdHJva2U9IiNhOTc2YzMiIHN0cm9rZS13aWR0aD0iMiI+DQogIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9InIiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjEuMjY1ODIyNzg0ODEwMTI2NHMiIHZhbHVlcz0iMDs0NCIga2V5VGltZXM9IjA7MSIga2V5U3BsaW5lcz0iMCAwLjIgMC44IDEiIGNhbGNNb2RlPSJzcGxpbmUiPjwvYW5pbWF0ZT4NCiAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0ib3BhY2l0eSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIGR1cj0iMS4yNjU4MjI3ODQ4MTAxMjY0cyIgdmFsdWVzPSIxOzAiIGtleVRpbWVzPSIwOzEiIGtleVNwbGluZXM9IjAuMiAwIDAuOCAxIiBjYWxjTW9kZT0ic3BsaW5lIj48L2FuaW1hdGU+DQo8L2NpcmNsZT4NCjwvc3ZnPg==`,
69
+ img_logout: `data:image/png;base64,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`,
70
+ img_dissconnection: `data:image/png;base64,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`,
71
+ img_deny: `data:image/png;base64,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`,
72
+ }
73
+ },
74
+ computed: {
75
+
76
+ connState: function() {
77
+ //console.log('computed loading')
78
+
79
+ let vo = this
80
+
81
+ return get(vo, `$store.state.connState`)
82
+ },
83
+
84
+ },
85
+ methods: {
86
+ }
87
+ }
88
+ </script>
89
+
90
+ <style scoped>
91
+ </style>
@@ -0,0 +1,524 @@
1
+ <template>
2
+ <div style="position:relative; width:100vw; height:100svh;">
3
+
4
+ <template v-if="!autoLogining">
5
+
6
+ <div
7
+ :style="`
8
+ position:absolute; top:0px; left:0px; width:100%; height:100%; display:flex; align-items:center; justify-content:center;
9
+ background-image: linear-gradient(-225deg, ${c1} 0%, ${c2} 50%, ${c3} 100%);
10
+ `"
11
+ >
12
+
13
+ <div style="">
14
+
15
+ <div :style="`padding-top:${logoSize/2}px;`"></div>
16
+
17
+ <div
18
+ :style="`
19
+ position:relative;
20
+ width:${contentWidth}px; padding:10px; border-radius:30px; background:${c4};
21
+ box-shadow: rgb(0 0 0 / 2%) 2.76726px 2.76726px 2.21381px 0px, rgb(0 0 0 / 3%) 6.6501px 6.6501px 5.32008px 0px, rgb(0 0 0 / 4%) 12.5216px 12.5216px 10.0172px 0px, rgb(0 0 0 / 4%) 22.3363px 22.3363px 17.869px 0px, rgb(0 0 0 / 5%) 41.7776px 41.7776px 33.4221px 0px, rgb(0 0 0 / 7%) 100px 100px 80px 0px;
22
+ `"
23
+ >
24
+
25
+ <div :style="`position:absolute; top:0px; left:50%; transform:translateX(-50%) translateY(-50%); padding:15px 15px 10px 15px; border-radius:50%; background:${c5};`">
26
+ <img :width="logoSize" :height="logoSize" :src="webLogo">
27
+ </div>
28
+
29
+ <div :style="`padding:${logoSize/2+contentPadding}px ${contentPadding}px ${contentPadding}px ${contentPadding}px;`">
30
+
31
+ <div style="padding-bottom:20px; text-align:center; font-size:1.3rem;">
32
+ {{webName}}
33
+ </div>
34
+
35
+ <div style="display:flex; align-items:stretch;">
36
+
37
+ <div style="display:flex; align-items:center; padding:0px 10px; background:rgba(34, 44, 77, 0.9);">
38
+ <WIcon
39
+ :icon="'mdi-account'"
40
+ :color="'#ddd'"
41
+ :colorHover="'#eee'"
42
+ :size="24"
43
+ ></WIcon>
44
+ </div>
45
+
46
+ <div style="width:100%; padding:5px 10px; background:rgba(34, 44, 77, 0.8);">
47
+
48
+ <div :style="`font-size:0.8rem; color:#eee;`">
49
+ {{$t('account')}}
50
+ </div>
51
+
52
+ <WText
53
+ :textColor="'#fff'"
54
+ :bottomLineBorderColor="'#b6b6b6'"
55
+ :bottomLineBorderColorHover="'#ccc'"
56
+ :bottomLineBorderColorFocus="'#ddd'"
57
+ v-model="account"
58
+ @enter="login"
59
+ ></WText>
60
+
61
+ </div>
62
+
63
+ </div>
64
+
65
+ <div style="padding-top:10px"></div>
66
+
67
+ <div style="display:flex; align-items:stretch;">
68
+
69
+ <div style="display:flex; align-items:center; padding:0px 10px; background:rgba(34, 44, 77, 0.9);">
70
+ <WIcon
71
+ :icon="'mdi-lock'"
72
+ :color="'#ddd'"
73
+ :colorHover="'#eee'"
74
+ :size="24"
75
+ ></WIcon>
76
+ </div>
77
+
78
+ <div style="width:100%; padding:5px 10px; background:rgba(34, 44, 77, 0.8);">
79
+
80
+ <div :style="`font-size:0.8rem; color:#eee;`">
81
+ {{$t('password')}}
82
+ </div>
83
+
84
+ <WText
85
+ :textColor="'#fff'"
86
+ :bottomLineBorderColor="'#b6b6b6'"
87
+ :bottomLineBorderColorHover="'#ccc'"
88
+ :bottomLineBorderColorFocus="'#ddd'"
89
+ :rightIcon="showPassword ? 'mdi-eye' : 'mdi-eye-off'"
90
+ :rightIconColor="'#ddd'"
91
+ :rightIconColorHover="'#eee'"
92
+ :rightIconColorFocus="'#ddd'"
93
+ :rightIconTooltip="showPassword ? '顯示密碼':'隱藏密碼'"
94
+ :password="!showPassword"
95
+ v-model="password"
96
+ @click-right="showPassword=!showPassword"
97
+ @enter="login"
98
+ ></WText>
99
+
100
+ </div>
101
+
102
+ </div>
103
+
104
+ <div style="padding-top:30px"></div>
105
+
106
+ <div style="padding:5px 0px; text-align:center;">
107
+ <WButtonChip
108
+ :style="`opacity:${hasAcPw?1:0.5};`"
109
+ :text="$t('login')"
110
+ :textFontSize="'1.0rem'"
111
+ :paddingStyle="{v:8,h:130}"
112
+ :backgroundColor="'rgba(255,255,255,0.5)'"
113
+ :backgroundColorHover="'rgba(255,255,255,0.7)'"
114
+ _shadow="false"
115
+ :editable="hasAcPw"
116
+ @click="login"
117
+ ></WButtonChip>
118
+ </div>
119
+
120
+ </div>
121
+
122
+ </div>
123
+
124
+ </div>
125
+
126
+ </div>
127
+
128
+ <div style="position:absolute; top:10px; right:10px;">
129
+ <div style="_white-space:nowrap">
130
+ <WTextSelect
131
+ style="width:100px;"
132
+ :items="tgLangs"
133
+ v-model="tgLangSelect"
134
+ @input="changeLang"
135
+ ></WTextSelect>
136
+ </div>
137
+ </div>
138
+
139
+ </template>
140
+
141
+ <div
142
+ style="position:absolute; top:0px; left:0px; width:100%; height:100%; display:flex; align-items:center; justify-content:center;"
143
+ v-else
144
+ >
145
+ <svg xmlns="http://www.w3.org/2000/svg" width="30px" height="30px" viewBox="0 0 24 24"><rect width="9" height="9" x="1.5" y="1.5" fill="currentColor" rx="1"><animate id="svgSpinnersBlocksScale0" attributeName="x" begin="0;svgSpinnersBlocksScale1.end+0.15s" dur="0.6s" keyTimes="0;.2;1" values="1.5;.5;1.5"/><animate attributeName="y" begin="0;svgSpinnersBlocksScale1.end+0.15s" dur="0.6s" keyTimes="0;.2;1" values="1.5;.5;1.5"/><animate attributeName="width" begin="0;svgSpinnersBlocksScale1.end+0.15s" dur="0.6s" keyTimes="0;.2;1" values="9;11;9"/><animate attributeName="height" begin="0;svgSpinnersBlocksScale1.end+0.15s" dur="0.6s" keyTimes="0;.2;1" values="9;11;9"/></rect><rect width="9" height="9" x="13.5" y="1.5" fill="currentColor" rx="1"><animate attributeName="x" begin="svgSpinnersBlocksScale0.begin+0.15s" dur="0.6s" keyTimes="0;.2;1" values="13.5;12.5;13.5"/><animate attributeName="y" begin="svgSpinnersBlocksScale0.begin+0.15s" dur="0.6s" keyTimes="0;.2;1" values="1.5;.5;1.5"/><animate attributeName="width" begin="svgSpinnersBlocksScale0.begin+0.15s" dur="0.6s" keyTimes="0;.2;1" values="9;11;9"/><animate attributeName="height" begin="svgSpinnersBlocksScale0.begin+0.15s" dur="0.6s" keyTimes="0;.2;1" values="9;11;9"/></rect><rect width="9" height="9" x="13.5" y="13.5" fill="currentColor" rx="1"><animate attributeName="x" begin="svgSpinnersBlocksScale0.begin+0.3s" dur="0.6s" keyTimes="0;.2;1" values="13.5;12.5;13.5"/><animate attributeName="y" begin="svgSpinnersBlocksScale0.begin+0.3s" dur="0.6s" keyTimes="0;.2;1" values="13.5;12.5;13.5"/><animate attributeName="width" begin="svgSpinnersBlocksScale0.begin+0.3s" dur="0.6s" keyTimes="0;.2;1" values="9;11;9"/><animate attributeName="height" begin="svgSpinnersBlocksScale0.begin+0.3s" dur="0.6s" keyTimes="0;.2;1" values="9;11;9"/></rect><rect width="9" height="9" x="1.5" y="13.5" fill="currentColor" rx="1"><animate id="svgSpinnersBlocksScale1" attributeName="x" begin="svgSpinnersBlocksScale0.begin+0.45s" dur="0.6s" keyTimes="0;.2;1" values="1.5;.5;1.5"/><animate attributeName="y" begin="svgSpinnersBlocksScale0.begin+0.45s" dur="0.6s" keyTimes="0;.2;1" values="13.5;12.5;13.5"/><animate attributeName="width" begin="svgSpinnersBlocksScale0.begin+0.45s" dur="0.6s" keyTimes="0;.2;1" values="9;11;9"/><animate attributeName="height" begin="svgSpinnersBlocksScale0.begin+0.45s" dur="0.6s" keyTimes="0;.2;1" values="9;11;9"/></rect></svg>
146
+ </div>
147
+
148
+ </div>
149
+ </template>
150
+
151
+ <script>
152
+ import get from 'lodash-es/get.js'
153
+ import isestr from 'wsemi/src/isestr.mjs'
154
+ import isDev from 'wsemi/src/isDev.mjs'
155
+ import delay from 'wsemi/src/delay.mjs'
156
+ import waitFun from 'wsemi/src/waitFun.mjs'
157
+ import WIcon from 'w-component-vue/src/components/WIcon.vue'
158
+ import WText from 'w-component-vue/src/components/WText.vue'
159
+ import WTextSelect from 'w-component-vue/src/components/WTextSelect.vue'
160
+ import WButtonChip from 'w-component-vue/src/components/WButtonChip.vue'
161
+
162
+
163
+ export default {
164
+ components: {
165
+ WIcon,
166
+ WText,
167
+ WTextSelect,
168
+ WButtonChip,
169
+ },
170
+ props: {
171
+ },
172
+ data: function() {
173
+ return {
174
+
175
+ tgLangs: [
176
+ {
177
+ id: 'cht',
178
+ text: '中文',
179
+ },
180
+ {
181
+ id: 'eng',
182
+ text: 'English',
183
+ },
184
+ ],
185
+ tgLangSelect: {
186
+ id: 'cht',
187
+ text: '中文',
188
+ },
189
+
190
+ logoSize: 120,
191
+
192
+ contentWidth: 380,
193
+ contentPadding: 30,
194
+
195
+ autoLogining: true,
196
+
197
+ account: '',
198
+
199
+ showPassword: false,
200
+ password: '',
201
+
202
+ }
203
+ },
204
+ mounted: function() {
205
+ let vo = this
206
+
207
+ //autoLogin
208
+ vo.autoLogin()
209
+
210
+ },
211
+ computed: {
212
+
213
+ connState: function() {
214
+ //console.log('computed loading')
215
+
216
+ let vo = this
217
+
218
+ return get(vo, `$store.state.connState`)
219
+ },
220
+
221
+ syncState: function() {
222
+ //console.log('computed syncState')
223
+
224
+ let vo = this
225
+
226
+ return get(vo, '$store.state.syncState')
227
+ },
228
+
229
+ viewState: function() {
230
+ //console.log('computed viewState')
231
+
232
+ let vo = this
233
+
234
+ return get(vo, `$store.state.viewState`, '')
235
+ },
236
+
237
+ heightToolbar: function() {
238
+ //console.log('computed heightToolbar')
239
+
240
+ let vo = this
241
+
242
+ return get(vo, `$store.state.heightToolbar`, 0)
243
+ },
244
+
245
+ webName: {
246
+ get() {
247
+ let vo = this
248
+ let c = vo.$t('webName', '')
249
+ // console.log('get webName1', c)
250
+ if (!isestr(c)) {
251
+ c = vo.$t('waitingData', '')
252
+ }
253
+ // console.log('get webName2', c)
254
+ document.title = c //更換網頁title
255
+ return c
256
+ },
257
+ // set(value) {
258
+ // return value
259
+ // },
260
+ },
261
+
262
+ webLogo: function() {
263
+ //console.log('computed webLogo')
264
+
265
+ let vo = this
266
+
267
+ return get(vo, `$store.state.webInfor.webLogo`, '')
268
+ },
269
+
270
+ webBackgoundGradientColors: function() {
271
+ //console.log('computed webBackgoundGradientColors')
272
+
273
+ let vo = this
274
+
275
+ return get(vo, `$store.state.webInfor.webBackgoundGradientColors`, [])
276
+ },
277
+
278
+ c1: function() {
279
+ let vo = this
280
+ let c = get(vo, 'webBackgoundGradientColors.0', '#fff')
281
+ return c
282
+ },
283
+
284
+ c2: function() {
285
+ let vo = this
286
+ let c = get(vo, 'webBackgoundGradientColors.1', '#fff')
287
+ return c
288
+ },
289
+
290
+ c3: function() {
291
+ let vo = this
292
+ let c = get(vo, 'webBackgoundGradientColors.2', '#fff')
293
+ return c
294
+ },
295
+
296
+ c4: function() {
297
+ let vo = this
298
+ let c = get(vo, 'webBackgoundGradientColors.3', '#fff')
299
+ return c
300
+ },
301
+
302
+ c5: function() {
303
+ let vo = this
304
+ let c = get(vo, 'webBackgoundGradientColors.4', '#fff')
305
+ return c
306
+ },
307
+
308
+ webKey: function() {
309
+ //console.log('computed webKey')
310
+
311
+ let vo = this
312
+
313
+ return get(vo, `$store.state.webInfor.webKey`, '')
314
+ },
315
+
316
+ hasAcPw: function() {
317
+ //console.log('computed loading')
318
+
319
+ let vo = this
320
+
321
+ return isestr(vo.account) && isestr(vo.password)
322
+ },
323
+
324
+ },
325
+ methods: {
326
+
327
+ changeLang: function(msg) {
328
+ // console.log('methods changeLang', msg)
329
+ let vo = this
330
+ let lang = msg.id
331
+ vo.$ui.setLang(lang)
332
+ },
333
+
334
+ goUrl: function(url, token) {
335
+ // let vo = this
336
+
337
+ //replace
338
+ url = url.replaceAll('{token}', token)
339
+
340
+ //href
341
+ if (isDev()) {
342
+ console.log('60s後重導至:', url)
343
+ setTimeout(() => {
344
+ window.location.href = url
345
+ }, 60 * 1000)
346
+ }
347
+ else {
348
+ window.location.href = url
349
+ }
350
+
351
+ },
352
+
353
+ autoLogin: function() {
354
+ let vo = this
355
+
356
+ async function core() {
357
+ let errTemp = null
358
+
359
+ //check
360
+ if (!vo.autoLogining) {
361
+ return
362
+ }
363
+
364
+ //waitFun, 因須使用webKey故須等待syncState
365
+ await waitFun(() => {
366
+ return vo.syncState
367
+ })
368
+
369
+ //$keyLS
370
+ let $keyLS = vo.webKey
371
+
372
+ //check
373
+ if (!isestr($keyLS)) {
374
+ vo.autoLogining = false
375
+
376
+ //alert
377
+ vo.$alert(vo.$t('failedLoginForNoWebKey'), { type: 'error' })
378
+
379
+ return
380
+ }
381
+
382
+ //key
383
+ let key = `${$keyLS}:userToken`
384
+ // console.log('key', key)
385
+
386
+ //getItem
387
+ let token = await localStorage.getItem(key)
388
+ // console.log('token', token)
389
+
390
+ //checkToken
391
+ await vo.$fapi.checkToken(token)
392
+ .catch((err) => {
393
+ errTemp = err
394
+ //無有效token改為提供使用者進行帳密登入
395
+ })
396
+ if (errTemp) {
397
+ vo.autoLogining = false
398
+ return
399
+ }
400
+
401
+ //getUserByToken
402
+ let u = await vo.$fapi.getUserByToken(token)
403
+ // console.log('getUserByToken u', u)
404
+
405
+ //redir
406
+ let redir = get(u, 'redir', '')
407
+ // console.log('redir', redir)
408
+
409
+ //check
410
+ if (!isestr(redir)) {
411
+ vo.autoLogining = false
412
+
413
+ //alert
414
+ vo.$alert(vo.$t('failedLoginForNoRedir'), { type: 'error' })
415
+
416
+ return
417
+ }
418
+
419
+ //goUrl
420
+ vo.goUrl(redir, token)
421
+
422
+ //autoLogining
423
+ vo.autoLogining = false
424
+
425
+ }
426
+
427
+ //core
428
+ core()
429
+ .catch((err) => {
430
+ console.log('autoLogin', err)
431
+
432
+ //alert
433
+ vo.$alert(vo.$t('failedLoginForCatch'), { type: 'error' })
434
+
435
+ })
436
+ .finally(() => {
437
+
438
+ //hide loading
439
+ vo.$ui.updateLoading(false)
440
+
441
+ })
442
+
443
+ },
444
+
445
+ login: function() {
446
+ let vo = this
447
+
448
+ async function core() {
449
+
450
+ //show loading
451
+ vo.$ui.updateLoading(true)
452
+
453
+ //delay
454
+ await delay(1000)
455
+
456
+ //$keyLS
457
+ let $keyLS = vo.webKey
458
+
459
+ //check
460
+ if (!isestr($keyLS)) {
461
+ return Promise.reject(vo.$t('failedLoginForNoWebKey'))
462
+ }
463
+
464
+ //key
465
+ let key = `${$keyLS}:userToken`
466
+ // console.log('key', key)
467
+
468
+ //loginByAccountAndPassword
469
+ let u = await vo.$fapi.loginByAccountAndPassword(vo.account, vo.password)
470
+ // console.log('u', u)
471
+
472
+ //setItem
473
+ await localStorage.setItem(key, '')
474
+
475
+ //token
476
+ let token = get(u, 'token', '')
477
+ // console.log('token', token)
478
+
479
+ //check
480
+ if (!isestr(token)) {
481
+ return Promise.reject(vo.$t('failedLoginForNoToken'))
482
+ }
483
+
484
+ //setItem
485
+ await localStorage.setItem(key, token)
486
+
487
+ //redir
488
+ let redir = get(u, 'redir', '')
489
+ // console.log('redir', redir)
490
+
491
+ //check
492
+ if (!isestr(redir)) {
493
+ return Promise.reject(vo.$t('failedLoginForNoRedir'))
494
+ }
495
+
496
+ //goUrl
497
+ vo.goUrl(redir, token)
498
+
499
+ }
500
+
501
+ //core
502
+ core()
503
+ .catch((err) => {
504
+ console.log('login', err)
505
+
506
+ //alert
507
+ vo.$alert(vo.$t('failedLoginForCatch'), { type: 'error' })
508
+
509
+ })
510
+ .finally(() => {
511
+
512
+ //hide loading
513
+ vo.$ui.updateLoading(false)
514
+
515
+ })
516
+
517
+ },
518
+
519
+ }
520
+ }
521
+ </script>
522
+
523
+ <style scoped>
524
+ </style>