给别朋友开法了一个精简的会员管理系统, 因为项目小自己想尝鲜,所以采用的是
Nodejs + mariadb。代码放在阿里的云效平台方便部署
首先在阿里云花99元 买下1台ECS 云服务器,通过页面远程登录到主机,我在/root目录下操做
--安装mariadb, mysql好像要收费
yum install mariadb-server
--查看mariadb安装状态,并启动
systemctl status mariadb, systemctl start mariadb
--初始化数据库,按提示输入,要先启动数据库
mysql_secure_installation
#开启远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'XXXXX' WITH GRANT OPTION;
#开启本机访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'XXXXX';
flush privileges;
--安装nodejs
从网络下载:wget https://nodejs.org/dist/v18.20.1/node-v18.20.1-linux-x64.tar.xz
解压:tar -xvf node-v18.20.1-linux-x64.tar.xz
做软链接:
ln -s /root/node-v18.20.1-linux-x64/bin/node /usr/bin/node
ln -s /root/node-v18.20.1-linux-x64/bin/npm /usr/bin/npm
在/etc/profile文件中,新增以下两行
export NODE_HOME=/root/node-v18.20.1-linux-x64/bin/
export PATH=$PATH:$NODE_HOME:/usr/bin/
使变量文件生效
source /etc/profile
--安装git,并下载代码
yum install -y git
git clone https://codeup.aliyun.com/abc/你的项目.git
------------------------项目的配置及启动
在src/下创建 env_conf.js 并配置对应参数
npm install //安装所有依赖
npm run prod //运行
-- 开启端口访问,在阿里云ECS控制台配置安全组开放要访问的端口,如果不能访问看下防火墙情况(默认是关闭的不用管)
数据库,我只有当业务需要改数据或手动备份的时候,才会勾线允许外网访问。
--数据库的客户端工具好多都需要收费, 我用的HeidiSQL, 免费且操做风格跟其他工具大致类同
另外谈一下心得,如果项目真的很小随便弄弄用nodejs没问题,大的建议还是老老实实java。
web框架,我用的是koa,这个可以支持同步方式,否则nodejs的异步回调机制写起来真难受
// GET 查询单个用户
router.get('/users/:id', async (ctx) => {
let queryResult = await getUserById(ctx.params.id, ctx.session.tenant_id)
ctx.body = {
errorCode: 'OK',
data: queryResult
}
})
数据库我用的是mysql2,多个db操做,需要自己取封装事务
const mysql = require('mysql2/promise');
const envConfig = require('../env_conf')
const pool = mysql.createPool({
host: envConfig.mysqlHost,
user: envConfig.mysqlUser,
password: envConfig.mysqlPwd,
database: envConfig.mysqlDb,
timezone: 'Asia/Shanghai',
waitForConnections: false
});
// 可以执行单个sql
const executeSQL =(sql, params) => {
// 获取连接
const connection = pool.getConnection();
return new Promise(function (resolve, reject) {
// 执行SQL语句
try {
connection.query(sql, params, (err, results) => {
if (err) {
reject(err)
} else {
resolve(results)
}
})
} catch (e) {
reject(e)
} finally {
connection.release() // 关闭链接
}
})
}
// 可以执行多个sql,开启事务
const executeTransactionSQL = async (sqlparamsList) => {
// 获取连接
const connection = await pool.getConnection();
try {
// 开始事务
await connection.beginTransaction();
for(var i=0; i< sqlparamsList.length; i++){
await connection.query(sqlparamsList[i].sql, sqlparamsList[i].params)
}
// 提交事务
await connection.commit();
return "ok"
} catch (error) {
// 回滚事务
await connection.rollback();
console.log(error);
return "error"
} finally {
// 释放连接
connection.release();
}
}
module.exports = { executeSQL, executeTransactionSQL }