diff --git a/backend/src/main/java/com/budwk/app/client/auth/controller/ClientAuthController.java b/backend/src/main/java/com/budwk/app/client/auth/controller/ClientAuthController.java index 333250f..68c861b 100644 --- a/backend/src/main/java/com/budwk/app/client/auth/controller/ClientAuthController.java +++ b/backend/src/main/java/com/budwk/app/client/auth/controller/ClientAuthController.java @@ -85,7 +85,7 @@ public class ClientAuthController { @ApiOperation(value = "短信登录", nickname = "/sms-login", httpMethod = "POST") public Object doSmsLogin(ClientLoginBody loginBody, HttpServletRequest req) { try { - String token = clientAuthService.doSmsLogin(loginBody); + String token = clientAuthService.doLogin(loginBody); return Result.success().addData(token); } catch (Exception e) { log.error(e.getMessage(), e); diff --git a/backend/src/main/java/com/budwk/app/client/auth/models/Client_user.java b/backend/src/main/java/com/budwk/app/client/auth/models/Client_user.java index 89417fb..89b3545 100644 --- a/backend/src/main/java/com/budwk/app/client/auth/models/Client_user.java +++ b/backend/src/main/java/com/budwk/app/client/auth/models/Client_user.java @@ -48,6 +48,16 @@ public class Client_user extends BaseModel implements Serializable { @Comment("单位ID") private String unitId; + @Column + @ColDefine(type = ColType.VARCHAR, width = 255) + @Comment("密码") + private String password; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 255) + @Comment("盐") + private String salt; + @Column @ColDefine(type = ColType.VARCHAR, width = 255) @Comment("openId") diff --git a/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthService.java b/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthService.java index 551a5be..67ac60a 100644 --- a/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthService.java +++ b/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthService.java @@ -10,7 +10,7 @@ public interface ClientAuthService { * @param loginBody 登录信息 * @return token */ - String doSmsLogin(ClientLoginBody loginBody); + String doLogin(ClientLoginBody loginBody); /** * 注册 diff --git a/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthServiceImpl.java b/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthServiceImpl.java index 2cb8a49..c12d31f 100644 --- a/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/client/auth/service/ClientAuthServiceImpl.java @@ -1,7 +1,9 @@ package com.budwk.app.client.auth.service; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; import com.budwk.app.base.exception.BaseException; +import com.budwk.app.base.utils.PwdUtil; import com.budwk.app.client.auth.vo.ClientLoginBody; import com.budwk.app.client.auth.models.Client_user; import com.budwk.app.client.auth.vo.ClientRegisterBody; @@ -11,6 +13,9 @@ import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Strings; + +import java.util.List; @IocBean public class ClientAuthServiceImpl implements ClientAuthService { @@ -21,23 +26,34 @@ public class ClientAuthServiceImpl implements ClientAuthService { private ValidateService validateService; @Override - public String doSmsLogin(ClientLoginBody loginBody) { + public String doLogin(ClientLoginBody loginBody) { Client_user user = null; int count = dao.count(Client_user.class, Cnd.where(Client_user::getPhone, "=", loginBody.getPhone())); if (count == 0) { -// // 自动注册 -// user = new Client_user(); -// user.setPhone(loginBody.getPhone()); -// user.setUserName("用户" + loginBody.getPhone()); -// dao.insert(user); throw new BaseException("手机号码不存在"); } - validateService.checkSMSCode(loginBody.getPhone(), loginBody.getSmsCode()); user = dao.fetch(Client_user.class, Cnd.where(Client_user::getPhone, "=", loginBody.getPhone())); + if (user == null) { - throw new BaseException("用户登录失败"); + throw new BaseException("用户不存在"); } + + if (StrUtil.isBlank(loginBody.getLoginMethod()) || !List.of("sms", "password").contains(loginBody.getLoginMethod())) { + throw new BaseException("登录方式不正确"); + } + + if (loginBody.getLoginMethod().equals("sms")) { + validateService.checkSMSCode(loginBody.getPhone(), loginBody.getSmsCode()); + } + + if (loginBody.getLoginMethod().equals("password")) { + String hashedPassword = PwdUtil.getPassword(loginBody.getPassword(), user.getSalt()); + if (!Strings.sNull(hashedPassword).equalsIgnoreCase(user.getPassword())) { + throw new BaseException("密码不正确"); + } + } + StpClientUtil.STP.login(user.getId()); StpClientUtil.STP.checkLogin(); return StpClientUtil.STP.getTokenValue(); diff --git a/backend/src/main/java/com/budwk/app/client/auth/vo/ClientLoginBody.java b/backend/src/main/java/com/budwk/app/client/auth/vo/ClientLoginBody.java index f192016..41b39a3 100644 --- a/backend/src/main/java/com/budwk/app/client/auth/vo/ClientLoginBody.java +++ b/backend/src/main/java/com/budwk/app/client/auth/vo/ClientLoginBody.java @@ -9,4 +9,8 @@ public class ClientLoginBody { private String smsCode; + private String password; + + private String loginMethod; + } diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientActivityController.java b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientActivityController.java index 46a63ca..13d4df1 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientActivityController.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientActivityController.java @@ -81,6 +81,7 @@ public class ClientActivityController { return Result.success(); } + /** * 查询报名人员 * 报名人不见得参加活动 diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientItemController.java b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientItemController.java index 112b4b4..80d6ca5 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientItemController.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientItemController.java @@ -117,4 +117,18 @@ public class ClientItemController { } + /** + * 取消项目报名 + * @param signVO + * @return + */ + @At("/cancel-team-sign-up") + @AdaptBy(type = JsonAdaptor.class) + @SaCheckLogin(type = StpClientUtil.TYPE) + public synchronized Result cancelTeamSignUp(ClientActivitySignVO signVO) { + clientItemService.cancelTeamSignUp(signVO); + return Result.success(); + } + + } diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientItemService.java b/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientItemService.java index 4747296..1c20e27 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientItemService.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientItemService.java @@ -1,9 +1,12 @@ package com.budwk.app.client.module.activity.service; import com.budwk.app.base.service.BaseService; +import com.budwk.app.client.module.activity.vo.ClientActivitySignVO; import com.budwk.app.client.module.activity.vo.ClientItemSignUpVO; import com.budwk.app.module.activity.models.ActivityItemUser; public interface ClientItemService extends BaseService { void signUp(ClientItemSignUpVO signVO); + + void cancelTeamSignUp(ClientActivitySignVO signVO); } diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientItemServiceImpl.java b/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientItemServiceImpl.java index 7e19ac4..e9703a3 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientItemServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientItemServiceImpl.java @@ -2,6 +2,7 @@ package com.budwk.app.client.module.activity.service.impl; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.client.module.activity.service.ClientItemService; +import com.budwk.app.client.module.activity.vo.ClientActivitySignVO; import com.budwk.app.client.module.activity.vo.ClientItemSignUpVO; import com.budwk.app.module.activity.models.ActGroupUser; import com.budwk.app.module.activity.models.Activity; @@ -59,4 +60,10 @@ public class ClientItemServiceImpl extends BaseServiceImpl imp } insert(userList); } + + @Override + public void cancelTeamSignUp(ClientActivitySignVO signVO) { + clear(Cnd.where(ActivityItemUser::getActivityId, "=", signVO.getActivityId()) + .and(ActivityItemUser::getItemId, "=", signVO.getItemId())); + } } diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/vo/ClientActivitySignVO.java b/backend/src/main/java/com/budwk/app/client/module/activity/vo/ClientActivitySignVO.java index 4e30663..d0a0bc2 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/vo/ClientActivitySignVO.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/vo/ClientActivitySignVO.java @@ -12,6 +12,7 @@ import java.util.List; public class ClientActivitySignVO { private Long activityId; + private Long itemId; private String unitId; diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java index e756c49..d36886b 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java @@ -185,7 +185,7 @@ public class ActUserController { @At @SaCheckPermission("activity.user") public Result getActivityList(String year){ - List activityList = dao.query(Activity.class, Cnd.where("YEAR(startTime)", "=", year).and(Activity::getDelFlag, "=", false)); + List activityList = dao.query(Activity.class, Cnd.NEW().andEX("YEAR(startTime)", "=", year).and(Activity::getDelFlag, "=", false)); return Result.success(activityList); } diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActWonderfulMomentController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActWonderfulMomentController.java new file mode 100644 index 0000000..41ee653 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActWonderfulMomentController.java @@ -0,0 +1,123 @@ +package com.budwk.app.module.activity.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.PageForm; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.result.Result; +import com.budwk.app.module.activity.models.ActWonderfulMoment; +import com.budwk.app.module.activity.models.Activity; +import com.budwk.app.module.activity.service.ActWonderfulMomentService; +import com.budwk.app.web.commons.auth.satoken.StpClientUtil; +import lombok.extern.slf4j.Slf4j; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @ClassName ActWonderfulMomentController + * @Author JyuHsin + * @Date 2025/5/6 15:30 + * @Version 1.0 + * @Description TODO + */ +@Slf4j +@IocBean +@Ok("json:full") +@At("/platform/activity/wonderfulMoment") +public class ActWonderfulMomentController { + + @Inject + private ActWonderfulMomentService wonderfulMomentService; + + @At("") + @SaCheckPermission("activity.wonderfulMoment") + @Ok("beetl:/platform/activity/wonderfulMoment/index.html") + public void index() { + } + + @At + @SaCheckPermission("activity.wonderfulMoment") + public Result pageData(PageForm pageForm, String startTime, String endTime){ + Cnd cnd = Cnd.NEW(); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + cnd.and("title", "like", "%" + pageForm.getSearchKeyword() + "%"); + } + cnd.andEX("publishTime", ">=", startTime); + cnd.andEX("publishTime", "<=", endTime); + cnd.desc("publishTime"); + Pagination pagination = wonderfulMomentService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), cnd); + return Result.success(pagination); + } + + @At + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("activity.wonderfulMoment") + public Result onHandle(@Param("wonderfulMoment") ActWonderfulMoment wonderfulMoment) { + if(wonderfulMoment.getId() == null) { + wonderfulMoment.setPublishTime(DateUtil.now()); + } + wonderfulMomentService.insertOrUpdate(wonderfulMoment); + return Result.success(); + } + + @At + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("activity.wonderfulMoment") + public Result onDelete(Long id) { + wonderfulMomentService.delete(id); + return Result.success(); + } + + @At + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result getWonderfulMoment(@Param("id") Long id) { + Cnd cnd = Cnd.where("published", "=", true).andEX("id", "=", id); + cnd.desc("publishTime"); + List momentList = wonderfulMomentService.query(cnd); + List result = new ArrayList<>(); + for (ActWonderfulMoment wonderfulMoment : momentList) { + NutMap nutMap = Lang.obj2map(wonderfulMoment, NutMap.class); + DateTime dateTime = DateUtil.parse(wonderfulMoment.getPublishTime()); + //如果是今天 + if(DateUtil.isSameDay(dateTime, new Date())) { + nutMap.put("time", "今天" + DateUtil.format(dateTime, "HH:mm")); + } else { + nutMap.put("time", DateUtil.betweenDay(dateTime, new Date(), false) + "天前"); + } + result.add(nutMap); + } + return Result.success(result); + } + + @At("/getWonderfulMomentById/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result getWonderfulMomentById(Long id) { + ActWonderfulMoment moment = wonderfulMomentService.fetch(id); + return Result.success(moment); + } + + @At("/handleWonderfulMoment/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result handleWonderfulMoment(Long id) { + ActWonderfulMoment moment = wonderfulMomentService.fetch(id); + moment.setReadCount(moment.getReadCount() + 1); + wonderfulMomentService.update(moment); + return Result.success(); + } +} diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActivityManageController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActivityManageController.java index e4aae90..827b7d8 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActivityManageController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActivityManageController.java @@ -1,5 +1,6 @@ package com.budwk.app.module.activity.controller; +import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.collection.CollUtil; import com.budwk.app.base.page.PageForm; @@ -8,6 +9,7 @@ import com.budwk.app.base.result.Result; import com.budwk.app.module.activity.models.Activity; import com.budwk.app.module.activity.models.ActivityItem; import com.budwk.app.module.activity.service.ActivityManageService; +import com.budwk.app.web.commons.auth.satoken.StpClientUtil; import lombok.extern.slf4j.Slf4j; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; @@ -163,4 +165,11 @@ public class ActivityManageController { return Result.success(); } + @At + @Aop(TransAop.READ_COMMITTED) + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result getActivity() { + List activityList = activityService.query(Cnd.NEW()); + return Result.success(activityList); + } } diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActWonderfulMoment.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActWonderfulMoment.java new file mode 100644 index 0000000..e2aa5fb --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActWonderfulMoment.java @@ -0,0 +1,56 @@ +package com.budwk.app.module.activity.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; + +/** + * @ClassName ActWonderfulMoment + * @Author JyuHsin + * @Date 2025/5/6 15:28 + * @Version 1.0 + * @Description TODO + */ +@Data +@Comment("活动项目队伍得分表") +@Table("act_wonderful_moment") +@EqualsAndHashCode(callSuper = true) +@TableMeta("{'mysql-charset':'utf8mb4'}") +public class ActWonderfulMoment extends BaseModel { + + @Id + @Comment("ID") + private Long id; + + @Column + @Comment("标题") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String title; + + @Column + @Comment("发布内容") + @ColDefine(type = ColType.TEXT) + private String content; + + @Column + @Comment("发布时间") + @ColDefine(type = ColType.VARCHAR, width = 30) + private String publishTime; + + @Column + @Comment("封面图") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String cover; + + @Column + @Comment("是否发布") + @ColDefine(type = ColType.BOOLEAN) + private Boolean published; + + @Column + @Comment("阅读次数") + @Default(value = "0") + @ColDefine(type = ColType.INT) + private Integer readCount; +} diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/ActWonderfulMomentService.java b/backend/src/main/java/com/budwk/app/module/activity/service/ActWonderfulMomentService.java new file mode 100644 index 0000000..b95ded8 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/service/ActWonderfulMomentService.java @@ -0,0 +1,14 @@ +package com.budwk.app.module.activity.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.module.activity.models.ActWonderfulMoment; + +/** + * @ClassName ActWonderfulMomentService + * @Author JyuHsin + * @Date 2025/5/6 15:30 + * @Version 1.0 + * @Description TODO + */ +public interface ActWonderfulMomentService extends BaseService { +} diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActWonderfulMomentServiceImpl.java b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActWonderfulMomentServiceImpl.java new file mode 100644 index 0000000..c53e062 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActWonderfulMomentServiceImpl.java @@ -0,0 +1,21 @@ +package com.budwk.app.module.activity.service.impl; + +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.module.activity.models.ActWonderfulMoment; +import com.budwk.app.module.activity.service.ActWonderfulMomentService; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +/** + * @ClassName ActWonderfulMomentServiceImpl + * @Author JyuHsin + * @Date 2025/5/6 15:31 + * @Version 1.0 + * @Description TODO + */ +@IocBean(args = {"refer:dao"}) +public class ActWonderfulMomentServiceImpl extends BaseServiceImpl implements ActWonderfulMomentService { + public ActWonderfulMomentServiceImpl(Dao dao) { + super(dao); + } +} diff --git a/backend/src/main/resources/static/components/plugins/imageUpload/index.vue b/backend/src/main/resources/static/components/plugins/imageUpload/index.vue index 343e919..006143a 100644 --- a/backend/src/main/resources/static/components/plugins/imageUpload/index.vue +++ b/backend/src/main/resources/static/components/plugins/imageUpload/index.vue @@ -12,10 +12,22 @@ :on-exceed="handleExceed" :file-list="fileList" > - + +
+ + + + + + + + + +
- + @@ -124,4 +136,4 @@ module.exports = { \ No newline at end of file + diff --git a/backend/src/main/resources/views/platform/activity/manage/addOrUpdate.js b/backend/src/main/resources/views/platform/activity/manage/addOrUpdate.js index 5e27579..6d4ff33 100644 --- a/backend/src/main/resources/views/platform/activity/manage/addOrUpdate.js +++ b/backend/src/main/resources/views/platform/activity/manage/addOrUpdate.js @@ -78,6 +78,9 @@ const addOrUpdate = { {{form.files}} + + + + + + + + 成员信息 + + + + + + diff --git a/frontend/src/pages/index/index.vue b/frontend/src/pages/index/index.vue index 0bc056d..41abb53 100644 --- a/frontend/src/pages/index/index.vue +++ b/frontend/src/pages/index/index.vue @@ -32,41 +32,90 @@ 项目报名 - - - - - 精彩瞬间 - + + + + + + - 精选活动 - 更多 + 近期活动 + 更多 - - - + + + + + + {{ item.title }} + + {{ moment(item.startTime).format('M月DD日') + '-' + moment(item.endTime).format('DD日') }} + {{ item.address }} + + + + + + + + + + + + + 精彩瞬间 + + + + + - - 一分钟了解运动会流程 - - 6月15日-20日 - 江苏省体育中心 + + {{ item.title }} + + {{ item.time }} + 阅读 {{ item.readCount }} + + + diff --git a/frontend/src/pages/login/index.vue b/frontend/src/pages/login/index.vue index b20beb9..3419d54 100644 --- a/frontend/src/pages/login/index.vue +++ b/frontend/src/pages/login/index.vue @@ -62,16 +62,16 @@ - + + + + + + + 立即登录 @@ -127,17 +139,14 @@ import {useUserStore} from "@/store"; const request = useRequest() const userStore = useUserStore() -const activeMethod = ref('phone') const loginForm = reactive({ phone: '', - smsCode: '' + smsCode: '', + password: '', + loginMethod: 'sms' }) -const setActiveMethod = (method) => { - activeMethod.value = method -} - // 倒计时相关 const countdown = ref(0) const timer = ref(null) @@ -265,10 +274,14 @@ async function handleLogin() { Toast('请输入手机号码'); return } - if (!loginForm.smsCode) { + if (!loginForm.smsCode && loginForm.loginMethod === 'sms') { Toast('请输入验证码'); return } + if (!loginForm.password && loginForm.loginMethod === 'password') { + Toast('请输入密码'); + return + } try { userStore.smsLogin(loginForm).then(() => { @@ -318,7 +331,7 @@ async function handleLogin() { } } -function navigateToRegister(){ +function navigateToRegister() { uni.redirectTo({ url: '/pages/login/register' }) diff --git a/frontend/src/pages/login/register.vue b/frontend/src/pages/login/register.vue index caf88c3..ae0c8a4 100644 --- a/frontend/src/pages/login/register.vue +++ b/frontend/src/pages/login/register.vue @@ -1,8 +1,57 @@