【苍穹外卖】学习心得体会-随笔

发布于:2024-12-19 ⋅ 阅读:(8) ⋅ 点赞:(0)

前言

写了很久,终于可以完整运行项目了,记录下这几天的心得体会回顾一下知识点

第一天、Git 分布式版本控制工具

一、Git概述

  • 定义:是分布式版本控制工具,用于管理软件开发中的源代码文件,像Java类、xml文件、html页面等,软件开发中应用广泛。
  • 仓库类型
    • 本地仓库:位于开发人员自己电脑上。
    • 远程仓库:存在于远程服务器上,可借助GitHub、码云、GitLab等代码托管服务搭建。

二、Git的下载与安装

  • 下载地址:https://git-scm.com/download,下载后双击安装文件完成安装。
  • 安装成功标志:在任意目录下点击鼠标右键,出现“Git GUI Here”(打开Git图形界面)和“Git Bash Here”(打开Git命令行)菜单。

三、常用代码托管服务

  • GitHub:面向开源及私有软件项目的托管平台,只支持Git作为版本库格式托管。
  • 码云:国内代码托管平台,服务器在国内,速度相对较快。
  • GitLab:用于仓库管理系统的开源项目,基于Git搭建的web服务。
  • BitBucket:源代码托管网站,采用Mercurial和Git作为分布式版本控制系统,有商业计划和免费账户。

四、Git常用命令

  1. 全局设置
    设置用户名称和email地址(非注册码云账号时用的用户名和邮箱,可任意设置):
    • git config --global user.name "itcast"
    • git config --global user.email "hello@itcast.cn"
      查看配置信息:git config --list
  2. 获取Git仓库
    • 本地初始化:在指定目录下执行git init命令创建,成功后会出现隐藏的.git文件夹。
    • 从远程仓库克隆:使用git clone 远程仓库地址命令,将远程仓库拷贝到本地。
  3. 工作区、暂存区、版本库相关概念
    • 版本库:.git隐藏文件夹,存储配置、日志、文件版本等信息。
    • 工作区:包含.git文件夹的目录,存放开发代码。
    • 暂存区:.git文件夹中的index文件,临时保存修改文件。
  4. 工作区文件状态:分为untracked(未跟踪)、tracked(已跟踪,含Unmodified未修改、Modified已修改、Staged已暂存状态),状态随Git命令执行而变化。
  5. 本地仓库操作命令
    • git status:查看文件状态。
    • git add:将文件修改加入暂存区(如git add fileName)。
    • git reset:取消暂存(git reset 文件名)或切换到指定版本(git reset --hard 版本号)。
    • git commit:将暂存区文件修改提交到版本库(如git commit -m msg 文件名,-m用于添加提交说明,可用通配符一次提交多个文件)。
    • git log:查看提交日志。
  6. 远程仓库操作命令
    • git remote:查看远程仓库(加-v参数查看详细信息)。
    • git remote add:添加远程仓库(格式为git remote add 简称 远程仓库地址,一个本地仓库可关联多个远程仓库)。
    • git clone:从远程仓库克隆数据到本地。
    • git push:将本地仓库内容推送到远程仓库(格式为git push 远程仓库简称 分支名称)。
    • git pull:从远程仓库获取最新版本并合并到本地仓库(格式为git pull 远程仓库简称 分支名称,若本地非克隆仓库拉取文件报错,可加--allow-unrelated-histories参数解决)。
  7. 分支操作命令
    • git branch:查看分支(git branch列出本地分支;git branch -r列出远程分支;git branch -a列出所有本地和远程分支)。
    • git branch [name]:创建分支。
    • git checkout [name]:切换分支。
    • git push [shortName] [name]:推送至远程仓库分支。
    • git merge [name]:合并分支。
  8. 标签操作命令
    • git tag:查看标签。
    • git tag [name]:创建标签。
    • git push [shortName] [name]:将标签推送至远程仓库。
    • git checkout -b [branch] [name]:检出标签(新建分支指向标签)。

五、在IDEA中使用Git

  1. 配置Git:需提前安装好Git,若安装在默认目录(C:\Program Files\Git),IDEA可直接使用,否则需手动配置Git安装目录下的git.exe可执行文件路径。
  2. 获取Git仓库
    • 本地初始化仓库:通过菜单【VCS】—【Import into Version Control】—【Create Git Repository】操作,选择项目根目录完成初始化,会出现.git隐藏目录,工具栏出现相关操作图标。
    • 从远程仓库克隆:在IDEA开始窗口点击【Get from Version Control】,输入远程仓库URL地址和本地仓库存放目录,点击【Clone】按钮克隆。
  3. Git忽略文件:通过.gitignore文件指定工作区中不需要Git管理的文件(如编译后的.class文件、开发工具配置文件等),文件名固定,添加到忽略列表的文件后续Git会忽略。
  4. 本地仓库操作:在IDEA中可进行将文件加入暂存区(操作类似命令git add)、将暂存区文件提交到版本库(简化操作可直接提交,有提交单个文件、多个文件等不同操作方式,工具栏有快捷按钮)、查看日志(可查看整个项目或某个文件的提交日志)等操作。
  5. 远程仓库操作:可查看远程仓库(对应git remote命令)、添加远程仓库(对应git remote add命令)、推送至远程仓库(对应git push命令,工具栏有提交快捷按钮可同时完成提交和推送)、从远程仓库拉取(对应git pull命令,工具栏有快捷按钮)。
  6. 分支操作:可查看分支(对应git branch命令,状态栏有快捷按钮)、创建分支(输入分支名创建)、切换分支、将分支推送到远程仓库(对应git push命令)、合并分支(对应git merge命令)等操作。

第二天、Swagger理解、开发环境搭建

以下是“苍穹外卖-day01”课程知识点的快速总结:

一、软件开发整体介绍

  1. 软件开发流程
    • 需求分析:编写需求规格说明书(用Word描述项目各部分,如系统定义、功能规格等)和产品原型(以网页形式展示页面效果、交互逻辑等)。
    • 设计:包含UI设计(页面及交互逻辑设计)、数据库设计(确定数据库、表结构及关系等)、接口设计(分析原型图确定接口相关参数及路径、请求方式)。
    • 编码:开发工程师进行项目代码编写并完成单元测试。
    • 测试:测试人员在测试环境对部署好的项目进行功能测试,出具测试报告。
    • 上线运维:运维人员准备服务器环境,将项目部署到服务器上线运行。
  2. 角色分工
    • 项目经理:负责整个项目,进行任务分配和把控进度,贯穿全阶段。
    • 产品经理:在需求分析阶段进行需求调研,输出需求调研文档、产品原型。
    • UI设计师:在设计阶段根据产品原型输出界面效果图。
    • 架构师:负责项目整体架构设计、技术选型等设计相关工作。
    • 开发工程师:在编码阶段实现项目功能代码。
    • 测试工程师:针对项目编写测试用例、输出测试报告,负责测试阶段工作。
    • 运维工程师:在上线运维阶段搭建软件环境、部署项目上线。
  3. 软件环境
    • 开发环境:软件开发人员开发阶段使用,外部用户一般无法访问,如开发中使用的本地或服务器中的MySQL等软件,项目测试、上线后不再使用。
    • 测试环境:开发人员完成功能模块开发与单元测试后,将项目部署至此供测试人员使用,用于项目测试,外部用户无法访问。
    • 生产环境:项目开发、测试通过后上线部署的环境,正式对外提供服务,可位于机房或云服务器等线上环境。

