目录结构

  1. .
  2. ├── README.md
  3. ├── .gitignore
  4. ├── back_end
  5. ├── controller
  6. ├── core
  7. ├── global
  8. ├── go.mod
  9. ├── go.sum
  10. ├── initialize
  11. ├── main.go
  12. ├── middleware
  13. ├── public
  14. ├── router
  15. ├── service
  16. ├── static
  17. ├── tmp
  18. └── utils
  19. └── front_end
  20. ├── README.md
  21. ├── craco.config.js
  22. ├── node_modules
  23. ├── package.json
  24. ├── pkg
  25. ├── public
  26. ├── src
  27. ├── tsconfig.json
  28. └── yarn.lock

脚手架搭建

前端:https://create-react-app.dev/docs/getting-started
后端:https://github.com/gin-gonic/gin
gorm:https://gorm.io/zh_CN/docs/index.html

前端使用craco支持less以及antd主题配置

原文地址:https://ant.design/docs/react/use-with-create-react-app-cn
image.png

前端定制打包输出目录

根据个人需求添加,这里只做一个备忘,并不是强制需求。
编辑craco.config.js如下:

  1. const CracoLessPlugin = require('craco-less');
  2. const path = require("path");
  3. module.exports = {
  4. plugins: [
  5. {
  6. plugin: CracoLessPlugin,
  7. options: {
  8. lessLoaderOptions: {
  9. lessOptions: {
  10. modifyVars: { '@primary-color': '#66d099' },
  11. javascriptEnabled: true,
  12. },
  13. },
  14. },
  15. },
  16. ],
  17. webpack: {
  18. configure: (webpackConfig, {
  19. env, paths
  20. }) => {
  21. paths.appBuild = '../back_end/public/dist' // 如果需要添加
  22. webpackConfig.output = {
  23. ...webpackConfig.output,
  24. path: path.resolve(__dirname, '../back_end/public/dist'), // 修改输出文件目录
  25. publicPath: '/'
  26. }
  27. return webpackConfig
  28. }
  29. }
  30. };

前端添加scss支持

参考文档:https://create-react-app.dev/docs/adding-a-sass-stylesheet

前端配置接口代理

添加依赖:yarn add http-proxy-middleware (这里用的版本是1.3.1)
在src目录下新建setupProxy.js,并编辑内容如下:

  1. const { createProxyMiddleware } = require('http-proxy-middleware');
  2. module.exports = function (app) {
  3. app.use(
  4. '/api/',
  5. createProxyMiddleware({
  6. target: 'http://localhost:8081', // 服务器接口host地址
  7. changeOrigin: true,
  8. pathRewrite: {
  9. // '^/api': '/api', // api路径重写
  10. }
  11. })
  12. );
  13. };

前端路由react-router-dom v6

安装依赖: yarn add react-router-dom 这里用的是(^6.2.1)
修改App.tsx,用法如下:

  1. import {
  2. BrowserRouter,
  3. Routes,
  4. Route,
  5. } from "react-router-dom";
  6. import './App.less';
  7. import Overview from './page/overview/overview';
  8. import Worker from './page/worker/worker';
  9. import Page404 from "./page/404";
  10. import ExcelDetail from "./page/excelDetail/excelDetail";
  11. import WorkerData from "./page/workerData/workerData";
  12. import ImportExplain from "./page/importExplain/importExplain";
  13. import RejectReason from "./page/rejectReason/rejectReason";
  14. function App() {
  15. return <BrowserRouter>
  16. <Routes>
  17. <Route path="/:date" element={<Overview />} />
  18. <Route path="/:date/worker_data" element={<WorkerData />} />
  19. <Route path="/:date/reject_reason" element={<RejectReason />} />
  20. <Route path="/:date/:id" element={<ExcelDetail />} />
  21. <Route path="/import_explain" element={<ImportExplain />} />
  22. <Route path="/worker" element={<Worker />} />
  23. <Route path="*" element={<Page404 />} />
  24. </Routes>
  25. </BrowserRouter>;
  26. }
  27. export default App;

后端gin目录最佳实践

  1. .
  2. ├── controller
  3. ├── response
  4. └── response.go
  5. ├── v1
  6. ├── baidu_data.go
  7. ├── baidu_excel.go
  8. ├── generate_excel.go
  9. ├── reject_reason.go
  10. ├── upload.go
  11. └── worker.go
  12. └── v2
  13. ├── core
  14. ├── generator.go
  15. └── model
  16. ├── baidu_data.go
  17. ├── baidu_excel.go
  18. ├── operation.go
  19. ├── reject_reason.go
  20. └── user.go
  21. ├── files
  22. ├── global
  23. └── global.go
  24. ├── go.mod
  25. ├── go.sum
  26. ├── initialize
  27. └── initialize.go
  28. ├── main.go
  29. ├── middleware
  30. ├── public
  31. ├── router
  32. └── enter.go
  33. ├── service
  34. └── mysql
  35. └── mysql.go
  36. ├── static
  37. └── excel
  38. └── baidu_excel_03.xlsx
  39. ├── tmp
  40. ├── runner-build
  41. └── unner-build-errors.log
  42. └── utils
  43. └── utils.go

