Skip to content

Commit b98bfb1

Browse files
Merge pull request #4 from github-learning/dev
Dev
2 parents 8c8e070 + 112cd3f commit b98bfb1

File tree

9 files changed

+232
-36
lines changed

9 files changed

+232
-36
lines changed

README1.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,6 @@
2020

2121
前后流程 角色 /
2222
是否踩过坑
23+
24+
zrh test
25+
test2

src/apis/user.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,31 @@ export interface IUserLoginData {
1919
username: string
2020
password: string
2121
}
22-
22+
export interface IUserRegisterData {
23+
username: string
24+
password: string
25+
verPassword: string
26+
}
2327
export interface ILoginResponseData {
2428
token: string
2529
}
30+
31+
export interface IRegisterResponseData {
32+
id: string
33+
username: string
34+
}
2635
// 登录接口
2736
export const login = (
2837
data: IUserLoginData
2938
): Promise<Api<ILoginResponseData>> => {
3039
return request.post('/auth/login', data)
3140
}
32-
41+
// 注册接口
42+
export const register = (
43+
data: IUserRegisterData
44+
): Promise<Api<IRegisterResponseData>> => {
45+
return request.post('/auth/register', data)
46+
}
3347
export interface IUsers {
3448
users: Profile[]
3549
total: number

src/main.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import element from './plugins/element'
77
import directives from './directives/index'
88
// 注册持久化插件
99
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
10+
import './style.css'
1011
import './permission'
1112
const pinia = createPinia()
1213
// 如果您正在使用CDN引入,请删除下面一行。

src/permission.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import NProgress from 'nprogress'
33
import 'nprogress/nprogress.css'
44
import { getToken } from '@/utils'
55
NProgress.configure({ showSpinner: false })
6-
const whiteList = ['/login']
6+
const whiteList = ['/login', '/register']
77
router.beforeEach(async (to) => {
88
// 获取用户信息
99
NProgress.start()

src/router/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@ const constantRoutes: RouteRecordRaw[] = [
4242
name: 'Login',
4343
component: () => import('@/views/login/index.vue')
4444
},
45-
45+
{
46+
path: '/register',
47+
name: 'register',
48+
component: () => import('@/views/register/index.vue')
49+
},
4650
{
4751
path: '/',
4852
name: 'layouts',

src/style.css

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
:root {
1+
/* :root {
22
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
33
line-height: 1.5;
44
font-weight: 400;
@@ -11,18 +11,19 @@
1111
text-rendering: optimizeLegibility;
1212
-webkit-font-smoothing: antialiased;
1313
-moz-osx-font-smoothing: grayscale;
14-
}
14+
} */
1515

1616
a {
17+
text-decoration: none;
1718
font-weight: 500;
18-
color: #646cff;
19-
text-decoration: inherit;
19+
color: #646cffd7;
2020
}
21+
2122
a:hover {
2223
color: #535bf2;
2324
}
2425

25-
body {
26+
/* body {
2627
margin: 0;
2728
display: flex;
2829
place-items: center;
@@ -76,4 +77,42 @@ button:focus-visible {
7677
button {
7778
background-color: #f9f9f9;
7879
}
80+
} */
81+
82+
/* 登陆注册页面样式 */
83+
.register-container,
84+
.login-container {
85+
@apply min-h-screen bg-indigo-500;
86+
}
87+
88+
.register-container .left,
89+
.register-container .right,
90+
.login-container .left,
91+
.login-container .right {
92+
@apply flex items-center justify-center;
93+
}
94+
95+
.register-container .right,
96+
.login-container .right {
97+
@apply bg-light-50 flex-col;
98+
}
99+
100+
.left > div > div:first-child {
101+
@apply font-bold text-5xl text-light-50 mb-4;
102+
}
103+
104+
.left > div > div:last-child {
105+
@apply text-gray-200 text-sm;
106+
}
107+
108+
.right .title {
109+
@apply font-bold text-3xl text-gray-800;
110+
}
111+
112+
.right > div {
113+
@apply flex items-center justify-center my-5 text-gray-300 space-x-2;
114+
}
115+
116+
.right .line {
117+
@apply h-[1px] w-16 bg-gray-200;
79118
}

src/utils/helpers.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export const sleep = (time: number = 1000): Promise<void> => {
2+
return new Promise((resolve) => {
3+
setTimeout(() => {
4+
resolve()
5+
}, time)
6+
})
7+
}

src/views/login/index.vue

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@
4949
>登 录</el-button
5050
>
5151
</el-form-item>
52+
<span class="text-slate-400 text-sm float-right m-2"
53+
>还没有账号? 请
54+
<router-link to="register"> 点击这里注册 </router-link>
55+
</span>
5256
</el-form>
5357
</el-col>
5458
</el-row>
@@ -121,30 +125,4 @@ onBeforeUnmount(() => {
121125
})
122126
</script>
123127

124-
<style scoped>
125-
.login-container {
126-
@apply min-h-screen bg-indigo-500;
127-
}
128-
.login-container .left,
129-
.login-container .right {
130-
@apply flex items-center justify-center;
131-
}
132-
.login-container .right {
133-
@apply bg-light-50 flex-col;
134-
}
135-
.left > div > div:first-child {
136-
@apply font-bold text-5xl text-light-50 mb-4;
137-
}
138-
.left > div > div:last-child {
139-
@apply text-gray-200 text-sm;
140-
}
141-
.right .title {
142-
@apply font-bold text-3xl text-gray-800;
143-
}
144-
.right > div {
145-
@apply flex items-center justify-center my-5 text-gray-300 space-x-2;
146-
}
147-
.right .line {
148-
@apply h-[1px] w-16 bg-gray-200;
149-
}
150-
</style>
128+
<style scoped></style>

src/views/register/index.vue

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
<template>
2+
<el-row class="register-container">
3+
<el-col :lg="16" :md="12" class="left">
4+
<div>
5+
<div>欢迎光临</div>
6+
<div>此站点是《vue3 + vite5 实战后台开发》演示项目</div>
7+
</div>
8+
</el-col>
9+
<el-col :lg="8" :md="12" class="right">
10+
<p class="title">用户注册</p>
11+
<div>
12+
<span class="line"></span>
13+
<div>账号注册</div>
14+
<span class="line"></span>
15+
</div>
16+
<el-form
17+
ref="ruleFormRef"
18+
class="w-[250px]"
19+
:model="registerFormData"
20+
:rules="rules"
21+
>
22+
<el-form-item prop="username">
23+
<el-input
24+
v-model="registerFormData.username"
25+
autocomplete="off"
26+
placeholder="请输入用户名"
27+
>
28+
<template #prefix>
29+
<el-icon><user /></el-icon>
30+
</template>
31+
</el-input>
32+
</el-form-item>
33+
<el-form-item prop="password">
34+
<el-input
35+
v-model="registerFormData.password"
36+
type="password"
37+
autocomplete="off"
38+
placeholder="请输入密码"
39+
show-password
40+
>
41+
<template #prefix>
42+
<el-icon><lock /></el-icon>
43+
</template>
44+
</el-input>
45+
</el-form-item>
46+
<el-form-item prop="verPassword">
47+
<el-input
48+
type="password"
49+
v-model.number="registerFormData.verPassword"
50+
placeholder="请确认密码"
51+
show-password
52+
>
53+
<template #prefix>
54+
<el-icon><lock /></el-icon>
55+
</template>
56+
</el-input>
57+
</el-form-item>
58+
<el-form-item>
59+
<el-button
60+
round
61+
type="primary"
62+
color="#626aef"
63+
:loading="loading"
64+
@click="submitForm(ruleFormRef)"
65+
class="w-[250px]"
66+
>
67+
注册
68+
</el-button>
69+
</el-form-item>
70+
<span class="text-slate-400 text-sm float-right m-2"
71+
>已有帐号?返回
72+
<router-link to="login"> 登陆 </router-link>
73+
</span>
74+
</el-form>
75+
</el-col>
76+
</el-row>
77+
</template>
78+
79+
<script setup lang="ts">
80+
import { useRouter } from 'vue-router'
81+
import { reactive, ref } from 'vue'
82+
import type { FormInstance, FormRules } from 'element-plus'
83+
import { register } from '@/apis/user'
84+
import { sleep } from '@/utils/helpers'
85+
const { proxy } = getCurrentInstance()!
86+
87+
const ruleFormRef = ref<FormInstance>()
88+
const loading = ref(false)
89+
90+
interface typeRegiser extends Record<string, string> {
91+
username: string
92+
password: string
93+
verPassword: string
94+
}
95+
const registerFormData: typeRegiser = reactive({
96+
username: '',
97+
password: '',
98+
verPassword: ''
99+
})
100+
const router = useRouter()
101+
102+
const validatePass = (
103+
_: unknown,
104+
value: string,
105+
callback: (error?: string | Error) => void
106+
) => {
107+
if (value === '') {
108+
callback(new Error('请确认密码'))
109+
} else if (value.toString() !== registerFormData.password) {
110+
callback(new Error('两次密码不一致'))
111+
} else {
112+
callback()
113+
}
114+
}
115+
const rules = reactive<FormRules<typeof registerFormData>>({
116+
username: [{ required: true, trigger: 'blur', message: '请输入用户名' }],
117+
password: [{ required: true, trigger: 'blur', message: '请输入密码' }],
118+
verPassword: [{ validator: validatePass, trigger: 'blur' }]
119+
})
120+
121+
const submitForm = (formEl: FormInstance | undefined) => {
122+
if (!formEl) return
123+
124+
formEl.validate(async (valid) => {
125+
if (valid) {
126+
loading.value = true
127+
await register(registerFormData)
128+
.then(async (res) => {
129+
proxy?.$message.success(res.message)
130+
await sleep()
131+
router.push({
132+
path: '/login'
133+
})
134+
})
135+
.catch(() => {
136+
for (const key in registerFormData) {
137+
if (Object.prototype.hasOwnProperty.call(registerFormData, key)) {
138+
registerFormData[key] = ''
139+
}
140+
}
141+
})
142+
.finally(() => {
143+
loading.value = false
144+
})
145+
}
146+
})
147+
}
148+
</script>
149+
150+
<style lang="scss" scoped></style>

0 commit comments

Comments
 (0)