Tduck 填鴨妒潭,超友好的開(kāi)源問(wèn)卷收集系統(tǒng) — 附部署文檔

開(kāi)源表單系統(tǒng)部署文檔

目前支持部署方式

  • 通過(guò)jar包快速安裝
  • 通過(guò)docker文件快速安裝

一着帽、本地運(yùn)行

開(kāi)發(fā)環(huán)境本地運(yùn)行 正式環(huán)境請(qǐng)參考部署教程!

  1. 項(xiàng)目運(yùn)行所需環(huán)境:

  2. 創(chuàng)建一個(gè)tduck的數(shù)據(jù)庫(kù)祭芦,并執(zhí)行項(xiàng)目目錄下doc/tduck.sql文件

  3. 啟動(dòng)后端服務(wù)

    拉取后端代碼

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

    打開(kāi)命令行筷笨,輸入以下命令

    mvn clean install -DskipTests
    cd tduck-platform/tduck-api
    mvn clean package -DskipTests
    java -Dfile.encoding=UTF-8 -jar tduck-api.jar
    
    
  4. 啟動(dòng)前端項(xiàng)目

    拉取前端代碼

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

  5. 打開(kāi)命令行,輸入以下命令

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

    此時(shí)龟劲,瀏覽器打開(kāi)胃夏,輸入網(wǎng)址http://localhost:8888, 進(jìn)入頁(yè)面

二、線上部署

#后端部署

mvn clean install -DskipTests

cd tduck-platform/tduck-api

mvn clean package -DskipTests

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

nohup意為后臺(tái)不掛斷運(yùn)行昌跌,與是否賬號(hào)退出無(wú)關(guān)

#前端部署

拉取前端代碼 進(jìn)入tduck-front目錄執(zhí)行命令 試用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

構(gòu)建打包成功之后仰禀,會(huì)在根目錄生成 dist 文件夾,里面就是構(gòu)建打包好的文件蚕愤,通常是 ***.js 答恶、***.cssindex.html 等靜態(tài)文件萍诱。

通常情況下 dist 文件夾的靜態(tài)文件發(fā)布到你的 nginx 或者靜態(tài)服務(wù)器即可悬嗓,其中的 index.html 是項(xiàng)目的入口頁(yè)面。

#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 / {
          # 靜態(tài)文件地址
            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;
        }
    }
}

三裕坊、后端項(xiàng)目配置

#必要配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: #數(shù)據(jù)庫(kù)地址
    username:  #用戶名
    password: #密碼
  redis:
    database: 1
    host: #地址
    port: #端口
    password:    # 密碼(默認(rèn)為空)

#文件存儲(chǔ)配置

不配置文件存儲(chǔ)系統(tǒng)中上傳文件無(wú)法使用

oss:
  ossType: #oss類(lèi)型 0:阿里云 1:七牛云
  endpoint: 
  accessKeyId: 
  accessKeySecret: 
  bucketName: 
  domain: 

#微信公眾號(hào)配置

不配置在使用微信公眾號(hào)相關(guān)功能時(shí)會(huì)拋出異常(登錄包竹,微信通知,微信中分享信息定義等)碍庵,可以申請(qǐng)微信測(cè)試公眾號(hào)

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

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

輸入圖片說(shuō)明

如圖所示 把對(duì)應(yīng)參數(shù)appId等配置到項(xiàng)目中映企,然后啟動(dòng)項(xiàng)目,本地可以使用內(nèi)網(wǎng)穿透 微信接口配置信息 url填入 外網(wǎng)可訪問(wèn)地址/tduck-api/wx/mp/portal/你的appId token可自行定義 需要與項(xiàng)目中token相同

如果提示配置失敗請(qǐng)仔細(xì)檢查項(xiàng)目中參數(shù)是否配置正確

#郵箱配置

具體配置去對(duì)應(yīng)郵箱客戶端設(shè)置中查看 我這里以88完美郵箱為例

經(jīng)測(cè)試 163等郵箱對(duì)發(fā)送次數(shù)上限比較低 目前88郵箱限制還比較低

enter image description here
mail:
  host: smtp.88.com #郵箱服務(wù)提供者
  username: tduck 
  password: 12345678

四静浴、文件存儲(chǔ)配置

項(xiàng)目目前支持 七牛云oss 阿里云oss 又拍云 本地存儲(chǔ)方式存儲(chǔ)文件

  1. Oss存儲(chǔ)(以七牛云為例)

      oss:
        ossType: 1 # 0:阿里云 1:七牛云 2:又拍云 3:本地存儲(chǔ)
        endpoint: # 阿里云需配置
        accessKeyId: # 平臺(tái)認(rèn)證參數(shù) 需要去對(duì)應(yīng)oss提供平臺(tái)獲取
        accessKeySecret: # 平臺(tái)認(rèn)證參數(shù) 需要去對(duì)應(yīng)oss提供平臺(tái)獲取
        bucketName: tduck-cloud #oss存儲(chǔ)桶名 
        domain: https://qiniu.smileyi.top #oss可供訪問(wèn)的域名
    
    

