基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四)

这篇具有很好参考价值的文章主要介绍了基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 编辑员工

1.1 需求分析与设计

1.1.1 产品原型

在员工管理列表页面点击 “编辑” 按钮,跳转到编辑页面,在编辑页面回显员工信息并进行修改,最后点击 “保存” 按钮完成编辑操作。

修改页面原型

注:点击修改时,数据应该正常回显到修改页面。

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

1.1.2 接口设计

根据上述原型图分析,编辑员工功能涉及到两个接口:

  • 根据id查询员工信息
  • 编辑员工信息

1). 根据id查询员工信息
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

2). 编辑员工信息

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

注:因为是修改功能,请求方式可设置为PUT。

1.2 代码开发

1.2.1 回显员工信息功能

1). Controller层

在 EmployeeController 中创建 getById 方法:

	/**
     * 根据id查询员工信息
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询员工信息")
    public Result<Employee> getById(@PathVariable Long id){
        Employee employee = employeeService.getById(id);
        return Result.success(employee);
    }

2). Service层接口

在 EmployeeService 接口中声明 getById 方法:

    /**
     * 根据id查询员工
     * @param id
     * @return
     */
    Employee getById(Long id);

3). Service层实现类

在 EmployeeServiceImpl 中实现 getById 方法:

 	/**
     * 根据id查询员工
     *
     * @param id
     * @return
     */
    public Employee getById(Long id) {
        Employee employee = employeeMapper.getById(id);
        employee.setPassword("****");
        return employee;
    }

4). Mapper层

在 EmployeeMapper 接口中声明 getById 方法:

	/**
     * 根据id查询员工信息
     * @param id
     * @return
     */
    @Select("select * from employee where id = #{id}")
    Employee getById(Long id);
1.2.2 修改员工信息功能

1). Controller层

在 EmployeeController 中创建 update 方法:

	/**
     * 编辑员工信息
     * @param employeeDTO
     * @return
     */
    @PutMapping
    @ApiOperation("编辑员工信息")
    public Result update(@RequestBody EmployeeDTO employeeDTO){
        log.info("编辑员工信息:{}", employeeDTO);
        employeeService.update(employeeDTO);
        return Result.success();
    }

2). Service层接口

在 EmployeeService 接口中声明 update 方法:

    /**
     * 编辑员工信息
     * @param employeeDTO
     */
    void update(EmployeeDTO employeeDTO);

3). Service层实现类

在 EmployeeServiceImpl 中实现 update 方法:

 	/**
     * 编辑员工信息
     *
     * @param employeeDTO
     */
    public void update(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();
        BeanUtils.copyProperties(employeeDTO, employee);

        employee.setUpdateTime(LocalDateTime.now());
        employee.setUpdateUser(BaseContext.getCurrentId());

        employeeMapper.update(employee);
    }

1.3 功能测试

进入到员工列表查询。

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

对员工姓名为杰克的员工数据修改,点击修改,数据已回显。

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

修改后,点击保存。

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

2. 分类模块功能开发

2.1 需求分析与设计

2.1.1 产品原型

后台系统中可以管理分类信息,分类包括两种类型,分别是 菜品分类套餐分类

菜品分类相关功能。

新增菜品分类:当我们在后台系统中添加菜品时需要选择一个菜品分类,在移动端也会按照菜品分类来展示对应的菜品。

菜品分类分页查询:系统中的分类很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。

根据id删除菜品分类:在分类管理列表页面,可以对某个分类进行删除操作。需要注意的是当分类关联了菜品或者套餐时,此分类不允许删除。

修改菜品分类:在分类管理列表页面点击修改按钮,弹出修改窗口,在修改窗口回显分类信息并进行修改,最后点击确定按钮完成修改操作。

启用禁用菜品分类:在分类管理列表页面,可以对某个分类进行启用或者禁用操作。

分类类型查询:当点击分类类型下拉框时,从数据库中查询所有的菜品分类数据进行展示。

分类管理原型:

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

