Skip to content

使用说明

WintBit edited this page Oct 30, 2023 · 2 revisions

使用说明

运行软件

准备工作

环境依赖

  • Docker Compose
  • MySQL

初始化数据库

  1. 执行 dal/sql/hr.sql 创建数据库表结构。
  2. 执行 unittest/init_data.sql 插入测试数据。

修改配置

  1. 如果有OAuth2源,请参考公共配置填写adminUrl, clientID, clientSecret, redirectUrl.
    1. 你可能需要根据OAuth2的特性进行二次开发。
  2. 如果没有OAuth2源,请将公共配置中的debug设置为true,进入超级管理员调试模式。
  3. 临时测试可以使用华南虎的微信认证登录,将wechatUrl设置为https://wx.scutbot.cn.
  4. 后续会推出支持用户名密码的版本,请持续关注催更作者。
  5. 更多说明请参考配置说明。

开发调试

  1. 启动 Docker 容器
cd unittest && docker-compose up -d
  1. 启动 Service 层
cd hr-service && go run .
cd hr-admin-service && go run .
  1. 启动 API 层
cd hr-api && go run .
cd hr-admin-api && go run .
  1. 检测服务启动情况
curl --request GET 'http://localhost:8000/api/ping'
curl --request GET 'http://localhost:8000/api/admin/ping'

正式上线

  1. 创建服务网络
docker network create hr
  1. 运行 etcd 服务发现
docker run -d \
--network=hr \
--name=etcd \
-e ALLOW_NONE_AUTHENTICATION=yes \
-e ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379 \
bitnami/etcd:3.5
  1. 新建 docker-compose.yml
version: "2"
networks:
  hr:
    external: true
services:
  hr-admin-service:
    image: scutrobot/hr-admin-service:latest
    restart: always
    volumes:
      - ./config/hr-admin-service.yaml:/app/etc/config.yaml
      - ./config/common.yaml:/app/etc/common.yaml
    environment:
      - COMMON_CONFIG_PATH=/app/etc/common.yaml
    networks:
      - hr
  hr-service:
    image: scutrobot/hr-service:latest
    restart: always
    volumes:
      - ./config/hr-service.yaml:/app/etc/config.yaml
      - ./config/common.yaml:/app/etc/common.yaml
    environment:
      - COMMON_CONFIG_PATH=/app/etc/common.yaml
    networks:
      - hr
  hr-api:
    image: scutrobot/hr-api:latest
    restart: always
    volumes:
      - ./config/hr-api.yaml:/app/etc/config.yaml
      - ./config/common.yaml:/app/etc/common.yaml
    environment:
      - COMMON_CONFIG_PATH=/app/etc/common.yaml
    networks:
      - hr
  hr-admin-api:
    image: scutrobot/hr-admin-api:latest
    restart: always
    volumes:
      - ./config/hr-admin-api.yaml:/app/etc/config.yaml
      - ./config/common.yaml:/app/etc/common.yaml
    environment:
      - COMMON_CONFIG_PATH=/app/etc/common.yaml
    networks:
      - hr
  hr-front:
    image: scutrobot/hr-front:latest
    restart: always
    volumes:
      - ./config/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - hr
    ports:
      - "8000:80"

目录结构

.
├──docker-compose.yml
├──config
    ├──common.yml
    ├──nginx.conf
    ├──hr-api.conf
    ├──hr-service.conf
    ├──hr-admin-api.conf
    ├──hr-admin-service.conf
  1. 启动容器
docker-compose up -d

你可以根据需要和流量负载缩放service实例数量

配置说明

公共配置

debug: true # 调试模式
url:
  baseUrl:   # 基础地址
  adminUrl:  # 管理员OAuth2地址
  wechatUrl: # 微信认证地址 eg. https://wx.scutbot.cn
groups:
  - 机械
  - 电控
  - 视觉
  ...
intents:
  min: 1 # 至少选择1个志愿
  max: 2 # 至多选择2个志愿
oAuth:
  clientID:     # OAuth2 ClientID
  clientSecret: # OAuth2 ClientSecret
  redirectUrl:  # OAuth2 回调地址

API 配置

以 hr-api/etc/hr.yaml 为例

Name: hr      # 服务名称
Host: 0.0.0.0 # 服务监听地址
Port: 8888    # 服务监听端口
Etcd:
  Hosts:
    - etcd:2379 # etcd地址
  Key: hr.rpc # etcd注册服务的key
