四、前端系统搭建简介
系统前端模块的搭建
本系统使用Vue3
+Vue CLI
实现系统前端模块的搭建
环境准备
安装node
得到npm
,使用npm
安装vue cli
(脚手架),使用vue cli
创建项目
npm可设置淘宝镜像,淘宝镜像的域名换了,加快组件下载速度npm config set registry https://registry.npmmirror.com
项目创建
依据官方文档,创建项目web-train
创建的项目目录
进入项目目录,执行npm run serve
即可启动前端项目
vue项目启动端口号的修改方法,默认采用8080端口,如果8080被占用,则自动加1
前端模块集成Ant Design Vue
UI组件有很多选择,一种是基于CSS的Bootstrap,适用于各种前端框架;另一种是基于Vue的UI组件,只能用于Vue框架
Ant Design Vue使用流程
- 下载资源,安装依赖
- 全局注册或者部分注册
- 在vue中即可直接使用相关组件
小插曲:关于Ant Design Vue图标组件的使用
需要手动再次下载依赖
npm install --save @ant-design/icons-vue
在
main.js
中全局注册(官方文档只讲解了局部注册)全局注册方法
```javascript
import { createApp } from ‘vue’
import App from ‘./App.vue’
import router from ‘./router’
import store from ‘./store’
import Antd from ‘ant-design-vue’
import ‘ant-design-vue/dist/reset.css’
import * as Icons from ‘@ant-design/icons-vue’const app = createApp(App)
app.use(store).use(router).use(Antd).mount(‘#app’);//全局使用图标
const icons = Icons;
for(const i in icons){app.component(i,icons[i]);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
## 短信验证码登录流程
使用手机号+验证码的方式进行用户的登录注册
<img src="04 系统前端模块的搭建/image-20231207001544054.png" alt="image-20231207001544054" style="zoom:33%;" />
登录和注册共用同一个页面,如果手机号存在直接登录,否则后台自动进行注册
流程:用户输入手机号->点击获取验证码按钮->输入用户码->点击登录
**补充说明:**
该登录注册流程容易受到黑客攻击
- 同一手机号重复请求验证码
- 后台可以将对应手机号加入黑名单或者单个手机号当天验证码请求次数设置上限
- 大量不同手机号请求验证码
- 设置图像验证码,增大被攻击难度
- <img src="04 系统前端模块的搭建/image-20231207002409475.png" alt="image-20231207002409475" style="zoom:33%;" />
不带图像验证码的登录注册流程
<img src="04 系统前端模块的搭建/640bfc3c0994a1fb07522184-1701880296038-2.jpg" alt="640bfc3c0994a1fb07522184" style="zoom: 25%;" />
带图像验证码的登录注册流程
<img src="04 系统前端模块的搭建/640bfc7609fdf6fb12562184.jpg" alt="640bfc7609fdf6fb12562184" style="zoom: 25%;" />
## 登陆注册二合一界面开发
新增登录注册页面,同时在`web-train/src/router/index.js`中添加对应的路由(router)配置
```tex
对于router配置,大型项目,页面多,80%页面不常用,可以用懒加载的方式,减少编译后文件的大小,提高初始访问速度;小型目,页面少,可以用静态导入的方式,对编译后的文件大小影响不大
Vue页面的编写
一个vue页面,由三个部分组件,都不是必须的
- template,相当于html
- script,JS脚本
- style,CSS样式
发送短信验证码端口开发
持久层
mapper
直接使用以前mybatis generator
生成的代码
业务层
新建发送验证码对应请求的实体类com.bang.train.member.req.MemberSendCodeReq
1 | package com.bang.train.member.req; |
在服务层接口中定义新的方法
1 | String sendCode(MemberSendCodeReq req); |
服务层实现类中编写新增方法的具体实现
1 | //发送验证码接口 |
控制层
1 | 四要素: |
1 |
|
短信验证码登录接口开发
持久层
mapper
直接使用以前mybatis generator
生成的代码
业务层
新建登录对应请求的实体类com.bang.train.member.req.MemberLoginReq
1 | package com.bang.train.member.req; |
在服务层接口中定义新的方法
1 | MemberLoginResp login(MemberLoginReq req); |
服务层实现类中编写新增方法的具体实现
1 | //验证码登录接口 |
控制层
1 | 四要素: |
1 |
|
集成Axios完成登录功能
下载第三方依赖:
- 进入web前端工程目录
npm install axios
安装依赖
使用流程
在对应Vue文件中引入依赖
1
import axios from 'axios';
编写点击发送验证码事件
1
2
3
4
5
6
7
8
9
10
11
12
13const sendCode = () => {
axios.post("http://localhost:8000/member/send-code", {
mobile: loginForm.mobile
}).then(response => {
let data = response.data;
if (data.success) {
notification.success({ description: '发送验证码成功!' });
loginForm.code = "8888";
} else {
notification.error({ description: data.message });
}
});
};编写点击登录事件
1
2
3
4
5
6
7
8
9
10const login = () => {
axios.post("http://localhost:8000/member/login", loginForm).then((response) => {
let data = response.data;
if (data.success) {
notification.success({ description: '登录成功!' });
} else {
notification.error({ description: data.message });
}
})
};问题一:解决前后端跨域问题:
问题描述:前后端不在同一个域。IP一样,端口不一样,也算跨域。跨域是前后端分离不可避免的问题
问题解决:在后端网关模块
applicatio.yaml
文件中进行配置,允许跨域访问1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
# 允许携带认证信息
allow-credentials: true
# 允许跨域的源(网站域名/ip),设置*为全部
allowedOriginPatterns: "*"
# 允许跨域的method, 默认为GET和OPTIONS,设置*为全部
allowedMethods: "*"
# 允许跨域请求里的head字段,设置*为全部
allowedHeaders: "*"
#跨域检测有效期
maxAge: 3600
问题二:解决前后端参数传递问题
前端参数传递是以
json
形式传递的,后端目前只支持以表单的形式访问,在后端请求参数前加上@RequestBody
注解即可改为支持json
方式的请求数据,此时就不再支持以表单形式提交1
2
3
4
5
6
7
8
9
10
11
12
13
public CommonResp<String> sendCode({ MemberSendCodeReq req)
CommonResp<String> commResp = new CommonResp<>();
commResp.setContent(memberService.sendCode(req));
return commResp;
}
public CommonResp<MemberLoginResp> login({ MemberLoginReq req)
CommonResp<MemberLoginResp> commResp = new CommonResp<>();
commResp.setContent(memberService.login(req));
return commResp;
}对应的请求格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16### 验证码获取
POST http://localhost:8000/member/send-code
Content-Type: application/json
{
"mobile": "12345678908"
}
###登录
POST http://localhost:8000/member/login
Content-Type: application/json
{
"mobile":"12345678908",
"code":"8888"
}
增加Axios拦截器配置
axios
发送请求获取响应结果,应该能够打印对应日志信息,便于前后端联调
在main.js
中进行axios
拦截器配置
1 | /** |
在浏览器的控制台能够看到每次请求的日志信息
Vue CLI多环境配置
现在前端请求后端接口的url
是写死的,但在实际开发过程中,应该让后端接口的域名能够动态配置(开发环境、测试环境、部署环境的接口地址都不一样)
1 | 在前端根目录下增加文件 .env.xxx,xxx表是不同的环境 |
编写多个env文件
.env.dev
1 | NODE_ENV=development |
.env.prod
1 | NODE_ENV=production |
在main.js中引用对应变量,让其生效
1 | axios.defaults.baseURL = process.env.VUE_APP_SERVER; |
在各个Vue页面中,可以省略请求前缀URL编写
启动命令中指定对应环境
npm run serve --port 80 --mode xxx
其中xxx
为.env
文件名后缀
新增web控台主页面
可以选择Ant Design Vue
中的Layout
布局作为基础进行修改
- 新增控台主页面
main.vue
- 在
index.js
中新增对应路由 - 实现跳转,由登录页面登陆成功跳转至主页面