java服务端——controller控制器

控制器接口

控制器(controller)在系统或者插件下 controller 文件夹下,使用 springboot 开发,遵循 restfulapi 接口规范,开发之前请掌握相关知识

打开系统你会发现 controller 下又 adminapi,api,core 子项文件夹,这里是系统将不同的端口放在一起统一管理,包括后期插件开发也是分成不同端口。

接口使用 restfulapi 开发,命名为:主题+Controller,接口命名规范:adminapi(api)/插件或者模块名称/功能子项模块或者功能名称/功能名称/参数

例如:adminapi/member/member_accout/{id} 代表 adminapi 端口,会员模块,会员账户,对应 id的账户详情

adminapi/shop/goods/goods_category代表 adminapi 端口,商城插件,商品模块,商品分类

控制器基本结构

基础控制器实现

复制代码
@RestController
@RequestMapping("adminapi/shop/goods")
@Description("商品管理")
public class ShopGoodsController {

    @Resource
    IShopGoodsService goodsService;

    // 控制器方法...
}

核心注解说明

类级别注解:

复制代码
@RestController  // 标识为REST控制器,自动返回JSON
@RequestMapping("adminapi/shop/goods")  // 定义请求路径前缀
@Description("商品管理")  // JFR描述
@SaCheckLogin  // 权限控制,需要登录

方法级别注解:

复制代码
@GetMapping("")  // 处理GET请求
@PostMapping("")  // 处理POST请求  
@PutMapping("/{id}")  // 处理PUT请求
@DeleteMapping("/{id}")  // 处理DELETE请求
@Description("获取商品分页列表")

请求参数处理

路径参数

复制代码
@GetMapping("/{id}")
@Description("获取商品详情")
public Result<ShopGoodsInfoVo> info(@PathVariable("id") Integer id) {
    ShopGoodsInfoVo info = goodsService.info(id);
    return Result.success(info);
}

查询参数

复制代码
@GetMapping("")
@Description("获取商品分页列表")
public Result<PageResult<ShopGoodsListVo>> list(
        @Validated PageParam pageParam,  // 分页参数
        @Validated ShopGoodsSearchParam searchParam) {  // 搜索条件
    return Result.success(goodsService.page(pageParam, searchParam));
}

请求体参数

复制代码
@PostMapping("")
@Description("添加商品")
public Result<Object> add(@Validated @RequestBody ShopGoodsParam addParam) {
    goodsService.add(addParam);
    return Result.success();
}

复杂参数处理

复制代码
@GetMapping("/select")
@Description("获取商品选择分页列表")
public Result<ShopSelectGoodsListVo> getSelectPage(
        @Validated PageParam pageParam,
        @Validated ShopGoodsSelectSearchParam searchParam,
        @RequestParam(name = "goods_ids[]", required = false) List<Integer> goodsIds,
        @RequestParam(name = "sku_ids[]", required = false) List<Integer> skuIds) {
    searchParam.setGoodsIds(goodsIds);
    searchParam.setSkuIds(skuIds);
    return Result.success(goodsService.getSelectPage(pageParam, searchParam));
}

权限控制

类级别权限控制

复制代码
@RestController
@RequestMapping("adminapi/shop/goods")
@SaCheckLogin  // 整个控制器需要登录
public class ShopGoodsController {
    // ...
}

方法级别权限控制

复制代码
@PutMapping("/{id}/status")
@Description("修改商品状态")
@SaCheckPermission("shop:goods:status")  // 需要特定权限
public Result<Object> editStatus(@PathVariable("id") Integer id, @RequestBody StatusParam statusParam) {
    goodsService.editStatus(id, statusParam);
    return Result.success();
}

完整控制器示例

ShopGoodsController 完整实现

复制代码
package com.niu.shop.controller.adminapi.goods;

import com.niu.core.common.domain.Result;
import com.niu.core.common.param.PageParam;
import com.niu.core.common.vo.PageResult;
import com.niu.shop.service.admin.goods.IShopGoodsService;
import com.niu.shop.service.admin.goods.param.*;
import com.niu.shop.service.admin.goods.vo.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import jakarta.annotation.Resource;

