活动-用户相关功能

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,9 +20,10 @@ 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;
/** /**
* 微信用户控制层 * 微信用户控制层
* *
* @author attiya * @author attiya
* @since 2025-09-17 * @since 2025-09-17
@ -42,14 +41,17 @@ public class UserController {
@Resource @Resource
private ActivityService activityService; private ActivityService activityService;
@Resource
private BulletinService bulletinService;
/** /**
* 用户微信无感登录 * 用户微信无感登录
* *
* @param code 微信登录返回的code * @param code 微信登录返回的code
* @return 登陆结果 * @return 登陆结果
*/ */
@RequestMapping("login") @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); JSONObject result = verifyUtil.wechatAuthority(code);
if (result == null) { if (result == null) {
return JsonResult.failed("微信登录失败"); return JsonResult.failed("微信登录失败");
@ -59,7 +61,7 @@ public class UserController {
} }
String openid = result.getString("openid"); String openid = result.getString("openid");
QueryWrapper queryWrapper = QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
.eq(User::getWxOpenId, openid); .eq(User::getWxOpenId, openid);
User user = userService.getOne(queryWrapper); User user = userService.getOne(queryWrapper);
if (user == null) { if (user == null) {
user = new User(); user = new User();
@ -70,7 +72,7 @@ public class UserController {
} }
/** /**
* 用户详情填写 * 用户详情填写
* *
* @param user 用户信息 * @param user 用户信息
* @return 登陆结果 * @return 登陆结果
@ -82,13 +84,13 @@ public class UserController {
} }
/** /**
* 用户详情 * 用户详情
* *
* @param openId 微信登陆openId * @param openId 微信登陆openId
* @return 登陆结果 * @return 登陆结果
*/ */
@GetMapping("info") @GetMapping("info")
public JsonResult<?> info(@RequestParam("openId")String openId) { public JsonResult<?> info(@RequestParam("openId") String openId) {
QueryWrapper queryWrapper = QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
.eq(User::getWxOpenId, openId); .eq(User::getWxOpenId, openId);
User user = userService.getOne(queryWrapper); User user = userService.getOne(queryWrapper);
@ -96,7 +98,7 @@ public class UserController {
} }
/** /**
* 用户查询活动分页数据 * 用户查询活动分页数据
* *
* @param activityName 活动名称 * @param activityName 活动名称
* @param activityType 活动类型 * @param activityType 活动类型
@ -112,7 +114,7 @@ public class UserController {
} }
/** /**
* 用户查询活动详细信息 * 用户查询活动详细信息
* *
* @param activityId 活动ID * @param activityId 活动ID
* @return 登陆结果 * @return 登陆结果
@ -124,7 +126,7 @@ public class UserController {
} }
/** /**
* 用户报名活动 * 用户报名活动
* *
* @param registrationVo 活动报名信息 * @param registrationVo 活动报名信息
* @return 登陆结果 * @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 分页参数 * @param pageParam 分页参数
* @return 登陆结果 * @return 登陆结果
*/ */
@GetMapping("activity/registered") @GetMapping("activity/registered")
public JsonResult<?> registered(PageParam pageParam, String activityName, Integer activityType,@NotNull(message = "OpenId不能为空") String wxOpenId) { public JsonResult<?> registered(PageParam pageParam, String activityName, Integer activityType, @NotNull(message = "OpenId不能为空") String wxOpenId) {
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;
@ -172,13 +181,72 @@ public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity> i
} }
@Override @Override
public Page<Activity> registered(PageParam pageParam, String activityName, Integer activityType,String wxOpenId) { public Page<Activity> registered(PageParam pageParam, String activityName, Integer activityType, String wxOpenId) {
QueryWrapper queryWrapper = QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
.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));
}
}