修改商城的接口url的前缀

This commit is contained in:
Wang 2026-01-23 10:14:13 +08:00
parent cf2ea3a12f
commit 21a007305e
15 changed files with 160 additions and 40 deletions

View File

@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/app/user/category") @RequestMapping("/app/category")
@RestController @RestController
@Tag(name = "APP - 商品类型") @Tag(name = "APP - 商品类型")
@Validated @Validated

View File

@ -25,7 +25,7 @@ import java.util.List;
* @Data: 2025-06-16 20:50 * @Data: 2025-06-16 20:50
*/ */
@RestController @RestController
@RequestMapping("/app/user/collect") @RequestMapping("/app/collect")
@Tag(name = "APP - 商品收藏管理") @Tag(name = "APP - 商品收藏管理")
@Validated @Validated
@SaCheckLogin(type = StpUtil.TYPE) @SaCheckLogin(type = StpUtil.TYPE)

View File

@ -28,7 +28,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
@RequestMapping("/app/user/goods") @RequestMapping("/app/goods")
@RestController @RestController
@Tag(name = "APP - 商品") @Tag(name = "APP - 商品")
@Validated @Validated

View File

@ -33,7 +33,7 @@ import java.util.List;
@DecryptionAnnotation @DecryptionAnnotation
@EncryptionAnnotation @EncryptionAnnotation
@RestController @RestController
@RequestMapping("/app/user/address") @RequestMapping("/app/address")
@Tag(name = "APP - 收货地址管理") @Tag(name = "APP - 收货地址管理")
@Validated @Validated
@RequiredArgsConstructor @RequiredArgsConstructor

View File

@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping("/app/user/after-sale") @RequestMapping("/app/after-sale")
@Tag(name = "APP - 交易售后") @Tag(name = "APP - 交易售后")
@Validated @Validated
@RequiredArgsConstructor @RequiredArgsConstructor

View File

@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
@RequestMapping("/app/user/mall/cart") @RequestMapping("/app/mall/cart")
@RestController @RestController
@Tag(name = "APP - 购物车") @Tag(name = "APP - 购物车")
@Validated @Validated

View File

