十七、统计业务方法耗时功能实现
统计业务方法耗时背景检测整个项目所有业务层方法的耗时(开始执行时间和结束执行时间之差),并且不会影响原始所有代码的逻辑
使用Spring AOP技术来实现,面向切面编程
AOP使用示例:
导入对应依赖maven`坐标
定义一个类,将这个类作为切面类
在这个类中定义切面方法(5类)
切面方法的修饰符必须是public
切面方法的返回值可以是void或者Object,如果这个方法被@Around注解修饰则此方法必须神明为Object类型,反之随意
切面方法名称可以自定义
切面方法可以接收参数,参数是ProceedingJoinPoint proceedingJoinPoint,注解@Around修饰的切面方法必须要传递该参数,其他类型切面方法不做此要求
在切面方法中编辑需要执行的功能代码逻辑
通过连接点来连接目标方法
使用示例导入对应的依赖在项目的pom.xml文件中添加如下依赖
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
十六、订单模块功能实现
订单模块数据库表创建
订单实体类创建在com.bang.store.pojo包下新建对应的实体类Order和OrderItem
123456789101112131415161718192021222324252627package com.bang.store.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.ToString;import java.util.Date;@Data@ToString(callSuper = true)@AllArgsConstructor@NoArgsConstructorpublic class Order extends BasePojo{ Integer oid; Integer uid; String recvName; String recvPhone; String recvProvince; String recvCity; St ...
十二、购物车模块功能实现
购物车模块数据库创建
实体类创建在com.bang.store.pojo中创建购物车对应的实体类Cart
1234567891011121314151617181920package com.bang.store.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;/** * 购物车实体类 */@Data@AllArgsConstructor@NoArgsConstructorpublic class Cart extends BasePojo{ Integer cid; Integer uid; Integer pid; Long price; Integer num;}
解决实体类tostring无法打印父类属性的问题
资料参考
持久层规划执行的SQL语句1.用户在商品详细页点击加入购物车按钮,像后端发送请求,将对应数据插入数据库,本质是insert语句
1insert into t_cart(uid,pid ...
十一、热销商品和商品详情展示功能实现
热销商品排行
商品数据库创建1234567891011121314151617CREATE TABLE t_product ( id int(20) NOT NULL COMMENT '商品id', category_id int(20) DEFAULT NULL COMMENT '分类id', item_type varchar(100) DEFAULT NULL COMMENT '商品系列', title varchar(100) DEFAULT NULL COMMENT '商品标题', sell_point varchar(150) DEFAULT NULL COMMENT '商品卖点', price bigint(20) DEFAULT NULL COMMENT '商品单价', num int(10) DEFAULT NULL COMMENT '库存数量', image varchar(500) DEFAULT NULL ...
十、收货地址删除功能的实现
收货地址删除用户点击删除按钮,向后端发送请求,删除用户该条地址记录,同时前端页面该地址删除
持久层规划执行的SQL语句1.删除该地址之前需要判断该数据在数据库中是否存在,此功能在设置默认地址模块已经实现
2.判断该条地址是否与当前登录用户相匹配,此功能在设置默认地址模块也已经实现
3.删除对应的地址数据
1delete from t_address where aid=?;
4.如果用户删除的是默认收货地址,则将剩下的地址中的某一条设置为新的默认地址,规则可以自定义:将最新修改时间的收货地址设置为默认的收货地址
1select * from t_address where uid=? order by modified_time DESC limit 0,1;
5.如果用户本身只有一条收货地址,删除之后,不用进行后续操作;查询用户地址数目语句在前面新增地址功能模块已经实现过了
接口和抽象方法在AddressMapper类中定义对应抽象方法
12345678910111213/** * 删除对应的地址记录 * @param aid 地址编号 * @return ...
九、设置默认收货地址功能的实现
设置默认收货地址点击设为默认按钮,当前地址设置为默认,后面的按钮隐藏,其他的地址全部显示该按钮
持久层规划执行的SQL语句1.检测用户想设置为默认地址的数据在数据库中是否存在,本质是一条查询语句
1select * from t_address where aid=?;
2.将用户选择的地址设为默认地址之前,先将该用户所有的收货地址全部设置为非默认
1update t_address set is_default=0 where uid=?;
3.将用户选择的该条地址设置为默认
1update t_address set is_default=1,modified_user=?,modified_time=? where aid=?;
接口和抽象方法在AddressMapper接口中申明对应的抽象方法
12345678910111213141516171819202122/** * 根据aid查询收货地址数据 * @param aid 地址aid * @return 记录存在则返回对应地址数据,反之返回null */Address findByAid( ...
八、收获地址列表展示功能的实现
收获地址列表展示用户收货地址展示页面
持久层规划执行的SQL语句用户收货地址页面展示,本质上是SQL查询语句,按照is_default字段进行排序,因为按照逻辑默认收货地址应该排在第一个;其余地址按照创建时间进行排序,最近创建的排在前面
1select * from t_address where uid=? order by is_default DESC,created_time DESC;
接口和抽象方法在AddressMapper接口中定义抽象方法findByUid
123456/** * 查询当前用户的收货地址列表 * @param uid 用户id * @return 用户拥有地址列表 */List<Address> findByUid(Integer uid);
SQL关系映射在AddressMapper.xml文件中编写抽象方法对应的映射语句
12345678910111213141516171819<resultMap id="addressPojoMap" type="com.bang ...
七、新增收货地址功能的实现
新增收货地址收货地址管理页面
点击新增收货地址按钮,出现新的页面,地址信息编辑表单
各功能的开发顺序收货地址模块的功能:列表的展示、修改、删除、设置默认、新增收货地址
功能模块的开发顺序:新增收货地址-》列表展示-》设置默认收货地址-》删除收货地址-》修改收货地址
数据库表的创建
收货地址实体类的创建创建收货地址实体类com.bang.store.pojo.Address,继承自BasePojo基类,因为其同样含有四个公共字段
属性名与数据表名一致,只是注意数据库字段一般命名方式为xx_xx,而java采用驼峰命名法
123456789101112131415161718192021222324/** * 收货地址实体类 */@Data@AllArgsConstructor@NoArgsConstructorpublic class Address extends BasePojo{ Integer aid; Integer uid; String name; String provinceName; String provinceCode ...
六、上传头像功能的实现
上传头像功能的实现用户上传头像图片,涉及到的问题:图片在数据库中以何种形式存在?
文件上传保存在服务器的某个位置,只需要将该位置记录即可,即数据库中对应字段存储的是头像图片在服务器中的存储路径
在实际应用场景中,一般是将静态资源文件(图片、视频、文本文件等资源文件)存储在一台专门的电脑上,将该电脑作为一个单独的服务器使用
持久层规划SQL语句将用户头像存储路径更新到数据库表中的avatar字段,本质为一条更新语句
1update t_user set avatar=?,modified_user=?,modified_time=? where uid=?;
抽象接口和方法在UserMapper接口定义对应的抽象方法
123456789/** * 更新用户图像 * @param uid 用户ide * @param avatar 用户图像存储地址 * @param modifiedUser 信息修改者 * @param modifiedTime 信息修改时间 * @return */Integer updateAvatarByUid ...
五、个人资料功能的实现
个人资料功能用户提交在页面填写个人资料,点击修改按钮提交至后台程序,保存至数据库
持久层规划执行的SQL语句更新用户信息的SQL语句1update t_user set phone=?,email=?,gender=?,modified_user=?,modified_time=? where uid=?;
根据用户名查询用户数据1select * from t_user where uid=?;
此功能在修改密码功能模块已经实现
接口和抽象方法的设计在UserMapper接口中定义更新用户信息方法
123456/** * 根据uid更新用户信息 * @param user 用户信息对象 * @return 更新操作受影响的行数 */Integer updateInfoByUid(User user);
抽象方法配置到映射文件UserMapper.xml中采用Mybatis的if标签,只有在各个字段不为空时,才会执行更新操作
123456789<update id="updateInfoByUid" parameterType ...