Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
unidocs-zh
提交
eeb2ae01
unidocs-zh
项目概览
DCloud
/
unidocs-zh
通知
3216
Star
106
Fork
815
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
94
列表
看板
标记
里程碑
合并请求
70
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
unidocs-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
94
Issue
94
列表
看板
标记
里程碑
合并请求
70
合并请求
70
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
eeb2ae01
编写于
4月 25, 2022
作者:
M
mehaotian
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of github.com:dcloudio/unidocs-zh
# Conflicts: # docs/uni-stat-v2.md
上级
a91d99ba
4e4e8391
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
175 addition
and
92 deletion
+175
-92
docs/component/list.md
docs/component/list.md
+1
-1
docs/uni-stat-v2.md
docs/uni-stat-v2.md
+170
-87
docs/uniCloud/clientdb.md
docs/uniCloud/clientdb.md
+1
-1
docs/uniCloud/jql.md
docs/uniCloud/jql.md
+3
-3
未找到文件。
docs/component/list.md
浏览文件 @
eeb2ae01
...
...
@@ -32,7 +32,7 @@ app端nvue专用组件。在app-nvue下,如果是长列表,使用list组件
> **注意**
> - 相同方向 `<list>` 或者 `<scroll-view>` 互相嵌套时,Android 平台子 `<list>` 不可滚动,iOS 可以,iOS 有Bounce效果, Android仅可滚动时有
> - `<list>` 需要显式的设置其宽高,可使用 position: absolute; 定位或 width、height 设置其宽高值。
> - list是区域滚动,不会触发页面滚动,无法触发pages.json配置的下拉刷新、页面触底onReachBottomDistance、titleNView的transparent透明渐变。
> - list是区域滚动,不会触发页面滚动,无法触发pages.json配置的下拉刷新、页面触底onReachBottomDistance、titleNView的transparent透明渐变
、style的transparentTitle导航栏透明
。
> - Android 平台,因 `<list>` 高效内存回收机制,不在屏幕可见区域的组件不会被创建,导致一些内部需要计算宽高的组件无法正常工作,例如 `<slider>`、`<progress>`、`<swiper>`
#### 子组件
...
...
docs/uni-stat-v2.md
浏览文件 @
eeb2ae01
## uni统计2.0
uni统计2.0
是基于uniCloud
开发的开源、免费统计平台。
uni统计2.0
是基于 uniCloud
开发的开源、免费统计平台。
## 产品特色
`uni统计2.0`
和
`uni统计1.0`
一样,均支持全域流量统计,无需在各端接不同的
sdk、无需在不同后台查看数据。使用uni统计,一张报表可查看所有端(iOS、Android、H5
及各家小程序)的运营数据。
`uni统计2.0`
和
`uni统计1.0`
一样,均支持全域流量统计,无需在各端接不同的
sdk、无需在不同后台查看数据。使用 uni 统计,一张报表可查看所有端(iOS、Android、H5
及各家小程序)的运营数据。
相比
`uni统计1.0`
,
`uni统计2.0`
还有如下特色功能:
**1. 开源**
前端采集数据的SDK、云端接收数据的云函数、云端跑批统计的云函数、展示统计结果的管理报表,所有代码全部开源。
前端采集数据的
SDK、云端接收数据的云函数、云端跑批统计的云函数、展示统计结果的管理报表,所有代码全部开源。
**2. 私有部署**
使用传统
`saas`
类统计产品时,所有
App
数据都上报在统计厂商统一的数据库中,也就是中央化部署模式。
使用传统
`saas`
类统计产品时,所有
App
数据都上报在统计厂商统一的数据库中,也就是中央化部署模式。
`uni统计2.0`
基于
`uniCloud`
实现,云函数、统计数据全部托管在开发者自己的服务空间中,开发者对自己的统计数据拥有完整的控制权。
**3. 自由定制**
`uni统计2.0`
所有代码是完全开源的,开发者可在开源代码基础上,轻松扩展统计维度,自由定制报表样式。
**uni统计新老版本对比**
**uni
统计新老版本对比**
|功能|uni统计1.0|uni统计2.0|
|
:-:|:-:|:-:
|
|是否开源|否|是|
|是否免费|是|是|
|部署方式|中央部署|私有部署|
|定制方式|不可定制|方便定制|
|
:-: | :-: | :-:
|
|是否开源
|否|是|
|是否免费
|是|是|
|部署方式
|中央部署|私有部署|
|定制方式
|不可定制|方便定制|
## 前端配置
...
...
@@ -38,16 +38,16 @@ uni统计2.0是基于uniCloud开发的开源、免费统计平台。
### 全局设置
将
`
manifest.json -> uniStatistics`
下的
`enable`
字段设置为
`true|false`
,来开启关闭
`uni统计`
将
`manifest.json -> uniStatistics`
下的
`enable`
字段设置为
`true|false`
,来开启关闭
`uni统计`
设置
`version`
属性为
`"2"`
来开启新版统计
```
js
//...
"
uniStatistics
"
:
{
"
enable
"
:
true
,
//全局开启
"
version
"
:
"
2
"
// 开启新版uni统计,值为字符串
},
//...
"
uniStatistics
"
:
{
"
enable
"
:
true
,
//全局开启
"
version
"
:
"
2
"
// 开启新版uni统计,值为字符串
},
//...
```
...
...
@@ -56,11 +56,11 @@ uni统计2.0是基于uniCloud开发的开源、免费统计平台。
`uniStatistics`
支持分平台设置,比如若需仅开启微信平台的
`uni统计`
,则在
`mp-weixin`
节点下设置
`uniStatistics ->enable`
即可,如下:
```
js
//...
"
mp-weixin
"
:{
"
uniStatistics
"
:
{
"
enable
"
:
true
//微信平台开启统计
}
//...
"
mp-weixin
"
:{
"
uniStatistics
"
:
{
"
enable
"
:
true
//微信平台开启统计
}
}
```
...
...
@@ -70,33 +70,31 @@ uni统计2.0是基于uniCloud开发的开源、免费统计平台。
-
应用在运行、调试时不会上报统计数据,仅在发行后,并启动新版的App、h5、小程序,才会上报数据。
-
如需在开发运行阶段调试查看上报数据 ,可开启 debug 模式 ,后文查看详情
:::
### 域名白名单
由于各家小程序对可访问的域名要配置白名单,否则无法联网。
注意选择对应的服务商域名(文章后面章节会有服务空间相关配置)
|服务提供商| request合法域名|
|:-:|:-:|
|阿里云 |api.bspapp.com |
|腾讯云 |tcb-api.tencentcloudapi.com|
| 服务提供商 | request 合法域名 |
| :--------: | :-------------------------: |
| 阿里云 | api.bspapp.com |
| 腾讯云 | tcb-api.tencentcloudapi.com |
## 统计管理后台配置
新版统计与之前不同的是需要用户自行管理部署统计后台,使用了
[
uni-admin
](
https://uniapp.dcloud.io/uniCloud/admin.html#uni-admin-%E6%A1%86%E6%9E%B6-%E5%8E%9F%E5%90%8D-unicloud-admin
)
来管理
`uni统计`
数据。
### 创建 uni-admin
使用
`HBuilderX 3.4.x
`
版本新建
`uni-app`
项目,选择
`uni-admin`
项目模板,如下图:
使用
`HBuilderX 3.4.x`
版本新建
`uni-app`
项目,选择
`uni-admin`
项目模板,如下图:
![
download-admin
](
https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/80406bf5-f96a-4a66-9430-a339a4054c96.png
)
创建完成后,可以跟随
`云服务空间初始化向导`
初始化项目,创建并绑定云服务空间
![
download-admin
](
https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/7fd34451-2313-4d01-8caf-39f277780642.png
)
### 运行 uni-admin
接下来所有操作都是基于新创建的
`uni-admin`
项目来操作
...
...
@@ -104,11 +102,12 @@ uni统计2.0是基于uniCloud开发的开源、免费统计平台。
### 目录结构
注意:创建完成后确保
`uniCloud -cloudfunctions`
目录下包含了
`uni-stat-report`
云函数
![
目录结构
](
https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/c20bd7bf-d52e-4038-80d6-a2e76c80a091.png
)
![
目录结构
](
https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/c20bd7bf-d52e-4038-80d6-a2e76c80a091.png
)
### 配置 uni-id
打开
`uni-config-center`
配置
`uni-id`
的
`passwordSecret`
和
`tokenSecret`
字段 (测试期间跳过本条也可以)
-
`passwordSecret`
字段 ,用于加密密码入库的密钥
-
`tokenSecret`
字段 ,为生成 token 需要的密钥
...
...
@@ -147,13 +146,14 @@ uni统计2.0是基于uniCloud开发的开源、免费统计平台。
## 关联服务空间
客户端和管理后端都已经准备好了,但是现在还不能从客户端直接上报数据到管理后端,所以需要关联客户端和管理后端的服务空间
1.
在客户端项目右键并选择
`创建uniCloud云开发环境 -> 阿里云|腾讯云`
![
关联前后台数据
](
https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/b2ad84ed-a69a-43dc-b8d1-6efaafd96a14.png
)
2.
在
`uniCloud`
目录右键并选择
`关联云服务空间或项目`
,在打开的窗口中选择上一节
`uni-admin`
关联的服务空间(两个项目务必关联同一个服务空间,且
uni-admin
中所有云函数、公共模板等都已经上传部署到该服务空间)
2.
在
`uniCloud`
目录右键并选择
`关联云服务空间或项目`
,在打开的窗口中选择上一节
`uni-admin`
关联的服务空间(两个项目务必关联同一个服务空间,且
uni-admin
中所有云函数、公共模板等都已经上传部署到该服务空间)
![
关联前后台数据
](
https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/14744bf3-c88e-4408-b2fa-0ecf0dcf4fe1.png
)
...
...
@@ -271,56 +271,55 @@ uni统计配置项存放于uniCloud配置中心(`uni-config-center`)下的 `
2.
分别在数据
`上报数据接收器(uni-stat-receiver)`
和
`定时任务云函数(uni-stat-cron)`
下的
`package.json`
文件中添加redis拓展库。
3.
重新上传部署数据
`上报数据接收器(uni-stat-receiver)`
、
`定时任务云函数(uni-stat-cron)`
和
`配置中心(uni-config-center)`
。
```
javascript
```
javascript
//配置uni-stat-receiver的redis拓展库
{
"
name
"
:
"
uni-stat-receiver
"
,
"
dependencies
"
:
{
"
uni-id
"
:
"
file:../../../../uni-id/uniCloud/cloudfunctions/common/uni-id
"
,
"
uni-stat
"
:
"
file:../common/uni-stat
"
},
"
extensions
"
:
{
"
uni-cloud-jql
"
:
{},
"
uni-cloud-redis
"
:
{}
// 配置为此云函数开启redis扩展库,值为空对象留作后续追加参数,暂无内容。如拷贝此配置项到package.json文件,切记去除注释。
}
"
name
"
:
"
uni-stat-receiver
"
,
"
dependencies
"
:
{
"
uni-id
"
:
"
file:../../../../uni-id/uniCloud/cloudfunctions/common/uni-id
"
,
"
uni-stat
"
:
"
file:../common/uni-stat
"
},
"
extensions
"
:
{
"
uni-cloud-jql
"
:
{},
"
uni-cloud-redis
"
:
{}
// 配置为此云函数开启redis扩展库,值为空对象留作后续追加参数,暂无内容。如拷贝此配置项到package.json文件,切记去除注释。
}
}
//配置uni-stat-cron的redis拓展库
{
"
name
"
:
"
uni-stat-cron
"
,
"
version
"
:
"
1.0.0
"
,
"
description
"
:
""
,
"
main
"
:
"
index.js
"
,
"
scripts
"
:
{
"
test
"
:
"
echo
\"
Error: no test specified
\"
&& exit 1
"
},
"
author
"
:
""
,
"
license
"
:
"
ISC
"
,
"
dependencies
"
:
{
"
uni-stat
"
:
"
file:../common/uni-stat
"
},
"
extensions
"
:
{
"
uni-cloud-redis
"
:
{}
// 配置为此云函数开启redis扩展库,值为空对象留作后续追加参数,暂无内容。如拷贝此配置项到package.json文件,切记去除注释。
},
"
cloudfunction-config
"
:
{
"
concurrency
"
:
1
,
"
memorySize
"
:
512
,
"
timeout
"
:
600
,
"
triggers
"
:
[
{
"
name
"
:
"
uni-stat-cron
"
,
"
type
"
:
"
timer
"
,
"
config
"
:
"
0 0 * * * * *
"
}
]
}
"
name
"
:
"
uni-stat-cron
"
,
"
version
"
:
"
1.0.0
"
,
"
description
"
:
""
,
"
main
"
:
"
index.js
"
,
"
scripts
"
:
{
"
test
"
:
"
echo
\"
Error: no test specified
\"
&& exit 1
"
},
"
author
"
:
""
,
"
license
"
:
"
ISC
"
,
"
dependencies
"
:
{
"
uni-stat
"
:
"
file:../common/uni-stat
"
},
"
extensions
"
:
{
"
uni-cloud-redis
"
:
{}
// 配置为此云函数开启redis扩展库,值为空对象留作后续追加参数,暂无内容。如拷贝此配置项到package.json文件,切记去除注释。
},
"
cloudfunction-config
"
:
{
"
concurrency
"
:
1
,
"
memorySize
"
:
512
,
"
timeout
"
:
600
,
"
triggers
"
:
[
{
"
name
"
:
"
uni-stat-cron
"
,
"
type
"
:
"
timer
"
,
"
config
"
:
"
0 0 * * * * *
"
}
]
}
}
```
### 定时任务配置说明
`cron`
参数用于配置定时任务触发时间,一般无需修改此项。
...
...
@@ -347,12 +346,12 @@ uni统计配置项存放于uniCloud配置中心(`uni-config-center`)下的 `
**阿里云服务空间开启步骤:**
1.
因阿里云服务空间默认不支持分钟级定时器,必须先向
DCloud
申请分钟级定时器后再开启。
[
申请方式
](
https://uniapp.dcloud.io/uniCloud/price.html#aliyun
)
2.
修改
uni
统计配置项将
`cronMin`
参数的值改为
`true`
。
1.
因阿里云服务空间默认不支持分钟级定时器,必须先向
DCloud
申请分钟级定时器后再开启。
[
申请方式
](
https://uniapp.dcloud.io/uniCloud/price.html#aliyun
)
2.
修改
uni
统计配置项将
`cronMin`
参数的值改为
`true`
。
3.
修改
`定时任务云函数(uni-stat-cron)`
下的
`package.json`
文件中的触发器配置。
4.
重新上传部署
`定时任务云函数(uni-stat-cron)`
和
`配置中心(uni-config-center)`
。
```
javascript
```
javascript
//config选项为阿里云定时器的cron表达式 将原小时级表达式 "config": "0 0 * * * * *" 更改为分钟级表达式 "config": "0 * * * * * *" 后重新上传部署云函数即可.
"
cloudfunction-config
"
:
{
"
concurrency
"
:
1
,
...
...
@@ -370,11 +369,11 @@ uni统计配置项存放于uniCloud配置中心(`uni-config-center`)下的 `
**腾讯云服务空间开启步骤:**
1.
修改
uni
统计配置项将
`cronMin`
参数的值改为
`true`
。
1.
修改
uni
统计配置项将
`cronMin`
参数的值改为
`true`
。
2.
修改
`定时任务云函数(uni-stat-cron)`
下的
`package.json`
文件中的触发器配置。
3.
重新上传部署
`定时任务云函数(uni-stat-cron)`
和
`配置中心(uni-config-center)`
。
```
javascript
```
javascript
//config选项为阿里云定时器的cron表达式 将原小时级表达式 "config": "0 0 * * * * *" 更改为分钟级表达式 "config": "0 * * * * * *" 后重新上传部署云函数即可.
"
cloudfunction-config
"
:
{
"
concurrency
"
:
1
,
...
...
@@ -401,15 +400,17 @@ uni统计配置项存放于uniCloud配置中心(`uni-config-center`)下的 `
|checkTime|错误检测间隔时间,单位
`分钟`
。|
### 日志清理配置说明
`cleanLog`
参数用于配置定时清理过期的日志,减少数据库数据的存储量,提升
uni统计性能。注意:因为留存统计的需要,基础会话日志和用户会话日志要至少保存31
天的日志,否则会对留存统计造成影响。
`cleanLog`
参数用于配置定时清理过期的日志,减少数据库数据的存储量,提升
uni 统计性能。注意:因为留存统计的需要,基础会话日志和用户会话日志要至少保存 31
天的日志,否则会对留存统计造成影响。
|参数|说明|
| :-: |:-:|
|open|是否开启日志清理:true:是;false:否|
|reserveDays|各项日志的保留天数配置,参数格式:
`日志类型:保留天数`
,例如:
`sessionLog:31`
代表保留31天的会话日志,保留天数设置为0时表示永久保留(此举会累积大量无用数据,不推荐)|
**目前可配置的日志类型有:**
|字段|说明|
...
...
@@ -431,12 +432,99 @@ uni统计配置项存放于uniCloud配置中心(`uni-config-center`)下的 `
## 开源代码解读
### 前端SDK说明
uni-app 框架内置
### uni-admin说明
**前端页面结构**
为了突出目标,仅注释出 uni 统计相关的文件夹及文件,其余与普通 uni-app 项目相同。新增页面可参考 uni-stat 中相似页面。
```
bash
├── cloudfunctions
├── common
# 样式
│ │── uni.css
# 公共样式
│ └── uni-icons.css
# icon样式
├── components
# 自定义组件
├── js_sdk
# js sdk
│ └── uni-stat
# uni统计相关工具方法
│ └── util.js
├── pages
# 页面
│ └── uni-stat
# uni统计页面
│ │── channel
# 渠道(app)
│ │ │── channel.vue
# 页面(下同)
│ │ └── fieldsMap.js
# 字段配置(下同)
│ │── device
# 设备统计
│ │ │── activity
# 渠道/场景分析
│ │ │ │── activity.vue
│ │ │ └── fieldsMap.js
│ │ │── comparison
# 平台对比
│ │ │ │── comparison.vue
│ │ │ └── fieldsMap.js
│ │ │── overview
# 今日概览
│ │ │ │── overview.vue
│ │ │ └── fieldsMap.js
│ │ │── retention
# 留存
│ │ │ │── retention.vue
│ │ │ └── fieldsMap.js
│ │ │── stickiness
# 粘性
│ │ │ │── stickiness.vue
│ │ │ └── fieldsMap.js
│ │ └── trend
# 趋势分析
│ │ │── trend.vue
│ │ └── fieldsMap.js
│ │── error
# 错误分析
│ │ │── error.vue
│ │ └── fieldsMap.js
│ │── event
# 事件分析
│ │ │── event.vue
│ │ └── fieldsMap.js
│ │── index
# 统计首页
│ │ │── index.vue
│ │ └── fieldsMap.js
│ │── page-ent
# 入口页
│ │ │── page-ent.vue
│ │ └── fieldsMap.js
│ │── page-res
# 受访页
│ │ │── page-res.vue
│ │ └── fieldsMap.js
│ │── scene
# 场景值(小程序)
│ │ │── scene.vue
│ │ └── fieldsMap.js
│ └── user
# 用户统计
│ │── activity
# 渠道/场景分析
│ │ │── activity.vue
│ │ └── fieldsMap.js
│ │── comparison
# 平台对比
│ │ │── comparison.vue
│ │ └── fieldsMap.js
│ │── overview
# 今日概览
│ │ │── overview.vue
│ │ └── fieldsMap.js
│ │── retention
# 留存
│ │ │── retention.vue
│ │ └── fieldsMap.js
│ │── stickiness
# 粘性
│ │ │── stickiness.vue
│ │ └── fieldsMap.js
│ └── trend
# 趋势分析
│ │── trend.vue
│ └── fieldsMap.js
├── static
├── store
├── admin.config.js
├── App.vue
├── main.js
├── mainfest.json
├── pages.json
├── postcss.config.js
└── uni.scss
```
### 服务端说明
** 1. 服务端构成**
**1. 服务端构成**
-
`uni-config-center/uni-stat 配置模块`
:给
`uni-stat 公共模块`
提供运行必要的配置参数。
-
`uni-stat 公共模块`
:数据处理模块,包括收集上报数据的处理入库及定时任务的数据处理。
-
`uni-stat-receiver 上报数据接收器`
:接收客户端上报数据并转发给公共模块处理。注意:该云对象依赖于
`uni-id`
公共模块。
...
...
@@ -451,7 +539,10 @@ uni统计配置项存放于uniCloud配置中心(`uni-config-center`)下的 `
-
`index.js文件`
代理入口文件。
## 扩展和自定义方式
<!-- ## 扩展和自定义方式
uni统计提供了基础的数据报表,如不能达到预期的数据采集,可以在客户端通过
`uni.report(eventKey,param)`
自由上报数据 ,并通过 uni-admin 增加页面 ,自行统计数据。
### uni.report 基础用法
...
...
@@ -476,14 +567,6 @@ uni.report('购买',{
})
```
### 完整扩展示例
**使用 uni.report(eventKey,param) 上报数据**
**uni-admin增加展示页面**
**获取数据**
**增加详情页面**
-->
docs/uniCloud/clientdb.md
浏览文件 @
eeb2ae01
...
...
@@ -16,7 +16,7 @@ JQL语法相关文档已移至:[JQL语法](uniCloud/jql.md)
在
`DB Schema`
中,配置数据操作的权限和字段值域校验规则,阻止前端不恰当的数据读写。详见:
[
DB Schema
](
https://uniapp.dcloud.net.cn/uniCloud/schema
)
如果
想在数据库操作之前或之后需要在云端执行额外的动作(比如获取文章详情之后
阅读量+1),
`clientDB`
提供了action云函数机制。在HBuilderX项目的
`cloudfunctions/uni-clientDB-actions`
目录编写上传js,参考:
[
action
](
uniCloud/jql?id=action
)
如果
需要数据库操作之前或之后,云端执行关联逻辑(比如获取文章详情后,文章
阅读量+1),
`clientDB`
提供了action云函数机制。在HBuilderX项目的
`cloudfunctions/uni-clientDB-actions`
目录编写上传js,参考:
[
action
](
uniCloud/jql?id=action
)
**注意**
...
...
docs/uniCloud/jql.md
浏览文件 @
eeb2ae01
...
...
@@ -11,7 +11,7 @@
-
sql是一种字符串表达式,写法形如:
```
select * from table1 where field1="
123
"
select * from table1 where field1="
value1
"
```
-
nosql是js方法+json方式的参数,写法形如:
...
...
@@ -19,7 +19,7 @@ select * from table1 where field1="123"
```
js
const
db
=
uniCloud
.
database
()
let
res
=
await
db
.
collection
(
'
table
'
).
where
({
field1
:
'
123
'
field1
:
'
value1
'
}).
get
()
```
...
...
@@ -42,7 +42,7 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
如果要表达
`或`
关系,需要用
`or`
方法,写法更复杂
```
js
field1
:
dbCmd
.
gt
(
4000
).
or
(
dbCmd
.
gt
(
6000
).
and
(
dbCmd
.
lt
(
8000
)
))
field1
:
dbCmd
.
gt
(
0
).
or
(
dbCmd
.
lt
(
-
5
))
```
2.
nosql的联表查询写法,比sql还复杂
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录