需求分析
- 用户模块
- 登录和注册
- 省份模块
- 增删改查
- 使用redis作为mybatis的缓存
- 景点模块
- 增删改查
- 使用redis作为mybatis的缓存
- 技术选型
- 前端:vue+axios
- 后端:springboot + mybatis + mysql + redis
库表设计
1、系统中有哪些表
用户表t_user、省份表t_province、景点表t_place
2、表与表之间的关系
用户表是独立的;省份表与景点表是1:N的关系
3、表中的字段
t_user:id、username、password、email
t_province:id、name、tags、placecounts
t_place:id、name、picpath、hotticket、dimticket、details、provinceid
库:travels
1 | create table t_user( |
编码环节
环境准备
1、创建springboot项目
2、导入druid数据据源和文件上传依赖
1 | <dependency> |
3、编写配置文件
1 | # 指定工程访问路径 |
开始编码
用户模块
实现注册和登录功能
bean
1 | package com.zyz.bean; |
dao
1 | package com.zyz.dao; |
1 |
|
service
1 | package com.zyz.service; |
1 | package com.zyz.service.impl; |
controller
1 | package com.zyz.controller; |
前端
使用v-model将表单中的数据与vue中data绑定
登录
1 | <script src="js/axios.min.js"></script> |
注册
1 | <script> |
在管理页面显示当前用户名:
1 | created(){ |
用户退出:
1 | <a href="javascript:;" @click="logout" style="float: right">安全退出</a> |
1 | methods:{ |
省份模块
展示所有省份
bean
1 | package com.zyz.bean; |
dao
抽取BaseDao
1 | /** |
ProvinceDao继承BaseDao
1 | package com.zyz.dao; |
1 | <?xml version="1.0" encoding="utf-8" ?> |
service
1 | package com.zyz.service; |
1 | package com.zyz.service.impl; |
controller
1 | package com.zyz.controller; |
前端
1 | <script> |
遍历当前查询到的信息
1 | <tbody> |
分页控件
1 | <div id="pages"> |
添加省份
dao
1 | <!-- 添加省份 --> |
service
1 |
|
controller
1 | /** |
前端
省份管理页:
1 | <button type="button" @click="toAdd" >添加省份</button> |
1 | // 跳转添加页面 |
添加页:
1 | // 添加省份方法 |
删除省份
dao
1 | <!-- 删除省份 --> |
serivce
1 |
|
controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 /**
* 删除省份
* @param id
* @return
*/
"delete") (
public Map<String,Object> delete(String id){
HashMap<String, Object> map = new HashMap<>();
try {
provinceService.delete(id);
map.put("status",true);
map.put("msg","提示:删除成功!");
} catch (Exception e) {
e.printStackTrace();
map.put("status",false);
map.put("msg","提示:删除失败");
}
return map;
}
前端
1 | <a href="javascript:;" @click="deletePro(province.id)">删除省份</a> |
1 | // 删除省份 |
修改省份
dao
1 | <!-- 根据id查询省份 --> |
service
1 |
|
controller
1 | /** |
前端
管理页面:
1 | <a href="javascript:;" @click="toUpdate(province.id)">修改省份</a> |
1 | // 跳转修改页面 |
修改页面:
1 | <button type="button" @click="update">修 改</button>  |
1 | <script> |
景点模块
根据省份展示该省份的所有景点
创建实体类
1 | package com.zyz.bean; |
dao层
1 | package com.zyz.dao; |
1 |
|
serivce层
1 | package com.zyz.service; |
1 | package com.zyz.service.impl; |
controller
1 | package com.zyz.controller; |
增加景点
dao层
继承了BaseDao中的增删改方法,以及添加所需要的判断景点是否已经存在 的queryByName()方法,修改所需要的回显当前景点信息的queryById()方法,因此只需要编写对应的mapper文件就行
1 | <!--添加景点--> |
service层,添加add()方法并实现
1 | void add(Place place); |
1 |
|
controller层 编写处理添加请求的方法
配置文件上传路径:
1 | # 文件上传路径 |
1 | // 注入文件上传路径 |
修改前端页面
携带省份id跳转到添加页面,便于返回
1 | toAdd(){ |
1 | <script> |
删除景点
dao
1 | <!-- 删除景点 --> |
service
1 | void delete(String id); |
1 |
|
controller
1 | /** |
前端
1 | deletePlace(id) { |
修改景点信息
service
1 | Place queryById(String id); |
1 |
|
controller
1 | /** |
前端
1 | <script> |
图片上传与显示
1 | <script> |
省份选择框:
1 | <label> |
使用Redis作为Mybatis的缓存
1、配置Redis地址和端口
1 | spring: |
2、实现mybatis中的Cache接口
1 | package com.zyz.cache; |
工具类ApplicationContextUtils获取工厂实例
1 | package com.zyz.utils; |
3、在mapper文件中添加自定义的Redis缓存
1 | <cache type="com.zyz.cache.RedisCache"></cache> |
4、存储在Redis中的实体类必须实现Serializable接口
主要界面
用户模块
省份模块
景点模块
项目总结
做了什么?
- 管理员的注册和登录
- 省份信息的增删改查
- 景点信息的增删改查
学到了什么?
- 在前后端分离中分页查询功能的实现
- 使用mysql中的meduimtext数据类型存储图片,图片需要先进行base64编码然后存进数据库
- vue中选择框的数据双向绑定
遇到的问题?怎么解决的?
- 在完成添加景点功能时,在浏览器端调试总是出现undefined的错误,仔细与之前的添加功能相比,此添加功能涉及到了文件的上传,需要构造表单,然后在表单中添加数据
<img src="project-02/12.png" style="zoom:80%;" />
在修改景点信息时,提交一直显示图片未上传,仔细读出现不难发现,如果在修改景点信息时沿用添加景点时的那种方式,
所以一直显示图片未上传,只要修改一下判断逻辑就可以了,在判断没有修改图片时直接更新,修改图片后进行重命名,文件上传然后更新
景点省份为空