基于Vue2和Node.js的反欺诈系统设计与实现 (12)

controller层的代码如下(这边其实可以用Promise.all进行优化,参考schedule那个例子,读者试着改一下吧,因为它触发了eslint的这个规则,/* eslint-disable no-await-in-loop */, 不建议在循环中用await):

async calculate() { const { ctx, service } = this; const { start, end } = ctx.request.body; const startUinx = this.ctx.app.utils.date.transformDate(start); const endUnix = this.ctx.app.utils.date.transformDate(end); const pieData = await service.statistics.calculateCount(startUinx, endUnix); const monthArr = this.ctx.app.utils.date.getMonthArr(start, end); const barData = []; let totalAmount = 0; for (const month of monthArr) { const { name, value } = month; const unix = this.ctx.app.utils.date.transformDate(value); const amount = await service.statistics.calculateAmount(unix); totalAmount += amount; barData.push({ name, amount }); } ctx.success({ pieData, barData, totalAmount }); } 功能实现-按钮权限控制

这里以银行查控为例,主要是根据相关的用户角色和记录的状态去判断它有什么按钮权限,具体的代码如下:

async index() { const { ctx, service } = this; const { alarmNo, account, bankId, accountType, page, pageSize } = ctx.request.query; const { list, ...rest } = await service.bank.getAllLimit( alarmNo, account, bankId, accountType, Number(page), Number(pageSize) ); const data = list.map(item => { const { role } = ctx.session.userinfo; const { status } = item; let btnList = []; if (role === 'operator') { if (status === 0) { btnList = ['check', 'detail']; } else if (status === 1) { btnList = ['detail']; } } else { btnList = ['detail']; } return { btnList, ...item, }; }); ctx.success({ list: data, ...rest }); } 部署实施 传统方式一个一个来(以ubuntu21.04举例) 能联网

第一步:

mysql的安装: apt-get install mysql-server

nginx的安装: apt-get install nginx

nodejs的安装 : apt-get install nodejs

第二步:

配置nignx、mysql开机自启动(略),nodejs这边的程序建议用pm2管理,具体的步骤如下

安装pm2

npm i pm2 -g

egg程序设置pm2管理,根目录新增server.js

// server.js const egg = require('egg'); // eslint-disable-next-line global-require const workers = Number(process.argv[2] || require('os').cpus().length); egg.startCluster({ workers, baseDir: __dirname, port: 7001, });

对pm2程序进行配置,根目录新增ecosystem.config.js

module.exports = { apps: [ { name: 'server', script: './server.js', instances: '1', exec_mode: 'cluster', env: { COMMON_VARIABLE: 'true', NODE_ENV: 'production', PORT: 7001, }, }, ], };

在package.json的scripts中中添加脚本

"pm2": "pm2 start server.js --env ecosystem.config.js"

设置pm2开机自启动

pm2 startup pm2 save

pm2文档: https://pm2.keymetrics.io/docs/usage/quick-start/

eggjs程序用pm2管理:

这里写的eggjs程序官网是不推荐用pm2管理的,在开发环境有egg-bin,生产环境有egg-script,我这边主要是考虑到,服务器那边环境没有我们阿里云或者腾讯云上面操作方便,需要考虑宕机后系统的重启,而PM2刚好具备这些特性(管理node程序,开机自启动管理的node程序),俺也懒得写启动脚本,就在选型上用pm2去管理,后面上了docker以后,那就没这么多杂事了。

不能联网

阿西吧,这个就比较头大了。这边就提供两个思路,第一个是组网,就是用你的电脑拉一根网线跟服务器组一个局域网,然后共享你的网络,这里需要注意的是,服务器可能 会有多个网卡,你需要确保你所配置的那张网卡是对的,这边有两个办法,第一个是眼睛睁大看网口上有没有标号, 第二个就是暴力组网,在你的宿主机上,使用ping 服务器内网配置ip -t 去测,直到发现那个正确的网卡。组完网,参照楼上的就跑一遍呗。

第二个就异常痛苦啦,实在连不上网,就需要提前下载相关的源码包(这里比较头大的是,一些不确定的依赖,比如编译安装的时候,可能需要下c++的库),挂载到服务器上一个一个解压编译安装,emmmmmmmm,太痛苦了,放弃治疗吧,我选docker。

优劣势

没看出有啥优势,头皮发麻,2333333333。

docker一把梭 Dockerfile的编写

通过docker build命令运行Dockerfile,我们可以得到相应的镜像,然后通过docker run 相应的镜像我们可以得到相应的容器,注意这里run命令要慎用,因为每执行一次都会创建一层镜像,你可以把多条命令用&&放到一起,或者放到CMD命令中,CMD是容器跑起来的时候执行的命令。

前端(以hzga-fe为例)

这里表示是基于node14.8.0的镜像,创建人是ataola,以/app为工作目录,拷贝相关的文件到工作目录,然后运行相关的命令构建镜像,在构建完以后,基于nginx1.17.2的镜像,将打包好后的文件拷贝到nginx中,暴露80端口,在容器跑起来的时候执行CMD的命令。

# build stage FROM node:14.8.0 as build-stage MAINTAINER ataola <zjt613@gmail.com> WORKDIR /app COPY package.json ./ COPY nginx ./nginx/ COPY public ./public/ COPY .editorconfig .env.* .eslintrc.js .eslintignore .prettierrc jsconfig.json *.config.js ./ COPY src ./src/ COPY build ./build/ RUN npm install --registry=https://registry.npm.taobao.org cnpm -g \ && SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ cnpm install --registry=https://registry.npm.taobao.org \ && npm rebuild node-sass \ && npm run build:prod # production stage FROM nginx:1.17.2-alpine-perl as production-stage COPY --from=build-stage /app/dist /usr/share/nginx/html COPY --from=build-stage /app/nginx /etc/nginx/ VOLUME /app EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfxzj.html