考试系统配置

考试系统相关的配置、如修改配置文件、初始化数据库、Nginx代理配置、注册系统服务等

上传部署资源

安装资源包通过邮件的方式交付到客户手上,默认位置为:docs

├── docs
│   ├── WinService
│   │   ├── ReadMe.txt
│   │   ├── yf-exam.exe
│   │   └── yf-exam.xml
│   ├── db
│   │   └── yf_exam_xxx.sql
│   ├── run
│   │   ├── application-local.yml
│   │   ├── dist.zip
│   │   ├── h5.zip
│   │   ├── readme.txt
│   │   ├── start.bat
│   │   ├── start.sh
│   │   └── yf-exam-api.jar
│   └── 用户手册&部署文档.pdf
├── exam-xxxx-server   后端接口JAVA项目
├── exam-xxxx-uni      移动端UNI-APP项目
└── exam-xxxx-vue      PC管理端VUE项目

初始化数据库

docs/部署资源/db/yf_exam_xxx.sql上传到服务器上
如:我们上传到服务器并重命名,最终路径为:/data/run/db.sql

# 登录数据库
mysql -uroot -p
# 创建数据库
create database yf_exam default character set utf8mb4 collate utf8mb4_general_ci;
# 导入数据,脚本可以放在任意位置
use yf_exam;
source /data/run/db.sql

配置后端程序

docs/部署资源/run/目录上传至服务器
如,我们传到服务器的:/data/run/下面

# 后端外置配置文件
/data/run/application-local.yml 
# 后端服务器JAVA程序
/data/run/yf-exam-api.jar
# PC学员端+管理端静态页面
/data/run/dist.zip
# H5学员端页面
/data/run/h5.zip

我们将dist.zip 和 h5.zip解压

unzip dist.zip
unzip h5.zip
# 如果解压命令无效,使用以下命令安装即可
yum install unzip

最终/data/run/目录结构为

# 后端外置配置文件
/data/run/application-local.yml 
# 后端服务器JAVA程序
/data/run/yf-exam-api.jar
# PC学员端+管理端静态页面
/data/run/dist.zip
/data/run/dist
# H5学员端页面
/data/run/h5.zip
/data/run/h5

配置文件总览

打开/data/run/application-local.yml


# 完整的外挂配置文件,修改配置无需重新打包
server:
  port: 8101
  # 启用服务端压缩
  compression:
    enabled: true
    min-response-size: 10
    mime-types: application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css

spring:
  application:
    name: yf-exam-api
  profiles:
    active: dev
  main:
    allow-bean-definition-overriding: true
  # 数据库配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/yf_exam?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: root
    filters: stat
    max-active: 1000
    initial-size: 10
    max-wait: 6000
    min-idle: 1
    time-between-eviction-runs-millis: 60000
    min-evictable-idle-time-millis: 300000
    test-while-idle: true
    test-on-borrow: false
    test-on-return: false
    pool-prepared-statements: true
    max-open-prepared-statements: 1000
    async-init: true

  # Redis配置
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    timeout: 5000

  # 定时任务配置
  quartz:
    #数据库方式
    job-store-type: jdbc
    # quartz 相关属性配置
    properties:
      org:
        quartz:
          scheduler:
            instanceName: examScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            tablePrefix: QRTZ_
            isClustered: true
            clusterCheckinInterval: 10000
            useProperties: false
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true

# 文档转换,请先安装LibreOffice,再配置相应路径,enabled=true
jodconverter:
  local:
    enabled: false
    office-home: /opt/libreoffice6.4
    max-tasks-per-process: 10
    port-numbers: 8100

# 支付配置
pay:
  # 支付实例,修改enabled为true则打开,false则关闭
  providers:
    - name: wechat
      enabled: true
    - name: alipay
      enabled: true

  wechat:
    # AppId,通常为wx开头的18位左右字符
    app-id:
    # App秘钥
    app-secret:
    # 商户号,通常为10位数字
    mch-id:
    # 商户API私钥。商户申请商户API证书时,会生成商户私钥,并保存在本地证书文件夹的文件apiclient_key.pem中
    private-key:
    # API v3密钥。为了保证安全性,微信支付在回调通知和平台证书下载接口中,对关键信息进行了AES-256-GCM加密。API v3密钥是加密时使用的对称密钥。商户可以在【商户平台】->【API安全】的页面设置该密钥。
    api-v3-key:
    # 证书序列号。每个证书都有一个由CA颁发的唯一编号,即证书序列号。如何查看证书序列号请看这里 https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan#ru-he-cha-kan-zheng-shu-xu-lie-hao
    mch-serial-no:
    # 支付回调地址
    notify-url:

  # 支付宝支付
  alipay:
    # 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    app-id:
    # 商户私钥,您的PKCS8格式RSA2私钥
    merchant-private-key:
    # 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    alipay-public-key:
    # 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    notify-url:
    # 服务器同步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    return-url:
    # 签名方式
    sign-type: RSA2

