node 项目管理系统:搭建基础平台。从0到1
sinye56 2024-10-25 16:15 4 浏览 0 评论
前言
介绍过了项目流程设计、数据库搭建、jwt 登录等模块。
此篇我们介绍分支管理设计及其他的基础模块。
后端模块
- DevOps - Gitlab Api使用(已完成,点击跳转)
- DevOps - 搭建 DevOps 基础平台(已完成 50%)基础平台搭建上,点击跳转
- DevOps - Gitlab CI 流水线构建
- DevOps - Jenkins 流水线构建
- DevOps - Docker 使用
- DevOps - 发布任务流程设计
- DevOps - 代码审查卡点
- DevOps - Node 服务质量监控
后期可能会根据 DevOps 项目的实际开发进度对上述系列进行调整
Git 分支管理流程
Git Flow 流程
Production 分支
就是常用的 Master 分支,这个分支包含最近发布到生产环境的代码,最近发布的 Release, 这个分支只能从其他分支合并,不能在这个分支直接修改
Develop 分支
这个分支是的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并于其他分支,比如 Feature 分支
Feature 分支
这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回 Develop 分支,并进入下一个 Release
Release 分支
当需要发布一个新 Release 的时候,基于 Develop 分支创建一个 Release 分支,完成 Release 后,合并到 Master 和 Develop 分支
Hotfix 分支
当在 Production 发现新的 Bu g时候,需要创建一个 Hotfix, 完成 Hotfix 后,合并回 Master 和 Develop 分支,所以 Hotfix 的改动会进入下一个 Release
整体的分支管理流程如下图所示
项目自建流程
上述的 Git Flow 流程使用可以规范约束开发质量跟流程,我们稍微修改一下部分流程,融入到项目中进行使用。
如图每个工程都共享一个 version 版本号,分支创建分为版本升级、特性更新、修订补丁三种模式,强制项目所有分支创建的命名规则都会升级,不会出现重复跟降级。
上述流程的优点:
- 工程使用固定的版本锁死,版本对应需求流程,上线质量得到保障
- 每个开发分支都只能部署到测试环境,必须合并到合并到对应的版本分支之后才能上生产
- 所有合并到 master 或者 relase 分支会被删除,防止一条分支处理过多业务,后期 review、回滚难度提升
- realse 版本分支上线之后,生成对应 tag
- hotfix 版本可以从对应的 tag 拉出,可以明确的知道 hotfix 具体修复的是哪个版本的问题
上述流程的缺点:
- 固化版本流程导致创建命名规则固定,且版本号不能升级只能降级
- 流程限制,降低开发灵活性
没有完美的解决方法,所有 devops 流程都要结合真实项目需求来设计,上述只是一种解决方案
DevOps 开发中篇
添加全局报错回调
没有绝对安全的程序,所有程序在运行中因各种情况会出现 error,全局错误回调是基础模块必要的。
export default class HttpExceptions extends Error { // 继承修改 error 类型
code: number;
msg: string;
httpCode: number;
constructor({ msg = "服务器异常", code = 1, httpCode = 400 }) {
super();
this.msg = msg;
this.code = code;
this.httpCode = httpCode;
}
}
import HttpExceptions from "../exceptions/http_exceptions"; // 全局拦截错误处理
export default () => {
return async function errorHandler(ctx, next) {
try {
await next();
} catch (err) {
// 所有的异常都在 app 上触发一个 error 事件,框架会记录一条错误日志
ctx.app.emit("error", err, ctx);
let status = err.status || 500;
let error: any = {};
if (err instanceof HttpExceptions) {
status = err.httpCode;
error.requestUrl = `${ctx.method} : ${ctx.path}`;
error.msg = err.msg;
error.code = err.code;
error.httpCode = err.httpCode;
} else {
// 未知异常,系统异常,线上不显示堆栈信息
// 生产环境时 500 错误的详细错误内容不返回给客户端,因为可能包含敏感信息
error.code = 500;
error.errsInfo =
status === 500 && ctx.app.config.env === "prod"
? "Internal Server Error"
: err.message;
}
// 从 error 对象上读出各个属性,设置到响应中
ctx.body = error;
if (status === 422) {
ctx.body.detail = err.errors;
}
ctx.status = status;
}
};
};
复制代码
如上,我们拓展默认错误类,添加错误中间件拦截全局异常,如果出现自定义异常抛出的时候,则处理全局异常,否则统一抛出 500 错误,去除敏感信息。
webSocket 使用
为什么要使用 webSocket
项目管理中,会涉及到同一个项目多人协作操作,而 ajax 轮训既消耗性能,实时性也不能完全保证,也会推送大量无效信息。所以项目采用 websocket 来推送多人协作信息以及后期构建流程的状态推送。
egg-socket
框架提供了 egg-socket.io 插件,增加了以下开发规约:
- namespace: 通过配置的方式定义 namespace(命名空间)
- middleware: 对每一次 socket 连接的建立/断开、每一次消息/数据传递进行预处理
- controller: 响应 socket.io 的 event 事件
- router: 统一了 socket.io 的 event 与 框架路由的处理配置方式。
具体的使用方式请参考:egg-socket.io 使用,下面简单说下 ts 的配置
import { Application } from "egg"; // io路由使用方式
import { EggShell } from "egg-shell-decorators";
export default (app: Application) => {
const { router, controller, io } = app;
EggShell(app);
// socket.io
io.of('/').route('server', io.controller.nsp.ping);
};
复制代码
ts 使用中 io.controller.nsp 会报类型未定义,所以需要修改一下 typings/index.d.ts 文件。
import "egg";
declare module "egg" {
interface Application { }
interface CustomController {
nsp: any;
}
interface EggSocketNameSpace {
emit: any
}
}
复制代码
socket.io-client
window.onload = function () {
// init
const socket = io('http://127.0.0.1:7001', {
// 实际使用中可以在这里传递参数
query: {
room: 'nsp',
userId: `client_${Math.random()}`,
},
transports: ['websocket'],
});
socket.on('connect', () => {
const id = socket.id;
log('#connect,', id, socket);
// 监听自身 id 以实现 p2p 通讯
socket.on(id, (msg: any) => {
log('#receive,', msg);
});
});
// 接收在线用户信息
socket.on('online', (msg: any) => {
log('#online,', msg);
});
// 系统事件
socket.on('disconnect', (msg: any) => {
log('#disconnect', msg);
});
socket.on('disconnecting', () => {
log('#disconnecting');
});
socket.on('error', () => {
log('#error');
});
window.socket = socket;
};
复制代码
客服端采用 socket.io-client 去链接 websocket。上述是基础链接部分,具体的实现要根据业务需求开发。
客服端实现
为了保障项目开发速度,客户端选择了 ANT DESIGN PRO。具体安装步骤请参考教程,这边展示一下部分业务端的代码。
JWT 前端使用
/**
* 异常处理程序
*/
const errorHandler = (error: { response: Response }): Response => {
const { response } = error;
if (response && response.status) {
const errorText = codeMessage[response.status] || response.statusText;
const { status, url } = response;
if (response.status === 401) {
window.location.href = '/user/login';
}
notification.error({
message: `请求错误 ${status}: ${url}`,
description: errorText,
});
} else if (!response) {
notification.error({
description: '您的网络发生异常,无法连接服务器',
message: '网络异常',
});
}
return response;
};
/**
* 配置request请求时的默认参数
*/
const request = extend({
prefix: '/api',
errorHandler, // 默认错误处理
credentials: 'include', // 默认请求是否带上cookie
headers: {
authorization: localStorage.getItem('authorization'), // 读取本地保存的 authorization token
},
});
export default request;
复制代码
改造 request 模块
import request from '@/utils/request';
export interface LoginParamsType {
username: string;
password: string;
mobile: string;
captcha: string;
}
export async function fakeAccountLogin(params: LoginParamsType) {
return request('/user/getUserToken', {
getResponse: true, // 开启可以拿到返回 header 参数,将对应的 authorization token 存入本地使用
method: 'POST',
data: { params },
});
}
复制代码
如上,拿到 response header 里面的 token,后续可以正常请求接口。
尾声
此项目是从零开发,后续此系列博客会根据实际开发进度推出,项目完成之后,会开放部分源码供各位同学参考。
最后,咱给小编:
1. 点赞+评论
2. 点头像关注,转发给有需要的朋友。
谢谢!!
相关推荐
- Linux在线安装JDK1.8
-
首先在服务器pingwww.baidu.com查看是否可以连网然后就可以在线下载一、下载安装JDK1.81、在下载安装的同时做好一些准备工作...
- Linux安装JDK,超详细
-
1、了解RPMRPM是Red-HatPackageManager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux...
- Linux安装jdk1.8(超级详细)
-
前言最近刚购买了一台阿里云的服务器准备要搭建一个网站,正好将网站的一个完整搭建过程分享给大家!#一、下载jdk1.8首先我们需要去下载linux版本的jdk1.8安装包,我们有两种方式去下载安装...
- Linux系统安装JDK教程
-
下载jdk-8u151-linux-x64.tar.gz下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.ht...
- 干货|JDK下载安装与环境变量配置图文教程「超详细」
-
1.JDK介绍1.1什么是JDK?SUN公司提供了一套Java开发环境,简称JDK(JavaDevelopmentKit),它是整个Java的核心,其中包括Java编译器、Java运行工具、Jav...
- Linux下安装jdk1.8
-
一、安装环境操作系统:CentOSLinuxrelease7.6.1810(Core)JDK版本:1.8二、安装步骤1.下载安装包...
- Linux上安装JDK
-
以CentOS为例。检查是否已安装过jdk。yumlist--installed|grepjdk或者...
- Linux系统的一些常用目录以及介绍
-
根目录(/):“/”目录也称为根目录,位于Linux文件系统目录结构的顶层。在很多系统中,“/”目录是系统中的唯一分区。如果还有其他分区,必须挂载到“/”目录下某个位置。整个目录结构呈树形结构,因此也...
- Linux系统目录结构
-
一、系统目录结构几乎所有的计算机操作系统都是使用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件,而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树...
- Linux文件查找
-
在Linux下通常find不很常用的,因为速度慢(find是直接查找硬盘),通常我们都是先使用whereis或者是locate来检查,如果真的找不到了,才以find来搜寻。为什么...
- 嵌入式linux基本操作之查找文件
-
对于很多初学者来说都习惯用windows操作系统,对于这个系统来说查找一个文件简直不在话下。而学习嵌入式开发行业之后,发现所用到的是嵌入式Linux操作系统,本想着跟windows类似,结果在操作的时...
- linux系统查看软件安装目录的方法
-
linux系统下怎么查看软件安装的目录?方法1:whereis软件名以查询nginx为例子...
- Linux下如何对目录中的文件进行统计
-
统计目录中的文件数量...
- Linux常见文件目录管理命令
-
touch用于创建空白文件touch文件名称mkdir用于创建空白目录还可以通过参数-p创建递归的目录...
- Linux常用查找文件方法总结
-
一、前言Linux系统提供了多种查找文件的命令,而且每种查找命令都具有其独特的优势,下面详细总结一下常用的几个Linux查找命令。二、which命令查找类型:二进制文件;...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- 关闭防火墙linux (53)