核心内容摘要
Python基于Django的“梅狸猫”宠物医院系统的设计与实现
本部分内容主要来源于鱼皮智能协图云图库部分并在笔者个人项目学习的基础上进行扩展衍生。
由于项目开发文档已经足够详细因此这里只记录要点。
这部分内容后端较为简单主要是熟悉业务流程开发思路以及mybatisplusstream流的使用以后一定需要找个时间专门补补。
方案设计
分析类需求的实现流程对于分析类需求实现流程几乎都是一致的包括1数据采集从数据源比如 MySQL 数据库或者大数据仓库获取原始数据。
要提前明确涉及的表和字段必要时采用分页查询处理大数据量。
2数据预处理对数据进行清洗、加工和格式化包括过滤无效数据比如逻辑删除或审核未通过、解析复杂字段比如 JSON 格式的 tags以及通过字段关联补充上下文信息。
3数据计算根据需求进行分组、聚合、排序等从而计算关键指标比如计算空间各分类图片的占用比例、用户上传图片的时间趋势。
可以根据场景调整计算方案比如对于大数据量的计算可以采用 Spark 之类的大数据计算组件做离线计算对于数据实时性要求较高的实时分析场景可以用 Flink 做流式处理。
4数据存储可选针对频繁查询的分析结果可将结果数据存储为单独的表或缓存减少重复计算提高查询效率。
5数据接口设计为前端提供统一接口从而支持查询和展示。
需要考虑到数据量较大导致前端渲染卡顿的情况可以按需精简返回的字符串、分页查询等。
6数据可视化通过图表直观展示分析结果前端可以使用 Apache ECharts 等可视化库渲染。
当然也可以让后端生成图表图片并返回但这种实现方法的灵活度有限。
后续还可以根据用户的反馈持续优化分析逻辑、增加指标或改进性能。
具体业务流程为:设计reuqest——设计vo——serviceimpl实现——接口编写对于serviceimpl实现校验合法性包括是否为空权限校验等——编写wrapper——进行查询——stream流处理查询结果在这个模块开发中通过分析需求写注释再借助ai就显得至关重要了。
典型样例空间图片分类分析开发请求封装类。
分类分析只需要传递空间范围相关参数因此可以直接继承公共的SpaceAnalyzeRequestEqualsAndHashCode(callSuper true) Data public class SpaceCategoryAnalyzeRequest extends SpaceAnalyzeRequest { }2开发响应视图类。
分类分析的结果需要返回图片分类、分类图片数量和分类图片总大小Data AllArgsConstructor NoArgsConstructor public class SpaceCategoryAnalyzeResponse implements Serializable { private String category; private Long count; private Long totalSize; private static final long serialVersionUID 1L; }3开发 Service 服务。
按照分类分组查询图片表的数据注意查询数据库时只获取需要的字段即可Override public ListSpaceCategoryAnalyzeResponse getSpaceCategoryAnalyze(SpaceCategoryAnalyzeRequest spaceCategoryAnalyzeRequest, User loginUser) { ThrowUtils.throwIf(spaceCategoryAnalyzeRequest null, ErrorCode.PARAMS_ERROR); checkSpaceAnalyzeAuth(spaceCategoryAnalyzeRequest, loginUser); QueryWrapperPicture queryWrapper new QueryWrapper(); fillAnalyzeQueryWrapper(spaceCategoryAnalyzeRequest, queryWrapper); queryWrapper.select(category AS category, COUNT(*) AS count, SUM(picSize) AS totalSize) .groupBy(category); return pictureService.getBaseMapper().selectMaps(queryWrapper) .stream() .map(result - { String category result.get(category) ! null ? result.get(category).toString() : 未分类; Long count ((Number) result.get(count)).longValue(); Long totalSize ((Number) result.get(totalSize)).longValue(); return new SpaceCategoryAnalyzeResponse(category, count, totalSize); }) .collect(Collectors.toList()); } 建议在编写具体的代码前先编写示例 SQL 语句并通过数据库查询客户端来验证。
4开发接口PostMapping(/category) public BaseResponseListSpaceCategoryAnalyzeResponse getSpaceCategoryAnalyze(RequestBody SpaceCategoryAnalyzeRequest spaceCategoryAnalyzeRequest, HttpServletRequest request) { ThrowUtils.throwIf(spaceCategoryAnalyzeRequest null, ErrorCode.PARAMS_ERROR); User loginUser userService.getLoginUser(request); ListSpaceCategoryAnalyzeResponse resultList spaceAnalyzeService.getSpaceCategoryAnalyze(spaceCategoryAnalyzeRequest, loginUser); return ResultUtils.success(resultList); }