业务规则:

  • 分类名称必须是唯一的
  • 分类按照类型可以分为菜品分类和套餐分类
  • 新添加的分类状态默认为“禁用”
2.1.2 接口设计

根据上述原型图分析,菜品分类模块共涉及6个接口。

  • 新增分类
  • 分类分页查询
  • 根据id删除分类
  • 修改分类
  • 启用禁用分类
  • 根据类型查询分类

接下来,详细地分析每个接口。

1). 新增分类

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

2). 分类分页查询

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

3). 根据id删除分类

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

4). 修改分类

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

5). 启用禁用分类

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

6). 根据类型查询分类

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

2.1.3 表设计

category表结构:

字段名 数据类型 说明 备注
id bigint 主键 自增
name varchar(32) 分类名称 唯一
type int 分类类型 1菜品分类 2套餐分类
sort int 排序字段 用于分类数据的排序
status int 状态 1启用 0禁用
create_time datetime 创建时间
update_time datetime 最后修改时间
create_user bigint 创建人id
update_user bigint 最后修改人id

2.2 代码实现

2.2.1 Mapper层

DishMapper.java

package com.sky.mapper;

@Mapper
public interface DishMapper {

    /**
     * 根据分类id查询菜品数量
     * @param categoryId
     * @return
     */
    @Select("select count(id) from dish where category_id = #{categoryId}")
    Integer countByCategoryId(Long categoryId);

}

SetmealMapper.java

package com.sky.mapper;

@Mapper
public interface SetmealMapper {

    /**
     * 根据分类id查询套餐的数量
     * @param id
     * @return
     */
    @Select("select count(id) from setmeal where category_id = #{categoryId}")
    Integer countByCategoryId(Long id);

}

CategoryMapper.java

package com.sky.mapper;

import java.util.List;

@Mapper
public interface CategoryMapper {

    /**
     * 插入数据
     * @param category
     */
    @Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user)" +
            " VALUES" +
            " (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")
    void insert(Category category);

    /**
     * 分页查询
     * @param categoryPageQueryDTO
     * @return
     */
    Page<Category> pageQuery(CategoryPageQueryDTO categoryPageQueryDTO);

    /**
     * 根据id删除分类
     * @param id
     */
    @Delete("delete from category where id = #{id}")
    void deleteById(Long id);

    /**
     * 根据id修改分类
     * @param category
     */
    void update(Category category);

    /**
     * 根据类型查询分类
     * @param type
     * @return
     */
    List<Category> findByType(Integer type);
}

CategoryMapper.xml,进入到resources/mapper目录下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.CategoryMapper">

    <select id="pageQuery" resultType="com.sky.entity.Category">
        select * from category
        <where>
            <if test="name != null and name != ''">
                and name like concat('%',#{name},'%')
            </if>
            <if test="type != null">
                and type = #{type}
            </if>
        </where>
        order by sort asc , create_time desc
    </select>

    <update id="update" parameterType="Category">
        update category
        <set>
            <if test="type != null">
                type = #{type},
            </if>
            <if test="name != null">
                name = #{name},
            </if>
            <if test="sort != null">
                sort = #{sort},
            </if>
            <if test="status != null">
                status = #{status},
            </if>
            <if test="updateTime != null">
                update_time = #{updateTime},
            </if>
            <if test="updateUser != null">
                update_user = #{updateUser}
            </if>
        </set>
        where id = #{id}
    </update>

    <select id="findByType" resultType="Category">
        select * from category
        where status = 1
        <if test="type != null">
            and type = #{type}
        </if>
        order by sort asc,create_time desc
    </select>
</mapper>

2.2.2 Service层

CategoryService.java

package com.sky.service;


public interface CategoryService {

    /**
     * 新增分类
     * @param categoryDTO
     */
    void save(CategoryDTO categoryDTO);

    /**
     * 分页查询
     * @param categoryPageQueryDTO
     * @return
     */
    PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO);

    /**
     * 根据id删除分类
     * @param id
     */
    void deleteById(Long id);

    /**
     * 修改分类
     * @param categoryDTO
     */
    void update(CategoryDTO categoryDTO);

    /**
     * 启用、禁用分类
     * @param status
     * @param id
     */
    void startOrStop(Integer status, Long id);

    /**
     * 根据类型查询分类
     * @param type
     * @return
     */
    List<Category> findByType(Integer type);
}

