活动-用户相关功能

This commit is contained in:
attiya 2025-09-23 15:05:25 +08:00
parent 97adc9119c
commit 94c21e13d3
16 changed files with 302 additions and 27 deletions

View File

@ -1,14 +1,12 @@
package com.cdzy.activity.controller; package com.cdzy.activity.controller;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.cdzy.activity.model.Activity; import com.cdzy.activity.model.*;
import com.cdzy.activity.model.JsonResult;
import com.cdzy.activity.model.PageParam;
import com.cdzy.activity.model.User;
import com.cdzy.activity.model.dto.ActivityInfo; import com.cdzy.activity.model.dto.ActivityInfo;
import com.cdzy.activity.model.vo.RegistrationVo; import com.cdzy.activity.model.vo.RegistrationVo;
import com.cdzy.activity.model.vo.UserVo; import com.cdzy.activity.model.vo.UserVo;
import com.cdzy.activity.service.ActivityService; import com.cdzy.activity.service.ActivityService;
import com.cdzy.activity.service.BulletinService;
import com.cdzy.activity.service.UserService; import com.cdzy.activity.service.UserService;
import com.cdzy.activity.uitls.VerifyUtil; import com.cdzy.activity.uitls.VerifyUtil;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
@ -22,6 +20,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.Objects; import java.util.Objects;
import static com.cdzy.activity.model.table.ActivityTableDef.ACTIVITY; import static com.cdzy.activity.model.table.ActivityTableDef.ACTIVITY;
import static com.cdzy.activity.model.table.BulletinTableDef.BULLETIN;
/** /**
* 微信用户控制层 * 微信用户控制层
@ -42,6 +41,9 @@ public class UserController {
@Resource @Resource
private ActivityService activityService; private ActivityService activityService;
@Resource
private BulletinService bulletinService;
/** /**
* 用户微信无感登录 * 用户微信无感登录
* *
@ -135,6 +137,18 @@ public class UserController {
return JsonResult.success(); return JsonResult.success();
} }
/**
* 用户取消报名活动
*
* @param registrationVo 活动报名信息
* @return 登陆结果
*/
@PostMapping("activity/cancel")
public JsonResult<?> cancel(@RequestBody RegistrationVo registrationVo) {
userService.cancel(registrationVo);
return JsonResult.success();
}
/** /**
* 分页查询用户已报名活动 * 分页查询用户已报名活动
* *
@ -146,4 +160,65 @@ public class UserController {
Page<Activity> page = activityService.registered(pageParam, activityName, activityType, wxOpenId); Page<Activity> page = activityService.registered(pageParam, activityName, activityType, wxOpenId);
return JsonResult.success(page); 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<Activity> 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<Bulletin> page = bulletinService.page(pageParam.getPage(), queryWrapper);
return JsonResult.success(page);
}
} }

View File

@ -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<UserCollectActivity> {
}

View File

@ -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;
}

View File

@ -2,6 +2,7 @@ package com.cdzy.activity.service;
import com.cdzy.activity.model.PageParam; import com.cdzy.activity.model.PageParam;
import com.cdzy.activity.model.vo.ActivityVo; import com.cdzy.activity.model.vo.ActivityVo;
import com.cdzy.activity.model.vo.RegistrationVo;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService; import com.mybatisflex.core.service.IService;
import com.cdzy.activity.model.Activity; import com.cdzy.activity.model.Activity;
@ -23,4 +24,12 @@ public interface ActivityService extends IService<Activity> {
void checkStatus(); void checkStatus();
Page<Activity> registered(PageParam pageParam, String activityName, Integer activityType,String wxOpenId); Page<Activity> registered(PageParam pageParam, String activityName, Integer activityType,String wxOpenId);
void collectRemove(RegistrationVo registrationVo);
void collect(RegistrationVo registrationVo);
Page<Activity> collectPage(PageParam pageParam,String wxOpenId);
boolean collected(RegistrationVo registrationVo);
} }

View File

@ -19,4 +19,6 @@ public interface UserService extends IService<User> {
void registration(RegistrationVo registrationVo); void registration(RegistrationVo registrationVo);
ActivityInfo activityInfo(Long activityId); ActivityInfo activityInfo(Long activityId);
void cancel(RegistrationVo registrationVo);
} }

View File

@ -6,10 +6,11 @@ import com.cdzy.activity.component.ImageConfig;
import com.cdzy.activity.enums.ActivityStatus; import com.cdzy.activity.enums.ActivityStatus;
import com.cdzy.activity.mapper.ActivityMapper; import com.cdzy.activity.mapper.ActivityMapper;
import com.cdzy.activity.mapper.ActivityUserMapper; import com.cdzy.activity.mapper.ActivityUserMapper;
import com.cdzy.activity.model.Activity; import com.cdzy.activity.mapper.UserCollectActivityMapper;
import com.cdzy.activity.model.ActivityUser; import com.cdzy.activity.mapper.UserMapper;
import com.cdzy.activity.model.PageParam; import com.cdzy.activity.model.*;
import com.cdzy.activity.model.vo.ActivityVo; import com.cdzy.activity.model.vo.ActivityVo;
import com.cdzy.activity.model.vo.RegistrationVo;
import com.cdzy.activity.service.ActivityService; import com.cdzy.activity.service.ActivityService;
import com.cdzy.activity.uitls.FileUtils; import com.cdzy.activity.uitls.FileUtils;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
@ -28,7 +29,8 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import static com.cdzy.activity.model.table.ActivityTableDef.ACTIVITY; 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; import static com.cdzy.activity.model.table.UserTableDef.USER;
/** /**
@ -46,6 +48,13 @@ public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity> i
@Resource @Resource
private ActivityUserMapper activityUserMapper; private ActivityUserMapper activityUserMapper;
@Resource
private UserCollectActivityMapper collectActivityMapper;
@Resource
private UserMapper userMapper;
@Resource @Resource
private ImageConfig imageConfig; private ImageConfig imageConfig;
@ -177,8 +186,67 @@ public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity> i
.where(ACTIVITY.ACTIVITY_NAME.like(activityName, StringUtil.hasText(activityName))) .where(ACTIVITY.ACTIVITY_NAME.like(activityName, StringUtil.hasText(activityName)))
.where(ACTIVITY.ACTIVITY_TYPE.eq(activityType, Objects.nonNull(activityType))) .where(ACTIVITY.ACTIVITY_TYPE.eq(activityType, Objects.nonNull(activityType)))
.where(USER.WX_OPEN_ID.eq(wxOpenId)) .where(USER.WX_OPEN_ID.eq(wxOpenId))
.leftJoin(ACTIVITY_USER).on(ACTIVITY_USER.ACTIVITY_ID.eq(ACTIVITY.ACTIVITY_ID)) .leftJoin(USER_REGISTRATION_ACTIVITY).on(USER_REGISTRATION_ACTIVITY.ACTIVITY_ID.eq(ACTIVITY.ACTIVITY_ID))
.leftJoin(USER).on(USER.USER_ID.eq(ACTIVITY_USER.USER_ID)); .leftJoin(USER).on(USER.USER_ID.eq(USER_REGISTRATION_ACTIVITY.USER_ID));
return activityMapper.paginate(pageParam.getPage(), queryWrapper); 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<Activity> 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;
}
} }

View File

@ -138,4 +138,28 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
} }
return activityInfo; 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);
}
} }

View File

@ -1,7 +1,5 @@
package com.cdzy.activity; 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.cdzy.activity.service.StaffService;
import com.mybatisflex.codegen.Generator; import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.GlobalConfig; 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 mapperPath="D:/ActivityRegistration/resources/mapper";
private static final String packageName ="com.cdzy.activity"; private static final String packageName ="com.cdzy.activity";
private static final String[] tables= new String[]{ private static final String[] tables= new String[]{
"user_registration_activity","activity_user" "user_collect_activity"
}; };
@Test @Test

View File

@ -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));
}
}