二、苍穹外卖项目介绍

  1. 项目介绍:专为餐饮企业定制,包含系统管理后台(供内部员工管理餐厅各类信息、统计数据、来单语音播报等)和小程序端(供消费者点餐、下单、支付等)两部分。
  2. 产品原型:由产品经理设计,展示项目业务功能(非最终页面效果),分为管理端原型(员工登录、管理等功能展示)和用户端原型(微信登录、点餐、支付等功能展示)。
  3. 技术选型
    • 用户层:管理后台前端用H5、Vue.js、ElementUI、apache echarts等;移动端用微信小程序。
    • 网关层:Nginx作Http服务器,有反向代理、负载均衡作用,可部署静态资源、提高访问性能。
    • 应用层:SpringBoot快速构建项目;SpringMVC与Spring无缝集成;还有Spring Task、httpclient、Spring Cache、JWT、阿里云OSS、Swagger、POI、WebSocket等用于不同功能实现。
    • 数据层:核心业务数据存MySQL,用Redis做缓存,Mybatis做持久层开发,搭配pagehelper分页插件以及spring data redis简化Redis操作。
    • 工具:git管理代码版本,maven构建项目,junit进行单元测试,postman测试接口。

三、开发环境搭建

  1. 前端环境搭建:基于nginx,将前端运行环境的nginx移到非中文目录,启动nginx(双击nginx.exe,访问端口80)即可访问前端页面。
  2. 后端环境搭建
    • 熟悉项目结构:后端基于maven分模块开发,有sky-take-out(父工程管理依赖、聚合模块)、sky-common(存放公共类)、sky-pojo(存放实体、DTO、VO等)、sky-server(存放配置、Controller、Service、Mapper等)模块,各模块内有不同功能的包。
    • Git版本控制:创建本地仓库,再在码云等平台创建远程仓库,将本地文件提交到本地仓库后,添加远程仓库地址,推送文件至远程仓库。
    • 数据库环境搭建:找到sky.sql文件直接打开执行创建数据库及11张表(如员工表、分类表等),了解各表大致存储数据,可参考《数据库设计文档》了解详细结构。
    • 前后端联调:后端初始工程已实现登录功能,介绍了从Controller层、Service层到Mapper层的代码逻辑,可通过断点调试跟踪执行过程。
    • nginx反向代理和负载均衡
      • 反向代理:将前端动态请求由nginx转发到后端服务器,可提高访问速度、进行负载均衡、保证后端服务安全,配置通过如location /api/ { proxy_pass http://localhost:8080/admin/; }等指令实现。
      • 负载均衡:基于反向代理实现,把请求按指定策略分配给集群中服务器,策略有轮询、weight(权重)、ip_hash、least_conn、url_hash、fair等,各有对应配置方式。
    • 完善登录功能:针对员工表密码明文存储安全性低的问题,采用MD5加密方式,修改数据库中密码为密文,同时在Java代码比对密码时先对前端提交密码加密后再比对。

四、导入接口文档

  1. 前后端分离开发流程:先定义接口(确定路径、请求方式、参数等),前端和后端并行开发与自测,然后前后端连调测试,最后提交给测试人员最终测试。
  2. 操作步骤:从资料中找到项目接口文件,在YApi平台(http://yapi.feisudu.com/ )创建项目后导入接口文件(管理端和用户端分别导入对应json文件)。

五、Swagger

  1. 介绍:是规范完整框架,利于前后端分离开发、自动生成接口文档、进行功能测试。Springfox基于Spring整合Swagger,knife4j是集成Swagger生成Api文档的增强解决方案,目前常用knife4j。
  2. 使用步骤
    • 导入knife4j的maven坐标到pom.xml。
    • 在配置类中加入knife4j相关配置(如定义Docket,设置ApiInfo等)。
    • 设置静态资源映射,确保接口文档页面能访问。
    • 通过访问http://ip:port/doc.html路径进行接口文档访问与测试。
  3. 常用注解
    • @Api:用在类(如Controller)上说明类。
    • @ApiModel:用在类(如entity、DTO、VO)上。
    • @ApiModelProperty:用在属性上描述属性信息。
    • @ApiOperation:用在方法上说明方法用途、作用,使用这些注解可生成可读性更好的接口文档。

第三天、员工查询分页等业务逻辑

本文档围绕苍穹外卖项目展开,主要介绍了项目开发中员工管理和菜品分类管理相关功能的实现,包括需求分析与设计、代码开发、功能测试以及代码提交等内容,具体知识点如下:

员工管理功能

  1. 新增员工
    • 需求分析与设计:依据产品原型明确功能需求,设计新增员工接口及对应的employee表结构,规定账号、手机号、身份证号等信息的格式及默认值等要求。
    • 代码开发:涉及DTO类设计、Controller层、Service层接口与实现类、Mapper层的代码编写,实现数据的接收、业务逻辑处理及数据库插入操作。
    • 功能测试:通过接口文档测试和前后端联调测试两种方式进行,解决了如JWT令牌校验失败等测试中出现的问题。
    • 代码完善:针对用户名重复、创建人及修改人id固定等问题,利用全局异常处理器和ThreadLocal机制进行优化处理。
    • 代码提交:按流程完成代码提交操作。
  2. 员工分页查询
    • 需求分析与设计:根据产品原型确定分页展示员工信息及按姓名查询的业务规则,明确接口相关要求。
    • 代码开发:设计DTO类封装请求参数,统一用PageResult封装分页查询结果,在各层级编写代码实现分页查询功能,利用PageHelper插件简化开发。
    • 功能测试:采用接口文档测试和前后端联调测试方式,针对操作时间字段显示格式问题进行代码完善。
    • 代码提交:完成相应提交操作。
  3. 启用禁用员工账号
    • 需求分析与设计:依照产品原型明确账号启用禁用的操作规则及对应接口设计要求。
    • 代码开发:在Controller层、Service层、Mapper层编写代码实现相关业务逻辑及数据库操作。
    • 功能测试:运用接口文档测试和前后端联调测试进行验证。
    • 代码提交:按常规步骤提交代码。
  4. 编辑员工
    • 需求分析与设计:基于产品原型梳理出根据id查询员工信息和编辑员工信息两个接口需求。
    • 代码开发:分别在各层级编写代码实现员工信息回显及修改功能,部分功能复用已有代码。
    • 功能测试:通过接口文档测试和前后端联调测试检验功能实现情况。
    • 代码提交:完成代码提交流程。

菜品分类管理功能

  1. 需求分析与设计:从产品原型出发,分析新增、分页查询、删除、修改、启用禁用、按类型查询菜品分类等功能需求,确定接口设计及category表结构。
  2. 代码导入:按照mapper、service、controller顺序导入资料中提供的分类管理模块功能代码,并进行编译。
  3. 功能测试:重启服务后,对菜品分类管理的各项功能如分页查询、分类类型查询、启用禁用、修改、新增、删除等进行测试验证。
  4. 代码提交:按照常规流程完成代码提交。

第四天、菜品管理板块

一、公共字段自动填充

  1. 问题分析
    • 系统中很多表存在公共字段(如创建时间、创建人、修改时间、修改人),在新增或编辑数据时需重复赋值,代码冗余繁琐。
  2. 实现思路
    • 自定义注解AutoFill,标识需自动填充公共字段的方法。
    • 自定义切面AutoFillAspect,拦截加AutoFill注解的方法,通过反射为公共字段赋值。
    • Mapper方法上加AutoFill注解。
  3. 技术点运用
    • 枚举:定义OperationType枚举(UPDATEINSERT)表示数据库操作类型。
    • 注解:创建AutoFill注解,指定作用于方法,运行时有效,关联OperationType枚举值。
    • AOP:通过@Aspect@Component定义切面类,设置切入点autoFillPointCut,在前置通知autoFill方法中实现公共字段赋值逻辑。
    • 反射:在autoFill方法中,利用反射获取被拦截方法的参数实体对象,根据操作类型为公共字段赋值。
  4. 代码开发要点
    • 自定义注解AutoFillcom.sky.annotation包中,关联OperationType枚举。
    • 切面AutoFillAspectcom.sky.aspect包中,切入点表达式execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill),在前置通知中获取方法签名、注解、操作类型,以及方法参数实体对象,然后根据操作类型利用反射为实体对象的公共字段赋值。
    • Mapper接口方法(如CategoryMapperEmployeeMapper的新增和修改方法)上添加@AutoFill注解,并注释掉业务层中原来为公共字段赋值的代码。
  5. 功能测试与提交
    • 以新增菜品分类为例测试,查看控制台输出的 SQL 和数据库表中数据,确认公共字段自动填充成功。
    • 代码提交时注意可能出现的提示,按步骤推送成功。

二、新增菜品

  1. 需求分析与设计
    • 产品原型:后台可管理菜品信息,新增菜品时需选择所属分类并上传图片,菜品名称唯一,可选择口味,对应一张图片。
    • 接口设计:包括根据类型查询分类(已完成)、文件上传、新增菜品。明确各接口请求方式、路径、参数和返回值。
    • 表设计:涉及菜品表dish(包含菜品名称、分类 ID、价格、图片、描述、状态、创建时间、更新时间、创建人、更新人等字段)和菜品口味表dish_flavor(包含菜品 ID、口味名称、口味值等字段)。
  2. 代码开发步骤
    • 文件上传实现
      • 定义OSS相关配置,在sky-server模块的application-dev.ymlapplication.yml中设置aliossendpointaccess-key-idaccess-key-secretbucket-name等属性。
      • 读取OSS配置,在sky-common模块的AliOssProperties类中通过@ConfigurationProperties读取配置。
      • 生成OSS工具类对象,在sky-server模块的OssConfiguration类中创建AliOssUtil对象。
      • 定义文件上传接口,在sky-server模块的CommonController中创建upload方法,接收MultipartFile类型的文件,处理文件名、生成新文件名,利用AliOssUtil上传文件并返回文件路径。
    • 新增菜品实现
      • 设计DTODishDTO,在sky-pojo模块中,包含菜品基本信息和口味列表。
      • Controller层,在sky-server模块的DishController中创建save方法,接收DishDTO,调用DishServicesaveWithFlavor方法。
      • Service层接口DishService中定义saveWithFlavor方法。
      • Service层实现类DishServiceImpl中实现saveWithFlavor方法,先将DishDTO属性复制到Dish实体,插入菜品表获取主键,再处理口味数据插入口味表。
      • Mapper层,DishMapper中添加insert方法并在DishMapper.xml中编写插入菜品数据的 SQL,DishFlavorMapper中添加insertBatch方法并在DishFlavorMapper.xml中编写批量插入口味数据的 SQL。
  3. 功能测试与提交
    • 进入菜品管理新建菜品页面,填写信息保存后在数据库表中查看数据,确认新增菜品功能成功。
    • 代码提交按常规步骤操作,注意提交过程中的提示信息。

三、菜品分页查询

  1. 需求分析和设计
    • 产品原型:菜品数据多以分页展示,展示菜品基本信息、图片(需下载)和分类名称(需关联查询)。
    • 业务规则:按页码展示,每页 10 条,可根据菜品名称、分类、状态查询。
    • 接口设计:设计菜品分页查询接口,明确请求方式、路径、参数和返回值。
  2. 代码开发流程
    • 设计DTODishPageQueryDTO,在sky-pojo模块中,包含页码、页大小、菜品名称、分类 ID、状态等属性。
    • 设计VODishVO,在sky-pojo模块中,包含菜品基本信息、分类名称、口味列表等属性。
    • Controller层,在DishController中创建page方法,接收DishPageQueryDTO,调用DishServicepageQuery方法并返回结果。
    • Service层接口DishService中扩展pageQuery方法。
    • Service层实现类DishServiceImpl中实现pageQuery方法,使用PageHelper进行分页,调用DishMapperpageQuery方法并封装PageResult返回。
    • Mapper层,DishMapper接口中声明pageQuery方法,在DishMapper.xml中编写 SQL,关联dish表和category表,根据条件查询并按创建时间倒序排列。
  3. 功能测试与提交
    • 可通过接口文档测试(启动服务,使用admin用户登录获取token,在Swagger中访问菜品分页查询接口发送请求)和前后端联调测试(启动nginx,访问http://localhost点击菜品管理),确认数据成功查出。
    • 代码提交步骤与之前类似,注意处理提交过程中的问题。

四、删除菜品

  1. 需求分析和设计
    • 产品原型:菜品列表有删除操作,可单个或批量删除。
    • 业务规则:起售中菜品不能删除,被套餐关联的菜品不能删除,删除菜品时关联口味数据也删除。
    • 接口设计:设计菜品批量删除接口,ids参数可包含多个菜品 ID。
    • 表设计:涉及dish表、dish_flavor表和setmeal_dish表(菜品与套餐关联中间表)。
  2. 代码开发实现
    • Controller层,在DishController中创建delete方法,接收菜品 ID 列表,调用DishServicedeleteBatch方法。
    • Service层接口DishService中声明deleteBatch方法。
    • Service层实现类DishServiceImpl中实现deleteBatch方法,先判断菜品是否起售中或被套餐关联,若可删除则先删除菜品表数据,再删除关联口味数据。
    • Mapper层,DishMapper中声明getById方法并编写 SQL 查询菜品,SetmealDishMapper中声明getSetmealIdsByDishIds方法并在SetmealDishMapper.xml中编写 SQL 根据菜品 ID 查询套餐 ID,DishMapper中声明deleteById方法并编写 SQL 删除菜品数据,DishFlavorMapper中声明deleteByDishId方法并编写 SQL 删除关联口味数据。
  3. 功能测试与提交
    • 通过前后端联调测试,在菜品列表页面进行删除操作,包括删除正常菜品和起售中菜品,检查数据库表中数据是否正确删除,确认功能是否符合业务规则。
    • 代码提交按常规流程操作,留意提交时的提示信息。

五、修改菜品

  1. 需求分析和设计
    • 产品原型:菜品管理列表点击修改按钮进入修改页面,回显信息并修改保存。
    • 接口设计:涉及根据 ID 查询菜品和修改菜品两个接口,明确各接口请求方式、路径、参数和返回值。
  2. 代码开发步骤
    • 根据 ID 查询菜品实现
      • Controller层,在DishController中创建getById方法,接收菜品 ID,调用DishServicegetByIdWithFlavor方法并返回结果。
      • Service层接口DishService中声明getByIdWithFlavor方法。
      • Service层实现类DishServiceImpl中实现getByIdWithFlavor方法,先查询菜品数据,再查询关联口味数据,封装到DishVO返回。
      • Mapper层,DishFlavorMapper中声明getByDishId方法并编写 SQL 根据菜品 ID 查询口味数据。
    • 修改菜品实现
      • Controller层,在DishController中创建update方法,接收DishDTO,调用DishServiceupdateWithFlavor方法。
      • Service层接口DishService中声明updateWithFlavor方法。
      • Service层实现类DishServiceImpl中实现updateWithFlavor方法,先更新菜品表基本信息,再删除原口味数据,最后重新插入口味数据。
      • Mapper层,DishMapper中声明update方法并在DishMapper.xml中编写动态更新菜品数据的 SQL,关联AutoFill注解实现公共字段自动更新。
  3. 功能测试与提交
    • 通过前后端联调测试,在菜品列表页面选择菜品修改,检查回显和修改保存功能是否正常。
    • 代码提交同常规操作,注意提交过程中的细节。

第五天、Redis的应用简单理解

Redis入门

  • 简介
    • Redis是基于内存的key-value结构数据库,是存储中间件,具有读写性能高、适合存储热点数据等特点,属于非关系型数据库(NoSql),是关系型数据库的补充。
    • 存储的value类型丰富,被称为结构化的NoSql数据库,官方给出的QPS能达100000+。
  • 下载与安装
    • 下载:分为Windows版(下载地址:https://github.com/microsoftarchive/redis/releases )和Linux版(下载地址:https://download.redis.io/releases/ ),资料中也提供了安装包。
    • 安装
      • Windows中安装:属于绿色软件,解压即可使用,解压后有特定目录结构。
      • Linux中安装(简单了解):需上传安装包后解压,安装依赖环境gcc,进入对应目录编译、安装,安装后有如Redis服务启动脚本、客户端脚本、配置文件等重点文件。
  • 服务启动与停止
    • 服务启动命令(以Windows版为例):使用“redis-server.exe redis.windows.conf”命令启动,默认端口号为6379,按Ctrl + C可停止服务。
    • 客户端连接命令:“redis-cli.exe”默认连接本地Redis服务及6379端口,也可通过指定参数(如-h、-p、-a)连接特定的服务、端口、设置密码等。修改Redis配置文件设置密码后需重启服务,连接时需带上密码(若有),在某些情况下可省略部分参数。
    • Redis客户端图形工具:默认客户端工具界面和操作不太友好,引入图形工具,安装后可新建连接并进行操作。

Redis数据类型

Redis中key是字符串类型,value有5种常用数据类型,分别是:

  • 字符串(string):普通字符串,是最简单的数据类型。
  • 哈希(hash):类似Java中的HashMap结构,是string类型的field和value的映射表,适合存储对象。
  • 列表(list):按插入顺序排序,可包含重复元素,类似Java中的LinkedList。
  • 集合(set):无序集合,无重复元素,类似Java中的HashSet。
  • 有序集合(sorted set/zset):集合中元素关联分数,根据分数升序排序,无重复元素。

Redis常用命令

  • 字符串操作命令:如“SET”设置指定key的值,“GET”获取指定key的值,“SETEX”设置值并设过期时间,“SETNX”在key不存在时设置值等。
  • 哈希操作命令:像“HSET”设置哈希表中字段的值,“HGET”获取指定字段的值,“HDEL”删除指定字段,“HKEYS”获取所有字段,“HVALS”获取所有值等。
  • 列表操作命令:例如“LPUSH”将值插入列表头部,“LRANGE”获取列表指定范围元素,“RPOP”移除并获取最后一个元素,“LLEN”获取列表长度,“BRPOP”移出并获取最后元素(可阻塞等待)等。
  • 集合操作命令:包含“SADD”向集合添加成员,“SMEMBERS”返回集合所有成员,“SCARD”获取集合成员数,“SINTER”返回交集,“SUNION”返回并集,“SREM”移除集合成员等。
  • 有序集合操作命令:有“ZADD”添加成员,“ZRANGE”通过索引区间返回成员(可带分数),“ZINCRBY”对成员分数增加增量,“ZREM”移除成员等。
  • 通用命令:不分数据类型,如“KEYS”查找符合模式的key,“EXISTS”检查key是否存在,“TYPE”返回key储存值的类型,“DEL”删除key,“rename”重命名,“ping”测试连接,“expire”设置key存活时间,“ttl”返回key剩余生存时间等。

在Java中操作Redis

  • Redis的Java客户端:常用的有Jedis、Lettuce、Spring Data Redis等,重点学习Spring Data Redis,Spring Boot项目中提供对应的Starter方便使用。
  • Spring Data Redis使用方式
    • 环境搭建
      • 导入maven坐标:在项目中添加“spring-boot-starter-data-redis”依赖。
      • 配置Redis数据源:在配置文件(如application-dev.yml、application.yml)中指定Redis的主机、端口、密码、使用的数据库等信息。
      • 编写配置类创建RedisTemplate对象:配置类中创建RedisTemplate,设置连接工厂对象及key的序列化器(将默认的修改为StringRedisSerializer),虽然Spring Boot会自动装配,但修改序列化器能让存入Redis的数据更符合预期。
      • 通过RedisTemplate对象操作Redis:注入RedisTemplate后,可获取对应不同数据类型操作的接口对象,如ValueOperations(字符串操作)、HashOperations(哈希操作)等,进而操作不同类型数据。
    • 操作常见类型数据:通过编写具体的测试方法,利用对应的操作接口对象,实现对字符串、哈希、列表、集合、有序集合类型数据以及通用命令的操作示例,如对字符串的存取值、设置过期等操作,对哈希类型的增删改查操作等。

店铺营业状态设置

  • 需求分析和设计
    • 产品原型:后台可设置餐厅营业状态(营业中/打烊中),不同状态决定用户能否在小程序下单,点击营业状态按钮可更改状态。
    • 接口设计:包含设置营业状态、管理端查询营业状态、用户端查询营业状态三个接口,虽查询的营业状态一致,但因管理端和用户端请求前缀不同,分为两个接口实现。
    • 营业状态存储方式:基于Redis的字符串存储,约定1表示营业,0表示打烊。
  • 代码开发
    • 设置营业状态:在“sky-server”模块创建“ShopController”类,编写“setStatus”方法,通过注入的RedisTemplate对象将营业状态值存入Redis。
    • 管理端查询营业状态:在“ShopController”类中编写“getStatus”方法,从Redis中获取营业状态值返回。
    • 用户端查询营业状态:在“com.sky.controller.user”包下创建“ShopController”类,同样编写“getStatus”方法从Redis获取并返回营业状态值。
  • 功能测试
    • 接口文档测试:启动服务访问接口文档,登录获取token后,分别进行设置营业状态、管理端和用户端查询营业状态的操作,查看控制台日志及Redis中数据验证功能。
    • 接口分组展示:通过修改配置类(如“WebMvcConfiguration.java”),分别扫描管理端和用户端接口所在包,生成不同分组的接口文档,方便区分。
    • 前后端联调测试:启动nginx访问项目,进入后台操作营业状态设置,查看状态变化验证功能。

第六天、微信小程序开发

HttpClient

  • 介绍
    • 是Apache Jakarta Common下的子项目,用于提供支持HTTP协议的客户端编程工具包,能发送HTTP请求及接收响应数据,支持HTTP协议最新版本与建议。
    • 有诸多应用场景,如扫描支付、查看地图等功能实现中,应用程序需访问对应服务发送HTTP请求并接收响应,就可借助HttpClient来完成。
    • 有HttpClient、HttpClients、CloseableHttpClient、HttpGet、HttpPost等核心API,使用时需按创建HttpClient对象、创建Http请求对象、调用execute方法发送请求的步骤操作。
    • 通过maven坐标“org.apache.httpcomponents:httpclient:4.5.13”引入依赖(不过项目中若引入了特定依赖如aliyun-sdk-oss,其底层已包含HttpClient相关依赖,可选择不单独导入)。
  • 入门案例
    • GET方式请求:在Java程序中,先创建HttpClient对象(如使用HttpClients.createDefault()),再创建HttpGet请求对象(指定请求的URL),接着调用HttpClient的execute方法发送请求,获取响应结果后解析,最后关闭相关资源。示例中发送请求到“http://localhost:8080/user/shop/status”并输出服务端返回状态码与数据。
    • POST方式请求:同样先创建HttpClient对象,然后创建HttpPost请求对象,对于携带参数的POST请求,需将参数封装为请求体对象(如StringEntity)并设置到请求对象中(指定编码方式、数据格式等),后续发送请求、解析响应结果以及关闭资源的步骤与GET请求类似。示例中发送请求到“http://localhost:8080/admin/employee/login”并输出响应码与响应数据。

微信小程序开发

  • 介绍:是一种可在微信内便捷获取与传播、体验出色的开放能力,不同注册主体(个人、企业、政府、媒体等)开发权限有别,比如个人身份注册小程序无法开通支付权限。微信官方提供了开发文档、开发者工具、设计指南以及体验DEMO等帮助开发者开发,开发完上线也有详细接入流程。
  • 准备工作
    • 注册小程序:通过指定注册地址(https://mp.weixin.qq.com/wxopen/waregister?action=step1 )进行,注册时要选择合适主体。
    • 完善小程序信息:登录小程序后台(https://mp.weixin.qq.com/ )完善信息、类目等,并查看小程序的AppID。
    • 下载开发者工具:资料中若已提供则无需下载,熟悉下载步骤即可,下载地址为https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html ,使用时需扫描登录、创建小程序项目,还可设置不校验合法域名(开发阶段若不勾选,请求发送到后端服务器可能失败)。
  • 入门案例
    • 小程序目录结构:主体部分含app.js(存放逻辑代码)、app.json(配置文件,存放公共配置)、app.wxss(存放公共样式表,非必须);每个页面又由js文件(存放业务逻辑代码)、wxml文件(存放页面结构,类似HTML页面)、json文件(存放页面相关配置,非必须)、wxss文件(存放页面样式表,类似CSS文件)组成。
    • 编写和编译小程序:在对应文件(如index.wxml编写页面布局,index.js编写业务逻辑代码)编写代码后点击编译按钮运行查看效果,运行时若涉及请求后端服务(如发送请求到“http://localhost:8080/user/shop/status”),需先启动后台项目,同时要设置不校验合法域名以防请求失败。
    • 发布小程序:代码开发完点击上传按钮指定版本号上传到微信服务器,此时为开发版本,还需进到微信公众平台的版本管理页面提交审核变为审核版本,审核通过后发布成线上版本,这样微信用户就能搜索使用该小程序了。

微信登录

  • 导入小程序代码:因小程序开发偏前端,后端开发为主时可直接导入已提供的小程序代码到微信开发者工具使用,导入时填写自己的AppID,还需根据实际情况修改后端服务的ip地址和端口号(修改配置文件中对应项)。
  • 微信登录流程
    • 小程序端先调用wx.login()获取code(授权码,每次获取只能使用一次),再调用wx.request()携带code请求开发者服务器。
    • 开发者服务端通过HttpClient向微信接口服务发送请求(携带appId、appsecret、code三个参数),接收返回的session_key、opendId(微信用户唯一标识)等数据后,自定义登录态生成令牌(token)和openid等返回给小程序端,方便后续请求身份校验。
    • 小程序端收到后存储,后续发起业务请求时携带token,开发者服务端收到请求后通过token解析登录用户id进行身份校验,校验通过处理业务逻辑并返回业务数据。可使用Postman按流程进行测试。
  • 需求分析和设计
    • 产品原型:用户进入小程序需微信授权登录才能点餐,登录要获取用户昵称、头像等信息,新用户首次使用自动完成注册存到数据库。
    • 接口设计:小程序端获取授权码后发给后端,后端请求微信接口服务最终返回openid和token等数据,设计出接口的请求参数(如传入用户登录相关的code)和返回数据(包含用户id、openid、token等),请求路径为/user/user/login。
    • 表设计:用户首次使用小程序自动注册时,用户信息存储到user表,表中包含id、openid、name、phone等字段,其中手机号字段获取权限因小程序注册主体不同而有差异(个人注册小程序通常拿不到微信用户手机号)。
  • 代码开发
    • 定义相关配置:在配置文件(如application-dev.yml、application.yml)中配置微信登录所需的appid、secret以及为微信用户生成jwt令牌时用到的相关配置项(如签名加密秘钥、过期时间、令牌名称等)。
    • DTO设计:根据传入参数设计UserLoginDTO类,包含如code等属性,用于接收小程序端传入的登录相关数据。
    • VO设计:根据返回数据设计UserLoginVO类,包含id、openid、token等属性,用于返回给小程序端登录相关结果数据。
    • Controller层:在UserController中创建login方法,接收UserLoginDTO参数,先调用Service层的wxLogin方法实现微信登录,再为微信用户生成jwt令牌,最后构建UserLoginVO对象返回给小程序端。
    • Service层接口与实现类:UserService接口定义wxLogin方法,UserServiceImpl实现类中wxLogin方法先调用getOpenid方法获取微信用户openid,判断是否为空(为空则登录失败抛异常),再判断用户是否新用户(新用户自动注册插入数据库),getOpenid方法通过HttpClientUtil向微信接口服务发送请求获取openid。
    • Mapper层:UserMapper接口定义根据openid查询用户、插入用户数据的方法,对应的UserMapper.xml映射文件实现插入用户数据的SQL语句。
    • 编写拦截器:编写JwtTokenUserInterceptor拦截器,用于拦截用户端请求进行jwt校验,从请求头获取令牌并校验,校验通过设置当前用户id到上下文,校验不通过响应401状态码;在WebMvcConfiguration配置类中注册拦截器,指定拦截路径和排除的路径(如登录接口、查询店铺营业状态接口不拦截)。
  • 功能测试:重新编译小程序进行登录,可获取到openid和token数据,查看后台日志以及数据库user表验证功能(首次登录会自动注册新用户到表中)。

导入商品浏览功能代码

  • 需求分析和设计
    • 产品原型:用户登录成功进入首页,按分类展示菜品和套餐,菜品根据是否设置口味信息展示不同按钮,同时有菜品列表、口味、套餐列表、套餐详情等不同效果图展示相应展示要求。
    • 接口设计:先粗粒度设计包含查询分类、根据分类id查询菜品、根据分类id查询套餐、根据套餐id查询包含的菜品这4个接口,然后细粒度分析明确各接口的请求方式、请求路径、传入参数和返回值。
  • 代码导入:按mapper、service、controller顺序导入资料中的商品浏览功能代码到sky-server模块中。
    • Mapper层:在SetmealMapper.java添加查询套餐、根据套餐id查询菜品选项的方法,创建SetmealMapper.xml文件实现动态条件查询套餐的SQL语句;在DishService.java添加条件查询菜品和口味的方法定义,在DishServiceImpl.java实现该方法(查询菜品及对应的口味信息)。
    • Service层:创建SetmealService.java接口定义条件查询、根据id查询菜品选项等方法,SetmealServiceImpl.java实现类实现相应业务逻辑;在DishService相关类中完善条件查询菜品和口味的方法定义与实现。
    • Controller层:分别创建DishController.java、CategoryController.java、SetmealController.java,在各控制器类中编写对应接口方法(如根据分类id查询菜品、查询分类、根据分类id查询套餐及根据套餐id查询菜品列表等),调用Service层方法处理业务并返回结果。
  • 功能测试:重启服务器、重新编译小程序,微信登录进入首页后测试菜品和套餐分类查询、具体分类下菜品查询、菜品口味查询等功能是否正常展示。
  • 代码提交:按常规操作流程进行代码提交。

第七天、缓存菜品、购物车功能的实现

缓存菜品

  • 问题说明:用户端小程序展示菜品数据依赖查询数据库,访问量较大时会增大数据库访问压力,导致系统响应慢、用户体验差。
  • 实现思路:利用Redis缓存菜品数据减少数据库查询,缓存逻辑为每个分类下的菜品保存一份缓存数据,且数据库中菜品数据变更时清理对应缓存数据。
  • 代码开发
    • 用户端接口修改:在DishController的list方法中,先从Redis查询菜品数据,若存在则直接返回;若不存在则查询数据库,将结果存入Redis后再返回。
    • 管理端接口优化:在管理端DishController中添加cleanCache方法用于清理缓存数据,然后在新增菜品、批量删除菜品、修改菜品、菜品起售停售等相关方法中调用cleanCache方法,保证数据库与Redis数据一致性。
  • 功能测试:可通过查看控制台sql、前后端联调、查看Redis缓存数据等方式测试。例如首次查询菜品分类时从数据库查询并缓存到Redis,再次查询相同分类直接从Redis获取;修改菜品数据后能清空对应缓存,保证下次访问时重新从数据库查询并更新缓存数据。
  • 代码提交:按照常规步骤提交代码,与其他功能代码提交后续操作类似。

缓存套餐

  • Spring Cache介绍
    • 概述:是实现基于注解的缓存功能的框架,提供了抽象层,底层可切换不同缓存实现(如EHCache、Caffeine、Redis等)。
    • 常用注解
      • @EnableCaching:开启缓存注解功能,加在启动类上。
      • @Cacheable:方法执行前先查缓存有无数据,有则直接返回,无则调用方法并将返回值存入缓存。
      • @CachePut:将方法的返回值放入缓存。
      • @CacheEvict:从缓存中删除一条或多条数据。
    • 入门案例:展示了在不同场景下各注解的使用,如在保存用户信息的方法上加@CachePut将数据存入缓存;在查询用户信息的方法上加@Cacheable实现先查缓存,无数据再查数据库并缓存结果;在删除用户信息的方法上加@CacheEvict清理指定缓存。
  • 实现思路:导入Spring Cache和Redis相关maven坐标,在启动类加@EnableCaching注解开启缓存功能,在用户端接口SetmealController的list方法上加@Cacheable注解缓存套餐数据,在管理端接口SetmealController的相关修改、删除、起售停售等方法上加CacheEvict注解清理缓存。
  • 代码开发:按照实现思路在项目中添加相应依赖、注解等代码实现缓存套餐功能。
  • 功能测试:通过前后端联调并观察redis中缓存的套餐数据来测试,与缓存菜品功能测试方法类似。
  • 代码提交:按照既定流程提交代码,与其他功能代码提交后续操作一样。

添加购物车

  • 需求分析和设计
    • 产品原型:用户可将菜品(设置口味信息的需选规格后)或套餐添加到购物车,购物车中能修改商品数量、清空购物车。
    • 接口设计:设计添加购物车接口,传入参数可能是菜品id或套餐id。
    • 表设计:购物车数据存于shopping_cart表,表中记录用户id、菜品或套餐相关id、口味、数量、单价、创建时间等信息,同一商品选多份只需更新数量字段。
  • 代码开发
    • DTO设计:根据接口参数设计ShoppingCartDTO类,包含菜品id、套餐id、菜品口味等属性。
    • 各层代码实现
      • Controller层:创建ShoppingCartController,其中add方法接收ShoppingCartDTO参数,调用Service层的addShoppingCart方法(后续实现)添加购物车。
      • Service层接口与实现类:ShoppingCartService接口定义addShoppingCart方法,ShoppingCartServiceImpl实现类中该方法先判断商品是否已在购物车,若已存在则更新数量,不存在则根据是菜品还是套餐插入相应数据到购物车。
      • Mapper层:创建ShoppingCartMapper接口及对应的ShoppingCartMapper.xml,定义条件查询、更新数量、插入数据等方法及对应的SQL语句。
  • 功能测试:进入小程序添加菜品到购物车,通过查询数据库(因暂未实现查看购物车功能)查看购物车数据,前后端联调时可通过断点查看运行步骤。
  • 代码提交:按常规操作提交代码,后续步骤与其他功能代码提交相同。

查看购物车

  • 需求分析和设计:产品原型体现用户添加完商品后可进入购物车查看菜品和套餐,接口设计明确了查看购物车接口相关的请求、返回信息。
  • 代码开发
    • Controller层:在ShoppingCartController中创建list方法,调用Service层的showShoppingCart方法(后续实现)并返回结果。
    • Service层接口与实现类:ShoppingCartService接口声明showShoppingCart方法,ShoppingCartServiceImpl实现类中该方法通过查询数据库获取当前用户的购物车数据并返回。
  • 功能测试:进入小程序会发起查看购物车请求,点击购物车图标能看到购物车内容则测试成功。
  • 代码提交:按正常流程提交代码,与其他功能代码提交后续步骤一致。

清空购物车

  • 需求分析和设计:产品原型展示点击清空按钮可清空购物车所有数据,接口设计明确了清空购物车接口相关的请求等信息。
  • 代码开发
    • 各层代码实现
      • Controller层:在ShoppingCartController中创建clean方法,调用Service层的cleanShoppingCart方法(后续实现)。
      • Service层接口与实现类:ShoppingCartService接口声明cleanShoppingCart方法,ShoppingCartServiceImpl实现类中该方法通过Mapper层的deleteByUserId方法删除当前用户的购物车数据。
      • Mapper层:在ShoppingCartMapper接口中创建deleteByUserId方法,定义根据用户id删除购物车数据的SQL语句。
  • 功能测试:进入购物车页面点击清空按钮后,查看数据库确认当前用户购物车数据已全部删除则测试成功。
  • 代码提交:按常规操作提交代码,后续步骤与其他功能代码提交相同。

第八天、微信支付功能实现

根据上传的文件内容,以下是关于“苍穹外卖-day08”课程的关键知识点总结:

1. 导入地址簿功能代码

1.1 需求分析和设计
  • 产品原型:用户可以维护自己的地址信息,包括查询、新增、修改、删除地址以及设置默认地址。
  • 接口设计:定义了7个接口用于处理地址簿管理的不同操作。
  • 表设计:创建address_book表存储用户的地址信息。
1.2 代码导入
  • Mapper层:实现了与数据库交互的基本方法,如新增地址、查询地址等。
  • Service层:提供了业务逻辑处理的服务接口及实现类。
  • Controller层:为前端提供RESTful API接口,以JSON格式响应请求。
1.3 功能测试

通过前后端联调测试来验证各个功能点是否正常工作。

2. 用户下单

2.1 需求分析和设计
  • 产品原型:用户将菜品加入购物车后可提交订单,并完成支付。
  • 表设计:设计了orders(订单表)和order_detail(订单明细表)两个数据表,用以保存订单相关信息。
2.2 代码开发
  • DTO设计:定义了传输对象OrdersSubmitDTO用于接收用户提交的订单信息。
  • VO设计:定义了视图对象OrderSubmitVO用于返回给用户的订单确认信息。
  • Controller层:提供了用户下单的API接口。
  • Service层接口:声明了用户下单的方法。
  • Service层实现类:实现了订单创建的具体逻辑,包括异常情况的处理。
  • Mapper层:实现了订单及其明细数据的插入操作。
2.3 功能测试

完成了从去结算到支付成功的整个流程测试。

3. 订单支付

3.1 微信支付介绍

简要介绍了微信支付的产品和服务,强调了微信支付接入的重要性。

3.2 微信支付准备工作

讨论了确保数据安全的方法,如使用证书进行加密解密,并解释了如何通过内网穿透技术让微信后台能够调用到本地服务器。

3.3 代码导入
  • 配置相关属性:在配置文件中设置了微信支付所需的参数。
  • Mapper层:增加了查询订单和更新订单状态的方法。
  • Service层:实现了订单支付和支付成功后的订单状态更新逻辑。
  • Controller层:提供了订单支付的API接口。
  • PayNotifyController:处理来自微信支付的成功回调通知。

3. 订单支付

3.1 微信支付介绍
  • 微信支付产品:本项目选择小程序支付。
  • 微信支付接入流程:商户系统调用微信支付接口生成预支付交易单,用户支付后微信后台通知商户系统支付结果。
  • 微信支付相关接口:包括JSAPI下单和微信小程序调起支付。
3.2 微信支付准备工作
  • 数据安全:使用微信支付平台证书和商户私钥文件保证数据安全。
  • 内网穿透:使用cpolar软件获取临时域名,确保微信后台可以调用到商户系统。
3.3 代码导入
  • 配置文件:配置了微信支付相关的参数。
  • Mapper层:实现了订单的查询和更新操作。
  • Service层:实现了订单支付和支付成功的业务逻辑。
  • Controller层:提供了订单支付的接口,并处理微信支付的回调通知。
3.4 功能测试
  • 通过前后端联调测试了订单支付功能,确保支付流程正常。

总结

  • 地址簿管理:实现了用户地址的增删改查功能,支持设置默认地址。
  • 用户下单:实现了用户下单功能,生成订单并清理购物车。
  • 订单支付:实现了微信支付功能,支持用户支付订单并处理支付回调。

通过本次课程,我们掌握了如何实现用户地址管理、用户下单和订单支付功能,并了解了微信支付的基本流程和接口调用方式。

第十天、催单、实时通讯功能实现

1. Spring Task

  • 作用: 用于定时执行任务,适用于需要定时处理的场景,如订单超时处理、通知提醒等。
  • 使用步骤:
    1. 导入spring-context依赖。
    2. 在启动类上添加@EnableScheduling注解以开启任务调度。
    3. 创建定时任务类,并在方法上使用@Scheduled注解,指定cron表达式。
  • cron表达式: 定义任务执行时间的字符串,分为秒、分钟、小时、日、月、周、年(可选)七个域,支持通配符和特殊字符。

2. WebSocket

  • 作用: 实现浏览器与服务器之间的全双工通信,适用于实时通信场景。
  • 特点: 长连接、双向通信、基于TCP。
  • 使用步骤:
    1. 前端使用WebSocket API建立连接。
    2. 后端使用@ServerEndpoint注解定义WebSocket服务端点。
    3. 配置WebSocket支持,如注册ServerEndpointExporter bean。
    4. 实现连接打开、消息接收、连接关闭等回调方法。

3. 来单提醒和客户催单

  • 设计思路:
    • 使用WebSocket保持管理端与服务器的长连接。
    • 当用户支付成功或点击催单时,服务器通过WebSocket向管理端推送消息。
    • 管理端解析消息并进行相应的提示和语音播报。
  • 实现细节:
    • 在支付成功和催单方法中,通过WebSocket向所有客户端发送消息。
    • 消息格式为JSON,包含类型、订单ID和内容字段。
    • 管理端根据消息类型进行不同的处理。

4. 代码结构和提交

  • 代码结构: 按模块划分,如sky-server模块包含业务逻辑、数据访问层等。
  • 代码提交: 按功能模块进行提交,确保每次提交的代码完整且有明确的提交信息。

5. 功能测试

  • 测试方法: 通过浏览器调试工具查看数据交互,进行前后端联调。
  • 测试步骤:
    • 登录管理端,建立WebSocket连接。
    • 在小程序端进行下单支付和催单操作。
    • 查看管理端是否收到相应的提醒和语音播报。

6. 其他注意事项

  • cron表达式生成器: 使用在线工具生成cron表达式,避免手动编写错误。
  • WebSocket安全: 考虑WebSocket连接的安全性,如添加身份验证和授权机制。
  • WebSocket重连: 处理网络波动导致的连接中断,实现自动重连机制。

第十一天、echart、用户统计、订单统计、销量功能实时显示

1. Apache ECharts

  • 介绍:基于Javascript的数据可视化图表库,可提供直观、生动、可交互且能个性化定制的数据可视化图表,本质是对数据进行可视化展示,常见效果有柱形图、饼形图、折线图等,官网地址为https://echarts.apache.org/zh/index.html。
  • 入门案例
    • 实现步骤:引入echarts.js文件、为ECharts准备设置宽高的DOM、初始化echarts实例、指定图表配置项和数据、使用配置项和数据显示图表。
    • 代码开发示例:给出了HTML页面中相关的代码结构,包括脚本的引入、DOM元素的定义以及具体配置项和图表显示的代码逻辑。
    • 测试方式:通过浏览器打开页面即可,使用Echarts重点在于研究图表所需的数据格式,后端需按前端要求返回相应格式数据。

2. 营业额统计

  • 需求分析和设计
    • 产品原型:基于折线图按天展示营业额,光标放对应点可展示具体数值,日期由时间选择器决定,营业额指已完成订单金额合计,X轴为日期,Y轴为营业额。
    • 接口设计:需根据原型图设计接口,后端要适配前端对数据格式的要求。
  • 代码开发
    • VO设计:定义TurnoverReportVO类,包含日期列表和营业额列表字段,用逗号分隔对应数据,在sky-pojo模块中实现。
    • Controller层:创建ReportController类,提供turnoverStatistics方法用于营业额数据统计,接收日期参数并返回对应结果。
    • Service层接口与实现类:ReportService接口声明getTurnover方法,ReportServiceImpl实现类实现该方法,通过调用Mapper层方法结合相关业务逻辑计算并封装营业额数据。
    • Mapper层:在OrderMapper接口声明sumByMap方法,并在OrderMapper.xml文件编写动态SQL用于根据动态条件统计营业额。
  • 功能测试:可通过接口文档测试、前后端联调测试,示例展示了查看近7日、近30日营业额统计情况及查看返回数据的操作。
  • 代码提交:按常规步骤提交代码,给出对应截图示意,与其他功能代码提交后续步骤一致。

3. 用户统计

  • 需求分析和设计
    • 产品原型:通过折线图展示用户总量和新增用户数量,基于可视化报表,X轴为日期,Y轴为用户数,根据时间选择区间展示对应数据。
    • 接口设计:依照原型图设计接口。
  • 代码开发
    • VO设计:定义UserReportVO类,包含日期、用户总量、新增用户列表字段,以逗号分隔对应数据,位于sky-pojo模块。
    • Controller层:在ReportController中创建userStatistics方法,用于获取用户数据统计结果。
    • Service层接口与实现类:ReportService接口声明getUserStatistics方法,ReportServiceImpl实现类实现该方法,通过循环计算不同日期下新增用户数和总用户数并封装返回。
    • Mapper层:在UserMapper接口声明countByMap方法,在对应xml文件编写动态SQL用于根据动态条件统计用户数量。
  • 功能测试:可采用接口文档测试、前后端联调测试,展示了查看近7日、近30日用户统计情况及查看返回数据的操作。
  • 代码提交:按常规步骤提交代码,给出对应截图示意,与其他功能代码提交后续步骤一致。

4. 订单统计

  • 需求分析和设计
    • 产品原型:用折线图展示订单总数和有效订单数(已完成状态订单),同时展示所选时间区间内的总订单数、有效订单数、订单完成率,X轴为日期,Y轴为订单数量。
    • 接口设计:根据原型图设计相应接口。
  • 代码开发
    • VO设计:定义OrderReportVO类,包含日期、每日订单数、每日有效订单数、订单总数、有效订单数、订单完成率等字段,在sky-pojo模块中定义。
    • Controller层:在ReportController里创建orderStatistics方法用于获取订单数据统计结果。
    • Service层接口与实现类:ReportService接口声明getOrderStatistics方法,ReportServiceImpl实现类实现该方法,通过循环统计每天订单相关数据,并计算时间区间内总订单数、有效订单数及订单完成率后封装返回。
    • Mapper层:在OrderMapper接口声明countByMap方法,在对应xml文件编写动态SQL实现根据动态条件统计订单数量。
  • 功能测试:能通过接口文档测试、前后端联调测试,展示了查看近7日、近30日订单统计情况及查看返回数据的操作。
  • 代码提交:按常规步骤提交代码,给出对应截图示意,与其他功能代码提交后续步骤一致。

5. 销量排名Top10

  • 需求分析和设计
    • 产品原型:针对菜品和套餐销售数量进行排名,通过柱形图降序展示销量排名前十的商品,根据时间选择区间展示相应数据,销量指商品销售份数。
    • 接口设计:依据原型图来设计接口。
  • 代码开发
    • VO设计:定义SalesTop10ReportVO类,包含商品名称列表和销量列表字段,以逗号分隔对应数据,在sky-pojo模块中定义。
    • Controller层:在ReportController中创建top10方法用于获取销量排名统计结果。
    • Service层接口与实现类:ReportService接口声明getSalesTop10方法,ReportServiceImpl实现类实现该方法,调用Mapper层方法获取商品销量排名数据并进行封装返回。
    • Mapper层:在OrderMapper接口声明getSalesTop10方法,在对应xml文件编写动态SQL实现查询商品销量排名。
  • 功能测试:可利用接口文档测试、前后端联调测试,展示了查看近30日销量排名Top10统计情况及查看返回数据的操作,若某时间段无销量数据则可能无展示效果。
  • 代码提交:按常规步骤提交代码,给出对应截图示意,与其他功能代码提交后续步骤一致。

第十二天、导出数据Excel表、工作台数据功能完善

1. 工作台

  • 需求分析和设计
    • 产品原型:作为系统运营的数据看板与快捷操作入口,展示今日数据、订单管理、菜品总览、套餐总览、订单信息等内容,还对营业额、有效订单、订单完成率、平均客单价、新增用户等名词做了解释。
    • 接口设计:依据原型图分析得出共6个接口,包含今日数据、订单管理、菜品总览、套餐总览、订单搜索(已完成)、各个状态的订单数量统计(已完成)等接口,并分别展示了各接口相关设计内容。
  • 代码导入
    • Controller层:WorkSpaceController.java中定义了如工作台今日数据查询、订单管理数据查询等多个方法,通过调用WorkspaceService的对应方法并返回相应结果。
    • Service层接口:WorkspaceService.java声明了根据时间段统计营业数据、查询订单管理数据等多个方法,为业务逻辑提供接口定义。
    • Service层实现类:WorkspaceServiceImpl.java实现了WorkspaceService中的方法,在各方法中通过调用对应Mapper层方法结合业务逻辑计算并返回如营业数据、订单管理数据、菜品及套餐总览数据等。
    • Mapper层:在SetmealMapper和DishMapper中分别添加countByMap方法定义,并在对应xml文件编写SQL实现,用于根据条件统计套餐和菜品数量。
  • 功能测试
    • 接口文档测试:启动服务后访问接口文档地址,使用admin用户登录重新获取token并设置全局参数防止失效,分别对今日数据查询、菜品总览查询、订单管理数据查询、套餐总览查询等接口进行测试并展示对应测试结果截图。
    • 前后端联调测试:启动nginx后访问对应网址进入工作台,进入开发者模式分别查看今日数据、订单管理、菜品总览、套餐总览等相关内容,并展示对应测试结果截图。
  • 代码提交:给出代码提交相关截图示意,后续步骤和其他功能代码提交一致。

2. Apache POI

  • 介绍:处理Miscrosoft Office各种文件格式的开源项目,通常用于Java程序中对Miscrosoft Office文件(尤其是Excel文件)进行读写操作,介绍了其常见应用场景,如银行网银系统导出交易明细、业务系统导出Excel报表、批量导入业务数据等,并展示了相关场景示例图。
  • 入门案例
    • 将数据写入Excel文件
      • 代码开发:展示了使用Apache POI将数据写入Excel文件的Java代码示例,包括创建Excel文件对象、Sheet页、行及单元格,设置单元格值,通过输出流将内存中Excel文件写入磁盘等操作。
      • 实现效果:在指定路径生成Excel文件并成功写入对应内容,展示了生成文件的截图示例。
    • 读取Excel文件中的数据
      • 代码开发:呈现了利用Apache POI读取Excel文件数据的Java代码示例,涵盖通过输入流读取文件、获取Sheet页、遍历行及单元格并获取其中文本内容等操作。
      • 实现效果:实现对指定Excel文件数据的读取,并展示读取后控制台输出内容的截图示例。

3. 导出运营数据Excel报表

  • 需求分析和设计
    • 产品原型:在数据统计页面点击数据导出按钮可下载Excel格式文件,包含最近30日运营相关数据,分为概览数据和明细数据两部分,按固定表格形式填充数字后可存档。
    • 接口设计:根据原型图设计接口,该接口无参数传递(后端自行计算最近30天运营数据),也无返回数据(报表导出本质是文件下载,通过输出流将Excel文件下载到客户端浏览器)。
  • 代码开发
    • 实现步骤:明确设计Excel模板文件、查询近30天运营数据、将数据写入模板文件、通过输出流下载Excel文件到客户端浏览器这几个步骤。
    • Controller层:在ReportController中创建export方法,调用ReportService的exportBusinessData方法用于导出运营数据报表。
    • Service层接口与实现类:ReportService接口声明exportBusinessData方法,ReportServiceImpl实现类实现该方法,先获取近30天时间范围,查询对应运营数据,加载模板文件创建Excel对象,将数据填充到Excel的对应单元格后通过输出流下载文件到客户端浏览器,并对可能出现的IOException做异常处理。
  • 功能测试:采用前后端联调测试,进入数据统计页面点击数据导出按钮,成功下载Excel报表并展示对应截图示例。
  • 代码提交:给出代码提交相关截图示意,后续步骤和其他功能代码提交一致。

总结

苍穹外卖项目学习总结

苍穹外卖项目是一个综合性的在线餐饮服务平台,涵盖了从用户端到管理端的一系列功能模块。通过这12天的学习,对项目整体架构、业务流程以及相关技术有了深入的理解和掌握。

功能模块概述

  1. 基础功能模块:包括员工管理、菜品分类管理、菜品管理、店铺营业状态设置等。员工管理实现了员工信息的增删改查,菜品分类管理和菜品管理确保了菜品体系的有序构建,店铺营业状态设置灵活控制店铺营业与否。
  2. 用户交互模块:用户可通过微信登录进入小程序,进行商品浏览、添加购物车、下单、支付等操作。商品浏览展示菜品和套餐,购物车功能方便用户管理选购商品,下单与支付流程完整流畅,同时地址簿管理使用户能便捷维护收货地址。
  3. 数据统计与展示模块:利用Apache ECharts实现数据可视化,通过折线图、柱状图展示营业额、用户数据、订单数据和销量排名等统计信息,帮助商家直观了解运营状况。工作台集成了今日数据、订单管理、菜品及套餐总览等功能,提供数据看板与快捷操作入口。
  4. 报表导出模块:借助Apache POI实现运营数据的Excel报表导出,便于商家存档与数据分析。

技术要点总结

  1. 后端技术:采用Spring Boot框架构建项目,集成MyBatis进行数据库操作,使用Spring Data Redis实现缓存功能,提高系统性能。HttpClient用于发送HTTP请求,实现与外部服务的交互,如微信登录、微信支付等功能。
  2. 前端技术(小程序):基于微信小程序开发框架,运用JavaScript语言进行页面逻辑编写,通过WXML构建页面结构,WXSS定义页面样式,实现用户端的交互功能。

项目收获与体会

  1. 技术能力提升:熟练掌握了前后端开发技术的整合应用,包括数据库设计与操作、接口开发、缓存策略等,提升了系统架构设计和性能优化能力。
  2. 业务理解深化:深入理解餐饮外卖业务流程,明确各功能模块间的协作关系,能更好地从业务需求出发进行功能设计与开发。
  3. 问题解决能力增强:在项目开发过程中遇到各种问题,如数据一致性维护、接口对接等,通过分析与调试,有效提升了问题解决能力。

展望未来

苍穹外卖项目为进一步开发提供了良好基础,后续可考虑优化用户体验,如提升页面加载速度、优化支付流程;拓展功能,如增加会员体系、营销活动功能;加强系统安全,保障用户数据和交易安全等。