diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientDynamicController.java b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientDynamicController.java new file mode 100644 index 0000000..9bfc201 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientDynamicController.java @@ -0,0 +1,107 @@ +package com.budwk.app.client.module.activity.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.date.DateUtil; +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.client.module.activity.service.ClientDynamicService; +import com.budwk.app.module.activity.models.ActDynamic; +import com.budwk.app.module.activity.models.ActDynamicPraise; +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.Sqls; +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.mvc.adaptor.JsonAdaptor; +import org.nutz.mvc.annotation.AdaptBy; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +/** + * @ClassName ClientDynamicController + * @Author JyuHsin + * @Date 2025/4/30 14:16 + * @Version 1.0 + * @Description TODO + */ +@Slf4j +@IocBean +@Ok("json:full") +@At("/client/activity/dynamic") +public class ClientDynamicController { + + @Inject + private ClientDynamicService dynamicService; + + @At("/list") + @AdaptBy(type = JsonAdaptor.class) + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result list(@Param("pageForm") PageForm pageForm, @Param("activityId") Long activityId) { + Sql sql = Sqls.create(""" + SELECT + ad.*, + cu.userName, + cu.sex, + (select count(1) from act_dynamic_praise where dynamicId = ad.id) as praiseCount, + (select count(1) from act_dynamic_praise where dynamicId = ad.id and userId = '') as selfPraiseCount + FROM + `act_dynamic` ad + LEFT JOIN client_user cu ON ad.userId = cu.id + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("ad.activityId", "=", activityId); + cnd.desc("ad.publishTime"); + sql.setCondition(cnd); + Pagination pagination = dynamicService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + @At("/onHandle") + @AdaptBy(type = JsonAdaptor.class) + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result onHandle(ActDynamic actDynamic) { + actDynamic.setUserId(StpClientUtil.STP.getLoginIdAsLong()); + actDynamic.setPublishTime(DateUtil.now()); + dynamicService.insert(actDynamic); + return Result.success(); + } + + @At("/praise/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result praise(Long id) { + int count = dynamicService.dao().count( + ActDynamicPraise.class, + Cnd.where("dynamicId", "=", id).and("userId", "=", StpClientUtil.STP.getLoginIdAsLong()) + ); + if(count > 0) { + dynamicService.dao().clear( + ActDynamicPraise.class, + Cnd.where("dynamicId", "=", id).and("userId", "=", StpClientUtil.STP.getLoginIdAsLong()) + ); + } else { + ActDynamicPraise praise = new ActDynamicPraise(); + praise.setUserId(StpClientUtil.STP.getLoginIdAsLong()); + praise.setDynamicId(id); + praise.setPraiseTime(DateUtil.now()); + dynamicService.dao().insert(praise); + } + return Result.success(); + } + + @At("/onDelete/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + @Aop(TransAop.READ_COMMITTED) + public Result onDelete(Long id) { + dynamicService.delete(id); + dynamicService.dao().clear(ActDynamicPraise.class, Cnd.where("dynamicId", "=", id)); + return Result.success(); + } +} diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientDynamicService.java b/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientDynamicService.java new file mode 100644 index 0000000..01ae8a3 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientDynamicService.java @@ -0,0 +1,14 @@ +package com.budwk.app.client.module.activity.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.module.activity.models.ActDynamic; + +/** + * @ClassName ActHighLightsService + * @Author JyuHsin + * @Date 2025/4/30 14:17 + * @Version 1.0 + * @Description TODO + */ +public interface ClientDynamicService extends BaseService { +} diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientDynamicServiceImpl.java b/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientDynamicServiceImpl.java new file mode 100644 index 0000000..302aca7 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientDynamicServiceImpl.java @@ -0,0 +1,22 @@ +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.ClientDynamicService; +import com.budwk.app.module.activity.models.ActDynamic; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +/** + * @ClassName ActHighLightsServiceImpl + * @Author JyuHsin + * @Date 2025/4/30 14:17 + * @Version 1.0 + * @Description TODO + */ +@IocBean(args = {"refer:dao"}) +public class ClientDynamicServiceImpl extends BaseServiceImpl implements ClientDynamicService { + + public ClientDynamicServiceImpl(Dao dao) { + super(dao); + } +} diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActDynamic.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActDynamic.java new file mode 100644 index 0000000..aaf128e --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActDynamic.java @@ -0,0 +1,54 @@ +package com.budwk.app.module.activity.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.json.JSONObject; +import org.nutz.dao.entity.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @ClassName ActDynamic + * @Author JyuHsin + * @Date 2025/4/30 14:13 + * @Version 1.0 + * @Description TODO + */ +@Data +@Comment("高光时刻") +@Table("act_dynamic") +@EqualsAndHashCode(callSuper = true) +@TableMeta("{'mysql-charset':'utf8mb4'}") +public class ActDynamic extends BaseModel { + + @Id + @Comment("ID") + private Long id; + + @Column + @Comment("活动ID") + @ColDefine(customType = "bigint") + private Long activityId; + + @Column + @Comment("用户id") + @ColDefine(customType = "bigint") + private Long userId; + + @Column + @Comment("发布内容") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String content; + + @Comment("发布时间") + @Column + @ColDefine(type = ColType.VARCHAR, width = 30) + private String publishTime; + + @Comment("发布图片") + @Column + @ColDefine(type = ColType.MYSQL_JSON) + private List files; +} diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActDynamicPraise.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActDynamicPraise.java new file mode 100644 index 0000000..fafebc2 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActDynamicPraise.java @@ -0,0 +1,40 @@ +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 ActDynamicPraise + * @Author JyuHsin + * @Date 2025/4/30 14:27 + * @Version 1.0 + * @Description TODO + */ +@Data +@Comment("赞") +@Table("act_dynamic_praise") +@EqualsAndHashCode(callSuper = true) +@TableMeta("{'mysql-charset':'utf8mb4'}") +public class ActDynamicPraise extends BaseModel { + + @Id + @Comment("ID") + private Long id; + + @Column + @Comment("精彩瞬间id") + @ColDefine(customType = "bigint") + private Long dynamicId; + + @Column + @Comment("用户id") + @ColDefine(customType = "bigint") + private Long userId; + + @Comment("点赞时间") + @Column + @ColDefine(type = ColType.VARCHAR, width = 30) + private String praiseTime; +} diff --git a/frontend/src/pages.json b/frontend/src/pages.json index fc6e6f0..4e46ffa 100644 --- a/frontend/src/pages.json +++ b/frontend/src/pages.json @@ -78,6 +78,12 @@ "style": { "navigationBarTitleText": "成绩查询" } + }, + { + "path": "pages/activity/dynamic/index", + "style": { + "navigationBarTitleText": "精彩瞬间" + } } ], "globalStyle": { diff --git a/frontend/src/pages/activity/dynamic/PublishMoment.vue b/frontend/src/pages/activity/dynamic/PublishMoment.vue new file mode 100644 index 0000000..def07e8 --- /dev/null +++ b/frontend/src/pages/activity/dynamic/PublishMoment.vue @@ -0,0 +1,477 @@ +