This commit is contained in:
2023-11-07 17:11:57 +08:00
commit 1358e52fdb
643 changed files with 84924 additions and 0 deletions
@@ -0,0 +1,43 @@
'use strict';
const dbName = 'jjx-enquiry-attributes'
module.exports = {
/**
* 查询现货列表
* @url client/spot/goods/kh/getList 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
const {pageIndex,pageSize,label } = data
let whereJson = {
enable: true,
label
};
res = await vk.baseDao.selects({
dbName,
getCount:false,
pageIndex,
pageSize,
// 主表where条件
whereJson: whereJson,
// 主表字段显示规则
fieldJson:{},
// 主表排序规则
sortArr:[{ name:"sort", type:"asc" }],
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,44 @@
'use strict';
const dbName = 'jjx-enquiry-attributes'
module.exports = {
/**
* 查询现货列表
* @url client/spot/goods/kh/getList 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "",list: [] };
// 业务逻辑开始-----------------------------------------------------------
const {pageIndex,pageSize,label } = data
let whereJson = {
enable: true,
label
};
const info = await vk.baseDao.findByWhereJson({
dbName,
getCount:false,
whereJson: whereJson,
});
if(info != null) {
res.list = info.values.map(item => {
return {
label: item,
value: item
}
})
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,63 @@
'use strict';
module.exports = {
/**
* XXXnameXXX
* @url client/enquiry/sheet/kh/add 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let {
productList,
remark,
invoice,
writeInvoiceTime,
nvoiceType,
transportDocuments,
otherTransportDocuments,
transportLimit,
tradeMethod,
payMethod,
advancePayRate,
otherPayMethod,
reputationPayDay,
answerTime,
earnestMoney,
status
} = data;
// 这里需要把 params1 params2 params3 改成你数据库里允许用户添加的字段
let dbName = "jjx-enquiry-sheet";
res.id = await vk.baseDao.add({
dbName,
dataJson:{
productList,
remark,
invoice,
writeInvoiceTime,
nvoiceType,
transportDocuments,
otherTransportDocuments,
transportLimit,
tradeMethod,
payMethod,
advancePayRate,
otherPayMethod,
reputationPayDay,
answerTime,
earnestMoney,
status
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,42 @@
'use strict';
const dbName = 'jjx-enquiry-template'
module.exports = {
/**
* 查询现货列表
* @url client/spot/goods/kh/getList 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
const {pageIndex,pageSize } = data
let whereJson = {
enable: true
};
res = await vk.baseDao.selects({
dbName,
getCount:false,
pageIndex,
pageSize,
// 主表where条件
whereJson: whereJson,
// 主表字段显示规则
fieldJson:{},
// 主表排序规则
sortArr:[{ name:"sort", type:"desc" }],
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,196 @@
'use strict';
const { verify } = require("crypto");
var CryptoJS = require("crypto-js");
var vk; // 全局vk实例
// 涉及的表名
const dbName = {
//test: "vk-test", // 测试表
};
var db = uniCloud.database(); // 全局数据库引用
var _ = db.command; // 数据库操作符
var $ = _.aggregate; // 聚合查询操作符
/**
* 权限注意:访问以下链接查看
* 文档地址:https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#内置权限
*/
var cloudObject = {
isCloudObject: true, // 标记为云对象模式
/**
* 请求前处理,主要用于调用方法之前进行预处理,一般用于拦截器、统一的身份验证、参数校验、定义全局对象等。
* 文档地址:https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#before-预处理
*/
_before: async function() {
vk = this.vk; // 将vk定义为全局对象
// let { customUtil, uniID, config, pubFun } = this.getUtil(); // 获取工具包
},
/**
* 请求后处理,主要用于处理本次调用方法的返回结果或者抛出的错误
* 文档地址:https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#after-后处理
*/
_after: async function(options) {
let { err, res } = options;
if (err) {
return; // 如果方法抛出错误,直接return;不处理
}
return res;
},
/**
* 获取列表
* @url client/fadada.getList 前端调用的url参数地址
*/
getList: async function(data) {
let res = { code: 0, msg: '' };
let { uid } = this.getClientInfo(); // 获取客户端信息
// 业务逻辑开始-----------------------------------------------------------
// 业务逻辑结束-----------------------------------------------------------
return res;
},
/**
* 模板函数
* @url client/fadada.test 前端调用的url参数地址
*/
test: async function(data) {
},
/**
* 实名认证异步通知回调
* @param {Object} data
*/
async pub_verifyNotify(data) {
let { customUtil, uniID, config, pubFun } = this.getUtil(); // 获取工具包
const {customerId} = data;
// 查询认证结果
let user = await vk.baseDao.findByWhereJson({
dbName:"uni-id-users",
whereJson:{
fadadaCustomerId: customerId,
}
});
let res
if(user.accountType == 1) {
res = await pubFun.fadada('find_personCertInfo.api', {
verified_serialno: user.fadadaVerify.transactionNo
})
}else {
res = await pubFun.fadada('find_companyCertInfo.api', {
verified_serialno: user.fadadaVerify.transactionNo
})
}
// 认证成功
if(res.code == 1) {
await vk.baseDao.setById({
dbName:"fadada-verify-record",
dataJson:{
_id: user._id,
...res.data
}
})
await vk.baseDao.updateById({
dbName:"uni-id-users",
id: user._id,
dataJson:{
person: res.data.person,
company: res.data.company,
manager: res.data.manager,
BankCard: res.data.BankCard,
fadadaConfirm: true
}
});
}
return res
},
/**
* 获取用户认证结果
*/
async getVerifyResult() {
let { customUtil, uniID, config, pubFun } = this.getUtil(); // 获取工具包
let res = { code: 0, msg: '' };
let { uid } = this.getClientInfo(); // 获取客户端信息
let {accountType,fadadaCustomerId} = await this.getUserInfo();
res.data = await vk.baseDao.findById({
dbName:"fadada-verify-record",
id: uid
});
return res
},
/**
* 获取实名认证地址
*/
async getVerifyUrl() {
let { customUtil, uniID, config, pubFun } = this.getUtil(); // 获取工具包
let res = { code: 0, msg: '' };
let { uid } = this.getClientInfo(); // 获取客户端信息
let {accountType,fadadaCustomerId, fadadaVerify} = await this.getUserInfo();
// 业务逻辑开始-----------------------------------------------------------
if(fadadaVerify) {
res.data = fadadaVerify
return res;
}
let verify_url_res ;
if(accountType === 1) {
verify_url_res = await pubFun.fadada('get_person_verify_url.api', {
customer_id: fadadaCustomerId,
verified_way: 2,
page_modify: 1,
notify_url: 'https://fc-mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5.next.bspapp.com/fadada_verify_notify'
})
}else {
verify_url_res = await pubFun.fadada('get_company_verify_url.api', {
customer_id: fadadaCustomerId,
page_modify: 1,
notify_url: 'https://fc-mp-0737e52b-fffa-4223-bcdf-d4ad3d9968a5.next.bspapp.com/fadada_verify_notify'
})
console.log(': ',);
}
console.log('verify_url_res: ',verify_url_res);
let {transactionNo, url} = verify_url_res.data
var parsedWordArray = CryptoJS.enc.Base64.parse(url);
url = parsedWordArray.toString(CryptoJS.enc.Utf8);
await vk.baseDao.update({
dbName: "uni-id-users",
whereJson: {
_id: uid
},
dataJson: {
fadadaVerify: {
transactionNo,
url
}
}
});
res.data = {
transactionNo,
url
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
};
module.exports = cloudObject;
@@ -0,0 +1,23 @@
'use strict';
module.exports = {
/**
* 此函数名称
* @url client/order/kh/test 前端调用的url参数地址
* data 请求参数
* @params {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { customUtil, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
// 可写与数据库的交互逻辑等等
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,23 @@
'use strict';
module.exports = {
/**
* 此函数名称
* @url client/order/pub/test 前端调用的url参数地址
* data 请求参数
* @params {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { customUtil, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
// 可写与数据库的交互逻辑等等
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,105 @@
/**
* 此为云对象模式,可以在这一个对象中写多个函数,具体文档请查看
* https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html
*/
'use strict';
var vk; // 全局vk实例
// 涉及的表名
const dbName = {
//test: "vk-test", // 测试表
};
var db = uniCloud.database(); // 全局数据库引用
var _ = db.command; // 数据库操作符
var $ = _.aggregate; // 聚合查询操作符
/**
* 权限注意:访问以下链接查看
* 文档地址:https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#内置权限
*/
var cloudObject = {
isCloudObject: true, // 标记为云对象模式
/**
* 请求前处理,主要用于调用方法之前进行预处理,一般用于拦截器、统一的身份验证、参数校验、定义全局对象等。
* 文档地址:https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#before-预处理
*/
_before: async function() {
vk = this.vk; // 将vk定义为全局对象
// let { customUtil, uniID, config, pubFun } = this.getUtil(); // 获取工具包
},
/**
* 请求后处理,主要用于处理本次调用方法的返回结果或者抛出的错误
* 文档地址:https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#after-后处理
*/
_after: async function(options) {
let { err, res } = options;
if (err) {
return; // 如果方法抛出错误,直接return;不处理
}
return res;
},
/**
* 模板函数
* @url client/pub.test.getInfo 前端调用的url参数地址
*/
getInfo: async function(data) {
let { uid } = this.getClientInfo(); // 获取客户端信息
let userInfo = await this.getUserInfo(); // 获取当前登录的用户信息
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
console.log("getInfo请求参数", data);
res.userInfo = userInfo; // 返回前端当前登录的用户信息
// 业务逻辑结束-----------------------------------------------------------
return res;
},
/**
* 模板函数
* @url client/pub.test.getList 前端调用的url参数地址
*/
getList: async function(data) {
let { uid, filterResponse, originalParam } = this.getClientInfo(); // 获取客户端信息
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
console.log("getList请求参数", data);
// 业务逻辑结束-----------------------------------------------------------
return res;
},
/**
* 云对象调用自身函数
* @url client/pub.test.test1 前端调用的url参数地址
*/
test1: async function(data) {
let { uid, filterResponse, originalParam } = this.getClientInfo(); // 获取客户端信息
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
console.log("test1请求参数", data);
let res1 = await this.getInfo(data);
console.log("res1", res1);
// 业务逻辑结束-----------------------------------------------------------
return res;
},
/**
* 云对象调用任意云对象或云函数
* @url client/pub.test.test2 前端调用的url参数地址
*/
test2: async function(data) {
let { uid, filterResponse, originalParam } = this.getClientInfo(); // 获取客户端信息
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
console.log("test2请求参数", data);
let callRes = await vk.callFunction({
url: 'client/pub.test.getInfo',
clientInfo: this.getClientInfo(),
data: {
a:1
},
});
console.log("callRes", callRes);
// 业务逻辑结束-----------------------------------------------------------
return res;
}
};
module.exports = cloudObject;
@@ -0,0 +1,27 @@
'use strict';
module.exports = {
/**
* 查询商品分类列表
* @url client/product/category/pub/getAll 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid, whereJson } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "jjx-spot-category";
res.data = await vk.baseDao.selects({
dbName,
getMain: true,
whereJson
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,42 @@
'use strict';
module.exports = {
/**
* 查询商品分类列表
* @url client/product/category/pub/getAll 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "jjx-spot-category";
res = await vk.baseDao.selects({
dbName,
pageIndex: 1,
pageSize: 500,
whereJson:{
parent_id: _.in([null, ""]),
_id: _.exists(true)
},
sortArr: [{ name: "sort", type: "asc" }],
// 树状结构参数
treeProps: {
id: "_id", // 唯一标识字段,默认为 _id
parent_id: "parent_id", // 父级标识字段,默认为 parent_id
children: "children", // 自定义返回的下级字段名,默认为 children
level: 3, // 查询返回的树的最大层级。超过设定层级的节点不会返回。默认10级,最大15,最小1
limit: 500, // 每一级最大返回的数据。
whereJson: {
}
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,69 @@
'use strict';
module.exports = {
/**
* 申请合作
* @url client/spot/goods/kh/addCooperate 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid,company,manager,person,accountType, goodsUserId, goodsId,remark } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let info = await vk.baseDao.findByWhereJson({
dbName:"jjx-goods-cooperate",
whereJson:{
userId: uid,
goodsId: goodsId
}
});
if(info != null) {
return {
code: -1,
msg: '您已经申请过了'
}
}
let subjectName = ''
let subjectMobile = ''
let managerName = ''
let managerMobile = ''
if(accountType == 1) {
subjectName = person.personName
subjectMobile = person.mobile
}else {
subjectName = company.companyName
subjectMobile = company.legalMobile
if(manager.mobile && manager.personName){
managerName = manager.personName
managerMobile = manager.mobile
}
}
res.data = await vk.baseDao.add({
dbName:"jjx-goods-cooperate",// 表名
dataJson:{ // 需要新增的数据 json格式
userId: uid,
goodsUserId: goodsUserId,
goodsId: goodsId,
company,
manager,
person,
accountType,
status: 0,
subjectName,
subjectMobile,
managerName,
managerMobile,
remark
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,46 @@
'use strict';
module.exports = {
/**
* 新增或更新现货
* @url client/product/goods/kh/addUpdate 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
const dbName = 'jjx-spot-goods'
let {_id,name,categoryIds,address,stock,files} = data
// 业务逻辑开始-----------------------------------------------------------
let info = await vk.baseDao.findByWhereJson({
dbName,
whereJson:{
userId: uid,
}
});
if(info == null) {
await vk.baseDao.add({
dbName,
dataJson:{
name,categoryIds,address,stock,files,userId: uid,sort: 0
}
});
}else {
await vk.baseDao.updateById({
dbName,
id: info._id,
dataJson:{
name,categoryIds,address,stock,files
}
});
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,28 @@
'use strict';
const dbName = 'jjx-spot-goods'
module.exports = {
/**
* XXXnameXXX
* @url client/spot/goods/kh/getSelfOne 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
res.data = await vk.baseDao.findByWhereJson({
dbName,
whereJson:{
user_id: uid,
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,75 @@
'use strict';
const dbName = 'jjx-spot-goods'
module.exports = {
/**
* XXXnameXXX
* @url client/spot/goods/kh/getDetail 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let {
data = {}, userInfo, util, filterResponse, originalParam
} = event;
let {
customUtil,
uniID,
config,
pubFun,
vk,
db,
_
} = util;
let {
uid
} = data;
let res = {
code: 0,
msg: ""
};
// 业务逻辑开始-----------------------------------------------------------
const {
_id
} = data
res.data = await vk.baseDao.selects({
dbName,
getOne: true,
getMain: true,
// 主表where条件
whereJson: {
_id: _id
},
foreignDB: [{
dbName: "uni-id-users",
localKey: "user_id",
foreignKey: "_id",
as: "user",
limit: 1, // limit=1则以对象形式返回
fieldJson: {
_id: true,
company: {
companyName: true
},
person: {
personName: true
},
businessCard: true,
accountType: true,
},
},
{
dbName: "jjx-goods-cooperate",
localKey: "_id",
foreignKey: "goodsId",
as: "cooperateList",
limit: 500, // limit=1则以对象形式返回
}
]
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,72 @@
'use strict';
const dbName = 'jjx-spot-goods'
module.exports = {
/**
* 查询现货列表
* @url client/spot/goods/kh/getList 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
const {keyword, categoryIds,provinceCodes,pageIndex,pageSize } = data
let whereJson = {};
if(vk.pubfn.isNotNull(keyword)) {
whereJson.name = new RegExp(keyword)
}
if(vk.pubfn.isNotNull(categoryIds)) {
whereJson.categoryIds = _.in(categoryIds)
}
if(vk.pubfn.isNotNull(categoryIds)) {
whereJson.categoryIds = _.in(categoryIds)
}
if(vk.pubfn.isNotNull(provinceCodes)) {
whereJson['address.province.code'] = _.in(provinceCodes)
}
res = await vk.baseDao.selects({
dbName,
getCount:false,
pageIndex,
pageSize,
// 主表where条件
whereJson: whereJson,
// 主表字段显示规则
fieldJson:{},
// 主表排序规则
sortArr:[{ name:"sort", type:"desc" }],
foreignDB: [
{
dbName:"uni-id-users",
localKey:"user_id",
foreignKey:"_id",
as:"user",
limit:1, // limit=1则以对象形式返回
fieldJson:{
_id: true,
company: {
companyName: true
},
person: {
personName: true
},
businessCard: true,
accountType: true,
},
}
]
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,23 @@
'use strict';
module.exports = {
/**
* 设置名片数据
* @url client/user/kh/setBusinessCard 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,23 @@
'use strict';
module.exports = {
/**
* 此函数名称
* @url client/user/kh/test 前端调用的url参数地址
* data 请求参数
* @params {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { customUtil, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
// 可写与数据库的交互逻辑等等
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,23 @@
'use strict';
module.exports = {
/**
* 此函数名称
* @url client/user/pub/test 前端调用的url参数地址
* data 请求参数
* @params {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { customUtil, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
// 业务逻辑开始-----------------------------------------------------------
// 可写与数据库的交互逻辑等等
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,11 @@
## 客户端(H5、小程序、APP客户端)
#### `router/service/client` 目录为客户端端逻辑
#### 以下的目录并非强制性,只是建议,便于统一开发规范。
```
.
├── client──────────────────────# 客户端逻辑
│ └── user───────────────────# 用户服务
│ └── order──────────────────# 订单服务
└─────────────────────────────────
```