郑州高端网站公司,重庆网站免费优化,秦皇岛是属于哪个省的城市,形象设计商品分类模块开发笔记
模块功能概述
实现分类数据的 增删改查 功能核心难点#xff1a; 分类的父子级目录结构递归实现多级分类查找列表展示顺序控制#xff08;从父级向子级递归#xff09; 接口说明
后台接口
1. 添加分类 请求地址: /admin/category/add 请求方法: …商品分类模块开发笔记
模块功能概述
实现分类数据的 增删改查 功能核心难点 分类的父子级目录结构递归实现多级分类查找列表展示顺序控制从父级向子级递归 接口说明
后台接口
1. 添加分类 请求地址: /admin/category/add 请求方法: POST 参数: 参数名类型说明nameString分类名称如新鲜水果typeInt分类层级1-3级parentIdInt父级ID0表示无父级orderNumberInt同级目录排序号 示例请求:
{name: 进口水果,type: 2,parentId: 1,orderNumber: 2
}2. 更新分类
请求地址: /admin/category/update请求方法: POST参数: 包含id字段用于指定要修改的分类其他参数与添加接口相同
3. 删除分类
请求地址: /admin/category/delete请求方法: POST参数: 参数名类型说明idInt分类ID
4. 分类列表平铺分页
请求地址: /admin/category/list请求方法: GET参数: 参数名类型说明pageNumberInt当前页码pageSizeInt每页显示条数 前台接口
递归分类列表
请求地址: /category/list请求方法: GET响应结构:
{code: 200,message: 成功,data: [{id: 1,name: 新鲜水果,childCategory: [{id: 2,name: 进口水果,childCategory: [{id: 3,name: 车厘子}]}]}]
}数据库设计
表名: category
字段名类型说明idint(11)主键IDnamevarchar(64)分类名称typeint(11)分类层级1-3级parent_idint(11)父级分类IDorder_numberint(11)排序号create_timedatetime创建时间update_timedatetime最后更新时间 关键实现点 递归查询算法 通过parent_id字段建立层级关系使用深度优先搜索实现树形结构构建 排序控制 同级分类通过order_number字段排序层级间展示顺序为父级-子级 层级校验 新增分类时校验层级不超过3级更新操作时防止循环引用
商品分类模块开发笔记 - 接口实现篇
Controller层实现
1. 创建Controller
RestController
public class CategoryController {Autowiredprivate CategoryService categoryService;Autowiredprivate UserService userService;
}2. 添加分类接口实现
PostMapping(/admin/category/add)
ResponseBody
public ApiRestResponse addCategory(HttpSession session,RequestBody AddCategoryRequest addCategoryRequest) {// 参数校验if (addCategoryRequest.getName() null || addCategoryRequest.getType() null|| addCategoryRequest.getParentId() null|| addCategoryRequest.getOrderNumber() null) {return ApiRestResponse.error(ExceptionEnum.PARAM_NOT_NULL);}// 用户登录校验User currentUser (User) session.getAttribute(UserConstant.LOGIN_USER);if (currentUser null) {return ApiRestResponse.error(ExceptionEnum.NEED_LOGIN);}// 管理员权限校验boolean isAdmin userService.checkAdminRole(currentUser);if (!isAdmin) {return ApiRestResponse.error(ExceptionEnum.NEED_ADMIN);}// 创建分类对象Category category new Category();BeanUtils.copyProperties(addCategoryRequest, category);// 调用Service层return categoryService.addCategory(category);
}请求参数对象设计
public class AddCategoryRequest {private String name;private Integer type;private Integer parentId;private Integer orderNumber;// Getter Setter// Lombok Data 注解可替代
}校验机制说明
1. 参数校验策略
必要性校验所有必要字段的非空检查安全校验使用独立Request对象防止额外字段注入层级校验通过type字段控制分类层级1-3级
2. 权限校验流程 #mermaid-svg-Nnq6EtDUFdlEMUk8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .error-icon{fill:#552222;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .marker.cross{stroke:#333333;}#mermaid-svg-Nnq6EtDUFdlEMUk8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .cluster-label text{fill:#333;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .cluster-label span{color:#333;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .label text,#mermaid-svg-Nnq6EtDUFdlEMUk8 span{fill:#333;color:#333;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .node rect,#mermaid-svg-Nnq6EtDUFdlEMUk8 .node circle,#mermaid-svg-Nnq6EtDUFdlEMUk8 .node ellipse,#mermaid-svg-Nnq6EtDUFdlEMUk8 .node polygon,#mermaid-svg-Nnq6EtDUFdlEMUk8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .node .label{text-align:center;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .node.clickable{cursor:pointer;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .arrowheadPath{fill:#333333;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .cluster text{fill:#333;}#mermaid-svg-Nnq6EtDUFdlEMUk8 .cluster span{color:#333;}#mermaid-svg-Nnq6EtDUFdlEMUk8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Nnq6EtDUFdlEMUk8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 失败 成功 未登录 已登录 非管理员 管理员 请求入口 参数校验 返回参数错误 登录状态 返回登录提示 管理员校验 返回权限不足 执行添加操作