# 竞技运动科学大会服务小程序 已实现原生微信小程序、会务管理后台和持久化 API。按学校官网配色方向调整为绿瓦绿、薄荷白和少量橙色点缀,统一表单、日期导航、活动卡片、凭证和状态反馈。配色来源、数字界面色值与适配说明见 [学校官网配色参考](docs/theme.md)。 已按后续提供的 HTML 原型调整为紧凑信息卡布局:顶部截止提示、双按钮会议主题卡、日期时间轴、合并报名列表与浅底凭证。新增参会身份/食宿需求分段选项和可由会务后台发布的图片直播相册,详见 [原型调整说明](docs/prototype-adjustment.md)。 ## 立即体验 当前后端已部署到服务器,小程序默认连接 `http://101.201.211.149`: - [服务器管理后台](http://101.201.211.149/admin/) - [服务器参会端预览](http://101.201.211.149/preview/) 当前为IP/HTTP联调,真实AppID/AppSecret已配置,服务器取得微信access_token验证成功;实际身份/手机号授权待开发者工具或真机验收,订阅发送仍需模板配置。公网服务关闭开发登录。管理员沿用原账号,部署与维护记录见 [服务器部署说明](docs/deployment-101.201.211.149.md)。 微信报名流程已增加登录门禁和手机号主动授权:先登录再填写报名,授权号码自动填入并置灰只读,已有报名号码保持;未授权手机号时需先授权再提交报名。项目已换为真实AppID,后续HTTPS域名及平台权限核对见[微信登录接入说明](docs/wechat-login-setup.md)。浏览器预览不模拟真实微信授权成功。 以下命令保留本机服务能力: Windows 双击项目根目录 `start-local.cmd`,或在此目录执行: ```powershell powershell -ExecutionPolicy Bypass -File scripts/start-local.ps1 ``` 脚本优先使用 Node.js 24+,本机系统 Node16 时自动使用已安装的 Codex Node24 运行时。其他电脑需安装含npm的 [Node.js 24 或更新版本](https://nodejs.org/)。首次启动会按`package-lock.json`安装官方阿里云短信SDK依赖;也可手动执行`npm ci --ignore-scripts`。小程序端无需npm构建。 - 参会端浏览器体验:[http://127.0.0.1:3000/preview/](http://127.0.0.1:3000/preview/) - 会务管理后台:[http://127.0.0.1:3000/admin/](http://127.0.0.1:3000/admin/) - 管理员账号默认 `admin`;**首次初始化的随机密码在启动终端输出**。本次已启动实例的访问信息另保存在本机 `server/data/local-access.txt`,该目录不纳入版本控制,也不经 HTTP 暴露。 - 本地开发登录需 `.env` 中 `ALLOW_DEV_LOGIN=true`,小程序 `config.js` 中 `development:true`。界面会明确提示本地体验账号。 - 浏览器体验器直接渲染 `miniprogram/` 下的 WXML、WXSS 和页面控制器;原生小程序源码独立可导入,浏览器体验器用于本地联调。 - 默认小程序和浏览器预览请求服务器API,数据在服务器后台维护;本地后台仍连接本机数据库,两份数据不会自动双向同步。测试脚本使用独立内存数据库,不污染业务库。 如果已有进程占用3000端口,直接访问运行中的服务;或修改 `.env` 的 PORT,同时修改小程序 `config.js` 的 apiBase。`Ctrl+C` 停止服务。 ## 微信开发者工具导入 1. 选择“导入项目”,目录选此项目根目录(包含 `project.config.json`),小程序目录已设为 `miniprogram/`。 2. 项目已配置真实AppID;使用有该小程序开发权限的微信账号登录开发者工具。游客模式不提供真实微信身份或手机号授权。 3. 启动本地服务;本地调试在开发者工具中关闭合法域名校验。当前 `urlCheck:false` 只用于本地。 4. `miniprogram/config.js` 当前连接 `http://101.201.211.149`,重新编译后使用远程后端。IP/HTTP用于开发者工具联调,正式体验应使用配置好的HTTPS域名及真实AppID。如需恢复纯本地开发,将API改为`http://127.0.0.1:3000`并将`development`设为`true`,本机服务的`ALLOW_DEV_LOGIN`也需启用;手机中的127.0.0.1指手机自身。 5. 无 npm 组件构建步骤,无需云开发环境。 ## 功能范围 | 模块 | 已实现 | | --- | --- | | 会议公开信息 | 大会通知与多图浏览、首页新通知提示与本机已读、主协承办单位、参会须知、专家全文搜索/身份筛选/学术名片/简介展开,职称职务/单位/专家简介/参会身份/报告题目、FAQ、使用指南、电话与微信咨询 | | 日程 | 日期与环节筛选、详情、后台变更同步;后台发布的新增跨月日期可选择 | | 地点交通 | 场地地址、报到位置、交通/食宿说明、复制地址;配置核实后的经纬度即可调用微信地图导航 | | 参会报名 | 登录、姓名/单位/职务/手机号/饮食/住宿/备注、逐项校验、信息用途确认、唯一编号凭证、去重、起止时间控制、截止前修改 | | 微信手机号 | 登录前报名门禁、主动授权后自动填写并只读、服务器绑定与水印/身份校验、报名号码不可自行更改、退出换号隔离;真实调用待平台配置 | | 原型新增报名选项 | 教练员/科研人员/院校师生/企业研发/其他身份分类;无需安排/仅住宿/住宿+用餐需求;独立保存、修改恢复、后台查看与CSV导出,不改变授权角色 | | 特邀嘉宾 | 会务组配置私有邀请码,报名时验证并标记嘉宾;错误非空邀请码拒绝提交 | | 配套活动 | 校园跑、工间操及后台新增活动;新增/删除/排序/图标,时间/地点/路线/须知及图文视频,原子名额与去重,删除保留历史记录;见[活动管理说明](docs/activities-management.md) | | 消息 | 报名及活动成功站内确认、消息已读、定向变更通知、会前提醒调度、微信订阅授权/发送适配与重试诊断 | | 阿里云短信 | 名单分组/搜索/逐人勾选、模板变量映射与草稿、逐人预览、计费确认、持久化队列与发送记录、回执查询;默认关闭,开通及配置见[短信接入说明](docs/sms-setup.md) | | 管理后台 | 管理员账号密码、账号新增/删除保护、统计、各栏目结构化编辑/草稿/发布/下架、通知/日程/嘉宾/活动定时发布 | | 名单与现场 | 姓名/单位/手机号/编号搜索、报名日期和活动筛选、UTF-8 BOM CSV、报到标记、现场临时登记、资料更正、报到统计 | | 媒体与数据 | 图片/MP4上传、文件类型与大小检查、SQLite持久化、事务、身份权限、导出公式防护、历史活动快照 | | 图片直播 / 现场相册 | 首页封面入口、公开照片网格/分类/大图、30秒可见页刷新、失败重试;后台上传/封面/草稿/发布/定时/删除及状态管理 | 详细对应见 [功能与验收对照](docs/requirements-coverage.md)。不包含收费/支付、酒店预订、视频直播/视频会议或硬件签到;图片直播为后续HTML原型新增的会务照片相册。 ## 基础内容与需要补齐的素材 需求已确定的大会时间为2026年11月27—30日,上海体育大学清源环路650号;线上参会报名2026年11月10日17:00(北京时间)截止。校园跑11月28日06:30—07:30,工间操11月29日同一时段。 详细日程已按用户提供的第二轮通知截图录入:27日12:00—22:00报到,27—29日共50项安排(含两项独立管理的配套活动)。同一报告跨多行时段已合并,主题、环节编号、报告人和单位均支持后台维护;原表两处“专题报告7”保留原编号。30日未提供具体议程,页面显示待公布。来源与录入范围见 [日程更新说明](docs/schedule-update.md)。**每项活动100人容量、10月1日报名开放及活动默认截止时间仍是可编辑的本地初始配置,不是会务组确认数据。** 嘉宾头像与介绍、活动媒体、详细路线/集合点及地图坐标需会务组确认后录入。缺失信息显示更新中,不填虚构专家和电话。地图区域为地址示意,未配置坐标前不假定定位。 ## 管理员操作 1. “大会信息”维护通知全文、地址、联系方式、邀请码及报名时间。 2. “会议日程”“特邀嘉宾”“大会通知”等栏目新增和编辑;可存草稿、立即发布或按北京时间定时发布。大会通知发布后,首页“大会正式通知”对本机未读内容显示“有新通知”,成功打开通知页后消除;新增或修改可见内容会再次提醒,同内容保存不重复提醒。首页可见期间每10秒检查公开内容,不等待个人资料接口;正在进行的检查不会叠加,也支持返回或下拉刷新。草稿不提醒,定时发布到时才提醒;已读在当前设备保存,清除缓存或更换设备会重新提示。更改已发布日程和活动会为相关参会者生成变更消息。 3. “配套活动”可新增、删除活动,填写排序值或用上移/下移调整显示顺序,并设置时间、名额、介绍、路线和注意事项。新建默认草稿,删除保留历史报名;图片支持 JPEG/PNG/WebP,单个不超过10MB;视频 MP4 不超过50MB。保存前等媒体上传完成。图片/视频可填HTTPS地址,正式小程序需配置相应媒体域名。 4. “报名与报到”筛选查询、导出当前结果、查看详情、核对后确认报到;现场登记直接标记报到,不受线上截止限制。资料更正保留编号和报到状态。 5. “消息通知”选择已报名人员或具体活动人员,发送会前或变更提醒;下方查看微信队列真实状态与失败原因。站内消息即时保存不依赖微信配置。 6. “管理员账号”添加工作账号;无法删除当前账号或最后一个管理员。当前管理员可通过“修改我的密码”校验旧密码并设置新密码;成功后本账号所有登录会话退出,需重新登录。此功能仅针对会务后台账号,不涉及服务器SSH账号。 7. “图集/图片直播”上传现场照片、填写说明/拍摄日期/分类,并保存草稿或发布;可设为首页封面。大会信息中的图片直播状态控制“待更新/更新中/已结束”。没有公开照片时参会端始终显示待更新。原型引用的五张照片未随HTML提供,当前不使用虚构现场照片。 8. “短信通知”维护模板、选择名单并逐人预览。只有服务器启用短信且模板启用后才能确认发送;“已受理”不代表送达,可在批次详情手动查询回执。目前阿里云尚未开通,发送保持关闭,预览与模板草稿可使用。 管理员应提前导出名单用于网络不稳定时的纸质核对。现场离线操作不会自动写回数据库,需要恢复网络后补录。 ## 服务端配置 复制 `.env.example` 为 `.env` 后维护,真实秘密只保存在服务端。默认数据库为 `server/data/conference.sqlite`,上传为 `server/data/uploads/`。首次创建数据库后修改 ADMIN_PASSWORD 不会自动重置已有账号密码。 | 环境变量 | 说明 | | --- | --- | | HOST / PORT | 默认127.0.0.1 / 3000 | | DB_PATH / UPLOADS_DIR | 可选数据路径,部署时使用持久化磁盘 | | ALLOW_DEV_LOGIN | 仅精确字符串true启用开发登录;正式部署关闭 | | CORS_ORIGINS | 可选逗号分隔的精确HTTP(S)源,默认空;远程服务允许本机预览`http://127.0.0.1:3000,http://localhost:3000`,不开放通配符或绕过登录 | | ADMIN_USERNAME / ADMIN_PASSWORD | 仅首次初始化管理员;密码10—128位;不配置时生成随机密码 | | WECHAT_APP_ID / WECHAT_APP_SECRET | 微信小程序凭据,严禁写到前端 | | WECHAT_REGISTRATION_TEMPLATE_ID | 参会报名确认模板,未设置时使用通用变更模板 | | WECHAT_ACTIVITY_TEMPLATE_ID | 活动报名确认模板,未设置时使用通用变更模板 | | WECHAT_REMINDER_TEMPLATE_ID | 会前提醒模板 | | WECHAT_CHANGE_TEMPLATE_ID | 安排变更/通用消息模板 | | WECHAT_TEMPLATE_FIELDS | 已申请模板的字段映射 JSON,例如 `{"thing1":"title","thing2":"body","time3":"date"}`;按实际审核字段配置 | | WECHAT_MINIPROGRAM_STATE | 默认formal;联调可按平台规则选developer/trial | | ALIYUN_SMS_ENABLED | 仅精确字符串true启用短信,默认false | | ALIYUN_SMS_ACCESS_KEY_ID / ALIYUN_SMS_ACCESS_KEY_SECRET | 仅服务端配置的阿里云RAM凭据;不进入小程序或管理页面 | | ALIYUN_SMS_SECURITY_TOKEN | 可选,使用STS临时凭据时配置;普通AccessKey留空 | 订阅消息模板应采用兼容的字段结构;当前映射支持 `title`、`body`、`date`。需将相应模板ID同时填入 `miniprogram/config.js` 的 `subscriptionTemplateIds`,用户在“我的”中主动授权。一次授权额度按模板记录,微信返回拒绝或额度耗尽时停止对应发送并显示等待授权状态。 无凭据、无微信身份、未授权或微信发送失败都不会伪报成功。站内通知始终保留,队列分别显示等待配置、等待微信身份、等待授权、重试、失败、已发送。调度每60秒执行,网络失败最多实际尝试5次;会前一天生成报到提醒并去重。 ## 正式接入与部署 1. 取得真实 AppID/AppSecret,替换 `project.config.json` 的 AppID。 2. 将 API 部署至 Node24+ 单实例服务,SQLite文件和上传目录配置持久化磁盘;反向代理提供HTTPS,限制管理入口并定期备份数据文件及媒体。此实现按约200人会议规模使用,多个独立SQLite副本不能共享名额。 3. 前端 `config.js` 修改为正式HTTPS域名、`development:false`;服务端关闭 `ALLOW_DEV_LOGIN`;开发者工具恢复合法域名校验。 4. 在微信后台配置 request 与媒体相关合法域名,核实地图坐标,补齐隐私保护指引主体、保存期限、联系方式。当前隐私说明为本地开发说明,正式运营主体需确认。 5. 申请订阅模板、配置字段和模板ID,真机验证授权、真实登录和订阅发送,确认没有等待配置/身份的生产消息。 6. 录入并核实正式素材、报名时间、活动容量、集合点、联系人及全部日程。 7. 完成平台要求的备案、体验版验收及提审发布。此仓库不代表已经备案或上线;实际平台时限以审核反馈为准。 ## 验证 ```powershell # 自动选择可用Node24,运行全部测试和源码/路由/资源检查 powershell -ExecutionPolicy Bypass -File scripts/start-local.ps1 -Verify # 使用已安装的微信开发者工具原生编译器校验WXML和WXSS powershell -ExecutionPolicy Bypass -File scripts/check-native.ps1 # 可选浏览器流程检查:安装playwright,或将PLAYWRIGHT_MODULE指向已有模块 node scripts/ui-smoke.mjs ``` HTTP测试使用真实监听端口和隔离数据库,覆盖权限、重复报名、时间边界、名额并发、持久化、下架快照、导出、上传、现场资料更正、通知授权与重试。浏览器检查覆盖参会报名→修改→凭证→活动→消息→后台同一名单、日期/环节筛选、FAQ及390px布局,截图保存在 `output/`。 已使用本机微信开发者工具的WXML/WXSS编译器验证12页源码,并独立校验app.json配置;浏览器联调不是微信真机测试。真实AppID登录、订阅消息实际投递和手机地图仍需配置后验收。 ## 目录与设计参考 `miniprogram/` 原生小程序;`server/` API与SQLite;`admin/` 会务后台;`preview/` 同源浏览器体验器;`tests/` 自动化测试;`scripts/` 启动/校验;`docs/` 设计/接口/功能对照。 样式与交互参考官方 [TDesign Miniprogram](https://github.com/Tencent/tdesign-miniprogram)、[TDesign发布记录](https://github.com/Tencent/tdesign-miniprogram/releases)、[Vant Weapp](https://github.com/youzan/vant-weapp)。当前使用自有原生样式与本地图标,无外部字体、图片CDN或组件库运行依赖。未来可按业务需要再接入组件。 组织单位介绍从小程序首页“会议信息 → 组织单位”进入,按主办、协作、承办、合作企业分组。后台“组织单位”支持名称、Logo、完整介绍、分类、显示排序及草稿/发布/定时发布;排序数字越小越靠前。维护步骤见[组织单位管理](docs/organizations-management.md)。