pageOption) {
+ this.pageOption.set(pageOption);
+ }
+
+ protected abstract void init(HttpServletRequest request, JSONObject requestParams);
+
+ /**
+ * 新增
+ *
+ * // * @param t 实体对象
+ */
+ @Operation(summary = "新增", description = "新增信息,对应后端的实体类")
+ @PostMapping("/add")
+ protected R add(@RequestAttribute() JSONObject requestParams) {
+ String body = requestParams.getStr("body");
+ if (JSONUtil.isTypeJSONArray(body)) {
+ JSONArray array = JSONUtil.parseArray(body);
+ return R.ok(Dict.create()
+ .set("id", service.addBatch(requestParams, array.toList(currentEntityClass()))));
+ } else {
+ return R.ok(Dict.create().set("id",
+ service.add(requestParams, requestParams.toBean(currentEntityClass()))));
+ }
+ }
+
+ /**
+ * 删除
+ *
+ * @param params 请求参数 ids 数组 或者按","隔开
+ */
+ @Operation(summary = "删除", description = "支持批量删除 请求参数 ids 数组 或者按\",\"隔开")
+ @PostMapping("/delete")
+ protected R delete(HttpServletRequest request, @RequestBody Map params,
+ @RequestAttribute() JSONObject requestParams) {
+ service.delete(requestParams, Convert.toLongArray(getIds(params)));
+ return R.ok();
+ }
+
+ /**
+ * 修改
+ *
+ * @param t 修改对象
+ */
+ @Operation(summary = "修改", description = "根据ID修改")
+ @PostMapping("/update")
+ protected R update(@RequestBody T t, @RequestAttribute() JSONObject requestParams) {
+ Long id = t.getId();
+ JSONObject info = JSONUtil.parseObj(JSONUtil.toJsonStr(service.getById(id)));
+ requestParams.forEach(info::set);
+ info.set("updateTime", new Date());
+ service.update(requestParams, JSONUtil.toBean(info, currentEntityClass()));
+ return R.ok();
+ }
+
+ /**
+ * 信息
+ *
+ * @param id ID
+ */
+ @Operation(summary = "信息", description = "根据ID查询单个信息")
+ @GetMapping("/info")
+ protected R info(@RequestAttribute() JSONObject requestParams,
+ @RequestParam() Long id,
+ @RequestAttribute(COOL_INFO_OP) CrudOption option) {
+ invokerTransformParam(option, requestParams);
+ T info = (T) service.info(requestParams, id);
+ invokerTransformValue(option, info);
+ return R.ok(info);
+ }
+
+ /**
+ * 列表查询
+ *
+ * @param requestParams 请求参数
+ */
+ @Operation(summary = "查询", description = "查询多个信息")
+ @PostMapping("/list")
+ protected R> list(@RequestAttribute() JSONObject requestParams,
+ @RequestAttribute(COOL_LIST_OP) CrudOption option) {
+ invokerTransformParam(option, requestParams);
+ QueryModeEnum queryModeEnum = option.getQueryModeEnum();
+ List list = (List) switch (queryModeEnum) {
+ case ENTITY_WITH_RELATIONS -> service.listWithRelations(requestParams, option.getQueryWrapper(currentEntityClass()));
+ case CUSTOM -> transformList(service.list(requestParams, option.getQueryWrapper(currentEntityClass()), option.getAsType()), option.getAsType());
+ default -> service.list(requestParams, option.getQueryWrapper(currentEntityClass()));
+ };
+ invokerTransformValue(option, list);
+ return R.ok(list);
+ }
+
+ /**
+ * 分页查询
+ *
+ * @param requestParams 请求参数
+ */
+ @Operation(summary = "分页", description = "分页查询多个信息")
+ @PostMapping("/page")
+ protected R> page(@RequestAttribute() JSONObject requestParams,
+ @RequestAttribute(COOL_PAGE_OP) CrudOption option) {
+ invokerTransformParam(option, requestParams);
+ Integer page = requestParams.getInt("page", 1);
+ Integer size = requestParams.getInt("size", 20);
+ QueryModeEnum queryModeEnum = option.getQueryModeEnum();
+ Object obj = switch (queryModeEnum) {
+ case ENTITY_WITH_RELATIONS -> service.pageWithRelations(requestParams, new Page<>(page, size), option.getQueryWrapper(currentEntityClass()));
+ case CUSTOM -> transformPage(service.page(requestParams, new Page<>(page, size), option.getQueryWrapper(currentEntityClass()), option.getAsType()), option.getAsType());
+ default -> service.page(requestParams, new Page<>(page, size), option.getQueryWrapper(currentEntityClass()));
+ };
+ Page pageResult = (Page) obj;
+ invokerTransformValue(option, pageResult.getRecords());
+ return R.ok(pageResult(pageResult));
+ }
+
+ /**
+ * 转换值,组装数据
+ */
+ private void invokerTransformValue(CrudOption option, Object obj) {
+ if (ObjUtil.isNotNull(option.getTransformValue())) {
+ if (obj instanceof List) {
+ ((List)obj).forEach(o -> {
+ option.getTransformValue().apply(o);
+ });
+ } else {
+ option.getTransformValue().apply(obj);
+ }
+ }
+ }
+
+ /**
+ * 转换入参
+ */
+ private void invokerTransformParam(CrudOption option, JSONObject obj) {
+ if (ObjUtil.isNotNull(option.getTransformParam())) {
+ option.getTransformParam().apply(obj);
+ }
+ }
+
+ /**
+ * 分页结果
+ *
+ * @param page 分页返回数据
+ */
+ protected PageResult pageResult(Page page) {
+ return PageResult.of(page);
+ }
+
+ public Class currentEntityClass() {
+ if (entityClass != null) {
+ return this.entityClass;
+ }
+ // 使用 获取泛型参数类型
+ Type type = TypeUtil.getTypeArgument(this.getClass(), 1); // 获取第二个泛型参数
+ if (type instanceof Class>) {
+ entityClass = (Class) type;
+ return entityClass;
+ }
+ throw new IllegalStateException("Unable to determine entity class type");
+ }
+
+ protected List getIds(Map params) {
+ Object ids = params.get("ids");
+ CoolPreconditions.checkEmpty(ids, "ids 参数错误");
+ if (!(ids instanceof ArrayList)) {
+ ids = ids.toString().split(",");
+ }
+ return Convert.toList(Long.class, ids);
+ }
+
+ /**
+ * 适用于自定义返回值为 map,map 的key为数据库字段,转驼峰命名
+ */
+ protected List transformList(List records, Class> asType) {
+ if (ObjUtil.isEmpty(asType) || !Map.class.isAssignableFrom(asType)) {
+ return records;
+ }
+ List