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();
    }
}
相关推荐
冷雨夜中漫步4 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
JH30735 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
m0_736919106 小时前
C++代码风格检查工具
开发语言·c++·算法
Coder_Boy_6 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934736 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
invicinble6 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟6 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖6 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_763472467 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
TechWJ8 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto