diff --git a/src/main/java/com/cdzy/activity/controller/UserController.java b/src/main/java/com/cdzy/activity/controller/UserController.java index 9bec8a1..abae6c8 100644 --- a/src/main/java/com/cdzy/activity/controller/UserController.java +++ b/src/main/java/com/cdzy/activity/controller/UserController.java @@ -1,14 +1,12 @@ package com.cdzy.activity.controller; import com.alibaba.fastjson2.JSONObject; -import com.cdzy.activity.model.Activity; -import com.cdzy.activity.model.JsonResult; -import com.cdzy.activity.model.PageParam; -import com.cdzy.activity.model.User; +import com.cdzy.activity.model.*; import com.cdzy.activity.model.dto.ActivityInfo; import com.cdzy.activity.model.vo.RegistrationVo; import com.cdzy.activity.model.vo.UserVo; import com.cdzy.activity.service.ActivityService; +import com.cdzy.activity.service.BulletinService; import com.cdzy.activity.service.UserService; import com.cdzy.activity.uitls.VerifyUtil; import com.mybatisflex.core.paginate.Page; @@ -22,9 +20,10 @@ import org.springframework.web.bind.annotation.*; import java.util.Objects; import static com.cdzy.activity.model.table.ActivityTableDef.ACTIVITY; +import static com.cdzy.activity.model.table.BulletinTableDef.BULLETIN; /** - * 微信用户控制层。 + * 微信用户控制层。 * * @author attiya * @since 2025-09-17 @@ -42,14 +41,17 @@ public class UserController { @Resource private ActivityService activityService; + @Resource + private BulletinService bulletinService; + /** - * 用户微信无感登录。 + * 用户微信无感登录。 * * @param code 微信登录返回的code * @return 登陆结果 */ @RequestMapping("login") - public JsonResult silentLogin(@RequestParam(name ="js_code") String code) { + public JsonResult silentLogin(@RequestParam(name = "js_code") String code) { JSONObject result = verifyUtil.wechatAuthority(code); if (result == null) { return JsonResult.failed("微信登录失败"); @@ -59,7 +61,7 @@ public class UserController { } String openid = result.getString("openid"); QueryWrapper queryWrapper = QueryWrapper.create() - .eq(User::getWxOpenId, openid); + .eq(User::getWxOpenId, openid); User user = userService.getOne(queryWrapper); if (user == null) { user = new User(); @@ -70,7 +72,7 @@ public class UserController { } /** - * 用户详情填写。 + * 用户详情填写。 * * @param user 用户信息 * @return 登陆结果 @@ -82,13 +84,13 @@ public class UserController { } /** - * 用户详情。 + * 用户详情。 * * @param openId 微信登陆openId * @return 登陆结果 */ @GetMapping("info") - public JsonResult info(@RequestParam("openId")String openId) { + public JsonResult info(@RequestParam("openId") String openId) { QueryWrapper queryWrapper = QueryWrapper.create() .eq(User::getWxOpenId, openId); User user = userService.getOne(queryWrapper); @@ -96,7 +98,7 @@ public class UserController { } /** - * 用户查询活动分页数据。 + * 用户查询活动分页数据。 * * @param activityName 活动名称 * @param activityType 活动类型 @@ -112,7 +114,7 @@ public class UserController { } /** - * 用户查询活动详细信息。 + * 用户查询活动详细信息。 * * @param activityId 活动ID * @return 登陆结果 @@ -124,7 +126,7 @@ public class UserController { } /** - * 用户报名活动。 + * 用户报名活动。 * * @param registrationVo 活动报名信息 * @return 登陆结果 @@ -136,14 +138,87 @@ public class UserController { } /** - * 分页查询用户已报名活动。 + * 用户取消报名活动。 + * + * @param registrationVo 活动报名信息 + * @return 登陆结果 + */ + @PostMapping("activity/cancel") + public JsonResult cancel(@RequestBody RegistrationVo registrationVo) { + userService.cancel(registrationVo); + return JsonResult.success(); + } + + /** + * 分页查询用户已报名活动。 * * @param pageParam 分页参数 * @return 登陆结果 */ @GetMapping("activity/registered") - public JsonResult registered(PageParam pageParam, String activityName, Integer activityType,@NotNull(message = "OpenId不能为空") String wxOpenId) { - Page page = activityService.registered(pageParam,activityName,activityType,wxOpenId); + public JsonResult registered(PageParam pageParam, String activityName, Integer activityType, @NotNull(message = "OpenId不能为空") String wxOpenId) { + Page page = activityService.registered(pageParam, activityName, activityType, wxOpenId); return JsonResult.success(page); } + + /** + * 校验用户是否收藏活动 + * @param registrationVo 活动信息 + * @return 结构 + */ + @PostMapping("activity/collected") + public JsonResult collected(@RequestBody RegistrationVo registrationVo) { + boolean collected = activityService.collected(registrationVo); + return JsonResult.success(collected); + } + + /** + * 用户收藏活动 + * @param registrationVo 活动信息 + * @return 结构 + */ + @PostMapping("activity/collect") + public JsonResult collect(@RequestBody RegistrationVo registrationVo) { + activityService.collect(registrationVo); + return JsonResult.success(); + } + + /** + * 用户取消收藏活动 + * @param registrationVo 活动信息 + * @return 结构 + */ + @PostMapping("activity/collectRemove") + public JsonResult collectRemove(@RequestBody RegistrationVo registrationVo) { + activityService.collectRemove(registrationVo); + return JsonResult.success(); + } + + /** + * 分析查询用户收藏活动 + * @param pageParam 分页信息 + * @return 结构 + */ + @GetMapping("activity/collectPage") + public JsonResult collectPage(PageParam pageParam,String wxOpenId) { + Page page = activityService.collectPage(pageParam,wxOpenId); + return JsonResult.success(page); + } + + + /** + * 公告分页查询 + * @param pageParam 分页参数 + * @param bulletinTitle 公告标题 + * @return 分页结果 + */ + @GetMapping("bulletin/page") + public JsonResult page(PageParam pageParam, String bulletinTitle) { + QueryWrapper queryWrapper = QueryWrapper.create() + .where(BULLETIN.BULLETIN_TITLE.like(bulletinTitle, StringUtil.hasText(bulletinTitle))); + Page page = bulletinService.page(pageParam.getPage(), queryWrapper); + return JsonResult.success(page); + } + + } diff --git a/src/main/java/com/cdzy/activity/mapper/UserCollectActivityMapper.java b/src/main/java/com/cdzy/activity/mapper/UserCollectActivityMapper.java new file mode 100644 index 0000000..d8da9e2 --- /dev/null +++ b/src/main/java/com/cdzy/activity/mapper/UserCollectActivityMapper.java @@ -0,0 +1,14 @@ +package com.cdzy.activity.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.cdzy.activity.model.UserCollectActivity; + +/** + * 映射层。 + * + * @author attiya + * @since 2025-09-23 + */ +public interface UserCollectActivityMapper extends BaseMapper { + +} diff --git a/src/main/java/com/cdzy/activity/model/UserCollectActivity.java b/src/main/java/com/cdzy/activity/model/UserCollectActivity.java new file mode 100644 index 0000000..5c2ecb3 --- /dev/null +++ b/src/main/java/com/cdzy/activity/model/UserCollectActivity.java @@ -0,0 +1,39 @@ +package com.cdzy.activity.model; + +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; +import java.io.Serializable; + +import java.io.Serial; + +import com.mybatisflex.core.keygen.KeyGenerators; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 实体类。 + * + * @author attiya + * @since 2025-09-23 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("user_collect_activity") +public class UserCollectActivity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Id(keyType = KeyType.Generator, value = KeyGenerators.snowFlakeId) + private Long collectId; + + private Long activityId; + + private Long userId; + +} diff --git a/src/main/java/com/cdzy/activity/service/ActivityService.java b/src/main/java/com/cdzy/activity/service/ActivityService.java index c248c93..1fc4051 100644 --- a/src/main/java/com/cdzy/activity/service/ActivityService.java +++ b/src/main/java/com/cdzy/activity/service/ActivityService.java @@ -2,6 +2,7 @@ package com.cdzy.activity.service; import com.cdzy.activity.model.PageParam; import com.cdzy.activity.model.vo.ActivityVo; +import com.cdzy.activity.model.vo.RegistrationVo; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; import com.cdzy.activity.model.Activity; @@ -23,4 +24,12 @@ public interface ActivityService extends IService { void checkStatus(); Page registered(PageParam pageParam, String activityName, Integer activityType,String wxOpenId); + + void collectRemove(RegistrationVo registrationVo); + + void collect(RegistrationVo registrationVo); + + Page collectPage(PageParam pageParam,String wxOpenId); + + boolean collected(RegistrationVo registrationVo); } diff --git a/src/main/java/com/cdzy/activity/service/UserService.java b/src/main/java/com/cdzy/activity/service/UserService.java index 5f25880..152211a 100644 --- a/src/main/java/com/cdzy/activity/service/UserService.java +++ b/src/main/java/com/cdzy/activity/service/UserService.java @@ -19,4 +19,6 @@ public interface UserService extends IService { void registration(RegistrationVo registrationVo); ActivityInfo activityInfo(Long activityId); + + void cancel(RegistrationVo registrationVo); } diff --git a/src/main/java/com/cdzy/activity/service/impl/ActivityServiceImpl.java b/src/main/java/com/cdzy/activity/service/impl/ActivityServiceImpl.java index a84dd18..8847a1a 100644 --- a/src/main/java/com/cdzy/activity/service/impl/ActivityServiceImpl.java +++ b/src/main/java/com/cdzy/activity/service/impl/ActivityServiceImpl.java @@ -6,10 +6,11 @@ import com.cdzy.activity.component.ImageConfig; import com.cdzy.activity.enums.ActivityStatus; import com.cdzy.activity.mapper.ActivityMapper; import com.cdzy.activity.mapper.ActivityUserMapper; -import com.cdzy.activity.model.Activity; -import com.cdzy.activity.model.ActivityUser; -import com.cdzy.activity.model.PageParam; +import com.cdzy.activity.mapper.UserCollectActivityMapper; +import com.cdzy.activity.mapper.UserMapper; +import com.cdzy.activity.model.*; import com.cdzy.activity.model.vo.ActivityVo; +import com.cdzy.activity.model.vo.RegistrationVo; import com.cdzy.activity.service.ActivityService; import com.cdzy.activity.uitls.FileUtils; import com.mybatisflex.core.paginate.Page; @@ -28,7 +29,8 @@ import java.util.List; import java.util.Objects; import static com.cdzy.activity.model.table.ActivityTableDef.ACTIVITY; -import static com.cdzy.activity.model.table.ActivityUserTableDef.ACTIVITY_USER; +import static com.cdzy.activity.model.table.UserCollectActivityTableDef.USER_COLLECT_ACTIVITY; +import static com.cdzy.activity.model.table.UserRegistrationActivityTableDef.USER_REGISTRATION_ACTIVITY; import static com.cdzy.activity.model.table.UserTableDef.USER; /** @@ -46,6 +48,13 @@ public class ActivityServiceImpl extends ServiceImpl i @Resource private ActivityUserMapper activityUserMapper; + @Resource + private UserCollectActivityMapper collectActivityMapper; + + + @Resource + private UserMapper userMapper; + @Resource private ImageConfig imageConfig; @@ -172,13 +181,72 @@ public class ActivityServiceImpl extends ServiceImpl i } @Override - public Page registered(PageParam pageParam, String activityName, Integer activityType,String wxOpenId) { + public Page registered(PageParam pageParam, String activityName, Integer activityType, String wxOpenId) { QueryWrapper queryWrapper = QueryWrapper.create() .where(ACTIVITY.ACTIVITY_NAME.like(activityName, StringUtil.hasText(activityName))) .where(ACTIVITY.ACTIVITY_TYPE.eq(activityType, Objects.nonNull(activityType))) .where(USER.WX_OPEN_ID.eq(wxOpenId)) - .leftJoin(ACTIVITY_USER).on(ACTIVITY_USER.ACTIVITY_ID.eq(ACTIVITY.ACTIVITY_ID)) - .leftJoin(USER).on(USER.USER_ID.eq(ACTIVITY_USER.USER_ID)); + .leftJoin(USER_REGISTRATION_ACTIVITY).on(USER_REGISTRATION_ACTIVITY.ACTIVITY_ID.eq(ACTIVITY.ACTIVITY_ID)) + .leftJoin(USER).on(USER.USER_ID.eq(USER_REGISTRATION_ACTIVITY.USER_ID)); return activityMapper.paginate(pageParam.getPage(), queryWrapper); } + + @Override + public void collectRemove(RegistrationVo registrationVo) { + QueryWrapper queryWrapper = QueryWrapper.create() + .where(USER_COLLECT_ACTIVITY.ACTIVITY_ID.eq(registrationVo.getActivityId())) + .where(USER.WX_OPEN_ID.eq(registrationVo.getWxOpenId())) + .leftJoin(USER).on(USER.USER_ID.eq(USER_COLLECT_ACTIVITY.USER_ID)); + collectActivityMapper.deleteByQuery(queryWrapper); + } + + @Override + public void collect(RegistrationVo registrationVo) { + QueryWrapper queryWrapper = QueryWrapper.create() + .where(USER_COLLECT_ACTIVITY.ACTIVITY_ID.eq(registrationVo.getActivityId())) + .where(USER.WX_OPEN_ID.eq(registrationVo.getWxOpenId())) + .leftJoin(USER).on(USER.USER_ID.eq(USER_COLLECT_ACTIVITY.USER_ID)); + UserCollectActivity collectActivity = collectActivityMapper.selectOneByQuery(queryWrapper); + if (collectActivity != null) { + throw new RuntimeException("请勿重复收藏"); + } + + queryWrapper.clear(); + queryWrapper.where(ACTIVITY.ACTIVITY_ID.eq(registrationVo.getActivityId())); + Activity activity = activityMapper.selectOneByQuery(queryWrapper); + if (activity == null) { + throw new RuntimeException("活动信息错误"); + } + + queryWrapper.clear(); + queryWrapper.where(USER.WX_OPEN_ID.eq(registrationVo.getWxOpenId())); + User user = userMapper.selectOneByQuery(queryWrapper); + if (user == null) { + throw new RuntimeException("用户信息错误"); + } + UserCollectActivity userCollectActivity = new UserCollectActivity(); + userCollectActivity.setActivityId(registrationVo.getActivityId()); + userCollectActivity.setUserId(user.getUserId()); + collectActivityMapper.insert(userCollectActivity); + } + + @Override + public Page collectPage(PageParam pageParam,String wxOpenId) { + QueryWrapper queryWrapper = QueryWrapper.create() + .select(ACTIVITY.ALL_COLUMNS) + .where(USER.WX_OPEN_ID.eq(wxOpenId)) + .leftJoin(USER_COLLECT_ACTIVITY).on(ACTIVITY.ACTIVITY_ID.eq(USER_COLLECT_ACTIVITY.ACTIVITY_ID)) + .leftJoin(USER).on(USER.USER_ID.eq(USER_COLLECT_ACTIVITY.USER_ID)); + return activityMapper.paginate(pageParam.getPage(), queryWrapper); + } + + @Override + public boolean collected(RegistrationVo registrationVo) { + QueryWrapper queryWrapper = QueryWrapper.create() + .where(USER_COLLECT_ACTIVITY.ACTIVITY_ID.eq(registrationVo.getActivityId())) + .where(USER.WX_OPEN_ID.eq(registrationVo.getWxOpenId())) + .leftJoin(USER).on(USER.USER_ID.eq(USER_COLLECT_ACTIVITY.USER_ID)); + UserCollectActivity collectActivity = collectActivityMapper.selectOneByQuery(queryWrapper); + return collectActivity==null?Boolean.FALSE:Boolean.TRUE; + } } diff --git a/src/main/java/com/cdzy/activity/service/impl/UserServiceImpl.java b/src/main/java/com/cdzy/activity/service/impl/UserServiceImpl.java index 10a1806..2889e05 100644 --- a/src/main/java/com/cdzy/activity/service/impl/UserServiceImpl.java +++ b/src/main/java/com/cdzy/activity/service/impl/UserServiceImpl.java @@ -138,4 +138,28 @@ public class UserServiceImpl extends ServiceImpl implements Us } return activityInfo; } + + @Override + public void cancel(RegistrationVo registrationVo) { + Long activityId = registrationVo.getActivityId(); + String wxOpenId = registrationVo.getWxOpenId(); + Activity activity = activityMapper.selectOneById(activityId); + if (activity == null) { + throw new RuntimeException("该活动不存在"); + } + QueryWrapper queryWrapper = QueryWrapper.create() + .where(USER.WX_OPEN_ID.eq(wxOpenId)); + User user = userMapper.selectOneByQuery(queryWrapper); + if (user == null) { + throw new RuntimeException("用户信息错误"); + } + queryWrapper.clear(); + queryWrapper.where(USER_REGISTRATION_ACTIVITY.USER_ID.eq(user.getUserId())) + .where(USER_REGISTRATION_ACTIVITY.ACTIVITY_ID.eq(activityId)); + UserRegistrationActivity userRegistrationActivity = userRegistrationActivityMapper.selectOneByQuery(queryWrapper); + if (userRegistrationActivity == null) { + throw new RuntimeException("用户当前未报名"); + } + userRegistrationActivityMapper.delete(userRegistrationActivity); + } } diff --git a/src/test/java/com/cdzy/activity/ActivityRegistrationApplicationTests.java b/src/test/java/com/cdzy/activity/ActivityRegistrationApplicationTests.java index f77f726..0f7072e 100644 --- a/src/test/java/com/cdzy/activity/ActivityRegistrationApplicationTests.java +++ b/src/test/java/com/cdzy/activity/ActivityRegistrationApplicationTests.java @@ -1,7 +1,5 @@ package com.cdzy.activity; -import cn.hutool.core.lang.generator.SnowflakeGenerator; -import com.cdzy.activity.model.Staff; import com.cdzy.activity.service.StaffService; import com.mybatisflex.codegen.Generator; import com.mybatisflex.codegen.config.GlobalConfig; @@ -21,7 +19,7 @@ class ActivityRegistrationApplicationTests { private static final String mapperPath="D:/ActivityRegistration/resources/mapper"; private static final String packageName ="com.cdzy.activity"; private static final String[] tables= new String[]{ - "user_registration_activity","activity_user" + "user_collect_activity" }; @Test diff --git a/target/classes/com/cdzy/activity/component/GlobalExceptionHandler.class b/target/classes/com/cdzy/activity/component/GlobalExceptionHandler.class index 66e6cd9..2172218 100644 Binary files a/target/classes/com/cdzy/activity/component/GlobalExceptionHandler.class and b/target/classes/com/cdzy/activity/component/GlobalExceptionHandler.class differ diff --git a/target/classes/com/cdzy/activity/controller/UserController.class b/target/classes/com/cdzy/activity/controller/UserController.class index 13e1153..bcc32f4 100644 Binary files a/target/classes/com/cdzy/activity/controller/UserController.class and b/target/classes/com/cdzy/activity/controller/UserController.class differ diff --git a/target/classes/com/cdzy/activity/service/ActivityService.class b/target/classes/com/cdzy/activity/service/ActivityService.class index db5f8a1..a1ad80b 100644 Binary files a/target/classes/com/cdzy/activity/service/ActivityService.class and b/target/classes/com/cdzy/activity/service/ActivityService.class differ diff --git a/target/classes/com/cdzy/activity/service/UserService.class b/target/classes/com/cdzy/activity/service/UserService.class index 97f2187..57cd78c 100644 Binary files a/target/classes/com/cdzy/activity/service/UserService.class and b/target/classes/com/cdzy/activity/service/UserService.class differ diff --git a/target/classes/com/cdzy/activity/service/impl/ActivityServiceImpl.class b/target/classes/com/cdzy/activity/service/impl/ActivityServiceImpl.class index 4aaf276..bd3dec9 100644 Binary files a/target/classes/com/cdzy/activity/service/impl/ActivityServiceImpl.class and b/target/classes/com/cdzy/activity/service/impl/ActivityServiceImpl.class differ diff --git a/target/classes/com/cdzy/activity/service/impl/UserServiceImpl.class b/target/classes/com/cdzy/activity/service/impl/UserServiceImpl.class index 49661f9..9ad0037 100644 Binary files a/target/classes/com/cdzy/activity/service/impl/UserServiceImpl.class and b/target/classes/com/cdzy/activity/service/impl/UserServiceImpl.class differ diff --git a/target/generated-sources/annotations/com/cdzy/activity/model/table/UserCollectActivityTableDef.java b/target/generated-sources/annotations/com/cdzy/activity/model/table/UserCollectActivityTableDef.java new file mode 100644 index 0000000..5b9f97d --- /dev/null +++ b/target/generated-sources/annotations/com/cdzy/activity/model/table/UserCollectActivityTableDef.java @@ -0,0 +1,46 @@ +package com.cdzy.activity.model.table; + +import com.mybatisflex.core.query.QueryColumn; +import com.mybatisflex.core.table.TableDef; + +// Auto generate by mybatis-flex, do not modify it. +public class UserCollectActivityTableDef extends TableDef { + + /** + * 实体类。 + + @author attiya + @since 2025-09-23 + */ + public static final UserCollectActivityTableDef USER_COLLECT_ACTIVITY = new UserCollectActivityTableDef(); + + public final QueryColumn USER_ID = new QueryColumn(this, "user_id"); + + public final QueryColumn COLLECT_ID = new QueryColumn(this, "collect_id"); + + public final QueryColumn ACTIVITY_ID = new QueryColumn(this, "activity_id"); + + /** + * 所有字段。 + */ + public final QueryColumn ALL_COLUMNS = new QueryColumn(this, "*"); + + /** + * 默认字段,不包含逻辑删除或者 large 等字段。 + */ + public final QueryColumn[] DEFAULT_COLUMNS = new QueryColumn[]{USER_ID, COLLECT_ID, ACTIVITY_ID}; + + public UserCollectActivityTableDef() { + super("", "user_collect_activity"); + } + + private UserCollectActivityTableDef(String schema, String name, String alisa) { + super(schema, name, alisa); + } + + public UserCollectActivityTableDef as(String alias) { + String key = getNameWithSchema() + "." + alias; + return getCache(key, k -> new UserCollectActivityTableDef("", "user_collect_activity", alias)); + } + +} diff --git a/target/test-classes/com/cdzy/activity/ActivityRegistrationApplicationTests.class b/target/test-classes/com/cdzy/activity/ActivityRegistrationApplicationTests.class index 9ee3961..b47c5c9 100644 Binary files a/target/test-classes/com/cdzy/activity/ActivityRegistrationApplicationTests.class and b/target/test-classes/com/cdzy/activity/ActivityRegistrationApplicationTests.class differ