销售一个产品的网站怎么做的,网站首页有被收录就是最近没有被抓取是怎么回事,wordpress应用展示,怎么做网站注册推广文章目录 1 云岚家政项目概述1.1 简介1.2 项目业务流程1.3 项目业务模块1.4 项目架构及技术栈1.5 学习后掌握能力 2 熟悉项目2.1 熟悉需求2.2 熟悉设计2.2.1 表结构2.2.2 熟悉工程结构2.2.3 jzo2o-foundations2.2.3.1 工程结构2.2.3.2 接口测试 3 开发区域服务模块3.1 流程分析… 文章目录 1 云岚家政项目概述1.1 简介1.2 项目业务流程1.3 项目业务模块1.4 项目架构及技术栈1.5 学习后掌握能力 2 熟悉项目2.1 熟悉需求2.2 熟悉设计2.2.1 表结构2.2.2 熟悉工程结构2.2.3 jzo2o-foundations2.2.3.1 工程结构2.2.3.2 接口测试 3 开发区域服务模块3.1 流程分析3.2 查询区域服务3.2.1 梳理接口3.2.2 接口设计3.2.2.1 接口文档3.2.2.2 HTTP请求方法3.2.2.3 接口路径3.2.2.4 请求参数类型3.2.2.5 请求参数内容3.2.2.6 响应结果类型3.2.2.7 响应结果状态码3.2.2.8 响应结果内容 3.2.3 接口定义3.2.3.1 编写controller3.2.3.1.1 基础注释3.2.3.1.2 分页controller中实现 3.2.3.2 编写mapper3.2.3.2.1 mapper代码生成工具3.2.3.2.2 分页mapper开发3.2.3.2.3 针对mapper的单元测试3.2.3.2.4 Resource 和 Autowired有什么区别? 3.2.3.3 编写service3.2.3.3.1 单元测试3.2.3.3.2 PageHelper原理 3.2.3.4 controller测试3.2.3.5 前后端联调 1 云岚家政项目概述
1.1 简介
云岚到家项目是一个家政服务o2o平台互联网家政是继打车、外卖后的又一个风口创业者众多比如58到家天鹅到家等o2oOnline To Offline是将线下商务的机会与互联网的技术结合在一起让互联网成为线下交易的前台同时起到推广和成交的作用。
C2B2C:
在家政 O2OOnline to Offline线上到线下领域中“Consumer to Business to Consumer”C2B2C描述了一个商业模式消费者不仅可以通过平台获取家政服务还有机会成为服务提供者。在这个背景下C2B2C 模式通常指的是
消费者Consumer
最终的家庭用户他们需要家政服务例如清洁、保姆、维修等。
企业Business
在家政 O2O 中企业通常是在线平台提供家政服务的中介。这些平台通过在线渠道为消费者提供了查找、预订、支付等服务同时也可能为家政服务提供者提供了工作机会。
消费者家政服务提供者
在 C2B2C 模式中一些消费者也可以成为服务的提供者。这些个体可能是独立的家政服务专业人员他们可以在家政 O2O 平台上注册提供自己的服务并被其他需要服务的消费者雇佣。
B2B2C:
代表着Business to Business to Consumer即企业到企业到消费者的模式。家政服务平台作为中间商通过与各种家政服务提供商家政服务公司合作为消费者提供多样化的家政服务选择。
B2B2C与C2B2C的区别是B2B2C中服务提供者是家政服务中介公司在C2B2C中是服务提供者是拥有服务技能的服务人员散户。
本项目结合了C2B2C和B2B2C模式个人和家政服务中介都可以通过平台提供家政服务如下图
项目包括四个端用户端(小程序)、服务端app、机构端(PC)、运营管理端(PC)四个端对应四类用户角色
家政需求方通过用户端小程序完成在线预约下单、支付、评价、投诉、退款等操作。
家政服务人员通过服务端APP完成在线接单、结算等操作。
家政服务公司通过机构端完成在线接单、派单、投诉处理、结算等操作。
平台方通过管理端完成服务人员管理、机构管理、订单管理、财务管理等操作一笔完成的订单结算时按照分成比例平台进行抽成。
1.2 项目业务流程 核心流程
运营端在运营区域上架家政服务
比如在北京上架 日常保洁、空调维修。 用户端通过定位区域获取当前区域的服务项目选择家政服务下单、支付 家政服务人员及家政服务公司机构通过平台抢单 家政服务人员现场服务平台跟踪管理整个服务过程。 服务完成用户评价、售后服务等。
1.3 项目业务模块 我们根据业务流程去分析各个模块的功能
服务管理对家政服务项目进行管理最后在指定区域上架服务后用户可在当前区域购买。
下单支付用户通过小程序完成下单支付进入小程序首页查询服务用户选择服务下单并支付
抢单服务人员和机构进行抢单。首先服务人员和机构设置接单范围、服务技能、开启抢单开关然后进入抢单界面进行抢单。
派单调度平台根据撮合匹配算法通过任务调度将订单和服务人员进行撮合匹配促进成交。
订单管理对订单的生命周期进行管理包括创建订单、取消订单、删除订单、历史订单等。
服务人员管理对服务人员的信息、认证等进行管理。
企业管理对机构的信息、认证进行管理。
客户管理对c端用户的信息、用户的状态等信息进行管理。
营销管理对优惠券活动进行管理。
1.4 项目架构及技术栈
项目是基于Spring Cloud Alibaba框架构建的微服务项目采用前后端分离模式进行开发系统架构图如下 用户层 包括四个端运营端(PC)、服务端APP、机构端PC、用户端小程序 负载层 反向代理、负载均衡。 服务层包括网关、业务微服务、基础服务。 业务微服务包括运营基础服务、客户管理服务、订单管理服务、抢单服务、派单服务、支付服务等。 基础服务Nacos服务注册、配置中心、XXL-JOB任务调度、RabbitMQ消息队列、Elasticsearch全文检索、Canal数据同步、Sentinel熔断降级、限流等。 数据层 MySQL数据库存储服务信息、区域信息、客户信息、订单信息、支付信息、抢单池、派单池、结算信息等。 分库分表使用ShardingShphere进行分库分表。 TiDB分布式数据库存储历史订单信息。 消息队列存储数据同步消息、各类异步消息等。 索引服务信息、服务提供者信息、订单信息等。 缓存服务信息、订单信息、服务单信息等。
项目核心交互流程如下图 1.5 学习后掌握能力
掌握项目需求分析能力 掌握系统分析与设计的能力 掌握Spring Cloud 在项目中的开发与调优能力 掌握Redis在项目中的应用能力 掌握缓存技术方案的分析与设计能力 掌握CanalMQ异构数据同步的开发调试能力 掌握Elasticsearch全文检索与地理搜索的开发能力 掌握ShardingSphere分库分表的方案设计与开发能力 掌握Seata分布式事务控制的开发能力 掌握数据冷热分离技术方案的设计与开发能力 掌握XXL-JOB线程池任务调度方案的设计与开发能力 掌握系统调优与线上故障处理的能力 掌握状态机组件的设计与开发能力
掌握门户业务的设计与开发能力 掌握订单支付业务的系统设计与开发能力 掌握优惠券活动管理业务的系统设计与开发能力 掌握秒杀抢购业务的常见设计方案与开发能力 掌握派单调度类业务的系统设计与开发能力 掌握客户管理业务的系统设计与开发能力 掌握活动管理业务的系统设计与开发能力 掌握搜索附近业务的系统设计与开发能力 掌握服务管理商品管理业务的系统计与开发能力 掌握统计分析与看板业务的系统设计与开发能力
2 熟悉项目
2.1 熟悉需求
目标阅读需求文档理解基本概念和业务流程。 1-4已经开发的差不多了模拟实际公司的业务环节我们需要新开发5添加对区域服务管理的开发。
2.2 熟悉设计
理解运营基本管理模块的表结构熟悉工程结构能够对接口进行断点调试。
2.2.1 表结构
根据需求熟悉本模块的核心表如下图 serve_type服务类型表家电清洗
serve_item: 服务项表存储了本平台的家政服务项目家电清洗的具体项目如洗衣机清洗空调清洗等等
每个服务项都有一个服务类型一个服务类型下有多个服务项服务类型与服务项是一对多关系。
region区域表存储运营地区信息一般情况区域表行政级别是市。
serve: 服务表存储了各个区域运营的服务及相关信息。直接与用户/运营相关
注意这里不要把serve表简单理解为只是区域表和服务项表的中间关系表因为如果是简单的关联关系表只需记录区域表和服务项表各自的主键Id即可serve记录的是平台运营服务的信息凡是与运营相关的信息都要记录在serve表比如运营价格。后期也可能会增加其它运营相关的字段。
注意 region与serve_item是什么关系 一个区域下可以设置多个服务项一个服务项可以被多个区域设置region与serve_item是多对多关系。
2.2.2 熟悉工程结构 2.2.3 jzo2o-foundations
2.2.3.1 工程结构
首先熟悉jzo2o-foundations运营基础服务工程的结构jzo2o-foundations工程结构如下图 依赖 dependencies!--Nacos服务发现--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency!--Nacos服务管理配置--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependency!--开启Bootstrap配置文件的支持--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId/dependency!--jzo2o-mvc在jzo2o-framework下针对web开发的依赖--dependencygroupIdcom.jzo2o/groupIdartifactIdjzo2o-mvc/artifactId/dependency!--knife4j用于生成swagger文档--dependencygroupIdcom.jzo2o/groupIdartifactIdjzo2o-knife4j-web/artifactId/dependency!-- dependency--
!-- groupIdcom.jzo2o/groupId--
!-- artifactIdjzo2o-es/artifactId--
!-- /dependency--!--单元测试--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency!--api接口,定义了服务之间的远程调用接口--dependencygroupIdcom.jzo2o/groupIdartifactIdjzo2o-api/artifactId/dependency!--序列化工具库--dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId/dependency!--jzo2o-redis定义在jzo2o-framework工程定义了持久层相关的依赖--dependencygroupIdcom.jzo2o/groupIdartifactIdjzo2o-redis/artifactId/dependency
!-- dependency--
!-- groupIdcom.jzo2o/groupId--
!-- artifactIdjzo2o-canal-sync/artifactId--
!-- /dependency--!--jzo2o-mysql定义在jzo2o-framework工程定义了持久层相关的依赖--dependencygroupIdcom.jzo2o/groupIdartifactIdjzo2o-mysql/artifactId/dependency
!-- dependency--
!-- groupIdcom.jzo2o/groupId--
!-- artifactIdjzo2o-xxl-job/artifactId--
!-- /dependency--/dependencies持久层MySQL数据库mybatis-plus框架com.github.pagehelper分页组件
中间件Redis、Elasticsearch、xxl-job
服务层通过Spring进行事务控制redisson分布式锁、Spring Cache缓存框架
web层: SpringMVC框架基于SpringBoot开发
web容器undertowUndertow 是一个采用 Java 开发的灵活的高性能 Web 服务器红帽公司的开源产品
高并发场景下undertow的性能更好。
2.2.3.2 接口测试
启动jzo2o-foundations工程。启动docker中的redismysqlnacos。 通过swagger接口文档去熟悉模块的接口通过测试接口去理解接口的整个交互流程。
打开接口文档http://localhost:11509/foundations/doc.html 通过左侧菜单找到“运营端-服务类型相关接口”如下图 点击“服务类型分页查询”打开接口文档如下图 找到接口地址/foundations/operation/serve-type/page
/foundations微服务的content-path路径
/operation表示给运营端使用的接口
/serve-type/page具体的接口地址
在jzo2o-foundations工程搜索“/serve-type”关键字 继续在ServeTypeController.java类中找/page接口如下图
GetMapping(/page)
ApiOperation(服务类型分页查询)
public PageResultServeTypeResDTO page(ServeTypePageQueryReqDTO serveTypePageQueryReqDTO) {return serveTypeService.page(serveTypePageQueryReqDTO);
}下边debug运行工程跟踪接口执行的流程
首先打上断点如下图 debug运行jzo2o-foundations工程。下边通过swagger接口文档测试该接口进入“调试”窗口点击“发送” 跟踪请求参数 放行继续执行测试结束观察响应结果 观察idea控制台输出的SQL执行语句 3 开发区域服务模块
3.1 流程分析
我们的开发流程肯定是先点区域然后在区域中设置服务所以我们应当先开发查询区域再查询服务列表的流程。
3.2 查询区域服务
3.2.1 梳理接口
在定义接口前先梳理本模块涉及哪些接口根据梳理出的接口制定工作计划。
通常对于前后端交互的接口根据界面原型、需求文档去梳理。
通过阅读需求文档在区域服务模块包括以下接口 区域服务分页查询接口 区域服务新增接口 区域服务删除接口 区域服务价格修改接口 区域服务设置热门接口 区域服务取消热门接口 区域服务上架接口 区域服务下架接口
3.2.2 接口设计
下边设计区域服务分页查询接口企业中前后分离开发通常由java程序员设计接口设计完成提供接口文档给前端工程师。
如何设计一个接口
我们根据最终提供的接口文档看看需要设计哪些内容。
3.2.2.1 接口文档
接口设计信息如下
接口路径GET/foundations/operation/serve/page
请求数据类型 application/x-www-form-urlencoded 响应参数 首先明确该接口是一个前后端交互接口该接口由前端通过HTTP协议进行调用前端去调用接口需要知道以下内容 HTTP请求方法 接口路径 请求参数类型 请求参数内容 响应结果类型 响应结果状态码 响应结果内容
所以我们设计接口需要设计这些内容。
3.2.2.2 HTTP请求方法
根据RESTful规范:
查询方法用GET请求参数比较多可用POST
新增方法用POST
修改方法用PUT
删除方法用DELETE
本接口是一个分页查询接口查询条件我们用GET。
具体的代码实现可以找一些现有的类参考比如ServeTypeController类
3.2.2.3 接口路径
定义为RESTful风格的路径。
接口路径为/foundations/operation/serve/page
因为我们在bootstrap.yml文件中已经定义了项目根路径 server.servlet.context-path: /foundations
server:port: 11509undertow:accesslog:enabled: truepattern: %t %a quot;%rquot; %s (%D ms)dir: /data/logs/undertow/${spring.application.name}/access-logs/servlet:context-path: /foundations可以在类上边使用RequestMapping指定该类中接口的路径的基础路径。
在方法中指定具体的路径。
3.2.2.4 请求参数类型
常用的有 json格式 application/json传递json格式字符串当传递的参数是属于一个对象的属性时可用此格式比如新增、修改时通常传递的数据是某个对象的信息就可以使用此格式。 表单格式 application/x-www-form-urlencoded传递key/value串就是在url后通过和进行拼接的参数比如
/foundations/operation/serve/page?pageNo1pageSize10
当传递的参数比较杂且不属于某个特定的对象时使用此格式本接口使用application/x-www-form-urlencoded格式。
3.2.2.5 请求参数内容
请求参数的内容根据需求文档和界面原型去识别。
分页式查询首先有当前页码和每页显示记录数。
对于查询类的接口还有常用的参数有排序方式、排序字段。
再根据需求的梳理查询某个区域下的服务需要传递一个区域id。
请求参数如下 3.2.2.6 响应结果类型
常见的类型有text/html、text/plain、application/json等。
本项目统一使用application/json
3.2.2.7 响应结果状态码
HTTP状态码是服务器返回给客户端的数字代码三位数字共分为五类
1xx: 表示服务器接收到了客户端请求并正在处理
2xx: 表示成功状态码
3xx表示重向定状态码
4xx表示客户端错误状态码
5xx: 表示服务端错误状态码
当服务端处理成功返回200其它表示失败。
3.2.2.8 响应结果内容
分页查询通用的响应内容有数据列表、总页数、总记录数
数据列表中需要分析具体的属性根据界面原型进行分析 属性包括 制定分页查询通用的响应内容如下
msg、code、 data、total、pages是固定的。
data中List数据的内容对于不同的分页查询会不一样。 响应示例
{msg: OK,code: 200,data: {list: [{serveTypeId: 0,serveItemName: ,updateTime: ,saleStatus: 0,serveItemId: 0,referencePrice: 0,createTime: ,regionId: 0,price: 0,id: 0,isHot: 0,serveTypeName: }],total: 0,pages: 0}
}3.2.3 接口定义
3.2.3.1 编写controller
3.2.3.1.1 基础注释
根据接口设计的内容编写controller方法最后通过swagger生成接口文档。 缺少请求路径的/foundations/operation/serve/page的serve的controller所以在com.jzo2o.foundations.controller.operation中创建ServeController
注意 RestController注入到Spring容器中的名字采用包名类名来避免重复
RestController(operationServeController)注意RequestMapping路径因为我们在bootstrap.yml文件中已经定义了项目根路径 server.servlet.context-path: /foundations所以路径应该是
RequestMapping(/operation/serve)注意是否要添加Validated可以对id等字段进行校验NotNull(message id不能为空)
public void update(NotNull(message id不能为空) PathVariable(id) Long id,RequestParam(managerName) String managerName,RequestParam(managerPhone) String managerPhone) {regionService.update(id, managerName, managerPhone);
}注意我们使用的swagger接口文档编写所以要添加Api
Api(tags 运营端 - 区域服务管理相关接口)3.2.3.1.2 分页controller中实现
请求参数用com.jzo2o.foundations.model.dto.request.ServePageQueryReqDTO封装起来进行请求
Data
ApiModel(服务分页查询类)
public class ServePageQueryReqDTO extends PageQueryDTO {ApiModelProperty(value 区域id, required true)private Long regionId;
}返回参数用com.jzo2o.foundations.model.dto.response.ServeResDTO封装到List列表中再和total和pages组成data返回。
RestController(operationServeController)
RequestMapping(/operation/serve)
Api(tags 运营端 - 区域服务管理相关接口)
public class ServeController {GetMapping(/page)ApiOperation(分页查询区域服务列表)public PageResultServeResDTO page(ServePageQueryReqDTO servePageQueryReqDTO) {return null;}
}初步构建完毕重新启动后查看swagger文档成功查询到 3.2.3.2 编写mapper
3.2.3.2.1 mapper代码生成工具
代码生成工具
通常一个接口需求明确后从持久层开始开发。
对于一个新模块需要使用工具生成模型类、mapper接口、mapper映射文件等下边介绍一个工具用于自动生成代码。
使用MybatisPlus插件自动生成代码
1、安装插件 2.重启IDEA连接mysql 配置连接的数据库
输入连接字符串jdbc:mysql://192.168.101.68:3306/jzo2o-foundations?useSSLfalseserverTimezoneUTC
账号和密码跟我们day00设置一样账号root密码mysql
3、配置代码生成规则 1选择表上图选择serve_type表。
2设置生成代码的根目录上图设置generator
3设置包路径上图设置为com.jzo2o.foundations
4主键生成策略根据表中主键的生成策略进行选择支持的主键生成策略如下图 本项目使用的MyBatisPlus版本支持前5个对应MyBatisPlus源码如下
public enum IdType {AUTO(0),NONE(1),INPUT(2),ASSIGN_ID(3),ASSIGN_UUID(4);AUTO基于数据库的自增主键NONE: 不设置id生成策略INPUT:用户手工输入idASSIGN_ID:雪花算法生成id(可兼容数值型与字符串型)ASSIGN_UUID:以UUID生成算法作为id生成策略
本项目使用ASSIGN_ID方式即分配ID。
5勾选要生成的类及包路径Entity、Mapper、Controller、Service、ServiceImpl。
6勾选是否生成lombok注解、restController注解、swagger注解等。
点击“check field”选择表中的字段。
点击“code generatro”生成代码。
生成成功在项目工程根目录有一个generator目录里边为生成的代码如下图 对生成的代码根据自己的需求稍加修改修改后拷贝到工程相应的包下即可。
3.2.3.2.2 分页mapper开发
因为我们最后获取的响应里由服务名称但是serve表中并没有服务名称 所以就涉及多表查询而MybatisPlus生成的代码只适合单表查询。
查看响应参数保证返回值与响应一致驼峰为返回值下划线为数据库查询出来的参数 先查询一个北京区域的服务region_id为1686303222843662337
SELECTst.id serve_type_id,si.name serve_item_name,s.update_time update_time,s.sale_status sale_status,si.id serve_item_id,si.reference_price reference_price,s.create_time create_time,s.region_id region_id,s.price price,s.id id,s.is_hot is_hotst.name serve_type_name
FROMserve sINNER JOIN serve_item si ON s.serve_item_id si.idINNER JOIN serve_type st ON si.serve_type_id st.id
WHEREregion_id 1686303222843662337持久层基础代码生成完毕下边开发mapper接口对于通用的CRUD接口由MybatisPlus提供。
对于需要自定义mapper接口的需求则需要自定义mapper接口及mapper映射文件根据需求本接口要返回的数据包括多张表的数据而MybatisPlus提供的CRUD是针对单表的下边定义mapper实现多表关联查询。
先定义mapper接口
mapper接口讲究通用性根据数据处理最底层的需求去定义接口本需求是根据区域查询服务列表参数为区域id方法返回值为服务列表。
生成com.jzo2o.foundations.mapper.ServeMapper
public interface ServeMapper extends BaseMapperServe {ListServeResDTO queryServeListByRegionId(Param(regionId) Long regionId);
}Param(regionId)是我们待会在mapper的xml文件中需要使用的。 因为我们的查询方法是新生成的自然在mapper的xml无法找到所以altenter在src/main/resources/mapper/ServeMapper.xml中自动生成 复制我们刚刚的sql语句修改where语句为 region_id #{regionId}现在都是使用#{}占位符号#{ } 和 ${ } 会有不同的表现。#{ }解析为一个 JDBC 预编译语句prepared statement的参数标记符。而${ } 仅仅为一个纯碎的 string 替换在动态 SQL 解析阶段将会进行变量替换。
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.jzo2o.foundations.mapper.ServeMapperselect idqueryServeListByRegionId resultTypecom.jzo2o.foundations.model.dto.response.ServeResDTOSELECTst.id serve_type_id,si.NAME serve_item_name,s.update_time update_time,s.sale_status sale_status,si.id serve_item_id,si.reference_price reference_price,s.create_time create_time,s.region_id region_id,s.price price,s.id id,s.is_hot is_hot,st.NAME serve_type_nameFROMserve sINNER JOIN serve_item si ON s.serve_item_id si.idINNER JOIN serve_type st ON si.serve_type_id st.idWHEREregion_id 1686303222843662337/select
/mapper
3.2.3.2.3 针对mapper的单元测试
大厂都严格要求对mapper进行单元测试创建com.jzo2o.foundations.service.ServeMapperTest SpringBootTest
Slf4j
public class ServeMapperTest {Resourceprivate ServeMapper serveMapper;Testpublic void testQueryServeListByRegionId() {ListServeResDTO serveResDTOS serveMapper.queryServeListByRegionId(1686303222843662337L);Assert.notEmpty(serveResDTOS, 查询结果为空);}
}SpringBootTestspring测试类注释Slf4j日志记录Test测试方法注解Resource自动注入
运行我们的单元测试 成功查询到说明我们的单元测试通过。
3.2.3.2.4 Resource 和 Autowired有什么区别?
来源不同
Resource 是 Java EEJava Platform, Enterprise Edition规范定义的注解位于 javax.annotation 包中不仅可以用于 Spring 环境还可以用于其他 Java EE 容器。
Autowired 是 Spring 框架定义的注解位于 org.springframework.beans.factory.annotation 包中主要用于 Spring 环境中。
注入方式不同
Resource默认按名称注入如果在spring容器找不到对应名称的 Bean则按照 byType 进行注入。
Autowired默认按照 byType 的方式进行注入。如果有多个类型相同的 Bean可以结合 Qualifier 使用指定具体的 Bean 名称
// 使用 Resource
Resource(name myBean)
private MyBean myBean;// 使用 Autowired
Autowired
Qualifier(myBean)
private MyBean myBean;3.2.3.3 编写service
用我们针对serve生成的代码进行修改 复制到相应的位置他生成的是针对单表查询的mybatisplus。所以我们单表查询的时候可以直接使用。
在controller中注入service
RestController(operationServeController)
RequestMapping(/operation/serve)
Api(tags 运营端 - 区域服务管理相关接口)
public class ServeController {Resourceprivate IServeService serveService;GetMapping(/page)ApiOperation(分页查询区域服务列表)public PageResultServeResDTO page(ServePageQueryReqDTO servePageQueryReqDTO) {return serveService.page(servePageQueryReqDTO);}
}service接口
public interface IServeService extends IServiceServe {PageResultServeResDTO page(ServePageQueryReqDTO servePageQueryReqDTO);}实现层分页有两种思路一种是mybatisplus的分页但是不能自定义查询语句也就是只能单表查询另一种是用pagehelper插件可以自定义我们的语句是自定义的因此我们采用pagehelper。
未来工作中有很多别人的代码我们要学习观察和替换把参数和方法改成我们自己的。 Service
public class ServeServiceImpl extends ServiceImplServeMapper, Serve implements IServeService {Overridepublic PageResultServeResDTO page(ServePageQueryReqDTO servePageQueryReqDTO) {PageResultServeResDTO serveResDTOPageResult PageHelperUtils.selectPage(servePageQueryReqDTO,() - baseMapper.queryServeListByRegionId(servePageQueryReqDTO.getRegionId()));return serveResDTOPageResult;}
}3.2.3.3.1 单元测试
SpringBootTest
Slf4j
class IServeServiceTest {Resourceprivate IServeService serveService;//分页测试Testpublic void test_page(){ServePageQueryReqDTO servePageQueryReqDTO new ServePageQueryReqDTO();servePageQueryReqDTO.setRegionId(1677152267410149378L);servePageQueryReqDTO.setPageNo(1L);servePageQueryReqDTO.setPageSize(3L);PageResultServeResDTO page serveService.page(servePageQueryReqDTO);log.info(page : {}, page);Assert.notEmpty(page.getList(),列表为空);}
}成功输出五条共两页。 3.2.3.3.2 PageHelper原理
使用com.github.pagehelper分页插件实现分页功能下边介绍它的执行原理。
PageHelperUtils是项目封装的一个工具类进入selectPage方法调用PageHelper.startPage方法设置分页参数通过一层一层进入源码最终将分页参数设置到ThreadLocalPageLOCAL_PAGEnewThreadLocal(); 中。 通过PageInterceptor拦截器拦截 MyBatis的Executor 的 query() 方法得到原始的sql语句首先得到count总数然后从newThreadLocal中取出分页参数在原始sql语句中添加分页参数查询分页数据。
部分源码截图如下 我们的分页参数在ThreadLocal中存储最后拼合在一起 如果查询第二页会自动进行计算拼接(page-1)*size 3.2.3.4 controller测试
重启服务通过接口文档工具进行测试。
遇到问题在controller、service中打断点进行调试。
测试时注意请求参数填写是否正确下边是测试结果 返回 3.2.3.5 前后端联调
启动foundations服务和gateway服务。
通过cmd进入project-xzb-pc-admin-vue3-java目录启动前端项目
运行命令启动前端工程
npm run dev 根据业务操作流程进行测试。
点击服务管理中区域服务对北京市进行设置服务 成功查询到五条服务项目