后端gin静态资源配置

  1. Router.Static("/public", "./public") // 设置静态资源、网站等等
  2. Router.StaticFS("/api/static", http.Dir("./static")) // 虚拟文件系统

后端gin Content-Type请求头x-www-form-urlencoded 与 application/json的接受参数方式

通过c.PostForm()获取数据需要前端设置请求头的Content-type为x-www-form-urlencoded,以axios为例如下所示:

  1. import qs from "qs";
  2. axios('/api/xxx', {
  3. method: "POST",
  4. headers: {
  5. 'Content-Type': 'application/x-www-form-urlencoded',
  6. },
  7. data: qs.stringify({
  8. id: record.ID,
  9. })
  10. })

(推荐)通过c.ShouldBindJSON()获取数据需要前端设置请求头的Content-type为application/json,以axios为例如下所示:

  1. axios('/api/xxx', {
  2. method: "POST",
  3. data: {
  4. id: record.ID,
  5. }
  6. })

项目部署

linux go环境安装配置

  • 下载go

linux x86_64 对应下载地址: https://dl.google.com/go/go1.17.3.linux-amd64.tar.gz
下载后解压到 /usr/local 目录(tar -xzf go1.17.3.linux-amd64.tar.gz -C /usr/local)

  • 环境变量配置 ```bash vi /etc/profile

添加一下内容

export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.io,direct

  1. - 添加环境配置后执行source /etc/profile,使用go version查看安装版本
  2. <a name="mxm1F"></a>
  3. ## 创建数据库
  4. 版本:Mysql 5+<br />库名:baidu_excel_factory
  5. <a name="r1y7H"></a>
  6. ### 克隆项目到本地
  7. git库地址:git@e.coding.net:leha/pule/baiduReview.git
  8. <a name="ljDfR"></a>
  9. ### 前端react项目打包
  10. - 切换到项目根目录/front_end
  11. - 执行 yarn 安装依赖
  12. - 执行 yarn build 打包
  13. <a name="WmrIs"></a>
  14. ### 后端gin项目打包
  15. - 切换到项目根目录/back_end
  16. - 执行 go mod download 安装依赖
  17. - 执行 export GIN_MODE=release && go run main.go 查看项目运行是否正常
  18. - 执行 go build -o main main.go 打包可执行文件输出为main
  19. - 赋予 main 权限 chmod 777 ./main
  20. <a name="b4cN5"></a>
  21. ### 使用linux systemctl开启后端gin守护进程
  22. - 创建service文件, touch /usr/lib/systemd/system/baidu_review.service
  23. - 编辑内容如下
  24. ```bash
  25. vi /usr/lib/systemd/system/baidu_review.service
  26. # 添加如下内容:
  27. [Unit]
  28. Description=baidu_review
  29. [Service]
  30. Type=simple
  31. Restart=on-failure
  32. RestartSec=10s
  33. Environment=GIN_MODE=release
  34. WorkingDirectory=/data1/baiduReview/back_end # 后端项目路径
  35. ExecStart=/data1/baiduReview/back_end/main # 后端可执行文件路径
  36. [Install]
  37. WantedBy=multi-user.target
  • 启动后端服务执行 systemctl start baidu_review.service 。详细service命令的使用如下
  1. systemctl start baidu_review.service # 开启
  2. systemctl stop baidu_review.service # 关闭
  3. systemctl restart baidu_review.service # 重启

nignx 前后端代理配置

  • 查看ngnix配置文件路径执行 locate nginx.conf
  • 编辑nginx配置文件添加如下配置: ```bash server {

    1. listen 443 ssl;
    2. server_name baidureview.pule.com;
    3. proxy_set_header Host $http_host;
    4. proxy_set_header X-Forwarded-Proto https;
    5. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    6. proxy_buffering off;
    7. ssl_certificate /etc/nginx/cert/pule/all_pule_com2021.crt;
    8. ssl_certificate_key /etc/nginx/cert/pule/all_pule_com2021.key;
    9. location / {
    10. gzip on;
    11. root /data1/baiduReview/front_end/build; # 前端打包目录
    12. try_files $uri $uri/ /index.html;
    13. }
    14. location /api {
    15. proxy_set_header X-Forward-For $remote_addr;
    16. proxy_set_header X-real-ip $remote_addr;
    17. proxy_pass http://127.0.0.1:8081/api; # 后端接口转发
    18. }
    19. location ^~ /excel {
    20. alias /data1/baiduReview/back_end/static/excel/;
    21. }

    }

server { listen 80; server_name baidureview.pule.com; return 301 https://baidureview.pule.com$request_uri; access_log off; } ```

  • nginx 重启执行 systemctl reload nginx.service

相关命令:

  • 查看端口占用情况 netstat -ntlp
  • 查看nginx配置文件位置 locate nginx.conf
  • 压缩包解压 tar -xzf xxx.tar.gz -C /usr/local
  • 可执行文件赋权 chmod 777 xxx
  • linux 环境变量配置文件 /etc/profile
  • nginx 重启 systemctl reload nginx.service
  • go mod 初始化 go mod init xxx
  • go mod 项目依赖安装 go mod download