编辑 | blame | 历史 | 原始文档

蓉易创项目

一、重要提示(不可违反)

全程使用中文!

不要修改和你无关的代码!

数据库表结构已经设计好了,你可以通过jdbc 创建要给test 函数来访问数据库获取表结构!, 不要在命令行里面执行mysql ,我没有安装!!!

修改任何功能都先对应查询对应模块的功能要求!

所有新增、编辑页面都是公用一个页面。

每个实体类都有对应的 Input 类型:id=null 表示新增,id≠null 表示修改。

关联媒体资源规则:

user 关联的头像、activity 关联的视频 / 图片、carousel 关联的视频 / 图像,均对应 t_media 数据表(实体类:Media);

通过 Target 字段关联区分。

二、需求描述

学员登录小程序 → 点击报名并录入报名信息 → 工作人员审核报名资料 → 评委评审资料,按比赛对应评分表给学员打分并填写评论。

三、Web 端需求

3.1 登录页面

核心功能:支持「手机号 + 密码」登录;

预留功能:微信扫码登录入口。

3.2 登录后首页(标准工作台模板)

区域 内容描述

左侧菜单 包含「比赛管理」「评委管理」「评分模板」「比赛报名」「新闻与推广」「员工管理」

右侧工作区 展示核心数据:当前进行比赛、参赛总人数、报名待审核人数

3.3 比赛管理(实体类:Activity)

3.3.1 比赛列表

顶部功能:查询框(支持按「比赛名称」模糊查询)、【新增比赛】按钮;

列表字段:比赛名称、报名人数、比赛时间、报名截至时间;

操作列:查看选手、编辑、删除。

3.3.2 比赛详情

基础信息配置:

比赛名称(最大长度≤30 字符);

报名截至日期(日历组件选择);

比赛开始时间(精确到「年月日 时分」);

比赛地址、最大参赛人数、比赛描述;

关联配置:选择评分模板、上传视频 / 图片(参考「五、设计要点」)。

比赛阶段定义(重要):

数据关联:比赛阶段与比赛共用 t_activity 表,通过 pid 关联(父 ID 为比赛 ID);

阶段配置项:

阶段名称(最大长度≤30 字符);

阶段开始时间(精确到「年月日 时分」);

阶段地址、阶段最大参赛人数、阶段描述;

评分模板(默认继承比赛模板,支持单独选择);

阶段列表操作:查看选手、编辑、删除。

3.4 评委管理(实体类:Judge)

3.4.1 评委列表

展示字段:头像、评委名称、专业标签、联系电话、性别。

3.4.2 评委详情

基础信息:评委名称、头像、性别、联系电话;

标签配置:专业标签(支持多选,参考「五、设计要点 3」);

补充信息:评委详情描述。

3.5 评分模板管理(实体类:RatingScheme)

3.5.1 评分模板列表

展示字段:模板名称、模板总分。

3.5.2 评分模板详情

基础配置:模板名称;

条目管理:

支持「新增 / 删除」评分条目(已绑定比赛的模板不可删除);

条目字段:条目名称、条目分值。

3.6 学员管理(实体类:Player)

3.6.1 学员列表

展示字段:学员头像、学员名称、报名的比赛名称、申请时间。

3.6.2 学员详情

基础信息:学员名称、头像、联系电话;

参赛记录列表(1 个学员可报多个比赛):

展示字段:比赛名称、当前状态;

状态说明:0-报名未审核、1-进行中、2-审核未通过、3-结束;

特殊规则:比赛结束后,「得分」「名次」不可修改。

3.7 新闻管理(实体类:Carousel)

3.7.1 新闻列表

展示字段:新闻名称、创建时间。

3.7.2 新闻播放设置(关联表:t_carousel_sort)

操作入口:列表查询按钮右侧 → 【设置播放】按钮;

设置页面:

顶部:新闻查询框;

下方:新闻列表,操作列支持「设置播放顺序」。

3.7.3 新闻详情

内容配置:新闻名称、新闻正文;

媒体配置:上传新闻关联的视频 / 图片;

播放配置:设置视频 / 图片的播放顺序。

3.8 权限角色

模型:采用标准 RBC(基于角色的访问控制)模型;

角色规则:内置 4 类角色(不可修改 / 编辑):学员、平台人员、评委、管理员。

3.9 专业标签管理(关联表:t_tag)

3.9.1 专业标签列表

支持功能:新增专业标签;

默认规则:新增标签的 code 与标签名称一致。

3.10 消息管理

功能:展示所有已发送的系统消息(含消息内容、发送时间、接收对象等)。

3.11 比赛报名(关联表:t_activity_player,t_player)
列表字段:

  • 学员名称(来自 t_player.name)
  • 报名项目(活动名称,t_activity_player.activity_id 关联 t_activity)
  • 联系电话(来自 t_player.phone)
  • 报名时间(t_activity_player.create_time)
  • 当前状态(按上述状态说明显示)

排序规则:

  • 默认按报名时间(create_time)降序,最新在最前

数据来源与关联:

  • 主表:t_activity_player,关联学员表 t_player(player_id),关联比赛表 t_activity(activity_id)
  • 注意:t_activity_player.activity_id 始终关联"比赛";t_activity_player.stage_id 必须关联该比赛的"阶段"ID。若该比赛未定义阶段(t_activity 无子记录 pid=activity_id),则将 stage_id 设为 activity_id(指向比赛自身)。

GraphQL 规范:

  • schema 文件放在 resources/graphqls/player.graphqls
  • 所有 query/mutation 必须 extend scheme.graphqls,避免重复定义问题

前端按钮规则(根据 state):

  • 0(报名未审核):显示按钮【审核通过】
  • 1(进行中,已通过):显示按钮【取消资格】
  • 2(审核未通过):显示【审核未通过】,无操作按钮

3.12 多评委评分系统

3.12.1 系统概述

多评委评分系统支持多个评委对同一选手进行独立评分,系统自动计算平均分,确保评分的公正性和透明度。

3.12.2 核心功能

评分页面增强:

  • 显示当前评委信息(姓名)
  • 展示所有评委的评分状态(已评分/未评分)
  • 显示选手的平均分
  • 支持评委查看和修改自己的评分

评分状态管理:

  • 实时显示各评委的评分进度
  • 区分当前评委和其他评委
  • 显示每个评委的总分(已评分的情况下)

数据计算:

  • 自动计算选手的平均分
  • 支持评委修改评分后重新计算
  • 保持评分历史记录

3.12.3 技术实现

前端实现(Vue.js):

  • 组件:RatingForm.vue - 增强评分表单组件
  • 页面:rating.vue - 评分页面
  • API:activityPlayer.js - 新增多评委相关接口

后端实现(Spring Boot + GraphQL):

  • API:PlayerGraphqlApi.java - 新增GraphQL查询方法
  • 服务:ActivityPlayerRatingService.java - 评分业务逻辑
  • DTO:新增响应类型支持多评委数据

新增GraphQL查询:

  • judgeRatingsForPlayer - 获取选手的所有评委评分状态
  • currentJudgeRating - 获取当前评委的评分详情
  • averageScoreForPlayer - 获取选手平均分
  • currentJudgeInfo - 获取当前评委信息

3.12.4 数据结构

评委评分状态响应(JudgeRatingStatusResponse):

  • judgeId - 评委ID
  • judgeName - 评委姓名
  • totalScore - 总分
  • status - 评分状态(0-未评分,1-已评分)
  • isCurrentJudge - 是否为当前评委

当前评委评分响应(CurrentJudgeRatingResponse):

  • id - 评分记录ID
  • totalScore - 总分
  • status - 评分状态
  • remark - 评分备注
  • items - 评分项目详情列表

当前评委信息响应(CurrentJudgeInfoResponse):

  • id - 评委ID
  • name - 评委姓名
  • phone - 联系电话
  • description - 评委描述

3.12.5 业务规则

评分权限:

  • 评委只能查看和修改自己的评分
  • 评委可以查看其他评委的评分状态(已评分/未评分)
  • 评委可以查看选手的平均分

评分流程:

  • 评委进入评分页面,系统显示当前评委信息
  • 显示所有评委的评分状态
  • 如果当前评委已评分,加载其历史评分数据
  • 评委提交评分后,系统重新计算平均分
  • 实时更新评分状态显示

数据一致性:

  • 评分提交后立即更新数据库
  • 重新加载页面数据确保状态同步
  • 支持评委多次修改评分
  • 3(结束):显示【已结束】,无操作按钮

四、微信端需求

聚焦“学员报名”“评委评审”“平台用户查询比赛进程和报名人数等等信息”核心场景,简化交互,避免冗余操作。

#### 登录

  小程序登录,使用微信标准小程序登录流程,

  后台对应 wxLogin 方法。(不是webLogin)

  登录逻辑:

  1. 如果t_user 里面 没有对应的 openid ,那么新增一个user 记录

  2. 如果存在user 记录, 则分别关联 t_player ,t_judge ,t_employee 表里面的 user_id, 返回前端的userDto 应该包含 player, judge, employee 的信息(如果有的话)

  3. 电话号码关联(非常重要)

  后台有个 saveUserPhone 的方法,小程序端或者web端更新电话后都必须调用这个方法,他的核心逻辑是:

  1,查询当前t_user 里面的是否存在相同的电话号码,如果没有,就更新到当前user里面

  2. 如果存在相同的电话号码,并且对应user的openid 是null ,那么 清空原来user 的phone 设置为null, 把新的电话号码更新到 当前用户的phone字段,(因为电话号码不可重复), 同时更新t_player, t_judge, t_employee 关联的user_id 到 新的user_id

 

#### 2.3.1 首页

- 顶部:展示“启用”状态的轮播图(按排序号播放)。

- 赛事列表:显示“封面图+比赛名称+已报名人数+截止倒计时”,已截止标红;未截止赛事带“详情”按钮,跳转详情页面。

- toolbar显示首页,消息,我的。三个模块。

  第一次打开小程序, 弹出手机号码授权,但是要有明显的【取消】按钮,用户可以不授权,如果用户取消授权,把 rejectPhone 记录到wx.setstorage 里面。 下次登录不在提醒授权手机号码。

 

#### 2.3.2 详情页面

  顶部是比赛的图片和视频

  下面是比赛名称

  比赛开始时间

  报名截至时间。

  比赛简介

  最下面是报名按钮

  如果当前用户已经在这个比赛报过名,未审核, 那么显示【已报名-待审核】

  如果当前用户已经在这个比赛报过名,已经审核, 那么显示【已报名-进行中】

  如果当前用户已经在这个比赛报过名,已经审核, 那么显示【已结束】

  “当前时间大于截至时间” 灰色显示“报名已结束”, 不可报名

  “当前时间大于比赛时间+24 小时, 那么显示【已结束】

  当前未报名状态,并且时间状态符合要求,那么显示 按钮【我要报名】

### 报名页面

  头像

  姓名

  电话:必填,并且不可录不可编辑(防止有人恶意注册他人电话号码),如果当前user(t_user 有电话号码,就带出) 只能在旁边有个按钮【获取电话】,调用微信小程序授权获取电话。

  以上信息如果t_user 里面有就自动带过来,没有是必填项。

  区域选择:来至于t_region ,必填

  比赛名称:来自于上个比赛详情页面, 编辑时后台dto需要后台带出包含这个字段的activity.

  个人简介:必填

  项目名称:必填

  项目介绍:必填

  文档资料:必填(最少一个),最多5个,支持视频,图片,word,pdf 文件。

 

  提交按钮

#### 2.3.3 我的

- 顶部是头像,下面是姓名,旁边是设置按钮。点击进入设置。

- 如果用户关联学员,就显示【我的比赛】。

- 如果用户关联评委,就显示【我的评审】。

- 如果用户关联员工,就显示【我的工作】。

- 列表展示:每个比赛显示“封面图+名称+进度条(待审核→审核通过→评审中→已出结果)+最终得分(评审后显示)”。

- 详情查看:点击“详情”可看提交资料、审核结果(拒绝显原因)、评审评语(评审后显)。

#### 2.3.4 消息

- 仅展示系统推送(审核结果、评审完成提示),按时间倒序,不支持回复。

#### 2.3.5 评委身份功能

- **我的评审**:

  - 分类展示:分“未评审”“已评审”tab页,显示“比赛名称+学员姓名+评审状态”。

  - 筛选支持:按比赛名称筛选任务。

- **评审操作**:

  - 资料查看:点击“未评审”学员,查看其报名资料。

  - 评分提交:展示评分模板(评分项+满分值),必填得分(校验不超满分),可选填评语;提交后不可修改。