CategoryServiceImpl.java

@Service
public class CategoryServiceImpl implements CategoryService {
@Autowired
private CategoryMapper categoryMapper;
@Autowired
private SetmealMapper setmealMapper;
@Autowired
private DishMapper dishMapper;
//菜品添加
    @Override
    public void add(CategoryDTO categoryDTO) {
        Category category=new Category();
        BeanUtils.copyProperties(categoryDTO,category);
        category.setCreateTime(LocalDateTime.now());
        category.setUpdateTime(LocalDateTime.now());
        category.setUpdateUser(BaseContext.getCurrentId());
        category.setCreateUser(BaseContext.getCurrentId());
        category.setStatus(StatusConstant.DISABLE);
        categoryMapper.add(category);
    }
   //菜品分页查询
    @Override
    public PageResult page(CategoryPageQueryDTO categoryPageQueryDTO) {

        PageHelper.startPage(categoryPageQueryDTO.getPage(),categoryPageQueryDTO.getPageSize());
          Page<Category> page= categoryMapper.page(categoryPageQueryDTO);

          PageResult pageResult=new PageResult();
          pageResult.setTotal(page.getTotal());
          pageResult.setRecords( page.getResult());
        return pageResult;
    }
//启用禁用
    @Override
    public void startOrStop(Integer status, Long id) {
        Category category = Category.builder().id(id).status(status).build();

        categoryMapper.update(category);
    }
         //根据类型查询
    @Override
    public List<Category> findByType(Integer type) {

        List<Category> categoryList=categoryMapper.findByType(type);
        return categoryList;
    }
//菜品的删除
    @Override
    public void delete(Long id) {
if (dishMapper.countByCategoryid(id)>0){
throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH);
}if (setmealMapper.selectCount(id)>0){
    throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL);
        }
        categoryMapper.delete(id);
    }
  //菜品的修改
    @Override
    public void update( CategoryDTO categoryDTO) {
        Category category=new Category();
        BeanUtils.copyProperties(categoryDTO,category);
        category.setUpdateTime(LocalDateTime.now());
        category.setUpdateUser(BaseContext.getCurrentId());
        categoryMapper.update(category);
    }
}

2.2.3 Controller层

CategoryController.java

package com.sky.controller.admin;


/**
 * 分类管理
 */
