module.exports = () => { return async (ctx, next) => { ctx.set('Access-Control-Allow-Origin', 'http://test.xue.com'); ctx.set('Access-Control-Allow-Credentials', true); ctx.set('Access-Control-Allow-Headers', 'content-type'); ctx.set('Access-Control-Allow-Methods', 'OPTIONS, GET, HEAD, PUT, POST, DELETE, PATCH'); // 这个响应头的意义在于,设置一个相对时间,在该非简单请求在服务器端通过检验的那一刻起, // 当流逝的时间的毫秒数不足Access-Control-Max-Age时,就不需要再进行预检,可以直接发送一次请求。 ctx.set('Access-Control-Max-Age', 3600 * 24); if (ctx.method == 'OPTIONS') { ctx.body = 200; } else { await next(); } } }
登录
这个系统属于强制登录的,登录统一进行了处理。
const Store = require("../../utils/Store"); const redis = new Store(); module.exports = () => { return async (ctx, next) => { // 白名单 if (ctx.request.url === '/api/login') { return await next(); } const SESSIONID = ctx.cookies.get('SESSIONID'); if (!SESSIONID) { return ctx.body = { mes: '没有携带SESSIONID~', data: '', err_code: 1, success: false, }; } const redisData = await redis.get(SESSIONID); if (!redisData) { return ctx.body = { mes: 'SESSIONID已经过期~', data: '', err_code: 1, success: false, }; } if (redisData && redisData.uid) { console.log(`登录了,用户uid为${redisData.uid}`); await next(); } } }
七、操作shell脚本
举个例子,创建项目分支
let path = ''; // 项目路径 // 创建分支 const branch_name = `branch_${new Date().getTime()}`; cp.execSync(`/data/dandelion-server/shell/createBranch.sh ${path} ${branch_name}`);
#!/bin/bash cd $1 git pull origin master git checkout -b $2 git push --set-upstream origin $2
八、连接数据库
config.js配置文件
let dbConf = null; const DEV = { database: 'dandelion', //数据库 user: 'root', //用户 password: '123456', //密码 port: '3306', //端口 host: '127.0.0.1' //服务ip地址 } const PRO = { database: 'dandelion', //数据库 user: 'root', //用户 password: '123456', //密码 port: '3306', //端口 host: 'xx.xx.xx.xx' //服务ip地址 } dbConf = PRO; //这个可以通过判断区分开发环境 module.exports = dbConf;
数据库连接文件
const mysql = require('mysql'); const dbConf = require('./../config/dbConf'); const pool = mysql.createPool({ host: dbConf.host, user: dbConf.user, password: dbConf.password, database: dbConf.database, }) let query = function( sql, values ) { return new Promise(( resolve, reject ) => { pool.getConnection(function(err, connection) { if (err) { reject( err ) } else { connection.query(sql, values, ( err, rows) => { if ( err ) { reject( err ) } else { resolve( rows ) } connection.release() }) } }) }) } module.exports = { query, }
就可以在model层调用了~
const {query} = require('../common/mysql'); class UserModel { constructor() {} /** * @description: 根据pid和did创建一个分支 * @param {pid} 项目id * @param {did} 需求id * @param {branch_name} 分支名 * @return: 分支信息 */ async insertBranchInfo(sqlParams) { const sql = 'insert branch_info (pid, bid, branch_name, pub_time) values(?,?,?,?)'; console.log(sql) let data = await query(sql, sqlParams, (err, result) => { return result; }); return data; } }
九、域名
没有买域名,通过本地修改hosts(可以直接用工具)
47.107.188.xx为服务器IP
47.107.188.xx test.xue.com
47.107.188.xx api.xue.com
47.107.188.xx m.xue.com
总结
算是第一次自己搭建一个完整的项目,从前端到后端。
尤其是后端,作为一个前端小白,从学习如何使用服务器,到Linux/Vim/Shell/Nignx/Pm2/Redis/Session/Mysql/Koa2。没有像以前一样,直接拿别的项目看,而是一步一个脚印的学习,虽然也都是皮毛,但是感觉自己的知识体系丰富了很多。也去了解了很多持续集成的知识,当然我做的小项目还是比较简单的啦~ 喜欢就点个赞鼓励一下吧,(^__^) 嘻嘻……
详细的使用都在前端项目、后端项目,感兴趣的可以看下并点个star哈~✨