目录
strapi解决方案
2020年12月29日星期二
- 组网图
- 路由
http://test.ichub.cn/nodeapi/hub-strapi/api/hub-levels
http://test.ichub.cn/nodeapi/hub-strapi/graphql
nodeai指向 haproxy
Hub-strapi指向hub-proxy
Hub-proxy再指向strapi
- 权限
根据url确定权限的配置与鉴权,分为rest接口和graphql(strapi)接口,目前工程在strapi-proxy : hub合约域
-
- 环境变量:
domain=hub
区分不同领域
-
- 权限入口:
app.use(Auth.authMiddleware())
-
- 权限配置:
rest白名单不需要鉴权
rest鉴权名单
// rest url鉴权名单
const checkList = [
//strapi api right
{
method: 'get', url: '/api/hub-meters',
domain: 'S', type: 'B', code: 'manage', key: 'print', action: 'insert',
},
]
graphql白名单不需要鉴权
const graphqlWhiteList = [
//已经使用
{query: 'hubDictionarys'},
{query: 'hubContractTypes'},
//支付模板
{query: 'hubCardTypes'},
{query: 'hubCurrencyTypes'},
{query: 'hubDictionarys'},
{query: 'hubLevels'},
{query: 'hubCards'},
{query: 'hubAssets'},
{mutation: 'createHubIcbank'},
{mutation: 'createHubCardType'},
{query: 'hubIcbanks'},
{query: 'hubCurrencies'},
// {mutation: 'createHubIcbank'},
{mutation: 'updateHubIcbank'},
{mutation: 'deleteHubIcbank'},
{mutation: 'updateHubCard'}
]
graphql鉴权名单
const graphqlCheckList = [
{
query: 'hubDictionarys', //mutation
domain: 'S', type: 'B', code: 'manage', key: 'print', action: 'read',
},
{
query: 'hubContractTypes', //mutation
domain: 'S', type: 'B', code: 'manage', key: 'print', action: 'read',
},
{
mutation: 'createHubCardType', //mutation
domain: 'S', type: 'B', code: 'manage', key: 'print', action: 'insert',
},
{
mutation: 'createHubIcbank', //mutation
domain: 'S', type: 'B', code: 'manage', key: 'print', action: 'insert',
},
]
- nodejs调用graphql
- 配置queryCardsByCardType.gql
query {
hubCards (filters:{
user_id:{eq: "${user_id}"},
card_type_id:{eq: "${card_type_id}"}
}){
data {
id
attributes {
name
}
}
}
}
- 调用graphql
let res = await strapiMsg.queryCardsByCardType(base, {user_id: user.id, card_type_id})
let query = gqlParser('queryCardsByCardType', data)
const res = await request.httpPost(base + '/graphql', {query})
return FormatResult.formatResultGraphql(res)
- 工程代码
- Strapi与nodejs方案优点:
- 通过strapi-proxy将strapi能力拉通
- graphql通用的strapi增删改查
graphql接口完全由模型驱动,也就是结构变化不用修改接口
包括排序和过滤条件
-
- 通过权限与rpc打通原go实现的接口
安装工具npm install protoc-gen-grpc -g
生成nodejs接口: protoc-gen-grpc --js_out=import_style=commonjs:. --grpc_out=. *.proto
-
- strapi-proxy实现通用es查询接口
nodejs支持es增删改查,特别是查询,Es index结构变化不用修改接口代码
- 配置环境变量
esEnv=release
- 配置ES操作类
'use strict'
const {DaoService, elasticBuilder} = require('../../../public')
const HubService = {
hubQuota: new DaoService('hub_quota'),
hubContract: new DaoService('hub_contract'),
hubShopContract: new DaoService('hub_shop_contract'),
hubShopContractQuota: new DaoService('hub_shop_contract_quota'),
hubMeters: new DaoService('hub_meters'),
hubQuotaFlow: new DaoService('hub_quota_flow'),
}
- 通用查询
querySignQuota: async (query) => {
if (!query.order_bys) {
query.order_bys = "domain_id|asc,quota_item_id|asc"
}
//汇总
const res = await HubService.hubShopContractQuota.esSearch(query)
- 入参根据有芯标准
{
param:
{
domain_name: "人脉",
card_id: "808695103533121537,
},
current: 1,
page_size: 1,
order_bys: 'qty|asc'
}
返回
{
"code": 200,
"msg": "操作成功!",
"data": {
"list": [
{
"type_name": "免费",
"shop_contract_name": "员工建账合约模板1",//签约名称
"quota_sku_id": "789154100014448641",
"available": 4,
"signer_shop_name": "剑圣123", //剩余
"used": 0,
"type": 20,
"domain_id": 1,
"domain_name": "人脉",//领域名称
"quota_item_id": 18, 配额项id
"contract_quota_id": "804358634236903425", //配额库存ID
"quota_id": "788553764484186113",//配额id
"state": 40,
"shop_contract_id": "804358631905755137",
"signer_user_id": "722819551922716673",
"total_price": 8,//总价
"end_time": 1678587574000,
"combo_id": "789154094779105281",//
"shop_id": "722876601929531393",
"start_time": 1665541174000,
"user_id": "722876601689931777",
"qty": 4,//数量
"invalid": 0,
"signer_shop_id": "722819552698826753",
"quota_item_name": "成员",//配额名称
"brand_name": "有芯",//厂牌
"remark": "备注",//备注
"part_number": "型号",//型号
"price":2 //单价,
card_id: '808695103533121537',//卡id
}
],
"pagination": {
"total": 14,
"current": 1,
"page_size": 1
}
}
}
- 解决难题:
最多的是Int64转字符串格式,此问题不解决strapi,nodejs无法使用。
Graphql, rpc , es都有此问题。
- 提升效率的方式:
- DAO层接口控制数目,特别是查询
- 使用graphql标准接口
- 与go语言拉通:权限、RPC
权限代码使用rpc
-
- 使用工具生成nodejs dao层代码
打印模板nodejs部份代码,对表的操作类似gorm,
支持多表操作
-
- 使用工具生成go语言多层代码
Cms、hub有使用。
其中query接口是通用的查询,一个接口搞定
-
- 一个注意点:
只有前端页面使用es查询,
后端用于生成查询前端接口的功能使用es组装
交易事务不能使用es查询,使用db操作。
- 其它:
- dbtool数据迁移工具
http://lei@192.168.13.235:10080/lei/strapi-dbtool.git
http://git clone https://gitee.com/ichub/strapi-dbtool.git
/*
* author: leijmdas
* company: farben
* date : 2022-08-27
*
* */
const DbToolService = require('./dbtools/dbtool')
const key = 'hub'
const backup = false
const expDev = () => DbToolService.DBExp2Files(key, 'connDev', backup)
const expTest = () => DbToolService.DBExp2Files(key, 'connTest', backup)
const expRelease = () => DbToolService.DBExp2Files(key, 'connRelease', backup)
const expMaster = () => DbToolService.DBExp2Files(key, 'connMaster', backup)
module.exports = {
expDev, expTest, expRelease, expMaster
}
expDev()
-
- go代码生成工具
-
- nodejs容器打包
- Dockerfile:
FROM node:16-alpine
MAINTAINER leijmdas <leijmdas@163.com>
RUN yarn config set registry http://192.168.13.191:8081/repository/group-npm/
RUN yarn config set disturl https://npm.taobao.org/dist
#RUN yarn config set https://registry.npm.taobao.org/
WORKDIR /root/strapi-proxy
ENV strapiUrl hub-strapi-dev:1337
#ENV goapiUrl hub-strapi-dev:1337
ADD ./strapi-proxy /root/strapi-proxy
EXPOSE 13370
RUN yarn
CMD [ "yarn","hub"]
- Strapi-proxy环境变量
environment:
TZ: Asia/Shanghai
# esHost与go环境相同 elasticsearch使用
esHost: "192.168.13.184:9200,192.168.13.185:9200,192.168.13.186:9200"
# esEnv:es使用与go环境相同
esEnv: dev #elasticsearch使用
# domain:strapi权限使用,strapi领域确定
domain: hub #api check-right needs 权限需要
# natsHosts,与go环境相同 nats消息需要
natsHosts: "192.168.13.235:4222,192.168.13.236:4222" # nats need
# etcdHost,与go环境相同 RPC服务需要
etcdHost: "192.168.14.75:12379" #"192.168.13.154:2379,192.168.13.155:2379,192.168.13.156:2379"
# serviceName:strapi使用
serviceName: strapi-proxy-hubdev
# proxyPort:k8s确定
proxyPort: 13370
# strapiUrl:连接strapi:k8s确定
strapiUrl: hub-strapi-dev:1337