@RestController
@RequestMapping("/admin/category")
@Api(tags = "分类相关接口")
@Slf4j
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    /**
     * 新增分类
     * @param categoryDTO
     * @return
     */
    @PostMapping
    @ApiOperation("新增分类")
    public Result<String> save(@RequestBody CategoryDTO categoryDTO){
        log.info("新增分类:{}", categoryDTO);
        categoryService.save(categoryDTO);
        return Result.success();
    }

    /**
     * 分类分页查询
     * @param categoryPageQueryDTO
     * @return
     */
    @GetMapping("/page")
    @ApiOperation("分类分页查询")
    public Result<PageResult> page(CategoryPageQueryDTO categoryPageQueryDTO){
        log.info("分页查询:{}", categoryPageQueryDTO);
        PageResult pageResult = categoryService.pageQuery(categoryPageQueryDTO);
        return Result.success(pageResult);
    }

    /**
     * 删除分类
     * @param id
     * @return
     */
    @DeleteMapping
    @ApiOperation("删除分类")
    public Result<String> deleteById(Long id){
        log.info("删除分类:{}", id);
        categoryService.deleteById(id);
        return Result.success();
    }

    /**
     * 修改分类
     * @param categoryDTO
     * @return
     */
    @PutMapping
    @ApiOperation("修改分类")
    public Result<String> update(@RequestBody CategoryDTO categoryDTO){
        categoryService.update(categoryDTO);
        return Result.success();
    }

    /**
     * 启用、禁用分类
     * @param status
     * @param id
     * @return
     */
    @PostMapping("/status/{status}")
    @ApiOperation("启用禁用分类")
    public Result<String> startOrStop(@PathVariable("status") Integer status, Long id){
        categoryService.startOrStop(status,id);
        return Result.success();
    }

    /**
     * 根据类型查询分类
     * @param type
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根据类型查询分类")
    public Result<List<Category>> list(Integer type){
        List<Category> list = categoryService.list(type);
        return Result.success(list);
    }
}

2.3 功能测试

重启服务,访问http://localhost:80,进入分类管理

分页查询:

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

分类类型:

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

启用禁用:

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

点击禁用

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

修改:

回显

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

修改后

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

新增:

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

点击确定,查询列表

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

删除:

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习

删除后,查询分类列表

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四),苍穹外卖项目,spring boot,redis,后端,mysql,java,spring,学习
删除成功

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹
文章来源地址https://www.toymoban.com/news/detail-755708.html

到了这里,关于基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十一)

    1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大。 结果 :系统响应慢、用户体验差 1.2 实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: 每个分类下的菜品保存一份缓存数据

    2024年01月24日
    浏览(39)
  • 基于SpringBoot+WebSocket+Spring Task的前后端分离外卖项目-订单管理(十七)

    1.1 介绍 Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 定位 :定时任务框架 作用 :定时自动执行某段Java代码 应用场景: 1). 信用卡每月还款提醒 2). 银行贷款每月还款提醒 3). 火车票售票系统处理未支付订单 4). 入职纪念日为用户发

    2024年02月21日
    浏览(37)
  • 基于springboot+Redis的前后端分离项目(八)-【黑马点评】

    🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwd=eh11 提取码:eh11 针对用户的操作:可以对用户进行关注和取消关注功能。 实现思路: 需求:基于该表数据结构,实现两个接口: 关注和取关接口 判断是否关注的接口 关注是User之间的关系,是博主与粉丝的

    2024年02月16日
    浏览(32)
  • 基于springboot+Redis的前后端分离项目(九)-【黑马点评】

    🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwd=eh11 提取码:eh11 GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有: GEOADD:添加一个地理空间信息,包含

    2024年02月16日
    浏览(32)
  • 基于springboot+Redis的前后端分离项目(七)-【黑马点评】

    🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwd=eh11 提取码:eh11 发布探店笔记 探店笔记类似点评网站的评价,往往是图文结合。对应的表有两个: tb_blog:探店笔记表,包含笔记中的标题、文字、图片等 tb_blog_comments:其他用户对探店笔记的评价 具体发布

    2024年02月13日
    浏览(37)
  • 基于springboot+Redis的前后端分离项目(二)-【黑马点评】

    🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwd=eh11 提取码:eh11 缓存( Cache),就是数据交换的 缓冲区 ,俗称的缓存就是 缓冲区内的数据 ,一般从数据库中获取,存储于本地代码。(例如: 由于其被 Static 修饰,所以随着类的加载而被加载到 内存之中 ,作为本地缓存

    2024年02月10日
    浏览(30)
  • 基于springboot+Redis的前后端分离项目(三)-【黑马点评】

    🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwd=eh11 提取码:eh11 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显 受单表数据量的限制 场景分析

    2024年02月10日
    浏览(30)
  • 基于springboot+Redis的前后端分离项目(一)-【黑马点评】

    🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwd=eh11 提取码:eh11 黑马点评项目是前后端分离项目,前端部署在nginx服务器上,后端部署在tomcat上,具体将实现以下功能。 短信登录 这一块我们会使用redis共享session来实现。 商户查询缓存 通过学习,我们会理

    2024年02月08日
    浏览(31)
  • 基于springboot+Redis的前后端分离项目之消息队列(六)-【黑马点评】

    🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwd=eh11 提取码:eh11 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单

    2024年02月12日
    浏览(27)
  • 基于springboot+Redis的前后端分离项目之分布式锁(四)-【黑马点评】

    🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwd=eh11 提取码:eh11 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包