# 介绍
政采云 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: {},
},
};
- app/config/httpsConfig.js 是否启用 https,配置 https证书 (opens new window)
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
- 首先把自己的 ssh 公钥添加到服务器的authorized_keys文件中,这样你就可以直接用ssh登录你的服务器了,可以参考配置 ssh (opens new window)。具体命令如下
ssh-copy-id -i ~/.ssh/id_rsa.pub root@服务器ip
- 在服务器上安装 Git、Node。以 Centos 为例,命名如下
yum install git
yum install -y nodejs
- 安装 MySQL 数据库 (opens new window)
- 创建数据库以及对应的表
- 在根目录运行 bash 命令,直接把本地的代码传到服务器指定的目录,然后登陆服务器启动服务即可。
rsync -av --delete -e ssh --exclude={'node_modules','.*','logs'} ./ 用户@服务器ip:/root/weekly/weekly-server/
# 方式2
通过 pm2 deploy (opens new window) 脚本部署、更新项目(此方式只适用于 Git 项目)
- 同方式1步骤1-4
- 在服务器上生成ssh,把公钥复制到GitHub上
- 根据pm2文档在process.json中配置相关字段
- 本地运行
pm2 deploy process.json production setup
初始化项目,然后运行pm2 deploy process.json production
启动项目。 后续更新项目只需要运行pm2 deploy process.json production update
,pm2 会从远程分支自动拉取最新的代码
# 日志
不管是开发环境还是生成环境。项目启动之后,会自动生成一个 logs 目录,会记录系统中日常的输出和报错信息。process 记录的是后台日志;process-job 记录的是邮件推送的日志;mineLogs.txt 是发送邮件成功之后的日志。
# RSS 订阅功能
现在小报前端首页新增了 RSS 订阅图标,点击之后会请求 1200 端口,这个服务需要通过三方服务实现,可以参考 RSSHub (opens new window)。