@ -32,7 +32,7 @@ import java.util.List;
@Tag(name = "APP - 物流") @Tag(name = "APP - 物流")
@Validated @Validated
@RestController @RestController
@RequestMapping("/app/user/logistics") @RequestMapping("/app/logistics")
@RequiredArgsConstructor @RequiredArgsConstructor
public class AppLogisticsController { public class AppLogisticsController {

View File

@ -45,7 +45,7 @@ import org.springframework.web.bind.annotation.RestController;
@Tag(name = "APP - 用户订单") @Tag(name = "APP - 用户订单")
@Validated @Validated
@RestController @RestController
@RequestMapping("/app/user/order") @RequestMapping("/app/order")
@RequiredArgsConstructor @RequiredArgsConstructor
@DecryptionAnnotation @DecryptionAnnotation
@EncryptionAnnotation @EncryptionAnnotation

View File

@ -2,6 +2,7 @@ package com.seer.teach.mp.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.seer.teach.mp.entity.MpActivityFormFieldEntity; import com.seer.teach.mp.entity.MpActivityFormFieldEntity;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
@ -15,4 +16,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface MpActivityFormFieldMapper extends BaseMapper<MpActivityFormFieldEntity> { public interface MpActivityFormFieldMapper extends BaseMapper<MpActivityFormFieldEntity> {
@Delete("DELETE FROM mp_activity_form_field WHERE form_id = #{formId}")
int deleteByFormId(Integer formId);
} }

View File

@ -1,5 +1,7 @@
package com.seer.teach.mp.admin.service.impl; package com.seer.teach.mp.admin.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.json.JSONUtil;
import com.seer.teach.common.constants.CommonConstant; import com.seer.teach.common.constants.CommonConstant;
import com.seer.teach.common.utils.CommonUtils; import com.seer.teach.common.utils.CommonUtils;
import com.seer.teach.mp.admin.controller.req.ActivityFormReq; import com.seer.teach.mp.admin.controller.req.ActivityFormReq;
@ -7,13 +9,19 @@ import com.seer.teach.mp.admin.controller.resp.AdminActivityFormResp;
import com.seer.teach.mp.admin.convert.AdminActivityFormConvert; import com.seer.teach.mp.admin.convert.AdminActivityFormConvert;
import com.seer.teach.mp.admin.service.IAdminActivityFormService; import com.seer.teach.mp.admin.service.IAdminActivityFormService;
import com.seer.teach.mp.entity.MpActivityFormEntity; import com.seer.teach.mp.entity.MpActivityFormEntity;
import com.seer.teach.mp.entity.MpActivityFormFieldEntity;
import com.seer.teach.mp.entity.MpActivityFormRelationEntity; import com.seer.teach.mp.entity.MpActivityFormRelationEntity;
import com.seer.teach.mp.service.IMpActivityFormFieldService;
import com.seer.teach.mp.service.IMpActivityFormRelationService; import com.seer.teach.mp.service.IMpActivityFormRelationService;
import com.seer.teach.mp.service.IMpActivityFormService; import com.seer.teach.mp.service.IMpActivityFormService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
/** /**
@ -33,12 +41,17 @@ public class AdminActivityFormServiceImpl implements IAdminActivityFormService {
private final IMpActivityFormRelationService activityFormRelationService; private final IMpActivityFormRelationService activityFormRelationService;
private final IMpActivityFormFieldService activityFormFieldService;
@Override @Override
public Boolean save(ActivityFormReq request) { public Boolean save(ActivityFormReq request) {
MpActivityFormEntity form = AdminActivityFormConvert.INSTANCE.convertToEntity(request); MpActivityFormEntity form = AdminActivityFormConvert.INSTANCE.convertToEntity(request);
boolean saveResult = activityFormService.save(form); boolean saveResult = activityFormService.save(form);
if (saveResult) { if (saveResult) {
// 保存表单字段
saveOrUpdateFormFields(form.getId(), request.getFields());
MpActivityFormRelationEntity relation = new MpActivityFormRelationEntity(); MpActivityFormRelationEntity relation = new MpActivityFormRelationEntity();
relation.setActivityId(request.getActivityId()); relation.setActivityId(request.getActivityId());
relation.setFormId(form.getId()); relation.setFormId(form.getId());
@ -71,12 +84,19 @@ public class AdminActivityFormServiceImpl implements IAdminActivityFormService {
} }
@Override @Override
@Transactional
public Boolean update(ActivityFormReq request) { public Boolean update(ActivityFormReq request) {
if (request.getId() == null) { if (request.getId() == null) {
return false; return false;
} }
MpActivityFormEntity form = AdminActivityFormConvert.INSTANCE.convertToEntity(request); MpActivityFormEntity form = AdminActivityFormConvert.INSTANCE.convertToEntity(request);
return activityFormService.updateById(form); boolean updateResult = activityFormService.updateById(form);
if (updateResult) {
// 更新表单字段
saveOrUpdateFormFields(form.getId(), request.getFields());
}
return updateResult;
} }
@Override @Override
@ -106,4 +126,96 @@ public class AdminActivityFormServiceImpl implements IAdminActivityFormService {
newRelation.setVersion(CommonUtils.generateVersionNumber(latestRelation.getVersion())); newRelation.setVersion(CommonUtils.generateVersionNumber(latestRelation.getVersion()));
return activityFormRelationService.save(newRelation); return activityFormRelationService.save(newRelation);
} }
/**
* 更新表单字段
*
* @param formId 表单ID
* @param fields 字段列表JSON字符串
*/
private void saveOrUpdateFormFields(Integer formId, List<String> fields) {
if (CollectionUtil.isEmpty(fields)) {
return;
}
// 如果字段列表为空删除所有现有字段
activityFormFieldService.deleteByFormId(formId);
// 保存新的字段
int sortOrder = 0;
List<MpActivityFormFieldEntity> fieldEntities = buildActivityFormFieldList(formId, fields, sortOrder);
if (CollectionUtil.isNotEmpty(fieldEntities)) {
boolean savedBatch = activityFormFieldService.saveBatch(fieldEntities);
log.info("保存字段到字段表的结果:{}", savedBatch);
}else{
log.info("没有字段需要保存到字段表");
}
}
private List<MpActivityFormFieldEntity> buildActivityFormFieldList(Integer formId, List<String> fields, int sortOrder) {
List<MpActivityFormFieldEntity> fieldEntities = new ArrayList<>();
for (String fieldJson : fields) {
try {
// 解析字段JSON
Map<String, Object> fieldMap = JSONUtil.toBean(fieldJson, Map.class);
Map<String, Object> config = (Map<String, Object>) fieldMap.get("__config__");
MpActivityFormFieldEntity fieldEntity = new MpActivityFormFieldEntity();
fieldEntity.setFormId(formId);
// 设置字段名称
fieldEntity.setFieldName((String) config.get("label"));
String fieldCode = (String) fieldMap.get("__vModel__");
if (fieldCode == null || fieldCode.trim().isEmpty()) {
fieldCode = generateFieldCode((String) config.get("label"), formId, sortOrder);
}
fieldEntity.setFieldCode(fieldCode);
// 设置字段类型
String fieldType = (String) fieldMap.get("tag");
if (fieldType == null) {
fieldType = (String) config.get("tag");
}
fieldEntity.setFieldType(fieldType);
// 设置占位符
fieldEntity.setPlaceholder((String) fieldMap.get("placeholder"));
// 设置是否必填
Boolean required = (Boolean) config.get("required");
fieldEntity.setIsRequired(required != null && required ? 1 : 0);
// 设置排序
fieldEntity.setSortOrder(sortOrder++);
// 设置字段描述
fieldEntity.setDescription((String) config.get("label"));
if(fieldMap.containsKey("options")){
fieldEntity.setFieldOptions(fieldMap.get("options").toString());
}
fieldEntities.add(fieldEntity);
} catch (Exception e) {
log.error("解析字段JSON失败: {}", fieldJson, e);
}
}
return fieldEntities;
}
/**
* 生成字段代码
*
* @param label 字段标签
* @param formId 表单ID
* @param index 索引
* @return 字段代码
*/
private String generateFieldCode(String label, Integer formId, int index) {
if (label == null) {
return "field_" + formId + "_" + index;
}
// 将标签转换为合适的字段代码格式
return label.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5]", "_").toLowerCase() + "_" + formId + "_" + index;
}
} }