# 基础配置
ycloud:
  # 运行模式,ture为演示/false为正式
  demo: false
  # 开放接口秘钥
  open-secret: JoQEJeD7grF8JdyVaOCvPDNL8arsyvfL
  # 微信登录成功以后,将token推送到这个链接同步登录
  login-sync-pc: https://yourdomain.com/#/sync/{token}/{roleType}
  # 微信登录成功以后,将token推送到这个链接同步登录
  login-sync-h5: https://yourdomain.com/#/pages/login/sync?token={token}
  # 微信获取code以后回调此URL
  login-redirect: https://yourdomain.com/api/common/wx/redirect

# 微信相关配置
wechat:
  login:
    # 小程序登录appId
    mp-app-id:
    mp-app-secret:
    # 网站登录appId
    site-app-id:
    site-app-secret:


# 企业微信
crop-wechat:
  login:
    crop-id:
    agent-id:
    crop-secret:
    redirect: https://yourdomain.com/api/common/crop-wechat/redirect

# 钉钉
ding-talk:
  login:
    app-key:
    app-secret:
    redirect: https://yourdomain.com/api/common/ding-talk/redirect

# 生产环境建议关闭文档
# 文档访问地址:http://localhost:8101/doc.html
swagger:
  enable: false

logging:
  level:
    root: error
  # 日志文件目录
  path: logs/${spring.application.name}/

修改数据库配置

  # 数据库配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/yf_exam?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: root
    filters: stat
    max-active: 1000
    initial-size: 10
    max-wait: 6000
    min-idle: 1
    time-between-eviction-runs-millis: 60000
    min-evictable-idle-time-millis: 300000
    test-while-idle: true
    test-on-borrow: false
    test-on-return: false
    pool-prepared-statements: true
    max-open-prepared-statements: 1000
    async-init: true

此段为MySQL的配置信息,修改url中的数据库名称usernamepassword即可,程序使用druid连接,其他参数请自行参考

修改Redis配置

  # Redis配置
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    timeout: 5000

默认安装的情况下,redis配置无需做任何修改,如果您对redis设置了密码请在password填入正确密码
默认database为0,您也可以修改成0-15的任意一个库来运行

理论上配置好以上两项程序即可正常启动了

文档转换配置

# 文档转换,请先安装LibreOffice,再配置相应路径,enabled=true
jodconverter:
  local:
    enabled: false
    office-home: /opt/libreoffice6.4
    max-tasks-per-process: 10
    port-numbers: 8100

文档转换默认是关闭的,即使不配置也可正常启动程序,详细配置请参考:安装Libreoffice

支付配置

# 支付配置
pay:
  # 支付实例,修改enabled为true则打开,false则关闭
  providers:
    - name: wechat
      enabled: true
    - name: alipay
      enabled: true

  wechat:
    # AppId,通常为wx开头的18位左右字符
    app-id:
    # App秘钥
    app-secret:
    # 商户号,通常为10位数字
    mch-id:
    # 商户API私钥。商户申请商户API证书时,会生成商户私钥,并保存在本地证书文件夹的文件apiclient_key.pem中
    private-key:
    # API v3密钥。为了保证安全性,微信支付在回调通知和平台证书下载接口中,对关键信息进行了AES-256-GCM加密。API v3密钥是加密时使用的对称密钥。商户可以在【商户平台】->【API安全】的页面设置该密钥。
    api-v3-key:
    # 证书序列号。每个证书都有一个由CA颁发的唯一编号,即证书序列号。如何查看证书序列号请看这里 https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan#ru-he-cha-kan-zheng-shu-xu-lie-hao
    mch-serial-no:
    # 支付回调地址
    notify-url:

  # 支付宝支付
  alipay:
    # 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    app-id:
    # 商户私钥,您的PKCS8格式RSA2私钥
    merchant-private-key:
    # 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    alipay-public-key:
    # 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    notify-url:
    # 服务器同步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    return-url:
    # 签名方式
    sign-type: RSA2

