1.项目概述
1.1 电商业务概述
- 客户使用的业务服务:PC端,小程序,移动web,移动app
- 管理员使用的业务服务:PC后台管理端。
1.2 PC后台管理端的功能
管理用户账号(登录,退出,用户管理,权限管理),商品管理(商品分类,分类参数,商品信息,订单),数据统计
1.3 电商后台管理系统采用的开发模式(前后端分离)
- 前端项目是
基于Vue的SPA(单页应用程序)项目
1.4 技术选型
1.前端技术栈:
- Vue
- Vue-Router
- Element-UI
- Axios
- Echarts 2.后端技术栈:(了解)
- Node.js
- Express
- Jwt(模拟session)
- Mysql
- Sequelize(操作数据库的框架)
2. 项目初始化
2.1 前端项目初始化步骤 p5-p6
- A.安装Vue脚手架
- B.通过脚手架创建项目 vue ui
- C.配置路由
- D.配置Element-UI:在插件中安装,搜索vue-cli-plugin-element-plus
- E.配置Axios:在依赖中安装,搜索axios(运行依赖)
- F.初始化git仓库
- G.将本地项目托管到github或者码云中
- 设置-生成公钥
ssh-keygen -t rsa -C "xxxxx@xxxxx.com" - /Users/ni/.ssh/id_rsa.pub
- 添加后,在终端(Terminal)中输入
ssh -T git@gitee.com-yes
- 设置-生成公钥
2.2 本地仓库托管到码云中 p7
- Git 全局设置:
- git config --global user.name "lynnajin"
- git config --global user.email "8524976+lynnajin@user.noreply.gitee.com"
- 先在本地仓库提交git暂存区中的文件
- git add .
- git commit -m "add files"
- git status
- 已有仓库:
- git remote add origin gitee.com/lynnajin/vu…
- git push -u origin master
2.3 后台项目的环境安装配置(未解决) p8
- A.安装Navicat Premium并导入mysql数据库数据 安装教程
- 1)下载mysql
- mysql官网,选择
MySQL Community Server,下载dmg文件 - 安装成功后,在系统偏好设置中打开即可
- mysql官网,选择
- 2)下载Navicat Premium,安装成功后打开
- 点击connection-选择mysql
- 输入连接名字(自己随便起),填入服务器名(远程主机名,本机是localhost),用户名,密码
mysql的密码,端口号:3306(mysql默认端口号) - 新建数据库:此时左侧列表会显示出刚刚所创建连接,鼠标右击点击新建数据库
- 创建表:选中刚创建的数据库,点击表头查询,新建查询
- 在项目文件根目录下找到
shop2-server/db/mydb.sql导入该文件后,点击运行 - 等待几分钟,数据生成完毕后,右击左侧表,刷新如图就完成了本地服务器部署
- 1)下载mysql
- B.安装nodeJS,配置后台项目,从终端打开后台项目
shop2-server文件夹,然后在终端中输入命令安装项目依赖包:npm installp9- 要在shop2-server/config/default.json文件中修改用户名和密码
"db_config" : {
"protocol" : "mysql",
"host" : "127.0.0.1",
"database" : "itcast",//改成上面设置的database的名字
"user" : "root",
"password" : "root", //改成自己的数据库密码才行
"port" : 3306
}
3. 登录/退出功能 p10
3.1登录概述
1.登录业务流程
- (1)在登录页面输入用户名和密码
- (2)调用后台接口进行验证
- (3)通过验证之后,根据后台的响应状态跳转到项目主页
2.登录业务的相关技术点
- http是无状态的
- 通过cookie在客户端记录状态
- 通过session在服务端记录状态
- 通过token方式维持状态(存在
跨域问题时使用,否则使用以上两种)
3.2 登录——token原理分析
3.3 登录功能实现 p11
1.登录页面的布局
通过Element-ui组件实现布局
- el-form
- el-form-item
- el-input
- el-button
- 字体图标
步骤: p12
- 使用vscode打开前端项目
- 执行:
git status检查项目状态。(检查当前工作区是否是干净的) - 执行:
git checkout -b login创建login分支,并且切换到该分支。(开发新功能时,尽量在新分支上开发,开发完成后再合并到master分支) - 执行:
git branch查看当前项目所有分支(目前有login和master) - 执行:
git status查看项目当前在哪个分支上 - 然后执行
vue ui命令打开ui界面,然后运行serve,点击启动,运行app查看当前项目效果 - 发现现在是一个默认页面,我们需要进行梳理,打开项目的src目录,点击
main.js文件(入口文件)
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import './plugins/element.js'
Vue.config.productionTip = false
new Vue({
router,
render: h => h(App)
}).$mount('#app')
- 再打开
App.vue(根组件),将根组件的内容进行操作梳理(template中留下根节点,script中留下默认导出,去掉组件,style中去掉所有样式)
<template>
<div id="app">
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'app'
}
</script>
<style>
</style>
- 再打开
router.js(路由),将routes数组中的路由规则清除,然后将views删除,将components中的helloworld.vue删除
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export default new Router({
routes: [
]
})
- 在components文件夹中新建
Login.vue组件,添加template,script,style标签 p13注意:单文件的style标签中一定要加scoped,只在当前组件内生效,可以防止组件之间的样式冲突,没有scoped则样式是全局的;同时,style支持less语法
// Login.vue
<template>
<div>
登录组件
</div>
</template>
<script>
export default {
}
</script>
<style lang="less" scoped>
</style>
- 在
router.js中导入组件并设置规则,访问根路径时通过路由重定向自动跳转到登录页面
import { createRouter, createWebHashHistory } from 'vue-router'
import Login from './components/Login.vue'
const routes = [{
path: '/',
redirect: '/login'
}, {
path: '/login',
name: 'Login',
component: Login
}]
const router = createRouter({
history: createWebHashHistory(),
routes
})
export default router
- 在
App.vue中添加路由占位符
<template>
<div id="app">
app根组件
<!-- 路由占位符 -->
<router-view></router-view>
</div>
</template>
- 当我们给Login.vue中的内容添加样式的时候,会报错“缺少less-loader”,需要配置less加载器(开发依赖),安装
less(开发依赖),less-loader(开发依赖)p14 - 然后需要添加公共样式,在assets文件夹下面添加css文件夹,创建
global.css文件,添加全局样式
/* 全局样式表 */
html,body,#app{
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
- 在
main.js中导入global.css,使得全局样式生效import “./assets/css/global.css” - 然后
Login.vue中的根元素也需要设置撑满全屏(height:100%)
其中我们有用到一下内容,需要进行进一步处理:
- A.添加element-ui的表单组件 p16
- 在plugins文件夹中打开element.js文件,进行elementui的按需导入
import Vue from 'vue'
import { Button } from 'element-ui'
import { Form, FormItem } from 'element-ui'
import { Input } from 'element-ui'
Vue.use(Button)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)
- B.添加第三方字体 引入第三方阿里巴巴icon p17
- 复制素材中的fonts文件夹到assets中,在入口文件
main.js中导入import ‘./assets/fonts/iconfont.css’,然后直接在Login.vue使用
- 复制素材中的fonts文件夹到assets中,在入口文件
<el-input prefix-icon="iconfont icon-3702mima"></el-input>
- 登录组件表单数据的绑定 p18
<template>
。。。
<!-- 登录表单区域 -->
<el-form :model="loginForm" label-width="0px" class="login_form">
<!-- 用户名 -->
<el-form-item >
<el-input v-model="loginForm.username" prefix-icon="iconfont el-iconyonghu"></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item >
<el-input v-model="loginForm.password" type="password" prefix-icon="iconfont el-iconmima"></el-input>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
export default {
data () {
return {
// 这是登录表单的数据绑定对象
loginForm: {
username: '',
password: ''
}
}
}
}
</script>
- C.添加表单验证的步骤 p19
- 1).给添加属性 :rules=“rules”,rules是一堆验证规则,定义在script中
- 2).为label项添加prop属性:
<el-form-item prop="username"> - 3).在script中添加rules:
// 这是表单的验证规则对象
loginFormRules: {
// 验证用户名是否合法
username: [
{ required: true, message: '请输入登录名称', trigger: 'blur' },
{ min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' }
],
// 验证密码是否合法
password: [
{ required: true, message: '请输入登录密码', trigger: 'blur' },
{ min: 6, max: 15, message: '长度在 6 到 15 个字符', trigger: 'blur' }
]
}
- 重置表单并移除校验结果
resetFields( )p20
//1.为表单添加ref引用
<el-form ref="loginFormRef" >
//2.为按钮添加事件
<el-button type="info" @click="resetLoginForm">重置</el-button>
//3.设置事件
export default {
data () {
},
methods: {
// 点击重置按钮,重置登录表单
resetLoginForm () {
// this就是表单是实例对象
this.$refs.loginFormRef.resetFields()
}
}
- 登录前的预验证
validate( )p21
//1.给按钮添加点击事件
<el-button type="primary" @click="login">登录</el-button>
//2.设置事件,调用validatavalidate函数
login () {
this.$refs.loginFormRef.validate(valid => {
console.log(valid)
})
- 根据预验证是否发起请求 p22
- 导入axios以发送ajax请求
- 打开
main.js,import axios from ‘axios’; - 设置请求的根路径:axios.defaults.baseURL = ‘http://127.0.0.1:8888/api/private/v1/’;
- 挂载axios:
- vue3.0: app.config.globalProperties.$http = axios
- vue2.0(Vue.prototype.$http = axios;)
注意:要启动mysql,还有在shop2-serve下运行node app.js- 如果出错 Error: listen EADDRINUSE: address already in use :::8888 即端口被占用
- 解决方法:输入
sudo lsof -i:8888,查看被占用进程的pid,再输入sudo kill -9 pid即可杀死进程。
- Login.vue
//1.为login注册事件
<el-button type="primary" @click="login">登录</el-button>
//2.login()拿到登录数据 解构data属性
login () {
// 点击登录的时候先调用validate方法验证表单内容是否有误
this.$refs.loginFormRef.validate(async valid => {
// 如果valid参数为false则验证不通过
if (!valid) return
//const result = await this.$http.post('login', this.loginForm)
const { data: res } = await this.$http.post('login', this.loginForm)
console.log(res)
})