View File

@ -11,13 +11,26 @@ public class AppActivityFormResp {
private Integer id; private Integer id;
@Schema(description = "表单模板名称") /**
private String templateName; * 表单名称
*/
@Schema(description = "表单名称")
private String formName;
/**
* 表单描述
*/
@Schema(description = "表单描述")
private String formDescription;
/**
* 配置
*/
@Schema(description = "配置")
private String config;
@Schema(description = "表单模板描述")
private String templateDescription;
@Schema(description = "表单字段列表") @Schema(description = "表单字段列表")
private List<AppActivityFormFieldResp> fields; private List<String> fields;
} }

View File

@ -3,18 +3,16 @@ package com.seer.teach.mp.app.convert;
import com.seer.teach.mp.app.controller.resp.AppActivityFormExecutionResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormExecutionResp;
import com.seer.teach.mp.app.controller.resp.AppActivityFormFieldResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormFieldResp;
import com.seer.teach.mp.app.controller.resp.AppActivityFormResp; import com.seer.teach.mp.app.controller.resp.AppActivityFormResp;
import com.seer.teach.mp.entity.MpActivityFormEntity;
import com.seer.teach.mp.entity.MpActivityFormExecutionEntity; import com.seer.teach.mp.entity.MpActivityFormExecutionEntity;
import com.seer.teach.mp.entity.MpActivityFormFieldEntity; import com.seer.teach.mp.entity.MpActivityFormFieldEntity;
import com.seer.teach.mp.entity.MpActivityFormEntity;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
@Mapper @Mapper
public interface AppActivityFormConvert { public interface AppActivityFormConvert {
AppActivityFormConvert INSTANCE = Mappers.getMapper(AppActivityFormConvert.class); AppActivityFormConvert INSTANCE = Mappers.getMapper(AppActivityFormConvert.class);
@Mapping(source = "fields", target = "fields", ignore = true)
AppActivityFormResp convertToAppTemplateResp(MpActivityFormEntity entity); AppActivityFormResp convertToAppTemplateResp(MpActivityFormEntity entity);
AppActivityFormFieldResp convertToAppFieldResp(MpActivityFormFieldEntity entity); AppActivityFormFieldResp convertToAppFieldResp(MpActivityFormFieldEntity entity);

View File

@ -62,18 +62,6 @@ public class AppActivityFormServiceImpl implements IAppActivityFormService {
MpActivityFormEntity template = activityFormTemplateService.getById(formId); MpActivityFormEntity template = activityFormTemplateService.getById(formId);
if (template != null) { if (template != null) {
AppActivityFormResp resp = AppActivityFormConvert.INSTANCE.convertToAppTemplateResp(template); AppActivityFormResp resp = AppActivityFormConvert.INSTANCE.convertToAppTemplateResp(template);
// 获取该表单的所有字段
List<MpActivityFormFieldEntity> fields = activityFormFieldService.list(
new LambdaQueryWrapper<MpActivityFormFieldEntity>()
.eq(MpActivityFormFieldEntity::getFormId, formId)
);
List<AppActivityFormFieldResp> fieldResps = fields.stream()
.map(AppActivityFormConvert.INSTANCE::convertToAppFieldResp)
.collect(Collectors.toList());
resp.setFields(fieldResps);
return resp; return resp;
} }
} }
@ -84,17 +72,6 @@ public class AppActivityFormServiceImpl implements IAppActivityFormService {
MpActivityFormEntity template = activityFormTemplateService.getById(formId); MpActivityFormEntity template = activityFormTemplateService.getById(formId);
if (template != null) { if (template != null) {
AppActivityFormResp resp = AppActivityFormConvert.INSTANCE.convertToAppTemplateResp(template); AppActivityFormResp resp = AppActivityFormConvert.INSTANCE.convertToAppTemplateResp(template);
// 获取该表单的所有字段
List<MpActivityFormFieldEntity> fields = activityFormFieldService.list(
new LambdaQueryWrapper<MpActivityFormFieldEntity>()
.eq(MpActivityFormFieldEntity::getFormId, formId)
);
List<AppActivityFormFieldResp> fieldResps = fields.stream()
.map(AppActivityFormConvert.INSTANCE::convertToAppFieldResp)
.collect(Collectors.toList());
resp.setFields(fieldResps);
return resp; return resp;
} }
} }

View File

@ -13,4 +13,12 @@ import com.seer.teach.mp.entity.MpActivityFormFieldEntity;
*/ */
public interface IMpActivityFormFieldService extends IService<MpActivityFormFieldEntity> { public interface IMpActivityFormFieldService extends IService<MpActivityFormFieldEntity> {
/**
* 根据表单ID删除表单字段定义
*
* @param formId
* @return 删除结果
*/
boolean deleteByFormId(Integer formId);
} }

View File

@ -8,6 +8,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Objects;
/** /**
* <p> * <p>
* 活动表单字段定义表 服务实现类 * 活动表单字段定义表 服务实现类
@ -21,4 +23,11 @@ import org.springframework.stereotype.Service;
@RequiredArgsConstructor @RequiredArgsConstructor
public class MpActivityFormFieldServiceImpl extends ServiceImpl<MpActivityFormFieldMapper, MpActivityFormFieldEntity> implements IMpActivityFormFieldService { public class MpActivityFormFieldServiceImpl extends ServiceImpl<MpActivityFormFieldMapper, MpActivityFormFieldEntity> implements IMpActivityFormFieldService {
@Override
public boolean deleteByFormId(Integer formId) {
if (Objects.isNull(formId) || formId == 0) {
return false;
}
return super.getBaseMapper().deleteByFormId(formId) > 0;
}
} }