考试系统支持微信和支付宝支付,用于课程付费、考试付费、题库付费等业务,如果您的程序版本不包含付费功能,则无需配置

基础配置

# 基础配置
ycloud:
  # 运行模式,ture为演示/false为正式
  demo: false
  # 开放接口秘钥
  open-secret: JoQEJeD7grF8JdyVaOCvPDNL8arsyvfL
  # 微信登录成功以后,将token推送到这个链接同步登录
  login-sync-pc: https://yourdomain.com/#/sync/{token}/{roleType}
  # 微信登录成功以后,将token推送到这个链接同步登录
  login-sync-h5: https://yourdomain.com/#/pages/login/sync?token={token}
  # 微信获取code以后回调此URL
  login-redirect: https://yourdomain.com/api/common/wx/redirect

基础设置,生产环境demo请固定设置为false,yourdomain.com表示您自己访问考试系统的域名或IP

其他配置


# 生产环境建议关闭文档
# 文档访问地址:http://localhost:8101/doc.html
swagger:
  enable: false

logging:
  level:
    root: error
  # 日志文件目录
  path: logs/${spring.application.name}/

生产环境应该将swagger关闭,这样就不会暴露接口文档;日志等级按需设置,一般生产环境使用error或info等级,这样不会产生大量日志文件占用服务器空间,如果您需要更详细的日志,可以将级别设置为debug

配置Nginx

我们使用nginx做反向代理,通过同域代理来配置来运行考试系统,即所有服务运行在同一个域名下

移动端用户访问自动代理到移动端页面
PC端用户访问自动代理到PC端页面
访问接口自动代理到后端处理

创建考试配置文件

vi /etc/nginx/conf.d/exam.conf

exam.conf内容如下


server {
        listen       80;
        # 域名绑定
        server_name  exam.yfhl.net;
        # https证书相关配置
        listen 443 ssl;
        ssl_certificate /data/ssl/8216221_exam.yfhl.net.pem;
        ssl_certificate_key /data/ssl/8216221_exam.yfhl.net.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        # 服务器端获取真实IP
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        # websocket通信要求开启
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        # 文件上传配置,可以按需求改大改小
        client_max_body_size 2000m;
        # http强制跳转到https
        if ($scheme = http) {
            return 301 https://$host$request_uri;
        }

        # 默认为PC端静态页面
	    set $dir '/data/run/dist';

        # 如果是手机端访问,则使用手机端页面
        if ($http_user_agent ~* (mobile|iphone|ipad|android)){
            set $dir '/data/run/h5';
        }

        # 动态决定到手机端还是PC端
        location / {
            root $dir;
            try_files $uri $uri/ /index.html last;
        }
        
        # 接口代理到后端处理
        location ~/(api/|upload/file/|druid/){
            proxy_pass http://localhost:8101;
        }
}

申请SSL证书

如果考试系统需要使用人脸识别、摄像头截屏、录音等功能,则必须使用https协议,这是由浏览器安全协议决定的,必须走https才能正常地使用视频、音频服务; 如果是内网部署使用IP访问则无法使用这些功能,必须使用域名+SSL证书才可以,目前不少云服务商都提供免费的证书申请;

阿里云: https://www.aliyun.com/product/casopen in new window
腾讯云:https://cloud.tencent.com/product/sslopen in new window

# 将证书上传到服务器的任意位置,然后修改以下配置为正确地址
listen 443 ssl;
ssl_certificate /data/ssl/8216221_exam.yfhl.net.pem;
ssl_certificate_key /data/ssl/8216221_exam.yfhl.net.key;

如果您不需要https访问,将以下内容删除即可

# https证书相关配置
listen 443 ssl;
ssl_certificate /data/ssl/8216221_exam.yfhl.net.pem;
ssl_certificate_key /data/ssl/8216221_exam.yfhl.net.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

刷新配置

nginx文件修改以后,需要刷新配置文件才能生效

# 刷新nginx配置
/usr/sbin/nginx -s reload

添加系统服务

配置好以后,我们可以使用java -jar命令来启动服务,如:

# 进入项目目录
cd /data/run
# 运行命令,退出命令行服务则终止
java -jar yf-exam-api.jar --spring.config.location=application-local.yml
# 后台运行,退出命令行服务也可以正常运行
nohup java -jar yf-exam-api.jar --spring.config.location=application-local.yml&

以上命令适合调试和临时运行,对于生产环境来说还是不太稳定,即便使用后台命令也容易停止服务,所以我们建议把他配置为系统服务启动

新增配置

# 进入服务目录
cd /usr/lib/systemd/system/

# 创建新文件
vi exam.service

创建新的配置,内容如下

[Unit]
Description=Exam
Wants=network-online.target
After=network.target

[Service]
Type=simple
WorkingDirectory=/data/run
ExecStart=/bin/java -jar /data/run/yf-exam-api.jar --spring.config.location=/data/run/application-local.yml
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

保存配置文件

刷新配置

# 刷新配置
systemctl daemon-reload

# 启动服务
systemctl start exam.service

设置开机启动

systemctl enable exam.service

其它操作

/usr/lib/systemd/system/ 目录下为所有可用的服务文件,都可以使用systemctl start|stop|restart xxx.service来维护

# 例如,启动mysql
systemctl start mysqld.service
# 例如,启动redis
systemctl start redis.service
# ...

安装Libreoffice

在上传Office课件时,格式有:doc,docx,xls,xlsx,ppt,pptx,程序需要将其转换成pdf格式,才能实现在线查看和预览,此时需要安装课件转换插件,如课件只使用视频或者pdf,可无需安装,如果您使用云存储,并通过云存储进行云转码,也无需安装。

如您购买的版本不含课程学习功能,也无需安装
课件转换组件支持两种,分别为LibreOffice和OpenOffice两种,两个安装一个即可,本文推荐使用LibreOffice

插件下载

进入 LibreOffice 官网:https://www.libreoffice.org/download/download/open in new window
请根据您的服务器类型来选择下载包,本文使用 CentOS,下载:Linux(64-bit) (rpm)
下载好的文件名为:LibreOffice_6.4.7_Linux_x86-64_rpm.tar.gz

组件安装

将下载好的 LibreOffice_6.4.7_Linux_x86-64_rpm.tar.gz上传到服务器的任意位置,本位将组件放置位置为: /home/LibreOffice_6.4.7_Linux_x86-64_rp m.tar.gz

# 解压文件 
cd /home 
tar -xvf LibreOffice_6.4.7_Linux_x86-64_rpm.tar.gz 

# 安装组件 
cd /home/LibreOffice_6.4.7.2_Linux_x86-64_rpm/RPMS/ 
yum localinstall *.rpm -y

获取配置

进入系统/opt目录,可以看到 libreoffice6.4 文件夹,此文件夹的路径则是程序 要的 OfficeHome,完整路径为:/opt/libreoffice6.4 (注意,不同版本和不同 系统,此文件夹的位置都不一样)
Linux 系统一般为:/opt/libreofficex.x
MacOs 系统一般为:/Applications/LibreOffice.app/Contents
Windows 系统一般为:C:/Program Files/LibreOffice

配置程序

打开我们的配置文件:/data/run/application-local.yml,找到以下配置:

# 文档转换,请先安装LibreOffice,再配置相应路径,enabled=true
jodconverter:
  local:
    enabled: false
    office-home: /opt/libreoffice6.4
    max-tasks-per-process: 100
    port-numbers: 8100

将enabled修改为true
将office-home修改为配置好的地址,如:/opt/libreoffice6.4
max-tasks-per-process:任务最大进程数量,可以修改为100-500的值
port-numbers 默认 8100,也可以修改成其他的

配置好以后重新启动考试后端

systemctl restart exam

乱码解决

如果服务器上没有中文字体,那么在转换带有中文的文档时,极有可能出现乱码,解决方法就是下载字体包

# 进入字体目录
cd /usr/share
# 下载字体包
wget https://cdn.yfhl.net/fonts.tar.gz
# 解压字体包
tar -xvf fonts.tar.gz

启动异常处理

在做了以上操作以后,仍然无法正常转换文档,试试以下命令

yum install ibus