Auth:
  AccessSecret: "12345678.debug" # 访问密钥
  AccessExpire: 28800            # 密钥过期时间

hr-admin-api/etc/hr-admin.yaml 同理

Service 配置

以 hr-admin-service/etc/admin.yaml 为例

Name: admin.rpc        # 服务名称
ListenOn: 0.0.0.0:8091 # 服务监听地址
Etcd:
  Hosts:
    - etcd:2379 # etcd地址
  Key: admin.rpc # etcd注册服务的key
DataSource: "root:123456@(localhost:3306)/hr?charset=utf8mb4&parseTime=True&loc=Local" # 数据库连接字符串
SmsBaoConfig:
  SendUrl: "https://api.smsbao.com/sms" # 短信发送地址
  Debug: false # 调试模式
  UserName: "" # 短信宝用户名
  Password: "" # 短信宝密码

hr-service/etc/hr.yaml 同理

数据库操作

执行 DDL

执行 dal/sql/hr.sql 创建数据库表结构。

执行 DML

部分数据暂不支持图形化界面导入,需要手动操作数据库。

announce_configs 通知配置

该表以键值对的格式规定了一系列通知文案

LOCK
TABLES `announce_configs` WRITE;
INSERT INTO `announce_configs`
VALUES (1, 'HaveNotAppliedForm', '您还没有提交报名表。'),
       (2, 'HaveNotSelectedTime',
        '{{applicant.name}}同学您好,感谢您报名华工机器人实验室{{#each intents}}{{this}}组{{#unless @last}}、{{/unless}}{{/each}}。您还没有选择报名面试时间,请进入系统选择。'),
       (3, 'HaveNotInterview',
        '{{applicant.name}}同学您好,感谢您报名华工机器人实验室。您报名的{{#each times}}{{this.group}}组的面试时间为{{this.date}} {{this.time}},面试地点在{{this.location}};{{/each}}我们期待您的到来!'),
       (4, 'HaveNotPublished', '{{applicant.name}}同学您好,面试结果尚未公布,请静候通知。'),
       (5, 'Admitted',
        '恭喜您!{{applicant.name}}同学,您通过了{{#each admitted}}{{this.group}}组{{#unless @last}}、{{/unless}}{{/each}}面试!'),
       (6, 'Failed', '很遗憾,{{applicant.name}}同学,您没有通过面试。');
UNLOCK
TABLES;

forms 申请表单模板

报名表中的题目格式取决于该表的内容

  • text-field-email 邮箱文本框
  • text-field 普通文本框
  • select 单项选择题
  • textarea 多行文本区域
LOCK
TABLES `forms` WRITE;
INSERT INTO `forms`
VALUES (1, 'E-mail', 'email', 'text-field-email', 1, '[]', NULL, NULL, NULL, NULL, NULL),
       (2, '微信号', 'wechat', 'text-field', 1, '[]', NULL, NULL, NULL, NULL, NULL),
       (3, '年级', 'grade', 'select', 1, '[\"大一\", \"大二\", \"大三\", \"大四\", \"其他\"]', NULL, NULL, NULL, NULL,
        NULL),
       (4, '学院', 'school', 'select', 1,
        '[\"机械与汽车工程学院\", \"建筑学院\", \"土木与交通学院\", \"电子与信息学院\", \"材料科学与工程学院\", \"化学与化工学院\", \"轻工科学与工程学院\", \"食品科学与工程学院\", \"数学学院\", \"物理与光电学院\", \"经济与金融学院\", \"旅游管理系\", \"电子商务系\", \"自动化科学与工程学院\", \"计算机科学与工程学院\", \"电力学院\", \"生物科学与工程学院\", \"环境与能源学院\", \"软件学院\", \"工商管理学院(创业教育学院)\", \"公共管理学院\", \"马克思主义学院\", \"外国语学院\", \"法学院(知识产权学院)\", \"新闻与传播学院\", \"艺术学院\", \"体育学院\", \"设计学院\", \"医学院(生命科学研究院)\", \"国际教育学院\", \"峻德书院\", \"铭诚书院\", \"生物医学科学与工程学院\", \"吴贤铭智能工程学院\", \"前沿软物质学院\", \"微电子学院\", \"未来技术学院\", \"海洋科学与工程学院\"]',
        NULL, NULL, NULL, NULL, NULL),
       (5, '专业', 'major', 'text-field', 1, '[]', NULL, 16, NULL, NULL, NULL),
       (6, '本学年校区', 'campus', 'select', 1, '[\"五山校区\", \"大学城校区\", \"广州国际校区\"]', NULL, NULL, NULL,
        NULL, NULL),
       (7, '自我介绍', 'self_intro', 'textarea', 0, '[]', NULL, 3000, NULL, NULL, NULL),
       (8, '促使你来报名的最主要原因', 'apply_main_reason', 'select', 1,
        '[\"同学分享\", \"老师介绍\", \"微信公众号@华工机器人实验室\", \"bilibili@华工机器人实验室\", \"RoboMaster赛事\", \"中小学阶段的机器人竞赛经历\", \"校内线下招新\", \"华工机器人协会\", \"华工机器人协会校内赛\", \"不记得\", \"其它渠道\"]',
        NULL, NULL, NULL, NULL, NULL),
       (9, '内部推荐人(选填)', 'internal_referees', 'text-field', 0, '[]', NULL, 16, NULL, NULL, NULL);
UNLOCK
TABLES;

guide 题库指导

该表以JSON格式存储了题库指导的内容,后续计划支持图形化界面修改

LOCK
TABLES `guide` WRITE;
INSERT INTO `guide`
VALUES (1, '赛规',
        '{\"steps\": [{\"title\": \"#1 官方规则视频\", \"content\": [{\"href\": \"https://www.bilibili.com/video/BV1cs4y1B787\", \"text\": \"RoboMaster 2023 机甲大师超级对抗赛·规则视频\", \"type\": \"link\"}], \"subtitle\": \"请花费2分钟观看以下视频,这将帮助你概括性地了解比赛流程。30%的赛规问题可以从中找到答案。\"}, {\"title\": \"#2 真实比赛视频\", \"content\": [{\"href\": \"https://www.bilibili.com/video/BV1GP41147Gf\", \"text\": \"第69场 东北大学 TDT战队 vs 华南理工大学 华南虎战队\", \"type\": \"link\"}], \"subtitle\": \"请花费20分钟观看以下视频,这将帮助你完整理解比赛的全流程。60%的赛规问题可以从中找到答案。\"}, {\"title\": \"#3 官方规则手册\", \"content\": [{\"href\": \"https://terra-1-g.djicdn.com/b2a076471c6c4b72b574a977334d3e05/RM2023/RoboMaster%202023%20%E6%9C%BA%E7%94%B2%E5%A4%A7%E5%B8%88%E8%B6%85%E7%BA%A7%E5%AF%B9%E6%8A%97%E8%B5%9B%E6%AF%94%E8%B5%9B%E8%A7%84%E5%88%99%E6%89%8B%E5%86%8CV2.0%EF%BC%8820230704%EF%BC%89.pdf\", \"text\": \"RoboMaster 2023 机甲大师超级对抗赛 比赛规则手册V2.0\", \"type\": \"link\"}], \"subtitle\": \"有10%的题目需要查阅规则手册找到答案,请善用浏览器的搜索功能。\"}], \"subtitle\": \"不同于技术方面的考察,赛规题目只需要很少的准备时间即可获得满分。阅读下方的题库指导,你将在40分钟内掌握全部的赛规题目。\"}',
        NULL, current_timestamp(), current_timestamp());
UNLOCK
TABLES;

rooms 面试教室

该表存储了面试教室的内容 ,后续计划支持图形化界面修改

LOCK
TABLES `rooms` WRITE;
INSERT INTO `rooms`
VALUES (1, '31-501', '', 0, current_timestamp(), 0, '', '', '电控', NULL, NULL, current_timestamp(), 0),
       (2, '31-502', '', 0, current_timestamp(), 0, '', '', '机械', NULL, NULL, current_timestamp(), 0),
       (3, '31-503', '', 0, current_timestamp(), 0, '', '', '视觉', NULL, NULL, current_timestamp(), 0);
UNLOCK
TABLES;

短信服务

面试系统使用短信宝 https://www.smsbao.com/ 发送短信

2000条短信150元,折合0.075元/条

短信签名

提供短信服务的云服务商有很多,但大多有非常严格的实名认证和审查机制。华工机器人实验室没有企业资质,无法提供足够的材料在这类平台认证。短信宝的认证相对人性化,亲测可以使用学生证申请到学校学生组织的认证。

发送短信需要携带实名认证过的签名,短信签名格式以全角【】起止,例如【华工机器人实验室】

上行短信

短信宝支持上行短信(即用户回复短信),如果你需要使用该服务,请在短信上行接收地址填写

https://你的域名/api/admin/sms/receive

smsbao