diff --git a/backend/application.yaml b/backend/application.yaml new file mode 100644 index 0000000..4ac4425 --- /dev/null +++ b/backend/application.yaml @@ -0,0 +1,158 @@ +nutz: + application: + name: budwk-v5-mini-plus + mvc: + ignore: ^(.+[.])(jsp|png|gif|jpg|js|css|jspx|jpeg|html|mp3|mp4|ico|svg|vue)$ + exclusions: /favicon/*,/assets/*,/druid/*,/upload/* +server: + port: 9090 + host: 0.0.0.0 + +jetty: + contextPath: / + threadpool: + idleTimeout: 60000 + minThreads: 10 + maxThreads: 200 + gzip: + enable: true + page: + 403: /error/403.html + 404: /error/404.html + 500: /error/500.html + #结合ftp使用,或用nginx代理ftp路径 + #staticPath: E:/project/NutzWk/upload + #开发模式静态资源 + staticPathLocal: E:/project/company/hmc_gbhd/src/main/resources/static + +security: + tokenName: token + timeout: 3600 + # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + # 允许同一账号并发登录,则系统参数 SessionOnlyOne 有效,亦可踢人下线并多了弹框提示功能 + isConcurrent: true + # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + isShare: true + +redis: + host: 192.168.21.207 + port: 6379 + timeout: 2000 + max_redir: 10 + database: 10 + maxTotal: 150 + pool: + maxTotal: 150 + maxIdle: 50 + minIdle: 10 + #password: test123 + mode: + normal + #cluster + #nodes=192.168.6.31:6377,192.168.6.31:6378,192.168.6.28:6377,192.168.6.28:6378,192.168.6.34:6377,192.168.6.34:6378 + +jdbc: + url: jdbc:mysql://192.168.21.207:3306/hmc_gbhd?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: root + password: root + validationQuery: select 1 + maxActive: 150 + testWhileIdle: true + connectionProperties: druid.stat.slowSqlMillis=2000 + defaultAutoCommit: true + + +xsssql: + ignore: + urls: /platform/cms/content/article/addDo,/platform/sys/app/conf/addDo,/platform/sys/app/conf/editDo + +beetl: + RESOURCE: + #本地路径,开发时设置本地路径,便于调试 + rootLocal: E:/project/company/hmc_gbhd/src/main/resources/views/ + root: views/ + DELIMITER_STATEMENT_START: '' + FT: + #用法: ${"wizzer",escape} + escape: com.budwk.app.web.commons.ext.beetl.HtmlEscapeFormat + #用法: ${10241024,filesize} + filesize: com.budwk.app.web.commons.ext.beetl.FileSizeFormat + #用法: ${"",html2txt="100"} 截取100字符 + html2txt: com.budwk.app.web.commons.ext.beetl.Html2TxtFormat + #用法: ${"",strlen="100"} 截取100字符 + strlen: com.budwk.app.web.commons.ext.beetl.StrlenFormat + +#============================================================== +#Configure Main Scheduler Properties +#============================================================== +#quartz延迟启动秒数 +quartz: + startupDelay: 10 + scheduler: + instanceName: defaultScheduler + instanceId: AUTO + #============================================================== + #Skip Check Update + #update:true + #not update:false + #============================================================== + skipUpdateCheck: true + #============================================================== + #Configure JobStore isClustered=启用集群模式 + #============================================================== + jobStore: + class: org.quartz.impl.jdbcjobstore.JobStoreTX + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate + #driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate + #driverDelegateClass: org.quartz.impl.jdbcjobstore.oracle.OracleDelegate + #Other delegates can see: http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-09.html + dataSource: myDS + tablePrefix: SYS_QRTZ_ + isClustered: false + clusterCheckinInterval: 20000 + maxMisfiresToHandleAtATime: 120 + misfireThreshold: 120000 + txIsolationLevelSerializable: false + + #============================================================== + #Configure ThreadPool + #============================================================== + threadPool: + class: org.quartz.simpl.SimpleThreadPool + threadCount: 2 + threadPriority: 5 + threadsInheritContextClassLoaderOfInitializingThread: true + + #============================================================================ + # Configure Plugins + #============================================================================ + plugin: + triggHistory: + class: org.quartz.plugins.history.LoggingJobHistoryPlugin + shutdownhook: + class: org.quartz.plugins.management.ShutdownHookPlugin + cleanShutdown: true + #============================================================================ + # NutDao dataSource + #============================================================================ + dataSource: + myDS: + connectionProvider: + class: com.budwk.app.task.conn.NutConnectionProvider + + +sms: + enabled: false + #腾讯云短信配置 + tencent: + secret-id: 1 + secret-key: 2 + appid: 1 #应用ID + sign: '萌发开源' #短信签名 + tpl: + #验证码模板ID + code: 1 + #短信通知模板ID + msg: 2 + 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 d66f095..3a922a0 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 @@ -33,6 +33,11 @@ public class Client_user extends BaseModel implements Serializable { @Comment("手机号") private String phone; + @Column + @ColDefine(type = ColType.VARCHAR, width = 18) + @Comment("身份证") + private String idCard; + @Column @ColDefine(type = ColType.VARCHAR, width = 255) @Comment("openId") 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 e062516..d876dd4 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 @@ -13,6 +13,7 @@ import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; @@ -22,6 +23,7 @@ import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.GET; import org.nutz.mvc.annotation.Ok; +import java.time.LocalDateTime; import java.util.List; @IocBean @@ -71,13 +73,25 @@ public class ClientActivityController { /** * 报名 */ - @At("/sign") + @At("/sign-up") @AdaptBy(type = JsonAdaptor.class) @SaCheckLogin(type = StpClientUtil.TYPE) - public Result sign(ClientActivitySignVO signVO) { + public synchronized Result signUp(ClientActivitySignVO signVO) { + clientActivityService.signUp(signVO); return Result.success(); } + /** + * 查询报名人员 + * 报名人不见得参加活动 + */ + @At("/list-signup-user/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result listSignUpUser(Long activityId) { + List list = dao.query(ActUser.class, Cnd.where(ActUser::getActivityId, "=", activityId).and(ActUser::getSignUpUserId, "=", StpClientUtil.STP.getLoginIdAsLong())); + return Result.success(list); + } + /** * 查询我报名的活动 */ @@ -89,11 +103,39 @@ public class ClientActivityController { } /** + * 个人、报名人都可以查询 * 查询报名签到信息 */ @At("/sign-info/?") @SaCheckLogin(type = StpClientUtil.TYPE) public Result signInfo(Long activityId) { + SqlExpressionGroup seg = new SqlExpressionGroup(); + seg.or(ActUser::getUserId, "=", StpClientUtil.STP.getLoginIdAsLong()); + seg.or(ActUser::getSignUpUserId, "=", StpClientUtil.STP.getLoginIdAsLong()); + Cnd cnd = Cnd.NEW(); + cnd.and(seg); + cnd.and(ActUser::getActivityId, "=", activityId); + ActUser actUser = dao.fetch(ActUser.class, cnd); + return Result.success(actUser); + } + + /** + * 签到活动 + */ + @At("/sign-in/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result signIn(Long activityId) { + clientActivityService.signIn(activityId); + return Result.success(); + } + + + /** + * 个人签到信息 + */ + @At("/sign-in-info/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result signInInfo(Long activityId) { ActUser actUser = dao.fetch(ActUser.class, Cnd.where(ActUser::getActivityId, "=", activityId).and(ActUser::getUserId, "=", StpClientUtil.STP.getLoginIdAsLong())); return Result.success(actUser); } 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 new file mode 100644 index 0000000..855a93c --- /dev/null +++ b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientItemController.java @@ -0,0 +1,75 @@ +package com.budwk.app.client.module.activity.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import com.budwk.app.base.result.Result; +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.ActUser; +import com.budwk.app.module.activity.models.ActivityItem; +import com.budwk.app.module.activity.models.ActivityItemUser; +import com.budwk.app.web.commons.auth.satoken.StpClientUtil; +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.mvc.adaptor.JsonAdaptor; +import org.nutz.mvc.annotation.AdaptBy; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +import java.util.List; + +/** + * 项目报名 + */ +@IocBean +@At("/client/item") +@Ok("json:full") +public class ClientItemController { + + @Inject + private Dao dao; + @Inject + private ClientItemService clientItemService; + + @At("/sign-up") + @AdaptBy(type = JsonAdaptor.class) + @SaCheckLogin(type = StpClientUtil.TYPE) + public synchronized Result signUp(ClientItemSignUpVO signVO) { + clientItemService.signUp(signVO); + return Result.success(); + } + + /** + * 获取项目列表 + */ + @At("/list/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result list(Long activityId) { + List items = dao.query(ActivityItem.class, Cnd.where(ActivityItem::getActivityId, "=", activityId)); + return Result.success(items); + } + + /** + * 查询团队成员 + */ + @At("/list-team-user/?") + @SaCheckLogin(type = StpClientUtil.TYPE) + public Result listTeamUser(Long activityId){ + List list = dao.query(ActUser.class, Cnd.where(ActUser::getActivityId, "=", activityId).and(ActUser::getIsSignIn, "=", 1)); + return Result.success(list); + } + + /** + * 查询项目报名人员 + */ + @At("/list-signup-user") + @SaCheckLogin + public Result listSignUpUser(Long activityId,Long itemId) { + List itemUsers = dao.query(ActivityItemUser.class, Cnd.where(ActivityItemUser::getActivityId, "=", activityId).and(ActivityItemUser::getItemId, "=", itemId)); + return Result.success(itemUsers); + } + + +} diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientActivityService.java b/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientActivityService.java index 4e035fe..785db10 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientActivityService.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientActivityService.java @@ -1,6 +1,7 @@ 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.module.activity.models.Activity; import org.nutz.lang.util.NutMap; @@ -13,4 +14,15 @@ public interface ClientActivityService extends BaseService { */ List listMineAct(); + /** + * 报名 + */ + void signUp(ClientActivitySignVO signVO); + + /** + * 报名签到 + */ + void signIn(Long activityId); + + } 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 new file mode 100644 index 0000000..4747296 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/client/module/activity/service/ClientItemService.java @@ -0,0 +1,9 @@ +package com.budwk.app.client.module.activity.service; + +import com.budwk.app.base.service.BaseService; +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); +} diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java b/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java index e52e04e..66b53c7 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java @@ -1,15 +1,23 @@ package com.budwk.app.client.module.activity.service.impl; +import com.budwk.app.base.exception.BaseException; +import com.budwk.app.base.result.Result; import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.client.auth.models.Client_user; import com.budwk.app.client.module.activity.service.ClientActivityService; +import com.budwk.app.client.module.activity.vo.ClientActivitySignVO; +import com.budwk.app.module.activity.models.ActUser; import com.budwk.app.module.activity.models.Activity; import com.budwk.app.web.commons.auth.satoken.StpClientUtil; +import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; @IocBean(args = {"refer:dao"}) @@ -33,4 +41,63 @@ public class ClientActivityServiceImpl extends BaseServiceImpl impleme sql.setParam("userId", StpClientUtil.STP.getLoginIdAsLong()); return listMap(sql); } + + @Override + public void signUp(ClientActivitySignVO signVO) { + LocalDateTime now = LocalDateTime.now(); + + List userList = signVO.getUserList(); + // 首先检查报名人员是否已经在用户表中 + for (ActUser user : userList) { + Client_user clientUser = dao().fetch(Client_user.class, Cnd.where(Client_user::getIdCard, "=", user.getIdCard())); + if (clientUser == null) { + // 创建用户 + clientUser = new Client_user(); + clientUser.setUserName(user.getUserName()); + clientUser.setSex(user.getSex()); + clientUser.setPhone(user.getPhone()); + clientUser.setIdCard(user.getIdCard()); + dao().insert(clientUser); + } else { + // 验证用户之前是不是已经报名 别人帮报 自己报 管理员报 + ActUser hisActUser = dao().fetch(ActUser.class, Cnd.where(ActUser::getUserId, "=", clientUser.getId()).and(ActUser::getActivityId, "=", signVO.getActivityId())); + if (hisActUser != null) { + if (!hisActUser.getSignUpUserId().equals(StpClientUtil.STP.getLoginIdAsLong())) { + throw new BaseException("【" + hisActUser.getUnitName() + "】" + clientUser.getUserName() + "已经报名了,请勿重复报名!"); + } + } + } + + user.setActivityId(signVO.getActivityId()); + user.setUserId(clientUser.getId()); + user.setUnitName(signVO.getUnitName()); + user.setSignUpContacts(signVO.getContactName()); + user.setSignUpMobile(signVO.getContactPhone()); + user.setSignUpUserId(StpClientUtil.STP.getLoginIdAsLong()); + user.setSignUpTime(now); + } + + // delete then insert so easy + + // 删除旧的报名人员 + dao().clear(ActUser.class, Cnd.where(ActUser::getActivityId, "=", signVO.getActivityId()).and(ActUser::getSignUpUserId, "=", StpClientUtil.STP.getLoginIdAsLong())); + + // 插入新的报名人员 + dao().insert(userList); + } + + @Override + public void signIn(Long activityId) { + ActUser actUser = dao().fetch(ActUser.class, Cnd.where(ActUser::getActivityId, "=", activityId).and(ActUser::getUserId, "=", StpClientUtil.STP.getLoginIdAsLong())); + if (actUser == null) { + throw new BaseException("您未报名该活动"); + } + if (actUser.getIsSignIn()) { + throw new BaseException("您已签到,请勿重复签到"); + } + // 更新签到信息 + actUser.setIsSignIn(true); + actUser.setSignInTime(LocalDateTime.now()); + dao().update(actUser, "isSignIn|signInTime"); + } } 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 new file mode 100644 index 0000000..7201e99 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientItemServiceImpl.java @@ -0,0 +1,38 @@ +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.ClientItemSignUpVO; +import com.budwk.app.module.activity.models.ActivityItemUser; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.IocBean; + +import java.util.List; + +@IocBean(args = {"refer:dao"}) +public class ClientItemServiceImpl extends BaseServiceImpl implements ClientItemService { + public ClientItemServiceImpl(Dao dao) { + super(dao); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public void signUp(ClientItemSignUpVO signVO) { + // 删除掉之前的 + clear(Cnd.where(ActivityItemUser::getActivityId, "=", signVO.getActivityId()) + .and(ActivityItemUser::getGroupId, "=", signVO.getGroupId()) + .and(ActivityItemUser::getItemId, "=", signVO.getItemId()) + ); + + List userList = signVO.getUserList(); + for (ActivityItemUser itemUser : userList) { + itemUser.setActivityId(signVO.getActivityId()); + itemUser.setItemId(signVO.getItemId()); + itemUser.setGroupId(signVO.getGroupId()); + } + insert(userList); + } +} diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/vo/ClientActivitySignInVO.java b/backend/src/main/java/com/budwk/app/client/module/activity/vo/ClientActivitySignInVO.java new file mode 100644 index 0000000..937c13f --- /dev/null +++ b/backend/src/main/java/com/budwk/app/client/module/activity/vo/ClientActivitySignInVO.java @@ -0,0 +1,4 @@ +package com.budwk.app.client.module.activity.vo; + +public class ClientActivitySignInVO { +} 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 f69d208..fc7c3ed 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 @@ -11,7 +11,7 @@ import java.util.List; @Data public class ClientActivitySignVO { - private String activityId; + private Long activityId; private String unitName; diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/vo/ClientItemSignUpVO.java b/backend/src/main/java/com/budwk/app/client/module/activity/vo/ClientItemSignUpVO.java new file mode 100644 index 0000000..0392944 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/client/module/activity/vo/ClientItemSignUpVO.java @@ -0,0 +1,19 @@ +package com.budwk.app.client.module.activity.vo; + +import com.budwk.app.module.activity.models.ActivityItemUser; +import lombok.Data; + +import java.util.List; + +@Data +public class ClientItemSignUpVO { + + private Long activityId; + + private Long itemId; + + private Long groupId; + + private List userList; + +} 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 fe5902d..95aed80 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 @@ -87,7 +87,7 @@ public class ActUserController { // 报名时间 LocalDateTime localDateTime = DateUtil.date().toLocalDateTime(); // 活动id - Long activityId = Long.parseLong(vo.getActivityId()); + Long activityId = vo.getActivityId(); List userList = vo.getUserList(); 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 ba5f07d..e4aae90 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 @@ -54,7 +54,7 @@ public class ActivityManageController { @At @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("activity.manager") - public Result save(Activity activity) { + public Result save(@Param("activity") Activity activity) { // activityService.insertWith(activity, "items"); activityService.insert(activity); return Result.success(); @@ -66,7 +66,7 @@ public class ActivityManageController { @At @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("activity.manager") - public Result update(Activity activity) { + public Result update(@Param("activity")Activity activity) { activityService.updateIgnoreNull(activity); diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java index ed59312..56a498e 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java @@ -98,6 +98,7 @@ public class ActUser extends BaseModel { @Column @Comment("是否签到") @ColDefine(type = ColType.BOOLEAN) + @Default("0") private Boolean isSignIn; @Column diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/Activity.java b/backend/src/main/java/com/budwk/app/module/activity/models/Activity.java index c66cbd8..cb6c2a9 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/models/Activity.java +++ b/backend/src/main/java/com/budwk/app/module/activity/models/Activity.java @@ -1,5 +1,6 @@ package com.budwk.app.module.activity.models; +import cn.hutool.json.JSONObject; import com.budwk.app.base.model.BaseModel; import lombok.Data; import lombok.EqualsAndHashCode; @@ -69,11 +70,21 @@ public class Activity extends BaseModel { @ColDefine(type = ColType.TEXT) private String content; + @Comment("承诺书") + @Column + @ColDefine(type = ColType.TEXT) + private String protocol; + @Comment("封面") @Column @ColDefine(type = ColType.VARCHAR, width = 500) private String cover; + @Comment("附件") + @Column + @ColDefine(type = ColType.MYSQL_JSON) + private List files; + /** * 项目列表 */ diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java index 23cb25a..7ac7413 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java @@ -36,6 +36,16 @@ public class ActivityItem extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 300) private String rule; + @Comment("图片") + @Column + @ColDefine(type = ColType.VARCHAR, width = 300) + private String img; + + @Comment("项目人数") + @Column + @ColDefine(type = ColType.INT) + private Integer num; + @Comment("排序") @Column @ColDefine(type = ColType.INT) diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItemUser.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItemUser.java new file mode 100644 index 0000000..35e0ba5 --- /dev/null +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItemUser.java @@ -0,0 +1,34 @@ +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.*; + +@Data +@Table("act_item_user") +@Comment("项目报名人员") +@EqualsAndHashCode(callSuper = true) +@TableMeta("{'mysql-charset':'utf8mb4'}") +public class ActivityItemUser extends BaseModel { + + @Id + @Comment("ID") + private Long id; + + @Column + @Comment("活动ID") + private Long activityId; + + @Column + @Comment("项目ID") + private Long itemId; + + @Column + @Comment("报名人Id") + private Long userId; + + @Column + @Comment("分组ID") + private Long groupId; +} diff --git a/backend/src/main/java/com/budwk/app/web/commons/auth/satoken/aop/SaCheckAnyLoginInterceptor.java b/backend/src/main/java/com/budwk/app/web/commons/auth/satoken/aop/SaCheckAnyLoginInterceptor.java index 0e3dcbf..965e0b9 100644 --- a/backend/src/main/java/com/budwk/app/web/commons/auth/satoken/aop/SaCheckAnyLoginInterceptor.java +++ b/backend/src/main/java/com/budwk/app/web/commons/auth/satoken/aop/SaCheckAnyLoginInterceptor.java @@ -3,6 +3,7 @@ package com.budwk.app.web.commons.auth.satoken.aop; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.exception.NotLoginException; +import com.budwk.app.web.commons.auth.satoken.StpClientUtil; import org.nutz.aop.InterceptorChain; import org.nutz.aop.MethodInterceptor; import org.nutz.ioc.loader.annotation.IocBean; @@ -15,7 +16,7 @@ public class SaCheckAnyLoginInterceptor implements MethodInterceptor { public void filter(InterceptorChain chain) throws Throwable { Method method = chain.getCallingMethod(); - boolean mini = SaManager.getStpLogic("mini").isLogin(); + boolean mini = SaManager.getStpLogic(StpClientUtil.TYPE).isLogin(); boolean web = SaManager.getStpLogic("login").isLogin(); if (mini || web) { chain.doChain(); diff --git a/backend/src/main/java/com/budwk/app/web/controllers/open/file/UploadController.java b/backend/src/main/java/com/budwk/app/web/controllers/open/file/UploadController.java index d80cf92..925b249 100644 --- a/backend/src/main/java/com/budwk/app/web/controllers/open/file/UploadController.java +++ b/backend/src/main/java/com/budwk/app/web/controllers/open/file/UploadController.java @@ -45,7 +45,7 @@ public class UploadController { @Ok("json") @SaCheckLogin //AdaptorErrorContext必须是最后一个参数 - public Object file(@Param("Filedata") TempFile tf, HttpServletRequest req, AdaptorErrorContext err) { + public Object file(@Param("file") TempFile tf, HttpServletRequest req, AdaptorErrorContext err) { try { if (err != null && err.getAdaptorErr() != null) { return NutMap.NEW().addv("code", 1).addv("msg", "文件不合法"); diff --git a/backend/src/main/resources/static/components/plugins/fileUpload/index.vue b/backend/src/main/resources/static/components/plugins/fileUpload/index.vue new file mode 100644 index 0000000..0ea3076 --- /dev/null +++ b/backend/src/main/resources/static/components/plugins/fileUpload/index.vue @@ -0,0 +1,274 @@ + + + + + \ No newline at end of file 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 8cfc7f9..343e919 100644 --- a/backend/src/main/resources/static/components/plugins/imageUpload/index.vue +++ b/backend/src/main/resources/static/components/plugins/imageUpload/index.vue @@ -89,6 +89,7 @@ module.exports = { handleSuccess(response, file, fileList) { if (response.code === 0) { if (this.maxCount === 1) { + debugger this.$emit('input', response.data) } else { @@ -122,9 +123,5 @@ module.exports = { \ No newline at end of file diff --git a/backend/src/main/resources/views/layouts/platform_1.html b/backend/src/main/resources/views/layouts/platform_1.html index 8fdb10d..1aaa746 100644 --- a/backend/src/main/resources/views/layouts/platform_1.html +++ b/backend/src/main/resources/views/layouts/platform_1.html @@ -57,6 +57,7 @@ Vue.component("table-tool", httpVueLoader("/components/plugins/sysTableTool/index.vue?v=" + new Date().getTime())) Vue.component("text-editor", httpVueLoader("/components/plugins/textEditor/index.vue?v=" + new Date().getTime())) Vue.component("image-upload", httpVueLoader("/components/plugins/imageUpload/index.vue?v=" + new Date().getTime())) + Vue.component("file-upload", httpVueLoader("/components/plugins/fileUpload/index.vue?v=" + new Date().getTime())) 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 d2100b6..eb03b96 100644 --- a/backend/src/main/resources/views/platform/activity/manage/addOrUpdate.js +++ b/backend/src/main/resources/views/platform/activity/manage/addOrUpdate.js @@ -55,6 +55,13 @@ const addOrUpdate = { + + + + + {{form.files}} + + + + +