系统规范
系统错误
编码规则
错误编码共5位:【大类(1)】【小类(1)】【明细(3)】
如:用户不存在:61001 => 【内部错误】【身份验证】【用户不存在】
成功提示信息: 10000
- 登录成功:10001
数据库: 20000
第三方异常:30000
代码报错: 50000
内部错误:60000
- 用户不存在:61001
- 密码有误:61002
- 二次验证失败:61003
- 权限不足:61004
- Token过期:61005
- 员工已离职:61006
- 无效的Token:61007
- 无访问Token:61008
样式规范
css语言
- 在vue中,统一使用scss
- css命名使用BEM规范
- html标签禁止使用style属性
- scss中,尽量使用_constant.scss定义的颜色
- 一个系统中,颜色不易多过,以使用$primaryColor为主
Vue 代码规范
属性要么全放一行,要么一个属性一行
属性申明顺序(按需)
- class
- slot
- v-for 或 v-if(不可用于同一元素)
- v-auth
- v-model
- 属性
- 事件
- ref名称
技术栈
前端
- Vue(v2.6.12):https://cn.vuejs.org/v2/guide/index.html
- Vue-router(v3.1.6):https://cn.vuejs.org/v2/guide/routing.html
- Vuex(v3.1.3):https://cn.vuejs.org/v2/guide/state-management.html
- Axios(v0.19.2):http://axios-js.com
- Ant Design For Vue(v1.7.2):https://www.antdv.com/components/button-cn/
- Vant(v2.8.3):https://vant-contrib.gitee.io/vant/#/zh-CN/
后端
- NodeJs(v12.16.1):http://nodejs.cn/learn
- Express(v4.16.1):https://www.expressjs.com.cn
- Mongoose(v5.9.12):https://mongoosejs.com/docs/guide.html
- Node-schedule(v1.3.2):https://www.npmjs.com/package/node-schedule
- Socket.io(v2.3.0):https://www.npmjs.com/package/socket.io
数据库
- mongoDB:https://www.mongodb.com/what-is-mongodb
server框架说明
基础说明
结构说明
- 语言:NodeJs v14.x、数据库:mongo v4.x
- 项目基于 Express v4.x 脚手架。
- 安全验证:request header中添加token(目前为帐号id,下一版升级为带时间的加密id)
- 路由扩展规则:在项目启动时对指定目录下自动读取,按文件/文件夹名进行创建路的规则
代码结构
|-- server
|-- app.js # 工程总入口
|-- package.json # 工程依赖文件
|-- bin # 启动目录
|-- |-- server.js # 启动入口文件
|-- |-- server.json # pm2 配置文件
|-- |-- svc.conf
|-- config # 配置信息
|-- |-- DolphinConfig.js # Dolphin-server-framework 个性化配置文件
|-- |-- config.js # 工程配置文件
|-- |-- initData # 初始化数据
|-- module # 模型配置
|-- public # 静态目录
|-- |-- exportExcel # 默认导出文件
|-- |-- uploadFiles # 默认上传文件
|-- routes # 路由层
|-- service # 服务层
|-- |-- ServiceMap.js # 服务层总入口
|-- socket # web-socket
|-- |-- RoomSocket.js 示例模块Socket 文件
|-- |-- init.js # Socket 初始化文件
|-- |-- common
|-- |-- |-- BaseSocket.js # Socket父类,未完善,暂放在各工程中,以后移到dolphin-server-framework中
|-- util # 工具类,供后台使用
|-- |-- LDAP.js # 对接LDAP
|-- |-- ThirdUtil.js # 统一第三方工具类,未完善,暂放在各工程中,以后移到dolphin-server-framework中
|-- |-- job # 定时任务
|-- |-- |-- JobMethod.js
|-- |-- |-- JobUtil.js
|-- |-- |-- syncWorkWeChat.js
|-- |-- notice # 通知
|-- |-- |-- AliSMS.js
|-- |-- |-- NodeMailer.js
|-- |-- |-- SmsYX.js
|-- |-- |-- VoiceYX.js
|-- |-- |-- alicloud-sms.js
基础配置
数据库配置
config.db = {
host : 'localhost',
port : '27017',
database : "wind_v4",
username : 'wind',
password : 'wind123',
};
服务端口
config.port = 19090;
项目统一路径
config.path = {};
config.path.publicPath = path.join(__dirname, '..', 'public'); //静态文件存放地址
config.path.uploadPath = path.join(config.path.publicPath, 'uploadFiles'); //上传文件存放地址
config.path.exportExcelPath = path.join(config.path.publicPath, 'exportExcel'); //导出文件存放地址
config.path.publicExportPath = '/exportExcel'; //导出文件地址对外相对地址
路由规则
基本规则
- 对指定目录(/server/routes)下自动读取,按文件/文件夹名进行创建路的规则,如/server/routers/system/auth/user.js的前缀路由为/system/auth/user
- 当访问路径能匹配到多个路由时,按路由加载顺序依次进入,当前一个路由函数调用next()时进入下一个路由
- 自动读取按同级目录文件/文件夹名称顺序加载,数字从小到大 -> 字母a到z
- 为方便控制路由先后加载顺序,对文件/文件夹名进行特殊处理,数字加_开头的部分仅用于文件/文件夹排序,不参与路由地址,即:/routes/0_login.js的前缀路由为/login
- 特殊处理:/routes/1_index.js的前缀路由为/,以对大多数请求进行统一处理
模块路由
- 模块路由都统一继承公共路由(BaseRouter | BaseListRouter | BaseTreeRouter)
- 提供定义路由接口的方法
- 每个模块的路由都默认提供CRUD等基础接口,在基于上述路由文件地址生成的前缀路由上,再加上定义的最末级路由,如:
- 用户的查询,
- 用户模块的路由文件地址是【/server/routers/system/auth/user】
- 生成的路由前缀地址是【/system/auth/user】
- 查询的末级路由【/find】
- 最终用户查询的路由地址就是【/system/auth/user/find】
BaseRouter
路由工厂,根据规则自动生成express.router
routerMap
根据请求方式注册routerMap,将所需接口加入对应数组中
路由定义规则
- 路由处理函数定义在类方法,路由方法名即为请求地址。
- 路由方法名转换地址规则
- 自动添加第一个”/“,分隔符”/“用”_”代替,比如report_byUser => /report/byUser
- 路径参数,变量符”:”用”$”代替,比如save_$id => /save/:id
- 路由方法返回值决定路由返回方式。公共方法只提供基本的返回JSON方式
- 返回值为Promise时,公共方法会根据Promise的结果返回前台
- 当resolve时,返回resUtil.success(result)
- 当reject时,打印日志并返回resUtil.error(err)
- 返回值为非Promise时,公共方法不做任何处理。如果需要特殊的返回时,比如文件下载、页面跳转等可以方法中直接使用res对象处理,return false就可以了。
- 当需要修改基础路由时,直接重写类方法即可
- 路由方法默认接收3个参数,req, res, next
统一返回格式
const response = {
success : true,
data : {},
rows : [],
total : 0,
message : "操作成功。",
errorCode : 0
};