2.本地存儲(chǔ) 使用項(xiàng)目本身對(duì)外提供文件訪問(wèn)

  oss:
    ossType: 3 # 3表示使用本地存儲(chǔ)
    endpoint:  
    accessKeyId:
    accessKeySecret: 
    bucketName: 
    domain: http://localhost:8999/tduck-api/u/  #對(duì)外訪問(wèn)的地址 使用后端項(xiàng)目部署的ip+端口 后面可以固定 
    upload-folder: C:\temp #文件存放的位置
    access-path-pattern: /u/**  # 文件訪問(wèn)路徑前綴 這里更改domain也需要更改

五堰氓、前端項(xiàng)目配置

tduck-front 項(xiàng)目中 src目錄下

  • .env.development 開(kāi)發(fā)環(huán)境配置
  • .env.production 正式環(huán)境配置
# 頁(yè)面標(biāo)題
VUE_APP_TITLE = 填鴨測(cè)試環(huán)境
# 接口請(qǐng)求地址,會(huì)設(shè)置到 axios 的 baseURL 參數(shù)上
VUE_APP_API_ROOT = /tduck-api
# 調(diào)試工具苹享,可設(shè)置 eruda 或 vconsole双絮,如果不需要開(kāi)啟則留空
VUE_APP_DEBUG_TOOL =
# 高德地圖key
VUE_APP_MAP_KEY = f2200337d0d08538e78729572749882d
# 微信功能開(kāi)關(guān) 開(kāi)啟設(shè)置 ON浴麻,關(guān)閉設(shè)置 OFF
VUE_APP_WX = ON

六、接口安全配置

為了保證接口調(diào)用的安全性囤攀,防止惡意請(qǐng)求接口软免,項(xiàng)目對(duì)接口進(jìn)行了簽名驗(yàn)證,接口請(qǐng)求時(shí)對(duì)參數(shù)進(jìn)行排序加密計(jì)算簽名焚挠,后端對(duì)簽名進(jìn)行校驗(yàn)膏萧,如果校驗(yàn)失敗,則提示非法請(qǐng)求蝌衔。

項(xiàng)目配置如下

platform:
  sign:
    enable: true # 是否啟用簽名校驗(yàn) 關(guān)閉之后所有請(qǐng)求無(wú)需校驗(yàn) 本地調(diào)試方便可以設(shè)置false
    secret: 916lWh2WMcbSWiHv # 簽名秘鑰
    ignore-urls:   # 簽名校驗(yàn)忽略的地址
      - /tduck-api/webjars/** 
      - /tduck-api/swagger/**

#實(shí)現(xiàn)部分

前端:/src/api/index.js

使用axios在請(qǐng)求前統(tǒng)一計(jì)算簽名

簽名具體算法如下

請(qǐng)求參數(shù)統(tǒng)一添加當(dāng)前時(shí)間戳榛泛,然后根據(jù)key做升序

( 簽名秘鑰(secret)+ 請(qǐng)求參數(shù)json字符串)做MD5然后轉(zhuǎn)小寫(xiě)

拼接的秘鑰和參數(shù)

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

md5之后

81deff67b73d2669f04e48f45faa20ac

后端請(qǐng)參考SignAuthFilter.java

如果正常情況下出現(xiàn)提示“非法訪問(wèn),請(qǐng)檢查請(qǐng)求信息” 請(qǐng)檢查部署環(huán)境時(shí)間是否正常

七噩斟、圖形驗(yàn)證碼

#圖形驗(yàn)證碼能使敏感操作更安全曹锨,建議開(kāi)啟。

如需關(guān)閉請(qǐng)打開(kāi)tduck-platform/tduck-api/src/main/resources/application.yml


aj:
  captcha:
    enable: true # 關(guān)閉驗(yàn)證碼

#驗(yàn)證碼攔截邏輯

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

public class ValidateCodeFilter implements Filter {

    //需要進(jìn)行滑動(dòng)驗(yàn)證的接口
    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;
        }
        // 判斷是否攜帶滑動(dòng)驗(yàn)證碼驗(yàn)證
        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);
    }

}

八剃允、微信功能

#微信配置比較麻煩 如果無(wú)需使用 需要關(guān)閉可以在如下配置關(guān)閉

.env.development # 本地環(huán)境配置 .env.production # 正式環(huán)境配置

  # 微信功能開(kāi)關(guān) 開(kāi)啟設(shè)置 ON沛简,關(guān)閉設(shè)置 OFF
VUE_APP_WX = ON

官網(wǎng)地址:https://www.tduckcloud.com

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

開(kāi)源地址:https://gitee.com/TDuckApp/tduck-platform

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市斥废,隨后出現(xiàn)的幾起案子椒楣,更是在濱河造成了極大的恐慌,老刑警劉巖牡肉,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撒顿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荚板,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)吩屹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)跪另,“玉大人,你說(shuō)我怎么就攤上這事煤搜∶饴蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵擦盾,是天一觀的道長(zhǎng)嘲驾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)迹卢,這世上最難降的妖魔是什么辽故? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮腐碱,結(jié)果婚禮上誊垢,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好喂走,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布殃饿。 她就那樣靜靜地躺著,像睡著了一般芋肠。 火紅的嫁衣襯著肌膚如雪乎芳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天帖池,我揣著相機(jī)與錄音奈惑,去河邊找鬼。 笑死碘裕,一個(gè)胖子當(dāng)著我的面吹牛携取,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帮孔,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼雷滋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了文兢?” 一聲冷哼從身側(cè)響起晤斩,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姆坚,沒(méi)想到半個(gè)月后澳泵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼呵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年兔辅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片击喂。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡维苔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出懂昂,到底是詐尸還是另有隱情介时,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布凌彬,位于F島的核電站沸柔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏铲敛。R本人自食惡果不足惜褐澎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伐蒋。 院中可真熱鬧乱凿,春花似錦顽素、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至段审,卻和暖如春全蝶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寺枉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工抑淫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姥闪。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓始苇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親筐喳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子催式,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容