Commit d59b2d89e90f2190d05ba9c710b0b76c8dd3c308
1 parent
fe44789e30
Exists in
master
madd appManage page
Showing
4 changed files
with
161 additions
and
565 deletions
Show diff stats
src/router/modules/application.js
1 | import Layout from '@/layout' | 1 | import Layout from '@/layout' |
2 | 2 | ||
3 | const applicationRouter = { | 3 | const applicationRouter = { |
4 | path: '/application', | 4 | path: '/application', |
5 | component: Layout, | 5 | component: Layout, |
6 | redirect: '/application/page', | 6 | redirect: '/application/page', |
7 | alwaysShow: true, // will always show the root menu | 7 | alwaysShow: true, // will always show the root menu |
8 | name: 'Application', | 8 | name: 'Application', |
9 | meta: { | 9 | meta: { |
10 | title: '应用', | 10 | title: '应用', |
11 | icon: 'component', | 11 | icon: 'component', |
12 | roles: ['admin', 'assistant'] // you can set roles in root nav | 12 | roles: ['admin', 'assistant'] // you can set roles in root nav |
13 | }, | 13 | }, |
14 | children: [{ | 14 | children: [{ |
15 | path: 'appManage', | 15 | path: 'appManage', |
16 | component: () => import('@/views/application/appManage'), | 16 | component: () => import('@/views/application/appManage'), // 应用管理/添加 |
17 | name: 'appManage', | 17 | name: 'appManage', |
18 | meta: { | 18 | meta: { |
19 | title: '应用管理', | 19 | title: '应用管理', |
20 | icon: 'component', | 20 | icon: 'component', |
21 | roles: ['admin', 'assistant'] // or you can only set roles in sub nav | 21 | roles: ['admin', 'assistant'] // or you can only set roles in sub nav |
22 | } | 22 | } |
23 | }] | 23 | }, |
24 | { | ||
25 | path: 'appList', | ||
26 | component: () => import('@/views/application/appList'), // 应用列表 | ||
27 | name: 'appList', | ||
28 | meta: { | ||
29 | title: '应用列表', | ||
30 | icon: 'list', | ||
31 | roles: ['admin', 'assistant'] // or you can only set roles in sub nav | ||
32 | } | ||
33 | } | ||
34 | ] | ||
24 | } | 35 | } |
25 | export default applicationRouter | 36 | export default applicationRouter |
26 | 37 |
src/views/application/appList.vue
File was created | 1 | <template> | |
2 | <el-container class="app-container"> | ||
3 | <el-header> | ||
4 | 应用列表 | ||
5 | </el-header> | ||
6 | <el-main> | ||
7 | asd | ||
8 | </el-main> | ||
9 | <el-aside> | ||
10 | <el-input v-model="filterText" placeholder="Filter keyword" style="margin-bottom:30px;" /> | ||
11 | <el-tree | ||
12 | ref="tree2" | ||
13 | :data="data2" | ||
14 | :props="defaultProps" | ||
15 | :filter-node-method="filterNode" | ||
16 | class="filter-tree" | ||
17 | default-expand-all | ||
18 | /> | ||
19 | </el-aside> | ||
20 | |||
21 | </el-container> | ||
22 | </template> | ||
23 | |||
24 | <script> | ||
25 | export default { | ||
26 | |||
27 | data() { | ||
28 | return { | ||
29 | filterText: '', | ||
30 | data2: [{ | ||
31 | id: 1, | ||
32 | label: 'Level one 1', | ||
33 | children: [{ | ||
34 | id: 4, | ||
35 | label: 'Level two 1-1' }, | ||
36 | { | ||
37 | id: 10, | ||
38 | label: 'Level three 1-1-2' | ||
39 | } | ||
40 | ] | ||
41 | }, { | ||
42 | id: 2, | ||
43 | label: 'Level one 2', | ||
44 | children: [{ | ||
45 | id: 5, | ||
46 | label: 'Level two 2-1' | ||
47 | }, { | ||
48 | id: 6, | ||
49 | label: 'Level two 2-2' | ||
50 | }] | ||
51 | }, { | ||
52 | id: 3, | ||
53 | label: 'Level one 3', | ||
54 | children: [{ | ||
55 | id: 7, | ||
56 | label: 'Level two 3-1' | ||
57 | }, { | ||
58 | id: 8, | ||
59 | label: 'Level two 3-2' | ||
60 | }] | ||
61 | }], | ||
62 | defaultProps: { | ||
63 | children: 'children', | ||
64 | label: 'label' | ||
65 | } | ||
66 | } | ||
67 | }, | ||
68 | watch: { | ||
69 | filterText(val) { | ||
70 | this.$refs.tree2.filter(val) | ||
71 | } | ||
72 | }, | ||
73 | |||
74 | methods: { | ||
75 | filterNode(value, data) { | ||
76 | if (!value) return true | ||
77 | return data.label.indexOf(value) !== -1 | ||
78 | } | ||
79 | } | ||
80 | } | ||
81 | </script> | ||
82 | |||
83 |
src/views/application/appManage.vue
1 | <template> | 1 | <template> |
2 | <div class="login-container"> | 2 | <el-container class="app-container"> |
3 | <el-button | 3 | <el-header> |
4 | type="primary" | 4 | 添加一个新应用(管理员不允许直接添加应用) |
5 | @click="() => addNode()" | 5 | </el-header> |
6 | >{{ $t('users.add') }}</el-button> | 6 | <el-main> |
7 | <el-tree | 7 | <el-form ref="form" :model="form" label-width="120px"> |
8 | ref="tree" | 8 | <el-form-item label="app_name"> |
9 | :data="data" | 9 | <el-input v-model="form.app_name" /> |
10 | show-checkbox | 10 | </el-form-item> |
11 | node-key="id" | ||
12 | highlight-current | ||
13 | check-strictly | ||
14 | indent="40" | ||
15 | icon-class="el-icon-pc" | ||
16 | :props="defaultProps" | ||
17 | > | ||
18 | <!-- <el-tree | ||
19 | :data="data" | ||
20 | show-checkbox | ||
21 | node-key="id" | ||
22 | default-expand-all | ||
23 | highlight-current | ||
24 | isLeaf | ||
25 | @node-contextmenu="()=>rightKey(node, data)" | ||
26 | check-strictly//在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 false | ||
27 | :expand-on-click-node="false"//是否在点击节点的时候展开或者收缩节点, 默认值为 true,如果为 false,则只有点箭头图标的时候才会展开或者收缩节点。 | ||
28 | :props="defaultProps" | ||
29 | > --> | ||
30 | <span | ||
31 | slot-scope="{ node, data }" | ||
32 | class="custom-tree-node" | ||
33 | > | ||
34 | <span>{{ node.label }}</span> | ||
35 | <span> | ||
36 | <el-button | ||
37 | type="primary" | ||
38 | icon="el-icon-upload" | ||
39 | size="mini" | ||
40 | @click="() => append(data)" | ||
41 | > | ||
42 | {{ $t('users.add') }} | ||
43 | </el-button> | ||
44 | <el-button | ||
45 | type="primary" | ||
46 | icon="el-icon-edit" | ||
47 | size="mini" | ||
48 | @click="() => update(node, data)" | ||
49 | > | ||
50 | {{ $t('users.update') }} | ||
51 | </el-button> | ||
52 | <el-button | ||
53 | type="primary" | ||
54 | icon="el-icon-delete" | ||
55 | size="mini" | ||
56 | class="danger" | ||
57 | @click="() => remove(node, data)" | ||
58 | > | ||
59 | {{ $t('users.del') }} | ||
60 | </el-button> | ||
61 | </span> | ||
62 | </span> | ||
63 | </el-tree> | ||
64 | 11 | ||
65 | <!-- <div class="buttons"> | 12 | <el-form-item label="app_type"> |
66 | <el-button @click="getCheckedNodes">通过 node 获取</el-button> | 13 | <el-radio-group v-model="form.app_type"> |
67 | <el-button @click="getCheckedKeys">通过 key 获取</el-button> | 14 | <el-radio label="自建站" /> |
68 | <el-button @click="setCheckedNodes">通过 node 设置</el-button> | 15 | <el-radio label="自营小程序" /> |
69 | <el-button @click="setCheckedKeys">通过 key 设置</el-button> | 16 | <el-radio label="淘宝店" /> |
70 | <el-button @click="resetChecked">清空</el-button> | 17 | <el-radio label="微店" /> |
71 | </div> --> | 18 | <el-radio label="亚马逊店" /> |
72 | </div> | 19 | <el-radio label="易贝店" /> |
20 | <el-radio label="拼多多店" /> | ||
21 | <el-radio label="抖音店" /> | ||
22 | <el-radio label="朋友圈店" /> | ||
23 | </el-radio-group> | ||
24 | </el-form-item> | ||
25 | |||
26 | <el-form-item label="app_desc"> | ||
27 | <el-input v-model="form.app_desc" type="textarea" /> | ||
28 | </el-form-item> | ||
29 | <el-form-item label="app_api_key"> | ||
30 | <el-input v-model="form.app_api_key" /> | ||
31 | </el-form-item> | ||
32 | <el-form-item label="app_user_defined"> | ||
33 | <el-input v-model="form.app_user_defined" /> | ||
34 | </el-form-item> | ||
35 | |||
36 | <el-form-item label="app_area_defined"> | ||
37 | <el-input v-model="form.app_area_defined" /> | ||
38 | </el-form-item> | ||
39 | |||
40 | <el-form-item label="app_lang_defined"> | ||
41 | <el-input v-model="form.app_lang_defined" /> | ||
42 | </el-form-item> | ||
43 | |||
44 | <el-form-item> | ||
45 | <el-button type="primary" @click="onSubmit">添加</el-button> | ||
46 | </el-form-item> | ||
47 | </el-form> | ||
48 | </el-main> | ||
49 | </el-container> | ||
73 | </template> | 50 | </template> |
51 | |||
74 | <script> | 52 | <script> |
75 | let id = 1000 | ||
76 | export default { | 53 | export default { |
77 | data() { | 54 | data() { |
78 | return { | 55 | return { |
79 | data: [ | 56 | form: { |
80 | { | 57 | app_name: '', |
81 | label: '成镜', | 58 | app_type: '', |
82 | id: '1', | 59 | app_desc: '', |
83 | children: [ | 60 | app_api_key: '', |
84 | { | 61 | app_user_defined: '', |
85 | label: '款式', | 62 | app_area_defined: '', |
86 | id: '11', | 63 | app_lang_defined: '' |
87 | children: [ | ||
88 | { label: '青春学子风' }, | ||
89 | { label: '休闲' }, | ||
90 | { label: '商务' }, | ||
91 | { label: '复古' }, | ||
92 | { label: '时尚' }, | ||
93 | { label: '质感哥特潮' }, | ||
94 | { label: '轻简北欧风' }, | ||
95 | { label: '理性几何派' }, | ||
96 | { label: '多元新风尚' }, | ||
97 | { label: '立体巴洛克' }, | ||
98 | { label: '有机未来时' }, | ||
99 | { label: '无界人文系' }, | ||
100 | { label: '自然舒视角' }, | ||
101 | { label: '流线洛可可' }, | ||
102 | { label: '奶奶风' }, | ||
103 | { label: '简约-极简文艺范' }, | ||
104 | { label: '运动风' }, | ||
105 | { label: '行政风' }, | ||
106 | { label: '折射率' } | ||
107 | ] | ||
108 | }, | ||
109 | { label: '个性化服务', id: '267', children: [] }, | ||
110 | { | ||
111 | label: '赠品', | ||
112 | id: '259', | ||
113 | children: [{ label: '眼镜布' }, { label: '眼镜盒' }] | ||
114 | }, | ||
115 | { | ||
116 | label: '场景', | ||
117 | id: '258', | ||
118 | children: [ | ||
119 | { label: '学校场景' }, | ||
120 | { label: '出行交际' }, | ||
121 | { label: '夜店迷人' }, | ||
122 | { label: '明星同款' } | ||
123 | ] | ||
124 | }, | ||
125 | { | ||
126 | label: '销售保障', | ||
127 | id: '245', | ||
128 | children: [ | ||
129 | { label: '可退' }, | ||
130 | { label: '可换' }, | ||
131 | { label: '可修' } | ||
132 | ] | ||
133 | }, | ||
134 | { | ||
135 | label: '功能', | ||
136 | id: '140', | ||
137 | children: [ | ||
138 | { label: '防踩压' }, | ||
139 | { label: '防扭曲' }, | ||
140 | { label: '抗过敏' }, | ||
141 | { label: '防腐蚀' }, | ||
142 | { label: '耐磨损' }, | ||
143 | { label: '抗蓝光' } | ||
144 | ] | ||
145 | }, | ||
146 | { | ||
147 | label: '品牌', | ||
148 | id: '71', | ||
149 | children: [ | ||
150 | { label: '购易' }, | ||
151 | { label: '海俪恩' }, | ||
152 | { label: '沙漠风暴' }, | ||
153 | { label: '古诗' }, | ||
154 | { label: '暴龙' }, | ||
155 | { label: '犀牛' }, | ||
156 | { label: 'Ray-Ban雷朋' }, | ||
157 | { label: 'PARIM派丽蒙' }, | ||
158 | { label: '石狼' }, | ||
159 | { label: '木九十' } | ||
160 | ] | ||
161 | }, | ||
162 | { | ||
163 | label: '边形', | ||
164 | id: '49', | ||
165 | children: [ | ||
166 | { label: '半框' }, | ||
167 | { label: '全框' }, | ||
168 | { label: '无框' } | ||
169 | ] | ||
170 | }, | ||
171 | { | ||
172 | label: '性别', | ||
173 | id: '23', | ||
174 | children: [{ label: '男性' }, { label: '女性' }] | ||
175 | }, | ||
176 | { | ||
177 | label: '梁型', | ||
178 | id: '20', | ||
179 | children: [{ label: '双梁' }, { label: '单梁' }] | ||
180 | }, | ||
181 | { | ||
182 | label: '重量', | ||
183 | id: '19', | ||
184 | children: [{ label: '30克以下' }, { label: '80克以上' }] | ||
185 | }, | ||
186 | { | ||
187 | label: '适用脸型', | ||
188 | id: '15', | ||
189 | children: [{ label: '方' }, { label: '圆' }, { label: '瓜子' }] | ||
190 | }, | ||
191 | { | ||
192 | label: '形状', | ||
193 | id: '14', | ||
194 | children: [ | ||
195 | { label: '正圆形' }, | ||
196 | { label: '椭圆形' }, | ||
197 | { label: '方圆' }, | ||
198 | { label: '方形' }, | ||
199 | { label: '多边形' }, | ||
200 | { label: '内三角(蛤蟆)' }, | ||
201 | { label: '外三角(蝶形)' } | ||
202 | ] | ||
203 | }, | ||
204 | { label: '年龄', id: '12', children: [{ label: '通用' }] }, | ||
205 | { | ||
206 | label: '材质', | ||
207 | id: '10', | ||
208 | children: [ | ||
209 | { label: '板材' }, | ||
210 | { label: '纯钛' }, | ||
211 | { label: 'TR90' }, | ||
212 | { label: '木质' }, | ||
213 | { label: '竹质' }, | ||
214 | { label: 'β钛' }, | ||
215 | { label: 'PC' }, | ||
216 | { label: 'ULTEM塑钢' }, | ||
217 | { label: '钨钛塑钢' }, | ||
218 | { label: '镁铝合金' }, | ||
219 | { label: '碳纤维' } | ||
220 | ] | ||
221 | }, | ||
222 | { label: '折射率', id: '286', children: [] }, | ||
223 | { | ||
224 | label: '颜色', | ||
225 | id: '13', | ||
226 | children: [ | ||
227 | { label: '金色' }, | ||
228 | { label: '银色' }, | ||
229 | { label: '黑色' }, | ||
230 | { label: '彩色' }, | ||
231 | { label: '枪色' } | ||
232 | ] | ||
233 | } | ||
234 | ] | ||
235 | }, | ||
236 | { | ||
237 | label: '镜片', | ||
238 | id: '2', | ||
239 | children: [ | ||
240 | { | ||
241 | label: '面型', | ||
242 | id: '85', | ||
243 | children: [{ label: '球面单光' }, { label: '非球面单光' }] | ||
244 | }, | ||
245 | { label: '近视度数', id: '92', children: [] }, | ||
246 | { label: '散光', id: '93', children: [] }, | ||
247 | { | ||
248 | label: '功能', | ||
249 | id: '95', | ||
250 | children: [ | ||
251 | { label: '防起雾' }, | ||
252 | { label: '防蓝光' }, | ||
253 | { label: '防紫外线' }, | ||
254 | { label: '偏光' }, | ||
255 | { label: '染色' }, | ||
256 | { label: '抗疲劳' }, | ||
257 | { label: '青少年渐进' }, | ||
258 | { label: '内渐进' }, | ||
259 | { label: '变色' }, | ||
260 | { label: '双光' }, | ||
261 | { label: '耐磨损' }, | ||
262 | { label: '防尘' }, | ||
263 | { label: '防水' }, | ||
264 | { label: '防摔' }, | ||
265 | { label: '防指纹' }, | ||
266 | { label: '防反光' } | ||
267 | ] | ||
268 | }, | ||
269 | { | ||
270 | label: '颜色', | ||
271 | id: '100', | ||
272 | children: [ | ||
273 | { label: '透明' }, | ||
274 | { label: '染色' }, | ||
275 | { label: '变色' }, | ||
276 | { label: '单色' } | ||
277 | ] | ||
278 | }, | ||
279 | { | ||
280 | label: '折射率', | ||
281 | id: '101', | ||
282 | children: [ | ||
283 | { label: '1.56' }, | ||
284 | { label: '1.60' }, | ||
285 | { label: '1.65' }, | ||
286 | { label: '1.67' }, | ||
287 | { label: '1.71' }, | ||
288 | { label: '1.74' } | ||
289 | ] | ||
290 | }, | ||
291 | { label: '阿贝数(色散)', id: '102', children: [] }, | ||
292 | { label: '重量', id: '103', children: [] }, | ||
293 | { | ||
294 | label: '材质', | ||
295 | id: '104', | ||
296 | children: [ | ||
297 | { label: '树脂' }, | ||
298 | { label: '玻璃' }, | ||
299 | { label: '宇宙PC' }, | ||
300 | { label: 'PC' } | ||
301 | ] | ||
302 | }, | ||
303 | { | ||
304 | label: '品牌', | ||
305 | id: '118', | ||
306 | children: [ | ||
307 | { label: '好视力' }, | ||
308 | { label: 'RAISE锐视' }, | ||
309 | { label: '依视路' }, | ||
310 | { label: '凯米' }, | ||
311 | { label: '蔡司' }, | ||
312 | { label: '舒曼' } | ||
313 | ] | ||
314 | }, | ||
315 | { | ||
316 | label: '销售保障', | ||
317 | id: '249', | ||
318 | children: [ | ||
319 | { label: '可退' }, | ||
320 | { label: '可换' }, | ||
321 | { label: '可修' } | ||
322 | ] | ||
323 | } | ||
324 | ] | ||
325 | }, | ||
326 | { | ||
327 | label: '隐形眼镜', | ||
328 | id: '88', | ||
329 | children: [ | ||
330 | { | ||
331 | label: '颜色', | ||
332 | id: '105', | ||
333 | children: [ | ||
334 | { label: '绿' }, | ||
335 | { label: '灰' }, | ||
336 | { label: '黑' }, | ||
337 | { label: '紫' }, | ||
338 | { label: '蓝' }, | ||
339 | { label: '棕色' }, | ||
340 | { label: '紫色' } | ||
341 | ] | ||
342 | }, | ||
343 | { | ||
344 | label: '颜料', | ||
345 | id: '106', | ||
346 | children: [{ label: '水性' }, { label: '油性' }] | ||
347 | }, | ||
348 | { label: '度数', id: '107', children: [] }, | ||
349 | { | ||
350 | label: '周期', | ||
351 | id: '108', | ||
352 | children: [ | ||
353 | { label: '日抛' }, | ||
354 | { label: '周抛' }, | ||
355 | { label: '双周抛' }, | ||
356 | { label: '月抛' }, | ||
357 | { label: '季抛' }, | ||
358 | { label: '半年抛' }, | ||
359 | { label: '年抛' } | ||
360 | ] | ||
361 | }, | ||
362 | { | ||
363 | label: '品牌', | ||
364 | id: '133', | ||
365 | children: [ | ||
366 | { label: 'HolyNara' }, | ||
367 | { label: '爱尔康' }, | ||
368 | { label: 'MaxLook' }, | ||
369 | { label: 'NEO' }, | ||
370 | { label: 'GEO' }, | ||
371 | { label: '实瞳' }, | ||
372 | { label: '茵洛' }, | ||
373 | { label: 'DAZZSHOP' }, | ||
374 | { label: 'O-LENS' }, | ||
375 | { label: 'envie' }, | ||
376 | { label: '曼秀雷敦' }, | ||
377 | { label: '妃蜜莉' }, | ||
378 | { label: '海俪恩' }, | ||
379 | { label: '凯达' }, | ||
380 | { label: '蔡司' }, | ||
381 | { label: '酷视' }, | ||
382 | { label: 'LILMOON' }, | ||
383 | { label: 'RICHBABY' }, | ||
384 | { label: 'T-Garden' }, | ||
385 | { label: 'lenstown' }, | ||
386 | { label: '新加坡P2' }, | ||
387 | { label: '星欧' }, | ||
388 | { label: '美尼康' }, | ||
389 | { label: '美汐' }, | ||
390 | { label: '欧舒天' }, | ||
391 | { label: '海昌' }, | ||
392 | { label: '菲士康' }, | ||
393 | { label: '卫康' }, | ||
394 | { label: '库博' }, | ||
395 | { label: '安视优' }, | ||
396 | { label: '美若康' }, | ||
397 | { label: '视康' }, | ||
398 | { label: '澜柏' }, | ||
399 | { label: '3N' }, | ||
400 | { label: 'BIJOU' }, | ||
401 | { label: '依视明' }, | ||
402 | { label: '博士伦' }, | ||
403 | { label: '瞳昕' }, | ||
404 | { label: '科莱博' }, | ||
405 | { label: '绮芙莉' }, | ||
406 | { label: '雅培' }, | ||
407 | { label: '爱能视' }, | ||
408 | { label: '女神秘语' }, | ||
409 | { label: '博视顿' }, | ||
410 | { label: '妆美堂' }, | ||
411 | { label: '人鱼姬' }, | ||
412 | { label: 'EverColor' }, | ||
413 | { label: 'Sincere' } | ||
414 | ] | ||
415 | }, | ||
416 | { | ||
417 | label: '工艺', | ||
418 | id: '159', | ||
419 | children: [{ label: '涂层工艺' }, { label: '三层夹色工艺' }] | ||
420 | }, | ||
421 | { | ||
422 | label: '材质', | ||
423 | id: '164', | ||
424 | children: [{ label: '硅水凝胶' }, { label: '水凝胶' }] | ||
425 | }, | ||
426 | { | ||
427 | label: '含水量', | ||
428 | id: '174', | ||
429 | children: [ | ||
430 | { label: '0-40%' }, | ||
431 | { label: '40-44%' }, | ||
432 | { label: '45%以上' } | ||
433 | ] | ||
434 | }, | ||
435 | { | ||
436 | label: '基弧', | ||
437 | id: '178', | ||
438 | children: [{ label: '0.0-8.4' }, { label: '8.4以上' }] | ||
439 | }, | ||
440 | { | ||
441 | label: '直径', | ||
442 | id: '181', | ||
443 | children: [{ label: '13.4-14' }, { label: '14以上' }] | ||
444 | }, | ||
445 | { | ||
446 | label: '中心厚度', | ||
447 | id: '184', | ||
448 | children: [ | ||
449 | { label: '0.0 - 0.03' }, | ||
450 | { label: '0.04 - 0.09' }, | ||
451 | { label: '0.1以上' } | ||
452 | ] | ||
453 | }, | ||
454 | { label: '销售保障', id: '253', children: [] }, | ||
455 | { label: '赠品', id: '260', children: [] } | ||
456 | ] | ||
457 | }, | ||
458 | { | ||
459 | label: '特种镜', | ||
460 | id: '146', | ||
461 | children: [ | ||
462 | { | ||
463 | label: '镜面颜色', | ||
464 | id: '237', | ||
465 | children: [{ label: '透明' }, { label: '亮金色' }] | ||
466 | }, | ||
467 | { | ||
468 | label: '品牌', | ||
469 | id: '238', | ||
470 | children: [{ label: '宁哥牌' }, { label: '秀野牌' }] | ||
471 | }, | ||
472 | { | ||
473 | label: '销售保障', | ||
474 | id: '254', | ||
475 | children: [{ label: '包退' }, { label: '包换' }] | ||
476 | }, | ||
477 | { | ||
478 | label: '功能', | ||
479 | id: '268', | ||
480 | children: [ | ||
481 | { label: '防风镜' }, | ||
482 | { label: '防爆溅工作镜' }, | ||
483 | { label: '泳镜' }, | ||
484 | { label: '智能镜' } | ||
485 | ] | ||
486 | } | ||
487 | ] | ||
488 | } | ||
489 | ], | ||
490 | defaultProps: { | ||
491 | children: 'children', | ||
492 | label: 'label' | ||
493 | } | 64 | } |
494 | } | 65 | } |
495 | }, | 66 | }, |
496 | methods: { | 67 | methods: { |
497 | getCheckedNodes() { | 68 | onSubmit() { |
498 | console.log(this.$refs.tree.getCheckedNodes()) | 69 | this.$message('submit!') |
499 | }, | ||
500 | getCheckedKeys() { | ||
501 | console.log(this.$refs.tree.getCheckedKeys()) | ||
502 | }, | ||
503 | addNode() { | ||
504 | let h | ||
505 | this.$message({ | ||
506 | message: h('p', null, [ | ||
507 | h('span', null, '添加一个新节点 ') | ||
508 | // h("i", { style: "color: teal" }, "VNode") | ||
509 | ]) | ||
510 | }) | ||
511 | }, | ||
512 | append(data) { | ||
513 | const newChild = { id: id++, label: 'testtest', children: [] } | ||
514 | if (!data.children) { | ||
515 | this.$set(data, 'children', []) | ||
516 | } | ||
517 | data.children.push(newChild) | ||
518 | }, | ||
519 | remove(node, data) { | ||
520 | // 删除 | ||
521 | const parent = node.parent | ||
522 | const children = parent.data.children || parent.data | ||
523 | const index = children.findIndex(d => d.id === data.id) | ||
524 | children.splice(index, 1) | ||
525 | }, | ||
526 | rightKey(node, data) { | ||
527 | // 右键 | ||
528 | const h = this.$createElement | ||
529 | // console.log(data, this.$refs.tree); | ||
530 | this.$message({ | ||
531 | message: h('p', null, [ | ||
532 | h('span', null, '右键了啊! ' + node + data), | ||
533 | h('i', { style: 'color: teal' }, 'VNode') | ||
534 | ]) | ||
535 | }) | ||
536 | }, | ||
537 | update(node, data) { | ||
538 | // 更新 | ||
539 | const h = this.$createElement | ||
540 | this.$message({ | ||
541 | message: h('p', null, [ | ||
542 | h('span', null, '内容可以是 '), | ||
543 | h('i', { style: 'color: teal' }, 'VNode') | ||
544 | ]) | ||
545 | }) | ||
546 | }, | ||
547 | setCheckedNodes() { |
src/views/login/index.vue
1 | <template> | 1 | <template> |
2 | <div class="login-container"> | 2 | <div class="login-container"> |
3 | <el-form | 3 | <el-form |
4 | ref="loginForm" | 4 | ref="loginForm" |
5 | :model="loginForm" | 5 | :model="loginForm" |
6 | :rules="loginRules" | 6 | :rules="loginRules" |
7 | class="login-form" | 7 | class="login-form" |
8 | autocomplete="on" | 8 | autocomplete="on" |
9 | label-position="left" | 9 | label-position="left" |
10 | > | 10 | > |
11 | <div class="title-container"> | 11 | <div class="title-container"> |
12 | <h3 class="title">{{ $t('login.title') }}</h3> | 12 | <h3 class="title">{{ $t('login.title') }}</h3> |
13 | <lang-select class="set-language" /> | 13 | <lang-select class="set-language" /> |
14 | </div> | 14 | </div> |
15 | 15 | ||
16 | <el-form-item prop="username"> | 16 | <el-form-item prop="username"> |
17 | <span class="svg-container"> | 17 | <span class="svg-container"> |
18 | <svg-icon icon-class="user" /> | 18 | <svg-icon icon-class="user" /> |
19 | </span> | 19 | </span> |
20 | <el-input | 20 | <el-input |
21 | ref="username" | 21 | ref="username" |
22 | v-model="loginForm.username" | 22 | v-model="loginForm.username" |
23 | :placeholder="$t('login.username')" | 23 | :placeholder="$t('login.username')" |
24 | name="username" | 24 | name="username" |
25 | type="text" | 25 | type="text" |
26 | tabindex="1" | 26 | tabindex="1" |
27 | autocomplete="on" | 27 | autocomplete="on" |
28 | /> | 28 | /> |
29 | </el-form-item> | 29 | </el-form-item> |
30 | 30 | ||
31 | <el-tooltip | 31 | <el-tooltip |
32 | v-model="capsTooltip" | 32 | v-model="capsTooltip" |
33 | content="Caps lock is On" | 33 | content="Caps lock is On" |
34 | placement="right" | 34 | placement="right" |
35 | manual | 35 | manual |
36 | > | 36 | > |
37 | <el-form-item prop="password"> | 37 | <el-form-item prop="password"> |
38 | <span class="svg-container"> | 38 | <span class="svg-container"> |
39 | <svg-icon icon-class="password" /> | 39 | <svg-icon icon-class="password" /> |
40 | </span> | 40 | </span> |
41 | <el-input | 41 | <el-input |
42 | :key="passwordType" | 42 | :key="passwordType" |
43 | ref="password" | 43 | ref="password" |
44 | v-model="loginForm.password" | 44 | v-model="loginForm.password" |
45 | :type="passwordType" | 45 | :type="passwordType" |
46 | :placeholder="$t('login.password')" | 46 | :placeholder="$t('login.password')" |
47 | name="password" | 47 | name="password" |
48 | tabindex="2" | 48 | tabindex="2" |
49 | autocomplete="on" | 49 | autocomplete="on" |
50 | @keyup.native="checkCapslock" | 50 | @keyup.native="checkCapslock" |
51 | @blur="capsTooltip = false" | 51 | @blur="capsTooltip = false" |
52 | @keyup.enter.native="handleLogin" | 52 | @keyup.enter.native="handleLogin" |
53 | /> | 53 | /> |
54 | <span | 54 | <span |
55 | class="show-pwd" | 55 | class="show-pwd" |
56 | @click="showPwd" | 56 | @click="showPwd" |
57 | > | 57 | > |
58 | <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" /> | 58 | <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" /> |
59 | </span> | 59 | </span> |
60 | </el-form-item> | 60 | </el-form-item> |
61 | </el-tooltip> | 61 | </el-tooltip> |
62 | <div style="position:relative;text-align:right;height:30px;line-height:30px;border:0px #000 solid;margin-top:-20px;"> | 62 | <div style="position:relative;text-align:right;height:30px;line-height:30px;border:0px #000 solid;margin-top:-20px;"> |
63 | <!-- <el-checkbox v-model="checked">{{$t('rememberpassword')}}</el-checkbox> --> | 63 | <!-- <el-checkbox v-model="checked">{{$t('rememberpassword')}}</el-checkbox> --> |
64 | <el-link type="primary">{{ $t('login.forgetpassword') }}</el-link> | 64 | <el-link type="primary">{{ $t('login.forgetpassword') }}</el-link> |
65 | <el-link type="primary">{{ $t('login.signup') }}</el-link> | 65 | <el-link type="primary">{{ $t('login.signup') }}</el-link> |
66 | </div> | 66 | </div> |
67 | <el-button | 67 | <el-button |
68 | :loading="loading" | 68 | :loading="loading" |
69 | type="primary" | 69 | type="primary" |
70 | style="width:100%;" | 70 | style="width:100%;" |
71 | @click.native.prevent="handleLogin" | 71 | @click.native.prevent="handleLogin" |
72 | >{{ $t('login.logIn') }}</el-button> | 72 | >{{ $t('login.logIn') }}</el-button> |
73 | <div style="position:relative;text-align:right;height:30px;line-height:30px;border:0px #000 solid;margin-bottom:30px;"> | 73 | <div style="position:relative;text-align:right;height:30px;line-height:30px;border:0px #000 solid;margin-bottom:30px;"> |
74 | <div class="tips"> | 74 | <div class="tips"> |
75 | <el-button | 75 | <el-button |
76 | class="thirdparty-button" | 76 | class="thirdparty-button" |
77 | type="primary" | 77 | type="primary" |
78 | @click="showDialog=true" | 78 | @click="showDialog=true" |
79 | >{{ $t('login.thirdparty') }}</el-button> | 79 | >{{ $t('login.thirdparty') }}</el-button> |
80 | </div> | 80 | </div> |
81 | <!-- <div class="tips"> | 81 | <!-- <div class="tips"> |
82 | <span style="margin-right:18px;">{{ $t('login.username') }} : runner</span> | 82 | <span style="margin-right:18px;">{{ $t('login.username') }} : runner</span> |
83 | <el-link type="primary">{{ $t('login.signup') }}</el-link> | 83 | <el-link type="primary">{{ $t('login.signup') }}</el-link> |
84 | </div> --> | 84 | </div> --> |
85 | </div> | 85 | </div> |
86 | <div style="position:relative"> | 86 | <!-- <div style="position:relative"> --> |
87 | <!-- <div class="tips"> | 87 | <!-- <div class="tips"> |
88 | <span>{{ $t('login.username') }} : admin</span> | 88 | <span>{{ $t('login.username') }} : admin</span> |
89 | <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> | 89 | <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> |
90 | </div> | 90 | </div> |
91 | <div class="tips"> | 91 | <div class="tips"> |
92 | <span style="margin-right:18px;">{{ $t('login.username') }} : assistant</span> | 92 | <span style="margin-right:18px;">{{ $t('login.username') }} : assistant</span> |
93 | <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> | 93 | <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> |
94 | </div> | 94 | </div> |
95 | <div class="tips"> | 95 | <div class="tips"> |
96 | <span style="margin-right:18px;">{{ $t('login.username') }} : runner</span> | 96 | <span style="margin-right:18px;">{{ $t('login.username') }} : runner</span> |
97 | <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> | 97 | <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> |
98 | </div> | 98 | </div> |
99 | <div class="tips"> | 99 | <div class="tips"> |
100 | <span style="margin-right:18px;">{{ $t('login.username') }} : shoper</span> | 100 | <span style="margin-right:18px;">{{ $t('login.username') }} : shoper</span> |
101 | <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> | 101 | <span>{{ $t('login.password') }} : {{ $t('login.any') }}</span> |
102 | </div> --> | 102 | </div> --> |
103 | </div> | 103 | <!-- </div> --> |
104 | </el-form> | 104 | </el-form> |
105 | 105 | ||
106 | <el-dialog | 106 | <el-dialog |
107 | :title="$t('login.thirdparty')" | 107 | :title="$t('login.thirdparty')" |
108 | :visible.sync="showDialog" | 108 | :visible.sync="showDialog" |
109 | > | 109 | > |
110 | {{ $t('login.thirdpartyTips') }} | 110 | {{ $t('login.thirdpartyTips') }} |
111 | <br> | 111 | <br> |
112 | <br> | 112 | <br> |
113 | <br> | 113 | <br> |
114 | <social-sign /> | 114 | <social-sign /> |
115 | </el-dialog> | 115 | </el-dialog> |
116 | <!-- <vfd></vfd> --> | 116 | <!-- <vfd></vfd> --> |
117 | </div> | 117 | </div> |
118 | </template> | 118 | </template> |
119 | 119 | ||
120 | <script> | 120 | <script> |
121 | import { validUsername } from '@/utils/validate' | 121 | import { validUsername } from '@/utils/validate' |
122 | import LangSelect from '@/components/LangSelect' | 122 | import LangSelect from '@/components/LangSelect' |
123 | import SocialSign from './components/SocialSignin' | 123 | import SocialSign from './components/SocialSignin' |
124 | // import vfd from "vfd"; | 124 | // import vfd from "vfd"; |
125 | export default { | 125 | export default { |
126 | name: 'Login', | 126 | name: 'Login', |
127 | // components: { LangSelect, SocialSign, vfd }, | 127 | // components: { LangSelect, SocialSign, vfd }, |
128 | components: { LangSelect, SocialSign }, | 128 | components: { LangSelect, SocialSign }, |
129 | data() { | 129 | data() { |
130 | const validateUsername = (rule, value, callback) => { | 130 | const validateUsername = (rule, value, callback) => { |
131 | if (!validUsername(value)) { | 131 | if (!validUsername(value)) { |
132 | callback(new Error('Please enter the correct user name')) | 132 | callback(new Error('Please enter the correct user name')) |
133 | } else { | 133 | } else { |
134 | callback() | 134 | callback() |
135 | } | 135 | } |
136 | } | 136 | } |
137 | const validatePassword = (rule, value, callback) => { | 137 | const validatePassword = (rule, value, callback) => { |
138 | if (value.length < 6) { | 138 | if (value.length < 6) { |
139 | callback(new Error('The password can not be less than 6 digits')) | 139 | callback(new Error('The password can not be less than 6 digits')) |
140 | } else { | 140 | } else { |
141 | callback() | 141 | callback() |
142 | } | 142 | } |
143 | } | 143 | } |
144 | return { | 144 | return { |
145 | loginForm: { | 145 | loginForm: { |
146 | username: 'admin', | 146 | username: 'admin', |
147 | password: '111111' | 147 | password: '111111' |
148 | }, | 148 | }, |
149 | loginRules: { | 149 | loginRules: { |
150 | username: [ | 150 | username: [ |
151 | { required: true, trigger: 'blur', validator: validateUsername } | 151 | { required: true, trigger: 'blur', validator: validateUsername } |
152 | ], | 152 | ], |
153 | password: [ | 153 | password: [ |
154 | { required: true, trigger: 'blur', validator: validatePassword } | 154 | { required: true, trigger: 'blur', validator: validatePassword } |
155 | ] | 155 | ] |
156 | }, | 156 | }, |
157 | passwordType: 'password', | 157 | passwordType: 'password', |
158 | capsTooltip: false, | 158 | capsTooltip: false, |
159 | loading: false, | 159 | loading: false, |
160 | showDialog: false, | 160 | showDialog: false, |
161 | redirect: undefined, | 161 | redirect: undefined, |
162 | otherQuery: {} | 162 | otherQuery: {} |
163 | } | 163 | } |
164 | }, | 164 | }, |
165 | watch: { | 165 | watch: { |
166 | $route: { | 166 | $route: { |
167 | handler: function(route) { | 167 | handler: function(route) { |
168 | const query = route.query | 168 | const query = route.query |
169 | if (query) { | 169 | if (query) { |
170 | this.redirect = query.redirect | 170 | this.redirect = query.redirect |
171 | this.otherQuery = this.getOtherQuery(query) | 171 | this.otherQuery = this.getOtherQuery(query) |
172 | } | 172 | } |
173 | }, | 173 | }, |
174 | immediate: true | 174 | immediate: true |
175 | } | 175 | } |
176 | }, | 176 | }, |
177 | created() { | 177 | created() { |
178 | // window.addEventListener('storage', this.afterQRScan) | 178 | // window.addEventListener('storage', this.afterQRScan) |
179 | }, | 179 | }, |
180 | mounted() { | 180 | mounted() { |
181 | if (this.loginForm.username === '') { | 181 | if (this.loginForm.username === '') { |
182 | this.$refs.username.focus() | 182 | this.$refs.username.focus() |
183 | } else if (this.loginForm.password === '') { | 183 | } else if (this.loginForm.password === '') { |
184 | this.$refs.password.focus() | 184 | this.$refs.password.focus() |
185 | } | 185 | } |
186 | }, | 186 | }, |
187 | destroyed() { | 187 | destroyed() { |
188 | // window.removeEventListener('storage', this.afterQRScan) | 188 | // window.removeEventListener('storage', this.afterQRScan) |
189 | }, | 189 | }, |
190 | methods: { | 190 | methods: { |
191 | checkCapslock(e) { | 191 | checkCapslock(e) { |
192 | const { key } = e | 192 | const { key } = e |
193 | this.capsTooltip = key && key.length === 1 && key >= 'A' && key <= 'Z' | 193 | this.capsTooltip = key && key.length === 1 && key >= 'A' && key <= 'Z' |
194 | }, | 194 | }, |
195 | showPwd() { | 195 | showPwd() { |
196 | if (this.passwordType === 'password') { | 196 | if (this.passwordType === 'password') { |
197 | this.passwordType = '' | 197 | this.passwordType = '' |
198 | } else { | 198 | } else { |
199 | this.passwordType = 'password' | 199 | this.passwordType = 'password' |
200 | } | 200 | } |
201 | this.$nextTick(() => { | 201 | this.$nextTick(() => { |
202 | this.$refs.password.focus() | 202 | this.$refs.password.focus() |
203 | }) | 203 | }) |
204 | }, | 204 | }, |
205 | handleLogin() { | 205 | handleLogin() { |
206 | this.$refs.loginForm.validate(valid => { | 206 | this.$refs.loginForm.validate(valid => { |
207 | if (valid) { | 207 | if (valid) { |
208 | this.loading = true | 208 | this.loading = true |
209 | this.$store | 209 | this.$store |
210 | .dispatch('user/login', this.loginForm) | 210 | .dispatch('user/login', this.loginForm) |
211 | .then(() => { | 211 | .then(() => { |
212 | this.$router.push({ | 212 | this.$router.push({ |
213 | path: this.redirect || '/', | 213 | path: this.redirect || '/', |
214 | query: this.otherQuery | 214 | query: this.otherQuery |
215 | }) | 215 | }) |
216 | this.loading = false | 216 | this.loading = false |
217 | }) | 217 | }) |
218 | .catch(() => { | 218 | .catch(() => { |
219 | this.loading = false | 219 | this.loading = false |
220 | }) | 220 | }) |
221 | } else { | 221 | } else { |
222 | console.log('error submit!!') | 222 | console.log('error submit!!') |
223 | return false | 223 | return false |
224 | } | 224 | } |
225 | }) | 225 | }) |
226 | }, | 226 | }, |
227 | getOtherQuery(query) { | 227 | getOtherQuery(query) { |
228 | return Object.keys(query).reduce((acc, cur) => { | 228 | return Object.keys(query).reduce((acc, cur) => { |
229 | if (cur !== 'redirect') { | 229 | if (cur !== 'redirect') { |
230 | acc[cur] = query[cur] | 230 | acc[cur] = query[cur] |
231 | } | 231 | } |
232 | return acc | 232 | return acc |
233 | }, {}) | 233 | }, {}) |
234 | } | 234 | } |
235 | // afterQRScan() { | 235 | // afterQRScan() { |
236 | // if (e.key === 'x-admin-oauth-code') { | 236 | // if (e.key === 'x-admin-oauth-code') { |
237 | // const code = getQueryObject(e.newValue) | 237 | // const code = getQueryObject(e.newValue) |
238 | // const codeMap = { | 238 | // const codeMap = { |
239 | // wechat: 'code', | 239 | // wechat: 'code', |
240 | // tencent: 'code' | 240 | // tencent: 'code' |
241 | // } | 241 | // } |
242 | // const type = codeMap[this.auth_type] | 242 | // const type = codeMap[this.auth_type] |
243 | // const codeName = code[type] | 243 | // const codeName = code[type] |
244 | // if (codeName) { | 244 | // if (codeName) { |
245 | // this.$store.dispatch('LoginByThirdparty', codeName).then(() => { | 245 | // this.$store.dispatch('LoginByThirdparty', codeName).then(() => { |
246 | // this.$router.push({ path: this.redirect || '/' }) | 246 | // this.$router.push({ path: this.redirect || '/' }) |
247 | // }) | 247 | // }) |
248 | // } else { | 248 | // } else { |
249 | // alert('第三方登录失败') | 249 | // alert('第三方登录失败') |
250 | // } | 250 | // } |
251 | // } | 251 | // } |
252 | // } | 252 | // } |
253 | } | 253 | } |
254 | } | 254 | } |
255 | </script> | 255 | </script> |
256 | 256 | ||
257 | <style lang="scss"> | 257 | <style lang="scss"> |
258 | /* 修复input 背景不协调 和光标变色 */ | 258 | /* 修复input 背景不协调 和光标变色 */ |
259 | /* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */ | 259 | /* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */ |
260 | 260 | ||
261 | $bg: #283443; | 261 | $bg: #283443; |
262 | $light_gray: #fff; | 262 | $light_gray: #fff; |
263 | $cursor: #fff; | 263 | $cursor: #fff; |
264 | 264 | ||
265 | @supports (-webkit-mask: none) and (not (cater-color: $cursor)) { | 265 | @supports (-webkit-mask: none) and (not (cater-color: $cursor)) { |
266 | .login-container .el-input input { | 266 | .login-container .el-input input { |
267 | color: $cursor; | 267 | color: $cursor; |
268 | } | 268 | } |
269 | } | 269 | } |
270 | 270 | ||
271 | /* reset element-ui css */ | 271 | /* reset element-ui css */ |
272 | .login-container { | 272 | .login-container { |
273 | .el-input { | 273 | .el-input { |
274 | display: inline-block; | 274 | display: inline-block; |
275 | height: 47px; | 275 | height: 47px; |
276 | width: 85%; | 276 | width: 85%; |
277 | 277 | ||
278 | input { | 278 | input { |
279 | background: transparent; | 279 | background: transparent; |
280 | border: 0px; | 280 | border: 0px; |
281 | -webkit-appearance: none; | 281 | -webkit-appearance: none; |
282 | border-radius: 0px; | 282 | border-radius: 0px; |
283 | padding: 12px 5px 12px 15px; | 283 | padding: 12px 5px 12px 15px; |
284 | color: $light_gray; | 284 | color: $light_gray; |
285 | height: 47px; | 285 | height: 47px; |
286 | caret-color: $cursor; | 286 | caret-color: $cursor; |
287 | 287 | ||
288 | &:-webkit-autofill { | 288 | &:-webkit-autofill { |
289 | box-shadow: 0 0 0px 1000px $bg inset !important; | 289 | box-shadow: 0 0 0px 1000px $bg inset !important; |
290 | -webkit-text-fill-color: $cursor !important; | 290 | -webkit-text-fill-color: $cursor !important; |
291 | } | 291 | } |
292 | } | 292 | } |
293 | } | 293 | } |
294 | 294 | ||
295 | .el-form-item { | 295 | .el-form-item { |
296 | border: 1px solid rgba(255, 255, 255, 0.1); | 296 | border: 1px solid rgba(255, 255, 255, 0.1); |
297 | background: rgba(0, 0, 0, 0.1); | 297 | background: rgba(0, 0, 0, 0.1); |
298 | border-radius: 5px; | 298 | border-radius: 5px; |
299 | color: #454545; | 299 | color: #454545; |
300 | } | 300 | } |
301 | } | 301 | } |
302 | </style> | 302 | </style> |
303 | 303 | ||
304 | <style lang="scss" scoped> | 304 | <style lang="scss" scoped> |
305 | $bg: #2d3a4b; | 305 | $bg: #2d3a4b; |
306 | $dark_gray: #889aa4; | 306 | $dark_gray: #889aa4; |
307 | $light_gray: #eee; | 307 | $light_gray: #eee; |
308 | 308 | ||
309 | .login-container { | 309 | .login-container { |
310 | min-height: 100%; | 310 | min-height: 100%; |
311 | width: 100%; | 311 | width: 100%; |
312 | background-color: $bg; | 312 | background-color: $bg; |
313 | overflow: hidden; | 313 | overflow: hidden; |
314 | 314 | ||
315 | .login-form { | 315 | .login-form { |
316 | position: relative; | 316 | position: relative; |
317 | width: 520px; | 317 | width: 520px; |
318 | max-width: 100%; | 318 | max-width: 100%; |
319 | padding: 160px 35px 0; | 319 | padding: 160px 35px 0; |
320 | margin: 0 auto; | 320 | margin: 0 auto; |
321 | overflow: hidden; | 321 | overflow: hidden; |
322 | } | 322 | } |
323 | 323 | ||
324 | .tips { | 324 | .tips { |
325 | font-size: 14px; | 325 | font-size: 14px; |
326 | color: #fff; | 326 | color: #fff; |
327 | margin-bottom: 10px; | 327 | margin-bottom: 10px; |
328 | 328 | ||
329 | span { | 329 | span { |
330 | &:first-of-type { | 330 | &:first-of-type { |
331 | margin-right: 16px; | 331 | margin-right: 16px; |
332 | } | 332 | } |
333 | } | 333 | } |
334 | } | 334 | } |
335 | 335 | ||
336 | .svg-container { | 336 | .svg-container { |
337 | padding: 6px 5px 6px 15px; | 337 | padding: 6px 5px 6px 15px; |
338 | color: $dark_gray; | 338 | color: $dark_gray; |
339 | vertical-align: middle; | 339 | vertical-align: middle; |
340 | width: 30px; | 340 | width: 30px; |
341 | display: inline-block; | 341 | display: inline-block; |
342 | } | 342 | } |
343 | 343 | ||
344 | .title-container { | 344 | .title-container { |
345 | position: relative; | 345 | position: relative; |
346 | 346 | ||
347 | .title { | 347 | .title { |
348 | font-size: 26px; | 348 | font-size: 26px; |
349 | color: $light_gray; | 349 | color: $light_gray; |
350 | margin: 0px auto 40px auto; | 350 | margin: 0px auto 40px auto; |
351 | text-align: center; | 351 | text-align: center; |
352 | font-weight: bold; | 352 | font-weight: bold; |
353 | } | 353 | } |
354 | 354 | ||
355 | .set-language { | 355 | .set-language { |
356 | color: #fff; | 356 | color: #fff; |
357 | position: absolute; | 357 | position: absolute; |
358 | top: 3px; | 358 | top: 3px; |
359 | font-size: 18px; | 359 | font-size: 18px; |
360 | right: 0px; | 360 | right: 0px; |
361 | cursor: pointer; | 361 | cursor: pointer; |
362 | } | 362 | } |
363 | } | 363 | } |
364 | 364 | ||
365 | .show-pwd { | 365 | .show-pwd { |
366 | position: absolute; | 366 | position: absolute; |
367 | right: 10px; | 367 | right: 10px; |
368 | top: 7px; | 368 | top: 7px; |
369 | font-size: 16px; | 369 | font-size: 16px; |
370 | color: $dark_gray; | 370 | color: $dark_gray; |
371 | cursor: pointer; | 371 | cursor: pointer; |
372 | user-select: none; | 372 | user-select: none; |
373 | } | 373 | } |
374 | 374 | ||
375 | .thirdparty-button { | 375 | .thirdparty-button { |
376 | position: absolute; | 376 | position: absolute; |
377 | right: 0; | 377 | right: 0; |
378 | bottom: 6px; | 378 | bottom: 6px; |
379 | } | 379 | } |
380 | 380 | ||
381 | @media only screen and (max-width: 470px) { | 381 | @media only screen and (max-width: 470px) { |
382 | .thirdparty-button { | 382 | .thirdparty-button { |
383 | display: none; | 383 | display: none; |
384 | } | 384 | } |
385 | } | 385 | } |
386 | } | 386 | } |
387 | </style> | 387 | </style> |
388 | 388 |