# 介绍

政采云 ZooTeam 开发的前端小报后端系统,主要功能有:

  • 提供投稿文章的保存、展示接口,供前端、插件调用

  • 提供邮件定时发送、钉钉推送功能

# 数据库初始化

小报系统使用的数据库是 MySQL,总共用了5张表,它们分别是 users 表、articles 表、categories 表、weeks 表、dingding 表。 首先你得安装 MySQL 数据库,安装教程可以参考 MySQL 安装 (opens new window),也可以参考官网 (opens new window)。本项目使用的版本是 MySQL8.0.21,安装完成之后,需要创建一个数据库和几张表。在启动数据库之前,你必须先初始化数据库,然后修改 MySQL 文件夹的读写权限,查看初始密码用于登录。

mysqld --initialize # 数据库初始化
chmod -R 777 /var/lib/mysql  # 修改mysql文件夹的权限
sudo grep 'temporary password' /var/log/mysql/mysqld.log  # 查看初始密码

# 创建 weekly 数据库

CREATE DATABASE weekly; 

# users表

存储用户信息,创建表( SQL 语句)并且初始化数据(导入自己公司的员工名称):

CREATE TABLE IF NOT EXISTS `users`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `value` VARCHAR(50) NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO users(value) VALUES
('张三'),
('李四'),
('王五');

# articles表

存储投稿文章,创建表( SQL 语句):

CREATE TABLE IF NOT EXISTS `articles` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(240) NOT NULL,
  `description` varchar(250) NOT NULL,
  `link` varchar(240) NOT NULL,
  `category` varchar(120) NOT NULL,
  `timestamp` bigint(30) NOT NULL,
  `week` bigint(11) NOT NULL,
  `referrer` varchar(255) NOT NULL DEFAULT '' COMMENT '投稿人',
  PRIMARY KEY (`id`),
  UNIQUE KEY `insert` (`link`(100),`title`(100)),
  UNIQUE KEY `unique-title` (`title`(120)) USING BTREE,
  UNIQUE KEY `unique-link` (`link`(120)) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1792 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

# categories表

存储投稿文章有哪些分类。创建表( SQL 语句):

CREATE TABLE IF NOT EXISTS `categories`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `value` VARCHAR(50) NOT NULL,
   `children` JSON,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO categories(value, children) VALUES
('基础','["HTML","CSS","JavaScript","NodeJS"]'),
('语言','["WebAssembly","TypeScript"]'),
('架构','["GraphQL","Serverless","MVVM","微前端","BFF"]'),
('选型','["React","Vue","小程序","Electron","Flutter","ReactNative","Weex","DSL"]'),
('工具','["版本管理","包管理","调试工具","自动化测试"]'),
('语法增强','["PostCSS","Less","Sass"]'),
('能力周边','["AI","AST","IoT","SQL","HTTP","Nginx","Docker","Server"]'),
('RunTime','["V8","浏览器","WebView","Extensions"]'),
('总结',' ["总结","方案","技巧","性能","安全","设计模式"]'),
('他山之石','["职业感悟","产品理解","用户体验","美学思考","行业趋势","深度精选"]'),
('新闻','["业界新闻","技术会议","周期互撕"]');

# weeks表

存储小报周刊信息,创建表( SQL 语句):

CREATE TABLE IF NOT EXISTS `weeks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(240) NOT NULL,
  `week` int(11) NOT NULL,
  `count` int(11) NOT NULL,
  `datetime` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `title` (`title`(100))
) ENGINE=InnoDB AUTO_INCREMENT=200 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

# dingding 表(不使用钉钉推送可以不用)

存储推送钉钉次数,创建表( SQL 语句):

CREATE TABLE IF NOT EXISTS `dingding` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(45) DEFAULT NULL,
  `week` int(11) DEFAULT NULL,
  `count` int(11) DEFAULT NULL,
  `times` int(11) DEFAULT NULL,
  `datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

# 常用数据库命令

数据库登录:mysql -u root -p
启动数据库:systemctl start mysqld
停止数据库:systemctl stop mysqld
重启数据库:systemctl restart mysqld 
开机自启动:systemctl enable mysqld

# MySQL 相关修改

  • 允许远程登录数据库
mysql>use mysql;
mysql>update user set host = '%' where user = 'root';
mysql>FLUSH PRIVILEGES;
  • 查看初始化密码