@RestController
@RequestMapping("adminapi/shop/goods")
@Description("商品管理")
public class ShopGoodsController {

    @Resource
    IShopGoodsService goodsService;

    /**
     * 商品列表
     */
    @GetMapping("")
    @Description("获取商品分页列表")
    public Result<PageResult<ShopGoodsListVo>> list(
            @Validated PageParam pageParam,
            @Validated ShopGoodsSearchParam searchParam) {
        return Result.success(goodsService.page(pageParam, searchParam));
    }

    /**
     * 商品详情
     */
    @GetMapping("/{id}")
    @Description("获取商品详情")
    public Result<ShopGoodsInfoVo> info(@PathVariable("id") Integer id) {
        ShopGoodsInfoVo info = goodsService.info(id);
        return Result.success(info);
    }

    /**
     * 添加商品
     */
    @PostMapping("")
    @Description("添加商品")
    public Result<Object> add(@Validated @RequestBody ShopGoodsParam addParam) {
        goodsService.add(addParam);
        return Result.success();
    }

    /**
     * 编辑商品
     */
    @PutMapping("/{id}")
    @Description("编辑商品")
    public Result<Object> edit(@PathVariable("id") Integer id, @Validated @RequestBody ShopGoodsParam editParam) {
        goodsService.edit(id, editParam);
        return Result.success();
    }

    /**
     * 删除商品
     */
    @DeleteMapping("/{id}")
    @Description("删除商品")
    public Result<Object> del(@PathVariable("id") Integer id) {
        goodsService.del(id);
        return Result.success();
    }

    /**
     * 商品上下架
     */
    @PutMapping("/{id}/status")
    @Description("商品上下架")
    public Result<Object> editStatus(@PathVariable("id") Integer id, @RequestBody StatusParam statusParam) {
        goodsService.editStatus(id, statusParam);
        return Result.success();
    }

    /**
     * 商品回收站列表
     */
    @GetMapping("/recyclePage")
    @Description("商品回收站列表")
    public Result<PageResult<ShopGoodsListVo>> recyclePage(
            @Validated PageParam pageParam,
            @Validated ShopGoodsSearchParam searchParam) {
        return Result.success(goodsService.recyclePage(pageParam, searchParam));
    }

    /**
     * 商品恢复
     */
    @PutMapping("/{id}/recycle")
    @Description("商品恢复")
    public Result<Object> recycle(@PathVariable("id") Integer id) {
        goodsService.recycle(id);
        return Result.success();
    }

    /**
     * 商品彻底删除
     */
    @DeleteMapping("/{id}/destroy")
    @Description("商品彻底删除")
    public Result<Object> destroy(@PathVariable("id") Integer id) {
        goodsService.destroy(id);
        return Result.success();
    }

    /**
     * 批量彻底删除
     */
    @DeleteMapping("/destroyBatch")
    @Description("批量彻底删除")
    public Result<Object> destroyBatch(@RequestBody GetGoodsIdsParam getGoodsIdsParam) {
        goodsService.destroyBatch(getGoodsIdsParam);
        return Result.success();
    }
}
相关推荐
To Be Clean Coder2 小时前
【Spring源码】通过 Bean 工厂获取 Bean 的过程
java·后端·spring
Fortunate Chen2 小时前
类与对象(下)
java·javascript·jvm
程序员水自流2 小时前
【AI大模型第9集】Function Calling,让AI大模型连接外部世界
java·人工智能·llm
‿hhh2 小时前
综合交通运行协调与应急指挥平台项目说明
java·ajax·npm·json·需求分析·个人开发·规格说明书
小徐Chao努力2 小时前
【Langchain4j-Java AI开发】06-工具与函数调用
java·人工智能·python
无心水2 小时前
【神经风格迁移:全链路压测】33、全链路监控与性能优化最佳实践:Java+Python+AI系统稳定性保障的终极武器
java·python·性能优化
萧曵 丶2 小时前
Synchronized 详解及 JDK 版本优化
java·多线程·synchronized
夏幻灵2 小时前
JAVA基础:基本数据类型和引用数据类型
java·开发语言
weixin199701080162 小时前
闲鱼 item_get - 商品详情接口对接全攻略:从入门到精通
java·后端·spring