@arkxos/arkos-theme-classic 0.1.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 (97) hide show
  1. package/README.md +36 -0
  2. package/ark_dist/ark-meta.json +81 -0
  3. package/ark_dist/ark_userChunk_1.js +5 -0
  4. package/ark_dist/ark_userChunk_2.js +5 -0
  5. package/ark_dist/ark_userChunk_3.js +49 -0
  6. package/ark_dist/config.js +79 -0
  7. package/ark_dist/css/layout.93396d23.css +125 -0
  8. package/ark_dist/favicon.ico +0 -0
  9. package/ark_dist/img/401.1800ba9e.gif +0 -0
  10. package/ark_dist/img/404.458c248a.png +0 -0
  11. package/ark_dist/img/404.png +0 -0
  12. package/ark_dist/img/auth_banner.jpg +0 -0
  13. package/ark_dist/img/avatar.jpg +0 -0
  14. package/ark_dist/img/avatar2.gif +0 -0
  15. package/ark_dist/img/avatar3.gif +0 -0
  16. package/ark_dist/img/login-background.1a699c00.jpg +0 -0
  17. package/ark_dist/img/loginbg.svg +1 -0
  18. package/ark_dist/img/logo-r.png +0 -0
  19. package/ark_dist/img/logo.png +0 -0
  20. package/ark_dist/img/no-widgets.svg +57 -0
  21. package/ark_dist/img/tasks-example.png +0 -0
  22. package/ark_dist/img/ver.svg +236 -0
  23. package/ark_dist/index.html +127 -0
  24. package/ark_dist/js/app.4a68e1f9.js +1 -0
  25. package/ark_dist/js/layout.661faa0e.js +3 -0
  26. package/ark_dist/js/layout.661faa0e.js.LICENSE.txt +6 -0
  27. package/ark_dist/js/layout.661faa0e.js.map +1 -0
  28. package/ark_proxy/entry.js +28 -0
  29. package/ark_proxy_es/entry.js +16 -0
  30. package/package.json +110 -0
  31. package/scripts/check.js +13 -0
  32. package/scripts/meta.js +21 -0
  33. package/scripts/prepublishOnly.js +28 -0
  34. package/src/assets/logo.png +0 -0
  35. package/src/auto-imports.d.ts +307 -0
  36. package/src/configs/subApp.ts +9 -0
  37. package/src/entrance/libProperties.ts +28 -0
  38. package/src/entrance/libTypes.ts +26 -0
  39. package/src/loadApp.ts +16 -0
  40. package/src/main.ts +18 -0
  41. package/src/os-themes/classic/assets/401_images/401.gif +0 -0
  42. package/src/os-themes/classic/assets/404_images/404.png +0 -0
  43. package/src/os-themes/classic/assets/404_images/404_cloud.png +0 -0
  44. package/src/os-themes/classic/assets/images/login-background.jpg +0 -0
  45. package/src/os-themes/classic/i18n/en.ts +39 -0
  46. package/src/os-themes/classic/i18n/zh-cn.ts +39 -0
  47. package/src/os-themes/classic/i18nFileBuilder/index.ts +19 -0
  48. package/src/os-themes/classic/images/tabs_images/ark-tab.png +0 -0
  49. package/src/os-themes/classic/index.js +19 -0
  50. package/src/os-themes/classic/layout/components/NavMenu.vue +56 -0
  51. package/src/os-themes/classic/layout/components/iframeView.vue +69 -0
  52. package/src/os-themes/classic/layout/components/search.vue +139 -0
  53. package/src/os-themes/classic/layout/components/setting.vue +95 -0
  54. package/src/os-themes/classic/layout/components/sideM.vue +137 -0
  55. package/src/os-themes/classic/layout/components/tags.vue +476 -0
  56. package/src/os-themes/classic/layout/components/tasks.vue +83 -0
  57. package/src/os-themes/classic/layout/components/topbar.vue +49 -0
  58. package/src/os-themes/classic/layout/components/userbar.vue +238 -0
  59. package/src/os-themes/classic/layout/index.vue +347 -0
  60. package/src/os-themes/classic/layout/other/404.vue +44 -0
  61. package/src/os-themes/classic/layout/other/autoExit.js +51 -0
  62. package/src/os-themes/classic/layout/other/empty.vue +3 -0
  63. package/src/os-themes/classic/router/routerStatic.js +103 -0
  64. package/src/os-themes/classic/router/scrollBehavior.js +22 -0
  65. package/src/os-themes/classic/router/systemRouter.js +36 -0
  66. package/src/os-themes/classic/store/index.js +6 -0
  67. package/src/os-themes/classic/store/modules/global.js +25 -0
  68. package/src/os-themes/classic/store/modules/iframe.js +40 -0
  69. package/src/os-themes/classic/store/modules/keepAlive.js +25 -0
  70. package/src/os-themes/classic/store/modules/viewTags.js +48 -0
  71. package/src/os-themes/classic/style/app.scss +318 -0
  72. package/src/os-themes/classic/style/dark.scss +42 -0
  73. package/src/os-themes/classic/style/fix.scss +87 -0
  74. package/src/os-themes/classic/style/media.scss +52 -0
  75. package/src/os-themes/classic/style/pages.scss +46 -0
  76. package/src/os-themes/classic/style/style.scss +5 -0
  77. package/src/os-themes/classic/utils/useTabs.js +66 -0
  78. package/src/os-themes/classic/views/bg.png +0 -0
  79. package/src/os-themes/classic/views/error/401.vue +82 -0
  80. package/src/os-themes/classic/views/error/404.vue +230 -0
  81. package/src/os-themes/classic/views/home.vue +13 -0
  82. package/src/os-themes/classic/views/login/components/commonPage.vue +35 -0
  83. package/src/os-themes/classic/views/login/components/passwordForm.vue +174 -0
  84. package/src/os-themes/classic/views/login/components/phoneForm.vue +74 -0
  85. package/src/os-themes/classic/views/login/index.vue +210 -0
  86. package/src/os-themes/classic/views/login/resetPassword.vue +125 -0
  87. package/src/os-themes/classic/views/login/userRegister.vue +174 -0
  88. package/src/os-themes/classic/views/redirect/index.vue +14 -0
  89. package/src/os-themes/classic/views/register.vue +219 -0
  90. package/src/shims-vue.d.ts +6 -0
  91. package/src/types/axios.d.ts +13 -0
  92. package/src/types/func.ts +14 -0
  93. package/src/types/global.d.ts +108 -0
  94. package/src/types/layout.d.ts +59 -0
  95. package/src/types/mitt.d.ts +40 -0
  96. package/src/types/pinia.d.ts +93 -0
  97. package/src/types/views.d.ts +27 -0
