活动-用户相关功能

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;
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<Activity> page = activityService.registered(pageParam,activityName,activityType,wxOpenId);
public JsonResult<?> registered(PageParam pageParam, String activityName, Integer activityType, @NotNull(message = "OpenId不能为空") String wxOpenId) {
Page<Activity> 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<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.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<Activity> {
void checkStatus();
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);
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.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<ActivityMapper, Activity> 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<ActivityMapper, Activity> i
}
@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()
.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<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;
}
@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;
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

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