- **消息**:仅展示系统通知(新评审任务、评审完成确认),按时间倒序,不支持回复。

五、设计要点

列表通用规则:所有模块的列表页面,均需包含「查询」「新增」功能;

媒体资源存储(关联表:t_media):

覆盖场景:user 头像、player 头像、activity 视频 / 图片、activityPlayer 报名资料、judge 头像、employee 头像、carousel 视频 / 图片;

区分规则:通过 TargetType 枚举区分资源类型(需定义包含上述所有场景的枚举);

标签管理(表:t_tag):

区分规则:通过 category 字段区分标签类型(例:专业标签的 category = 'major')。

六、环境配置

开发环境:Windows 系统,命令行工具:PowerShell;

JDK 配置:Java 25,安装路径:C:\Program Files\Java\jdk-25。

使用环境变量里面的mave。

七、技术规范

7.1 目录规范

根目录按「端 / 模块」拆分,backend 内部按「业务模块」划分,结构如下:

plaintext

backend/src/main/java/com/rongyichuang/

├── config/ # 全局配置(RabbitMQ、GraphQL、跨域等)

├── judge/ # 评委模块

│ ├── api/ # GraphQL接口(如JudgeGraphqlApi.java)

│ ├── entity/ # 实体类(如Judge.java)

│ ├── dto/ # 数据传输对象(分request/response子目录)

│ ├── service/ # 业务逻辑(如JudgeService.java,无单独接口层)

│ └── util/ # 模块内工具类

├── rating/ # 评分模板模块(结构同judge)

├── activity/ # 比赛模块(结构同judge)

├── player/ # 参赛人员模块(结构同judge)

├── carousel/ # 轮播图(新闻)模块(结构同judge)

├── employee/ # 平台员工模块(结构同judge)

└── common/ # 公共模块

  ├── entity/ # 基础实体(如BaseEntity.java,含id/state)

  ├── dto/ # 公共DTO(如PageRequest.java)

  ├── exception/ # 全局异常处理(如GlobalExceptionHandler.java)

  └── util/ # 全局工具类(如DateUtil.java)

7.2 GraphQL 配置

文件路径:resources/graphql/;

命名规则:每个业务模块对应 1 个 graphqls 文件(例:评委模块 → judge.graphqls)。 业务模块的graphql里面query,Mutation都要extend scheme.graphqls ,不然会包重复的错误!

7.3 安全框架

采用 Spring Security + Token 实现身份认证与接口授权。

7.4 事务控制

作用范围:service 层核心业务方法(如评委评分、学员审核);

实现方式:添加 @Transactional 注解,确保数据一致性。

7.5 逻辑删除

通用规则:所有实体类含 state 字段(类型:int (1),默认值:1);

查询过滤:JPA 父接口添加 @Where(clause = "state = 1"),自动过滤已删除数据;

特殊说明:activityPlayer 的 state 含义与其他实体不同(参考 3.6.2 状态说明)。

7.6 云存储规范

存储目标:视频、图片上传至「腾讯云存储桶」;

目录规则:按「yyyyMMdd」(年月日)创建目录,当日资源存入对应目录。

7.8 前端代码是js ,不要用ts

八、资源信息

8.1 数据库连接(MySQL)

说明:以后端 application.yml 为准,避免环境不一致。

当前配置(摘自 backend/src/main/resources/application.yml):

超时建议:

  • 在测试或批量操作场景下,追加 connectTimeout=60000、socketTimeout=60000 以提高稳定性。

8.2 RabbitMQ 连接

yaml

rabbitmq:

  host: 140.143.152.226

  port: 5672

  virtual-host: ryc_prod

  username: admin

  password: ycl@2020

  connection-timeout: 15000

8.3 腾讯云存储(COS)

SecretId:AKIDZ4Pcj9zbgaZgl6yJf0HSXXHzfGl9PcdT

SecretKey:qjYFnCas0xseEdsxrsobKuJiwzrZ7dzC

Bucket:ryc-1256886520

Region:ap-chengdu

Git 服务:

IP: http://42.193.1.25:9521/

用户名:ai

密码:ai@ycl2025

库:

微信小程序开发者工具

路径:C:\Program Files (x86)\Tencent\微信web开发者工具