@@ -0,0 +1,174 @@
1
+ <template>
2
+ <el-form ref="loginForm" :model="form" :rules="rules" label-width="0" size="large" @submit.enter.prevent @keyup.enter.native="login">
3
+ <el-form-item prop="user">
4
+ <el-input v-model="form.user" prefix-icon="el-icon-user" clearable :placeholder="$t('login.userPlaceholder')">
5
+ <template #append>
6
+ <el-select v-model="userType" style="width: 130px;">
7
+ <el-option :label="$t('login.admin')" value="admin"></el-option>
8
+ <el-option :label="$t('login.user')" value="user"></el-option>
9
+ </el-select>
10
+ </template>
11
+ </el-input>
12
+ </el-form-item>
13
+ <el-form-item prop="password">
14
+ <el-input v-model="form.password" prefix-icon="el-icon-lock" clearable show-password :placeholder="$t('login.PWPlaceholder')"></el-input>
15
+ </el-form-item>
16
+ <el-form-item prop="code" v-if="captchaEnabled">
17
+ <el-input
18
+ v-model="form.code"
19
+ auto-complete="off"
20
+ placeholder="验证码"
21
+ style="width: 63%"
22
+ >
23
+ <template #prefix><el-icon><el-icon-camera/></el-icon></template>
24
+ </el-input>
25
+ <div class="login-code">
26
+ <img :src="codeUrl" @click="getVerifyCode" class="login-code-img"/>
27
+ </div>
28
+ </el-form-item>
29
+ <el-form-item style="margin-bottom: 10px;">
30
+ <el-col :span="12">
31
+ <el-checkbox :label="$t('login.rememberMe')" v-model="form.autologin"></el-checkbox>
32
+ </el-col>
33
+ <el-col :span="12" class="login-forgot">
34
+ <router-link to="/reset_password">{{ $t('login.forgetPassword') }}?</router-link>
35
+ </el-col>
36
+ </el-form-item>
37
+ <el-form-item>
38
+ <el-button type="primary" style="width: 100%;" :loading="islogin" round @click="login">{{ $t('login.signIn') }}</el-button>
39
+ </el-form-item>
40
+ <div class="login-reg">
41
+ {{$t('login.noAccount')}} <router-link to="/user_register">{{$t('login.createAccount')}}</router-link>
42
+ </div>
43
+ </el-form>
44
+ </template>
45
+
46
+ <script>
47
+ // import {getCodeImg, getInfo} from "@/api/login";
48
+ // import {encrypt} from "@/puzzles/arkos-system/utils/jsencrypt";
49
+ // import {getRouters} from "@/api/menu";
50
+ // import ValidCode from "@/assets/icons/validCode.vue";
51
+ import { useMessage } from '@arkxos/arkos-core'
52
+ // import { allUserMenuData, staticMenuData } from "@/router/testRouter"
53
+ // const system = arkosStarter.system
54
+
55
+ export default {
56
+ // components: {ValidCode},
57
+ data() {
58
+ return {
59
+ userType: 'admin',
60
+ form: {
61
+ user: 'admin',
62
+ password: '123456',
63
+ code: '',
64
+ verKey: '',
65
+ autologin: false
66
+ },
67
+ rules: {
68
+ user: [
69
+ { required: true, message: this.$t('login.userError'), trigger: 'blur' }
70
+ ],
71
+ password: [
72
+ { required: true, message: this.$t('login.PWError'), trigger: 'blur' }
73
+ ]
74
+ },
75
+ islogin: false,
76
+ captchaEnabled: true,
77
+ codeUrl: ''
78
+ }
79
+ },
80
+ watch: {
81
+ userType(val) {
82
+ if (val == 'admin') {
83
+ this.form.user = ''
84
+ this.form.password = ''
85
+ } else if (val == 'user') {
86
+ this.form.user = ''
87
+ this.form.password = ''
88
+ }
89
+ }
90
+ },
91
+ mounted() {
92
+ this.getVerifyCode()
93
+ },
94
+ methods: {
95
+ fixMenuPath(menus, parentMenu) {
96
+ menus.forEach(menu => {
97
+ if (!menu.path.startsWith('http') &&
98
+ !menu.path.startsWith('/')) {
99
+ menu.path = parentMenu.path + '/' + menu.path
100
+ }
101
+ if (menu.children) {
102
+ this.fixMenuPath(menu.children, menu)
103
+ }
104
+ })
105
+ },
106
+ async login() {
107
+ const validate = await this.$refs.loginForm.validate().catch(() => {})
108
+ if (!validate) { return false }
109
+
110
+ this.islogin = true
111
+ const data = {
112
+ username: this.form.user,
113
+ password: this.form.password, // this.$TOOL.crypto.MD5(this.form.password),
114
+ code: this.form.code,
115
+ verKey: this.form.verKey
116
+ }
117
+
118
+ console.log('login form', data)
119
+ // 获取token
120
+ this.$access.getToken(data).then(token => {
121
+ this.islogin = false;
122
+ // this.$TOOL.cookie.set("TOKEN", user.data.token, {
123
+ // expires: this.form.autologin? 24*60*60 : 0
124
+ // })
125
+ // this.$TOOL.data.set("USER_INFO", user.data.userInfo)
126
+ this.$access.refreshUserInfo().then(() => {
127
+ console.log('进入系统')
128
+ this.$router.replace({
129
+ path: '/'
130
+ })
131
+ this.$message.success('登录成功')
132
+ this.islogin = false
133
+ }).catch(err => {
134
+ this.islogin = false;
135
+ useMessage().error(err);
136
+
137
+ this.getVerifyCode()
138
+ })
139
+ }).catch((err) => {
140
+ this.islogin = false;
141
+ useMessage().error(err);
142
+
143
+ this.getVerifyCode()
144
+ })
145
+ },
146
+ async getVerifyCode() {
147
+ const res = await this.$API.auth.getCodeImg.post();
148
+ const responseData = res.data;
149
+ this.captchaEnabled = responseData.captchaEnabled === undefined ? true : responseData.captchaEnabled;
150
+ if (this.captchaEnabled) {
151
+ this.codeUrl = responseData.image;
152
+ this.form.verKey = responseData.verKey;
153
+ }
154
+ }
155
+ }
156
+ }
157
+ </script>
158
+
159
+ <style lang='scss' scoped>
160
+ .login-code {
161
+ width: 33%;
162
+ height: 40px;
163
+ float: right;
164
+ img {
165
+ cursor: pointer;
166
+ vertical-align: middle;
167
+ }
168
+ }
169
+
170
+ .login-code-img {
171
+ height: 40px;
172
+ padding-left: 12px;
173
+ }
174
+ </style>
@@ -0,0 +1,74 @@
1
+ <template>
2
+ <el-form ref="loginForm" :model="form" :rules="rules" label-width="0" size="large" @keyup.enter="login">
3
+ <el-form-item prop="phone">
4
+ <el-input v-model="form.phone" prefix-icon="el-icon-iphone" clearable :placeholder="$t('login.mobilePlaceholder')">
5
+ <template #prepend>+86</template>
6
+ </el-input>
7
+ </el-form-item>
8
+ <el-form-item prop="yzm" style="margin-bottom: 35px;">
9
+ <div class="login-msg-yzm">
10
+ <el-input v-model="form.yzm" prefix-icon="el-icon-unlock" clearable :placeholder="$t('login.smsPlaceholder')"></el-input>
11
+ <el-button @click="getYzm" :disabled="disabled">{{this.$t('login.smsGet')}}<span v-if="disabled"> ({{time}})</span></el-button>
12
+ </div>
13
+ </el-form-item>
14
+ <el-form-item>
15
+ <el-button type="primary" style="width: 100%;" :loading="islogin" round @click="login">{{ $t('login.signIn') }}</el-button>
16
+ </el-form-item>
17
+ <div class="login-reg">
18
+ {{$t('login.noAccount')}} <router-link to="/user_register">{{$t('login.createAccount')}}</router-link>
19
+ </div>
20
+ </el-form>
21
+ </template>
22
+
23
+ <script>
24
+ export default {
25
+ data() {
26
+ return {
27
+ form: {
28
+ phone: '',
29
+ yzm: '',
30
+ },
31
+ rules: {
32
+ phone: [
33
+ { required: true, message: this.$t('login.mobileError') }
34
+ ],
35
+ yzm: [
36
+ { required: true, message: this.$t('login.smsError') }
37
+ ]
38
+ },
39
+ disabled: false,
40
+ time: 0,
41
+ islogin: false,
42
+ }
43
+ },
44
+ mounted() {
45
+
46
+ },
47
+ methods: {
48
+ async getYzm() {
49
+ const validate = await this.$refs.loginForm.validateField('phone').catch(() => {})
50
+ if (!validate) { return false }
51
+
52
+ this.$message.success(this.$t('login.smsSent'))
53
+ this.disabled = true
54
+ this.time = 60
55
+ const t = setInterval(() => {
56
+ this.time -= 1
57
+ if (this.time < 1) {
58
+ clearInterval(t)
59
+ this.disabled = false
60
+ this.time = 0
61
+ }
62
+ }, 1000)
63
+ },
64
+ async login() {
65
+ const validate = await this.$refs.loginForm.validate().catch(() => {})
66
+ if (!validate) { return false }
67
+ }
68
+ }
69
+ }
70
+ </script>
71
+
72
+ <style>
73
+
74
+ </style>
@@ -0,0 +1,210 @@
1
+ <template>
2
+ <div class="login_bg">
3
+ <div class="login_adv" style="background-image: url(img/auth_banner.jpg);">
4
+ <div class="login_adv__title">
5
+ <h2>ArkX OS</h2>
6
+ <h4>{{ $t('login.slogan') }}</h4>
7
+ <p>{{ $t('login.describe') }}</p>
8
+ <div>
9
+ <span>
10
+ <el-icon><sc-icon-vue /></el-icon>
11
+ </span>
12
+ <span>
13
+ <el-icon class="add"><el-icon-plus /></el-icon>
14
+ </span>
15
+ <span>
16
+ <el-icon><el-icon-eleme-filled /></el-icon>
17
+ </span>
18
+ </div>
19
+ </div>
20
+ <div class="login_adv__mask"></div>
21
+ <div class="login_adv__bottom">
22
+ © {{$CONFIG.ArkosTitle}} {{$CONFIG.APP_VER}}
23
+ </div>
24
+ </div>
25
+ <div class="login_main">
26
+ <div class="login_config">
27
+ <el-button :icon="config.dark?'el-icon-sunny':'el-icon-moon'" circle type="info" @click="configDark"></el-button>
28
+ <el-dropdown trigger="click" placement="bottom-end" @command="configLang">
29
+ <el-button circle>
30
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512"><path d="M478.33 433.6l-90-218a22 22 0 0 0-40.67 0l-90 218a22 22 0 1 0 40.67 16.79L316.66 406h102.67l18.33 44.39A22 22 0 0 0 458 464a22 22 0 0 0 20.32-30.4zM334.83 362L368 281.65L401.17 362z" fill="currentColor"></path><path d="M267.84 342.92a22 22 0 0 0-4.89-30.7c-.2-.15-15-11.13-36.49-34.73c39.65-53.68 62.11-114.75 71.27-143.49H330a22 22 0 0 0 0-44H214V70a22 22 0 0 0-44 0v20H54a22 22 0 0 0 0 44h197.25c-9.52 26.95-27.05 69.5-53.79 108.36c-31.41-41.68-43.08-68.65-43.17-68.87a22 22 0 0 0-40.58 17c.58 1.38 14.55 34.23 52.86 83.93c.92 1.19 1.83 2.35 2.74 3.51c-39.24 44.35-77.74 71.86-93.85 80.74a22 22 0 1 0 21.07 38.63c2.16-1.18 48.6-26.89 101.63-85.59c22.52 24.08 38 35.44 38.93 36.1a22 22 0 0 0 30.75-4.9z" fill="currentColor"></path></svg>
31
+ </el-button>
32
+ <template #dropdown>
33
+ <el-dropdown-menu>
34
+ <el-dropdown-item v-for="item in lang" :key="item.value" :command="item" :class="{'selected':config.lang==item.value}">{{item.name}}</el-dropdown-item>
35
+ </el-dropdown-menu>
36
+ </template>
37
+ </el-dropdown>
38
+ </div>
39
+ <div class="login-form">
40
+ <div class="login-header">
41
+ <div class="logo">
42
+ <img :alt="$CONFIG.ArkosTitle" src="img/logo.png">
43
+ <label>{{$CONFIG.ArkosTitle}}</label>
44
+ </div>
45
+ </div>
46
+ <el-tabs>
47
+ <el-tab-pane :label="$t('login.accountLogin')" lazy>
48
+ <password-form></password-form>
49
+ </el-tab-pane>
50
+ <!-- <el-tab-pane :label="$t('login.mobileLogin')" lazy>-->
51
+ <!-- <phone-form></phone-form>-->
52
+ <!-- </el-tab-pane>-->
53
+ </el-tabs>
54
+ <template v-if="$CONFIG.MY_SHOW_LOGIN_OAUTH">
55
+ <el-divider>{{ $t('login.signInOther') }}</el-divider>
56
+ <div class="login-oauth">
57
+ <el-button type="success" icon="sc-icon-wechat" circle @click="wechatLogin"></el-button>
58
+ </div>
59
+ </template>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ <el-dialog v-model="showWechatLogin" :title="$t('login.wechatLoginTitle')" :width="400" destroy-on-close>
64
+ <div class="qrCodeLogin">
65
+ <sc-qr-code class="qrCode" :text="WechatLoginCode" :size="200"></sc-qr-code>
66
+ <p class="msg">{{$tc('login.wechatLoginMsg', 1)}}<br/>{{$tc('login.wechatLoginMsg', 2)}}</p>
67
+ <div class="qrCodeLogin-result" v-if="isWechatLoginResult">
68
+ <el-result icon="success" :title="$tc('login.wechatLoginResult', 1)" :sub-title="$tc('login.wechatLoginResult', 2)"></el-result>
69
+ </div>
70
+ </div>
71
+ </el-dialog>
72
+ </template>
73
+
74
+ <script>
75
+ import passwordForm from './components/passwordForm.vue'
76
+ import phoneForm from './components/phoneForm.vue'
77
+ import iframeStore from '../../store/modules/iframe';
78
+ import keepAliveStore from '../../store/modules/keepAlive';
79
+ import viewTagsStore from '../../store/modules/viewTags';
80
+
81
+ export default {
82
+ components: {
83
+ passwordForm,
84
+ phoneForm
85
+ },
86
+ data() {
87
+ return {
88
+ config: {
89
+ lang: this.$TOOL.data.get('APP_LANG') || this.$CONFIG.LANG,
90
+ dark: this.$TOOL.data.get('APP_DARK') || false
91
+ },
92
+ lang: [
93
+ {
94
+ name: '简体中文',
95
+ value: 'zh-cn',
96
+ },
97
+ {
98
+ name: 'English',
99
+ value: 'en',
100
+ }
101
+ ],
102
+ WechatLoginCode: '',
103
+ showWechatLogin: false,
104
+ isWechatLoginResult: false
105
+ }
106
+ },
107
+ watch: {
108
+ 'config.dark'(val) {
109
+ if (val) {
110
+ document.documentElement.classList.add('dark')
111
+ this.$TOOL.data.set('APP_DARK', val)
112
+ } else {
113
+ document.documentElement.classList.remove('dark')
114
+ this.$TOOL.data.remove('APP_DARK')
115
+ }
116
+ },
117
+ 'config.lang'(val) {
118
+ this.$i18n.locale = val
119
+ console.log('lang val', val)
120
+ this.$TOOL.data.set('APP_LANG', val)
121
+ }
122
+ },
123
+ created: function() {
124
+ console.log('this.$i18n', this.$i18n)
125
+ this.$i18n.local = 'zh-ch'
126
+ this.$TOOL.cookie.remove('TOKEN')
127
+ this.$TOOL.data.remove('USER_INFO')
128
+ this.$TOOL.data.remove('MENU')
129
+ this.$TOOL.data.remove('PERMISSIONS')
130
+ this.$TOOL.data.remove('DASHBOARDGRID')
131
+ this.$TOOL.data.remove('grid')
132
+
133
+ viewTagsStore().clearViewTags()
134
+ keepAliveStore().clearKeepLive()
135
+ iframeStore().clearIframeList()
136
+ // console.log('%c SCUI %c Gitee: https://gitee.com/lolicode/scui', 'background:#666;color:#fff;border-radius:3px;', '')
137
+ },
138
+ methods: {
139
+ configDark() {
140
+ this.config.dark = !this.config.dark
141
+ },
142
+ configLang(command) {
143
+ this.config.lang = command.value
144
+ },
145
+ wechatLogin() {
146
+ this.showWechatLogin = true
147
+ this.WechatLoginCode = 'SCUI-823677237287236-' + new Date().getTime()
148
+ this.isWechatLoginResult = false
149
+ setTimeout(() => {
150
+ this.isWechatLoginResult = true
151
+ }, 3000)
152
+ }
153
+ }
154
+ }
155
+ </script>
156
+
157
+ <style scoped>
158
+ .login_bg {width: 100%;height: 100%;background: #fff;display: flex;}
159
+ .login_adv {width: 33.33333%;background-color: #555;background-size: cover;background-position: center center;background-repeat: no-repeat;position: relative;}
160
+ .login_adv__title {color: #fff;padding: 40px;position: absolute;top:0px;left:0px;right: 0px;z-index: 2;}
161
+ .login_adv__title h2 {font-size: 40px;}
162
+ .login_adv__title h4 {font-size: 18px;margin-top: 10px;font-weight: normal;}
163
+ .login_adv__title p {font-size: 14px;margin-top:10px;line-height: 1.8;color: rgba(255,255,255,0.6);}
164
+ .login_adv__title div {margin-top: 10px;display: flex;align-items: center;}
165
+ .login_adv__title div span {margin-right: 15px;}
166
+ .login_adv__title div i {font-size: 40px;}
167
+ .login_adv__title div i.add {font-size: 20px;color: rgba(255,255,255,0.6);}
168
+ .login_adv__bottom {position: absolute;left:0px;right: 0px;bottom: 0px;color: #fff;padding: 40px;background-image:linear-gradient(transparent, #000);z-index: 3;}
169
+ .login_adv__mask {position: absolute;top:0px;left:0px;right: 0px;bottom: 0px;background: rgba(0,0,0,0.5);z-index: 1;}
170
+
171
+ .login_main {flex: 1;overflow: auto;display:flex;}
172
+ .login-form {width: 400px;margin: auto;padding:20px 0;}
173
+ .login-header {margin-bottom: 40px;}
174
+ .login-header .logo {display: flex;align-items: center;}
175
+ .login-header .logo img {width: 40px;height: 40px;vertical-align: bottom;margin-right: 10px;}
176
+ .login-header .logo label {font-size: 26px;font-weight: bold;}
177
+ .login-oauth {display: flex;justify-content:space-around;}
178
+ .login-form .el-divider {margin-top:40px;}
179
+
180
+ .login-form {}
181
+ .login-form:deep(.el-tabs) .el-tabs__header {margin-bottom: 25px;}
182
+ .login-form:deep(.el-tabs) .el-tabs__header .el-tabs__item {font-size: 14px;}
183
+
184
+ .login-form:deep(.login-forgot) {text-align: right;}
185
+ .login-form:deep(.login-forgot) a {color: var(--el-color-primary);}
186
+ .login-form:deep(.login-forgot) a:hover {color: var(--el-color-primary-light-3);}
187
+ .login-form:deep(.login-reg) {font-size: 14px;color: var(--el-text-color-primary);}
188
+ .login-form:deep(.login-reg) a {color: var(--el-color-primary);}
189
+ .login-form:deep(.login-reg) a:hover {color: var(--el-color-primary-light-3);}
190
+
191
+ .login_config {position: absolute;top:20px;right: 20px;}
192
+
193
+ .login-form:deep(.login-msg-yzm) {display: flex;width: 100%;}
194
+ .login-form:deep(.login-msg-yzm) .el-button {margin-left: 10px;--el-button-size:42px;}
195
+
196
+ .qrCodeLogin {text-align: center;position: relative;padding: 20px 0;}
197
+ .qrCodeLogin img.qrCode {background: #fff;padding:20px;border-radius:10px;}
198
+ .qrCodeLogin p.msg {margin-top: 15px;}
199
+ .qrCodeLogin .qrCodeLogin-result {position: absolute;top:0;left:0;right: 0;bottom: 0;text-align: center;background: var(--el-mask-color);}
200
+
201
+ @media (max-width: 1200px){
202
+ .login-form {width: 340px;}
203
+ }
204
+ @media (max-width: 1000px){
205
+ .login_main {display: block;}
206
+ .login_main .login_config {position: static;padding:20px 20px 0 20px;text-align: right;}
207
+ .login-form {width:100%;padding:20px 40px;}
208
+ .login_adv {display: none;}
209
+ }
210
+ </style>
@@ -0,0 +1,125 @@
1
+ <template>
2
+ <common-page title="重置密码">
3
+ <el-steps :active="stepActive" simple finish-status="success">
4
+ <el-step title="填写新密码" />
5
+ <el-step title="完成重置" />
6
+ </el-steps>
7
+ <el-form v-if="stepActive==0" ref="form" :model="form" :rules="rules" :label-width="120">
8
+ <el-form-item label="登录账号" prop="user">
9
+ <el-input v-model="form.user" placeholder="请输入登录账号"></el-input>
10
+ <div class="el-form-item-msg">请输入注册时填写的登录账号</div>
11
+ </el-form-item>
12
+ <el-form-item label="手机号码" prop="phone">
13
+ <el-input v-model="form.phone" placeholder="请输入手机号码"></el-input>
14
+ </el-form-item>
15
+ <el-form-item label="短信验证码" prop="yzm">
16
+ <div class="yzm">
17
+ <el-input v-model="form.yzm" placeholder="请输入6位短信验证码"></el-input>
18
+ <el-button @click="getYzm" :disabled="disabled">获取验证码<span v-if="disabled"> ({{time}})</span></el-button>
19
+ </div>
20
+ </el-form-item>
21
+ <el-form-item label="新密码" prop="newpw">
22
+ <el-input v-model="form.newpw" show-password placeholder="请输入新密码"></el-input>
23
+ <div class="el-form-item-msg">请输入包含英文、数字的8位以上密码</div>
24
+ </el-form-item>
25
+ <el-form-item label="确认新密码" prop="newpw2">
26
+ <el-input v-model="form.newpw2" show-password placeholder="请再一次输入新密码"></el-input>
27
+ </el-form-item>
28
+
29
+ <el-form-item>
30
+ <el-button type="primary" @click="save">提交</el-button>
31
+ </el-form-item>
32
+ </el-form>
33
+ <el-result v-if="stepActive==1" icon="success" title="密码重置成功" sub-title="请牢记自己的新密码,返回登录后使用新密码登录">
34
+ <template #extra>
35
+ <el-button type="primary" @click="backLogin">返回登录</el-button>
36
+ </template>
37
+ </el-result>
38
+ </common-page>
39
+ </template>
40
+
41
+ <script>
42
+ import commonPage from './components/commonPage'
43
+
44
+ export default {
45
+ components: {
46
+ commonPage
47
+ },
48
+ data() {
49
+ return {
50
+ stepActive: 0,
51
+ form: {
52
+ user: '',
53
+ phone: '',
54
+ yzm: '',
55
+ newpw: '',
56
+ newpw2: ''
57
+ },
58
+ rules: {
59
+ user: [
60
+ { required: true, message: '请输入登录账号' }
61
+ ],
62
+ phone: [
63
+ { required: true, message: '请输入手机号' }
64
+ ],
65
+ yzm: [
66
+ { required: true, message: '请输入短信验证码' }
67
+ ],
68
+ newpw: [
69
+ { required: true, message: '请输入新的密码' }
70
+ ],
71
+ newpw2: [
72
+ { required: true, message: '请再次输入新的密码' },
73
+ {
74
+ validator: (rule, value, callback) => {
75
+ if (value !== this.form.newpw) {
76
+ callback(new Error('两次输入密码不一致'));
77
+ } else {
78
+ callback();
79
+ }
80
+ }
81
+ }
82
+ ],
83
+ },
84
+ disabled: false,
85
+ time: 0
86
+ }
87
+ },
88
+ mounted() {
89
+
90
+ },
91
+ methods: {
92
+ async getYzm() {
93
+ const validate = await this.$refs.form.validateField('phone').catch(() => {})
94
+ if (!validate) { return false }
95
+
96
+ this.$message.success('已发送短信至手机号码')
97
+ this.disabled = true
98
+ this.time = 60
99
+ var t = setInterval(() => {
100
+ this.time -= 1
101
+ if (this.time < 1) {
102
+ clearInterval(t)
103
+ this.disabled = false
104
+ this.time = 0
105
+ }
106
+ }, 1000)
107
+ },
108
+ async save() {
109
+ const validate = await this.$refs.form.validate().catch(() => {})
110
+ if (!validate) { return false }
111
+
112
+ this.stepActive = 1
113
+ },
114
+ backLogin() {
115
+ this.$router.push({
116
+ path: '/login'
117
+ })
118
+ }
119
+ }
120
+ }
121
+ </script>
122
+
123
+ <style scoped>
124
+
125
+ </style>