sudo grep 'temporary password' /var/log/mysql/mysqld.log
  • 修改初始化密码
ALTER USER root@localhost IDENTIFIED BY 'newPassword';

# 修改配置

在后端代码中根据自己的开发环境修改配置,然后启动服务

  • app/config/dbConfig.js 配置本地数据库和线上数据库
module.exports = {
  env: process.env.NODE_ENV, // development or production
  database: {
    // 本地数据库地址
    development: {
      host: '10.201.78.8',
      user: 'root',
      password: '1234qwer',
      database: 'test',
    },
    // 线上数据库地址
    production: {},
  },
};
module.exports = {
  enable: false, // 是否使用https
  // https证书配置
  httpsCert: {
    key: fs.readFileSync('key.pem'),
    cert: fs.readFileSync('cert.pem'),
  },
};
  • app/config/pushConfig.js 配置是否开启邮箱、钉钉推送,推送时间
const pushMailNotion = false; // 是否开启邮箱推送
const pushDingNotion = false; // 是否开启钉钉推送
const dingAccessToken = ''; // 钉钉群的token
const START_TIME = '2018-10-22'; // 开始时间,用于记录当前是第几期小报
module.exports = {
  dingConfig: { pushDingNotion, dingAccessToken },
  mailConfig: {
    pushMailNotion,
    // 邮箱server配置。这边以阿里云邮箱为例
    mailServerCfg: {
      service: 'qiye.aliyun',
      port: 25, // SMTP 端口
      host: 'smtp.mxhichina.com',
      secureConnection: true, // 使用SSL
      auth: {
        user: 'A@cai-inc.com',
        pass: 'XXX',
      },
    },
    // 邮件发送、抄送对象
    mailOptions: {
      from: '"政采云前端小报" <A@cai-inc.com>', // 邮件发送者
      to: ['B@cai-inc.com'], // 发送对象
      cc: ['C@cai-inc.com'], // 抄送对象
    },
    // 定时发送邮件的时间
    mailTime: {
      dayOfWeek: 5, // 每周五
      hour: 17, // 17点
      minute: 0,
      second: 0,
    },
  },
  START_TIME,
};

# 启动命令

npm run dev // 开启后端服务,数据库使用 development 环境的
npm run pro // 开启后端服务,数据库使用 production 环境的
npm run mail:dev // 开启邮件服务,数据库使用 development 环境的
npm run mail:pro // 开启邮件服务,数据库使用 production 环境的
npm run reload // 重新加载服务。更新代码之后使用

# 部署代码

# 方式1

  1. 首先把自己的 ssh 公钥添加到服务器的authorized_keys文件中,这样你就可以直接用ssh登录你的服务器了,可以参考配置 ssh (opens new window)。具体命令如下
ssh-copy-id -i ~/.ssh/id_rsa.pub root@服务器ip
  1. 在服务器上安装 Git、Node。以 Centos 为例,命名如下
yum install git
yum install -y nodejs
  1. 安装 MySQL 数据库 (opens new window)
  2. 创建数据库以及对应的表
  3. 在根目录运行 bash 命令,直接把本地的代码传到服务器指定的目录,然后登陆服务器启动服务即可。
rsync -av --delete -e ssh --exclude={'node_modules','.*','logs'} ./ 用户@服务器ip:/root/weekly/weekly-server/

# 方式2

通过 pm2 deploy (opens new window) 脚本部署、更新项目(此方式只适用于 Git 项目)

  1. 同方式1步骤1-4
  2. 在服务器上生成ssh,把公钥复制到GitHub上
  3. 根据pm2文档在process.json中配置相关字段
  4. 本地运行pm2 deploy process.json production setup初始化项目,然后运行pm2 deploy process.json production启动项目。 后续更新项目只需要运行pm2 deploy process.json production update,pm2 会从远程分支自动拉取最新的代码

# 日志

不管是开发环境还是生成环境。项目启动之后,会自动生成一个 logs 目录,会记录系统中日常的输出和报错信息。process 记录的是后台日志;process-job 记录的是邮件推送的日志;mineLogs.txt 是发送邮件成功之后的日志。

logs

# RSS 订阅功能

现在小报前端首页新增了 RSS 订阅图标,点击之后会请求 1200 端口,这个服务需要通过三方服务实现,可以参考 RSSHub (opens new window)

# 参考文档

Last Updated: 7/31/2021, 5:03:11 PM