- 用户登录操作
- 后台首页展现、展现左侧菜单列表
- 完成用户模块的crud–增删改查
- 完成商品分类模块的crud
- 完成商品模块的crud
- 完成商品关联入库、关联查询
- 完成商品图片文件上传
- 完成图片的回显 nginx反向代理
- 完成项目服务器部署 准备3台tomcat服务器 实现负载均衡、搭建tomcat集群
- 实现项目linux 真实环境部署
菜单
在pom里添加maven依赖
1. 创建一个新的项目 jt 2. 编辑pom文件 3. 复制目录 4.修改后端服务器的端口号server: port: 80915. 流程
controller 要加两个注解
- @CrossOrigin //跨越那个服务器,就在谁的头上加注解
- @RestController
//将该类交给Spring容器管理
@RestController
@CrossOrigin
public class UserController {
@Autowired
private UserService userService;
//1.测试后端
@GetMapping("findall")
public List findall(){
return userService.findAll();
}
}
service 接口
public interface UserService {
List findAll();
}
实现类 接口实现类
要加注解
- @Service //将该类交给Spring容器管理
@Service
public class UserServiceImplt implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public List findAll() {
return userMapper.findAll();
}
}
mapper接口
- 在mapper头顶加@Mapper注解
- 或者在启动类上加@Mapperscan
@Mapper
public interface UserMapper {
List findAll();
}
后端项目环境的测试
- 目录
- 后补
components组件页面
完成用户登录用户登录的流程
- 用户输入用户名和密码
- 通过vue中的axios发起post请求和参数
- 在UserController中接受用户的请求和参数
- 现将密码进行加密处理 根据参数查询数据
4.1 查询成功有数据 输入正确 有且只有一个数据
4.2.查询失败 没有数据 输入有误
5.登陆成功 则返回token秘钥(传token是为了安全性 )利用SysResult对象返回
目录结构:
controller
service
mapper
“小型类型文件”,为了辨别用户身份,是通过session加密跟踪用户信息,即暂时或永久储存在计算机(本地终端)
- 是一个小型文本文件,存储在本地终端上
- 可以存储用户信息
- 数据类型key-value
- 数据一般采用加密的方式保存
- 数据可以“永久”保存
session加密跟踪用户信息,会话期间有效
session和cookie选择特点:
- 临时用session 永久用cookie
- 对于安全性较高的数据,选用session
- seesion和cookie信息的查看,如图:
跳转到系统主页–组件是 home
步骤:
- 导入组件
- 添加跳转路径
- 如图:
引入:
说明:用户在未登录的情况下,可直接访问其他页面,没有安全性
所以需要添加校验规则
校验的规则:
1.访问没有token信息,则用户没有登录,则需要跳转登录页面
2.
问题:如何实现每一次的请求都要校验
答:路由导航拦截器
- 业务接口
1.2 如图: - 权限列表查询的sql(关联查询)
2.1 如图:
但是我们映射的sql语句是不能出现重名的id,需要更改:
也可以选择封装时更改 resultMap
写了箭头函数,写this,代表当前的function函数
实现子集
点击请求后,要求跳转的页面组件 在 home组件空白位置展现—即该组件为home组件的子级
路由语法说明
组成路由的三个部分:
商场 路由 跳转的关键字路由的填充位,跳转的页面 --> 展现的位置 - const routes = [ {path: '/', redirect: '/login'},// redirect:再直接询问 {path: '/login', component: Login}, {path:'/home',component:Home} ]路由的跳转规则
父子组件跳转
第一步:在home里有个占位符 router-view
代码:
在home组件中
第二步:实现父子组件的映射
思路:从home组件跳转到home下的子组件user页面下,代码展现–使用children关键字,前提是,在home里有个占位符 router-view
在index 路由组件中
{path:'/home',component:Home,children:[
{path: '/', component: }
]}
实现跳转user的总结
跳转页面,同时获取用户数据 – 实现方法: 生命周期函数
1.
//利用钩子函数实现数据查询
mounted(){
this.getUserList()
}
2.获取的js
async getUserList(){
//动态获取数据 get请求 携带多个数据 封装成对象 用params
const {data: result} = await this.$http.get('/user/list',{
params: this.queryInfo
})
// 访问失败
if(result.status !== 200) return this.$message.error("用户列表查询失败")
// rows 后讲 多层封装
this.userList = result.data.rows
// total 后讲
this.total = result.data.total
console.log("总记录数:"+this.total)
}
封装的对象queryInfo
queryInfo: { //封装的对象
query: '', //查询:请输入内容
pageNum: 1, //初始化页
pageSize: 20 //定义每页几行
}
业务:分页查询数据
前端使用的对象封装,后端数据库 也应该用PageResult对象封装
前后端数据关联:在后端服务器需要额外的查询总数以及分页的总数
请求类型为get 一共传了三个参数 --> 返回结果有五个 --> 把剩余的两个附带上 --> 业务
数据封装:如图
后端编辑
controller
sql查询
分页sql语法:
select * from user limit 起始位置,查询条数 (含头不包尾)
第一页:
select * from user limit 0,10
第二页:
select * from user limit 10,10
第n页:
select * from user limit (页数-1)*条数,条数
(分数据库 limit不是通用的 sql标准 是通过row 行的方式来查询)
需求: 如果query有参数,则添加like关键字 --> 如何实现??动态sql
username like "%"#{query}"%"
扩展:将多值封装成单值 @Param
总结:
controller
实现类
mapper接口
xml
知识点一:非空校验
知识点二:双向数据绑定
- 点击事件
确 定 - 函数说明 校验
//校验用户数据 valid表示校验是否通过
addUserBtn(){
this.$refs.addUserRef.validate(async valid => {
//如果校验失败 则停止数据
if(!valid) return
//console.log(this.addUserModel)
const {data: result} = await this.$http.post('/user/addUser',this.addUserModel)
if(result.status !== 200) return this.$message.error("用户新增失败")
this.$message.success("用户新增成功")
//关闭对话框
this.dialogVisible = false
//重新获取用户列表
this.getUserList()
})
}
2.2 后端编辑
- 密码加密处理
- 设定默认状态
- 设定默认时间
- sql语句 insert into value
controller
实现类
mapper.xml
点击修改按钮时,触发作用域插槽(获取当前行的所有数据)–>根据id更新数据 --> 为了获取id 所以使用作用域插槽获取当前行的全部数据
需要注意的是sql语句 只需要写三个值,username phone email
仔细看前端页面
- 路径是resultful形式 所以putmapping注意
- 传参是单值 写@path…
- 只有一个参数的时候,sql会自动按照下表,所以#{写什么都行}
xml
摁钮
摁钮触发的方法 : 校验 和 根据接口文档封装数据
URL:/user/updateUser
参数类型 是user的js对象 – 属性有三个 id phone email --> 后端用json串接
-
查看用户接口文档
-
编辑controller
-
实现类:修改更新时间 updated
-
编辑xml文件 update user set phone = #{phone} ,email = #{email},updated = #{updated} where id = #{id}
- 点击删除按钮 会弹出消息确认框
- 触发方法 – > scope.row作用域插槽
- 确认就是confirm 取消就是cancel
- url:/user/{id}
- 参数id
- 接口文件:接受单个参数id需要添加@PathVariable 接口方法注意不要重名 deleteByUserId()
- sql : delete from user where id = #{id}
说明:用户可以修改状态 请求路径是:
更新操作一定要写条件
在js中无法直接识别布尔型数据 所以用一个开关
拓展:vue.js作用域插槽
一般在表格数据中,信息不全,如果需要获取全部数据,则需要使用 vue.js作用域插槽
作用域插槽 基本语法:
{{scope.row}}
其中{{scope.row}} 代表当前行的全部信息
5.2 后端编辑controller–更新操作不用返回值,看路径是resultful形式,
实现类
全局异常的处理机制 – 只拦截controller层抛出的异常 语法规则
- 1.标识该类是异常处理机制
- @RestControllerAdvice 返回对象是json串
- advice:通知 AOP技术 面向切面编程 的技术 用来解决特定问题
- 返回值几乎统一
- 说明:需要定义一个方法
- 要求:返回的是统一的业务数据 SysResult
- 拦截:指定遇到某种异常实现AOP处理
- 2.在方法上添加注解 @ExceptionHandler()
参考:
//全局异常的处理机制 -- 只拦截controller层抛出的异常
@RestControllerAdvice
public class SystemExe {
//用来拦截指定的异常 当我们遇到运行异常时,报这个异常
@ExceptionHandler({RuntimeException.class})
public Object fail(Exception e){//异常类型较多 数量多 用大类Object接
e.printStackTrace();
//返回返回失败
return SysResult.fail();
// return SysResult.fail1();
// return SysResult.fail2();
}
}
5.2 spring中事务机制
5.2.1 特征
- 原子性 事务同时成功同时失败 不能分割
- 隔离性 多个事务相互隔离 独立 互不干扰
- 一致性 保证数据的一直(脏读/幻读/不可重复度)
- 持久性 一旦事务提交 就应该持久化保存
在实现类上添加注解@Transactional
@Transactional
@Override
public void deleteUserById(Integer id) {
userMapper.deleteUserById(id);
}



