大家好,我是程序员鱼皮。很多朋友都知道,我从 22 年开始带大家做项目,至今已经练习两年半、带做了 10 多套项目。虽然不断产出新项目,但随着时间的流逝和技术的更新,早期录制的项目教程的含金量也会慢慢减少。
比如之前就有小伙伴吐槽:用户中心项目的 React 前端根本看不懂啊,入不了门啊!
的确,当时我考虑到用户中心项目的主要目的是帮没做过项目的朋友了解项目前后端的标准开发流程,所以前端直接使用了 Ant Design Pro 脚手架,可以尽量少写代码、快速完成页面开发。但没想到,这个脚手架更新地太特么快了!以至于对版本号不太敏感的同学,安装了跟教程中不一致的版本,就会出现一些小问题。
虽然改个版本号就能解决,但很多新手就是不知道、也不看文档。不过这也没办法,我刚开始学的时候也不知道看文档哈哈。
所以,我选择录制一套全新的、更适合入门的前端项目教程,目标是让没有前端项目经验、或者基础较差的同学也能快速入门前端项目的开发,同时补充一些网站开发的知识。
⭐️ 推荐观看视频教程:https://bilibili.com/video/BV1MHSMYvEJq/
下面是文字教程,内容较长,大家可以先收藏再阅读~
本文重点
本次的前端教程中,会假设已经完成了用户中心项目后端,并提供了 API 接口,在此基础上去开发前端项目,功能和特性与之前的前端教程(React 框架)保持一致,因此可以单独学习。
一般企业中开发,前后端是同时开发的,但如果想保证前端的运行效果,最好是后端先完成开发,独立开发全栈项目时也建议先开发后端。(当然前端同学也可以使用 Mock 技术模拟后端接口,不用干等着后端)
大纲:
-
-
-
Web 前端项目初始化(简易 Vue 前端万用模板开发)
-
-
用户登录(Cookie / Session 讲解)
-
-
-
一、Web 前端技术选型
-
-
-
Ant Design 组件库:快速开发 UI 界面
-
-
-
⭐️ 前端工程化:ESLint + Prettier + TypeScript,保证前端项目开发规范
这里解释一下为什么用 Vue-CLI?
Vue CLI 已经进入了稳定维护版本,不会出现未来因为版本号升级导致和教程不一致的情况,【更适合新手入门】;而且会一个脚手架,其他的也都会了,比如使用打包更快的 Vite。
二、Web 前端项目初始化
自主打造一套简易的前端开发项目模板
确认环境!!!
nodeJS 版本 >= 10 均可
检测命令:
node -v
推荐使用快速切换和管理 node 版本的工具 NVM ,可以参考 该视频 配置前端环境。
创建项目
使用 Vue-CLI 脚手架快速创建 Vue3 的项目:https://cli.vuejs.org/zh/
为什么选择该脚手架?
-
-
目前进入维护模式,相对稳定,对低版本的 Node 兼容性好,不容易出现因为环境不同而导致的问题
-
相对轻量,整合了一些前端项目开发常用的工具,并且可以按需选取
该脚手架自动整合了 vue-router 路由、TypeScript、前端工程化等库:
可以 参考官方文档 来安装脚手架工具:
npm install -g @vue/cli
检测是否安装成功:
vue -V
如图,鱼皮的版本是 5.0.8,尽量保持一致:
如果找不到命令,那么建议重新到官网安装 npm,会自动帮你配置环境变量。
创建项目:
vue create user-center-frontend-vue
手动选择特性:
选择如下特性:
会自动生成代码并安装依赖:
然后用 WebStorm 打开项目,在终端执行
npm run serve
,能访问网页就成功了。
前端工程化配置
脚手架已经帮我们配置了 Prettier 代码美化、ESLint 自动校验、TypeScript 类型校验、格式化插件等,无需再自行配置。
但是需要在 webstorm 里开启代码美化插件:
在 vue 文件中执行格式化快捷键,不报错,表示配置工程化成功。
如果发现格式化效果不好,也没关系,之后可以使用另外一种格式化快捷键:
如果想关闭 ESLint 校验导致的编译错误(项目无法运行),可以修改
vue.config.js
来 关闭 lintOnsave :
const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({
transpileDependencies: true,
lintOnSave: "warning",
});
修改 .eslintrc.js 和 tsconfig.json 可以改变校验规则。
如果不使用脚手架,就需要自己整合这些工具,比较麻烦。
引入组件库
引入 Ant Design Vue 组件库,参考 官方文档 快速上手。
注意,本教程使用的是 v4.2.6 的组件库版本,如果后续阅读本教程中发现有组件或语法不一致,以官方文档为主,或者在网站右上角切换对应版本的文档即可:
执行安装:
npm i --save [email protected]
改变主入口文件 main.ts,全局注册组件(为了方便):
import
{ createApp } from "vue";
import App from "./App.vue";
import router from "./router";
import Antd from "ant-design-vue";
import "ant-design-vue/dist/reset.css";
createApp(App).use(Antd).use(router).mount("#app");
随便引入一个组件,如果显示出来,就表示引入成功。
比如引入按钮:
type="primary">Primary Button</a-button>
效果如图:
开发规范
个人建议遵循 Vue3 的组合式 API (Composition API),而不是 选项式 API,开发更自由高效一些。
示例代码:
全局通用布局
1、基础布局结构
在 layouts 目录下新建一个布局
BasicLayout.vue
, 在 App.vue 全局页面入口文件中引入。
App.vue 代码如下:
"app">
<
/div>
template>
样式:
页面效果如图:

用户登录页面
新建 UserLoginPage.vue,可以基于 Ant Design 的表单组件 快速开发登录页面。
先开发基础页面,可以按照需要增加一些前端校验,代码如下:
用户登录
style="max-width: 480px; margin: 0 auto"
label-align="left"
:label-col="{ span: 4 }"
:wrapper-col="{ span: 20 }"
:model="form"
@finish="handleSubmit"
>
name="userAccount"
label="账号"
:rules="[{ required: true, message: '请输入账号' }]"
>
name="userPassword"
label="密码"
:rules="[
{ required: true, message: '请输入密码' },
{ min: 8, message: '密码不少于 8 位' },
]"
>
v-model:value="form.userPassword"
placeholder="请输入密码"
/>
登录
需要定义一个响应式变量来接受表单输入的值:
/**
* 表单信息
*/
const form = reactive({
userAccount: "",
userPassword: "",
});
编写表单提交后执行的函数,登陆成功后需要在全局状态中记录当前登录用户的信息,并跳转到主页:
const router = useRouter();
const loginUserStore = useLoginUserStore();
/**
* 提交表单
* @param data
*/
const handleSubmit = async () => {
const res = await userLogin(form);
// 登录成功,跳转到主页
if (res.data.code === 0 && res.data.data) {
await loginUserStore.fetchLoginUser();
message.success("登录成功");
router.push({
path: "/",
replace: true,
});
} else {
message.error("登录失败");
}
};
页面效果如图:

用户注册页面
同样使用表单组件,在用户登录页面的基础上调整即可,涉及到更多表单项的填写:
用户注册
style="max-width: 480px; margin: 0 auto"
label-align="left"
:label-col="{ span: 4 }"
:wrapper-col="{ span: 20 }"
:model="form"
@finish="handleSubmit"
>
name="userAccount"
label="账号"
:rules="[{ required: true, message: '请输入账号' }]"
>
name="userPassword"
label="密码"
:rules="[
{ required: true, message: '请输入密码' },
{ min: 8, message: '密码不少于 8 位' },
]"
>
v-model:value="form.userPassword"
placeholder="请输入密码"
/>
name="checkPassword"
label="确认密码"
:rules="[
{ required: true, message: '请输入确认密码' },
{ min: 8, message: '确认密码不少于 8 位' },
]"
>
v-model:value="form.checkPassword"
placeholder="请输入密码"
/>
name="planetCode"
label="编号"
:rules="[{ required: true, message: '请输入编号' }]"
>
注册
定义表单信息变量:
const form = reactive({
userAccount: "",
userPassword: "",
checkPassword: "",
planetCode: "",
});
编写提交表单函数,可以增加一些前端校验,并且在注册成功后跳转到用户登录页:
const handleSubmit = async () => {
// 可以增加一些前端校验
if (form.checkPassword !== form.userPassword) {
message.error("二次输入的密码不一致");
return;
}
const res = await userRegister(form);
// 注册成功,跳转到登录页面
if (res.data.code === 0 && res.data.data) {
message.success("注册成功");
router.push({
path: "/user/login",
replace: true,
});
} else {
message.error("注册失败," + res.data.description);
}
};
页面效果如图:
