Tduck 填鸭,超友好的开源问卷收集系统 — 附部署文档

开源表单系统部署文档

目前支持部署方式

  • 通过jar包快速安装
  • 通过docker文件快速安装

一、本地运行

开发环境本地运行 正式环境请参考部署教程!

  1. 项目运行所需环境:

  2. 创建一个tduck的数据库,并执行项目目录下doc/tduck.sql文件

  3. 启动后端服务

    拉取后端代码

    git clone https://gitee.com/TDuckApp/tduck-platform.git

    打开命令行,输入以下命令

    mvn clean install -DskipTests
    cd tduck-platform/tduck-api
    mvn clean package -DskipTests
    java -Dfile.encoding=UTF-8 -jar tduck-api.jar
    
    
  4. 启动前端项目

    拉取前端代码

    git clone https://gitee.com/TDuckApp/tduck-front.git

  5. 打开命令行,输入以下命令

    npm install -g cnpm --registry=https://registry.npm.taobao.org
    cd tduck-front
    cnpm install
    cnpm run serve
    
    

    此时,浏览器打开,输入网址http://localhost:8888, 进入页面

二、线上部署

#后端部署

mvn clean install -DskipTests

cd tduck-platform/tduck-api

mvn clean package -DskipTests

nohup java -Dfile.encoding=UTF-8 -jar tduck-api.jar &

nohup意为后台不挂断运行,与是否账号退出无关

#前端部署

拉取前端代码 进入tduck-front目录执行命令 试用cnpm或者yarn都可以 推荐使用yarn yarn命令

npm install -g yarn
yarn install 
yarn run build

cnpm 命令

npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install 
cnpm run build

构建打包成功之后,会在根目录生成 dist 文件夹,里面就是构建打包好的文件,通常是 ***.js***.cssindex.html 等静态文件。

通常情况下 dist 文件夹的静态文件发布到你的 nginx 或者静态服务器即可,其中的 index.html 是项目的入口页面。

#nginx配置

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

       location / {
          # 静态文件地址
            root   /usr/share/nginx/html/tduck;
        try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }

    location /tduck-api/{
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 改为你后端接口地址   http://xxxx/tduck-api/
        proxy_pass http://localhost:8999/tduck-api/;
    }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

三、后端项目配置

#必要配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: #数据库地址
    username:  #用户名
    password: #密码
  redis:
    database: 1
    host: #地址
    port: #端口
    password:    # 密码(默认为空)

#文件存储配置

不配置文件存储系统中上传文件无法使用

oss:
  ossType: #oss类型 0:阿里云 1:七牛云
  endpoint: 
  accessKeyId: 
  accessKeySecret: 
  bucketName: 
  domain: 

#微信公众号配置

不配置在使用微信公众号相关功能时会抛出异常(登录,微信通知,微信中分享信息定义等),可以申请微信测试公众号

https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

wx:
  mp:
    configs:
      - appId: 
        secret: 
        token: 
        aesKey:

输入图片说明

如图所示 把对应参数appId等配置到项目中,然后启动项目,本地可以使用内网穿透 微信接口配置信息 url填入 外网可访问地址/tduck-api/wx/mp/portal/你的appId token可自行定义 需要与项目中token相同

如果提示配置失败请仔细检查项目中参数是否配置正确

#邮箱配置

具体配置去对应邮箱客户端设置中查看 我这里以88完美邮箱为例

经测试 163等邮箱对发送次数上限比较低 目前88邮箱限制还比较低

enter image description here
mail:
  host: smtp.88.com #邮箱服务提供者
  username: tduck 
  password: 12345678

四、文件存储配置

项目目前支持 七牛云oss 阿里云oss 又拍云 本地存储方式存储文件

  1. Oss存储(以七牛云为例)

      oss:
        ossType: 1 # 0:阿里云 1:七牛云 2:又拍云 3:本地存储
        endpoint: # 阿里云需配置
        accessKeyId: # 平台认证参数 需要去对应oss提供平台获取
        accessKeySecret: # 平台认证参数 需要去对应oss提供平台获取
        bucketName: tduck-cloud #oss存储桶名 
        domain: https://qiniu.smileyi.top #oss可供访问的域名
    
    

2.本地存储 使用项目本身对外提供文件访问

  oss:
    ossType: 3 # 3表示使用本地存储
    endpoint:  
    accessKeyId:
    accessKeySecret: 
    bucketName: 
    domain: http://localhost:8999/tduck-api/u/  #对外访问的地址 使用后端项目部署的ip+端口 后面可以固定 
    upload-folder: C:\temp #文件存放的位置
    access-path-pattern: /u/**  # 文件访问路径前缀 这里更改domain也需要更改

五、前端项目配置

tduck-front 项目中 src目录下

  • .env.development 开发环境配置
  • .env.production 正式环境配置
# 页面标题
VUE_APP_TITLE = 填鸭测试环境
# 接口请求地址,会设置到 axios 的 baseURL 参数上
VUE_APP_API_ROOT = /tduck-api
# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
VUE_APP_DEBUG_TOOL =
# 高德地图key
VUE_APP_MAP_KEY = f2200337d0d08538e78729572749882d
# 微信功能开关 开启设置 ON,关闭设置 OFF
VUE_APP_WX = ON

六、接口安全配置

为了保证接口调用的安全性,防止恶意请求接口,项目对接口进行了签名验证,接口请求时对参数进行排序加密计算签名,后端对签名进行校验,如果校验失败,则提示非法请求。

项目配置如下

platform:
  sign:
    enable: true # 是否启用签名校验 关闭之后所有请求无需校验 本地调试方便可以设置false
    secret: 916lWh2WMcbSWiHv # 签名秘钥
    ignore-urls:   # 签名校验忽略的地址
      - /tduck-api/webjars/** 
      - /tduck-api/swagger/**

#实现部分

前端:/src/api/index.js

使用axios在请求前统一计算签名

签名具体算法如下

请求参数统一添加当前时间戳,然后根据key做升序

( 签名秘钥(secret)+ 请求参数json字符串)做MD5然后转小写

拼接的秘钥和参数

916lWh2WMcbSWiHv{"current":"1","name":"","size":"10","timestamp":"1616904031441"}

md5之后

81deff67b73d2669f04e48f45faa20ac

后端请参考SignAuthFilter.java

如果正常情况下出现提示“非法访问,请检查请求信息” 请检查部署环境时间是否正常

七、图形验证码

#图形验证码能使敏感操作更安全,建议开启。

如需关闭请打开tduck-platform/tduck-api/src/main/resources/application.yml


aj:
  captcha:
    enable: true # 关闭验证码

#验证码拦截逻辑

tduck-api/src/main/java/com/tduck/cloud/api/web/filter/ValidateCodeFilter.java

public class ValidateCodeFilter implements Filter {

    //需要进行滑动验证的接口
    private List<String> validateUrls = Lists.newArrayList(
            "/login/account",
            "/retrieve/password/email",
            "/retrieve/password/phone/code");

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        // 如果不是需要拦截的 则不拦截
        if (!StrUtil.containsAnyIgnoreCase(httpServletRequest.getRequestURI(),
                validateUrls.toArray(new String[validateUrls.size()]))) {
            filterChain.doFilter(request, response);
            return;
        }
        // 判断是否携带滑动验证码验证
        String code = request.getParameter("slideCode");
        if (StrUtil.isBlank(code)) {
            ResponseUtils.outJson(response, Result.failed(ResponseCodeConstants.NEED_VERIFICATION, ""));
            return;
        }
        CaptchaService captchaService = SpringContextUtils.getBean(CaptchaService.class);
        CaptchaVO vo = new CaptchaVO();
        vo.setCaptchaVerification(code);
        if (!captchaService.verification(vo).isSuccess()) {
            ResponseUtils.outJson(response, Result.failed(ResponseCodeConstants.FAIL, ResponseCodeConstants.VALIDATE_CODE_FAIL_MSG));
            return;
        }
        filterChain.doFilter(request, response);
    }

}

八、微信功能

#微信配置比较麻烦 如果无需使用 需要关闭可以在如下配置关闭

.env.development # 本地环境配置 .env.production # 正式环境配置

  # 微信功能开关 开启设置 ON,关闭设置 OFF
VUE_APP_WX = ON

官网地址:https://www.tduckcloud.com

文档地址:https://doc.tduckapp.com

开源地址:https://gitee.com/TDuckApp/tduck-platform

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容