提交 14d1d150 编写于 作者: L linju

2

{ {
"name" : "base-app", "name" : "base-app",
"appid" : "__UNI__BC54A00", "appid" : "__UNI__03B096E",
"description" : "", "description" : "",
"versionName" : "1.0.0", "versionName" : "1.0.0",
"versionCode" : "100", "versionCode" : "100",
...@@ -64,7 +64,8 @@ ...@@ -64,7 +64,8 @@
"entitlements" : { "entitlements" : {
"com.apple.developer.associated-domains" : [ "com.apple.developer.associated-domains" : [
"applinks:uniapp.dcloud.io", "applinks:uniapp.dcloud.io",
"applinks:static-7827e38b-7f40-4421-bca7-58331dcddc00.bspapp.com" "applinks:static-7827e38b-7f40-4421-bca7-58331dcddc00.bspapp.com",
"applinks:static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com"
] ]
} }
}, },
...@@ -78,20 +79,20 @@ ...@@ -78,20 +79,20 @@
"weixin" : { "weixin" : {
"appid" : "wx0411fa6a39d61297", "appid" : "wx0411fa6a39d61297",
"appsecret" : "", "appsecret" : "",
"UniversalLinks" : "https://static-7827e38b-7f40-4421-bca7-58331dcddc00.bspapp.com/uni-universallinks/__UNI__BC54A00" "UniversalLinks" : "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E"
}, },
"univerify" : {} "univerify" : {}
}, },
"share" : { "share" : {
"weixin" : { "weixin" : {
"appid" : "wx0411fa6a39d61297", "appid" : "wx0411fa6a39d61297",
"UniversalLinks" : "https://static-7827e38b-7f40-4421-bca7-58331dcddc00.bspapp.com/uni-universallinks/__UNI__BC54A00", "UniversalLinks" : "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E",
"_spaceID" : "7827e38b-7f40-4421-bca7-58331dcddc00" "_spaceID" : "76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e"
} }
}, },
"payment" : { "payment" : {
"weixin" : { "weixin" : {
"UniversalLinks" : "https://static-7827e38b-7f40-4421-bca7-58331dcddc00.bspapp.com/uni-universallinks/__UNI__BC54A00" "UniversalLinks" : "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E"
} }
}, },
"ad" : {} "ad" : {}
...@@ -100,7 +101,7 @@ ...@@ -100,7 +101,7 @@
}, },
"quickapp" : {}, "quickapp" : {},
"mp-weixin" : { "mp-weixin" : {
"appid" : "", "appid" : "wx999bf02c8e05dfc9",
"setting" : { "setting" : {
"urlCheck" : false "urlCheck" : false
}, },
......
...@@ -50,11 +50,12 @@ ...@@ -50,11 +50,12 @@
this.uploadUserInfo({avatar:url}); this.uploadUserInfo({avatar:url});
}) })
let options = { let options = {
width:uni.upx2px(700), width:600,
height:uni.upx2px(700) height:600
} }
uni.navigateTo({ uni.navigateTo({
url:'./uploadCutImageToUnicloud?path=' + res.tempFilePaths[0] + `&options=${JSON.stringify(options)}`, url:'./uploadCutImageToUnicloud?path=' + res.tempFilePaths[0] + `&options=${JSON.stringify(options)}`,
animationType:"fade-in"
}); });
} }
}) })
...@@ -65,9 +66,11 @@ ...@@ -65,9 +66,11 @@
* value 更新后的用户字段值 * value 更新后的用户字段值
*/ */
uploadUserInfo(data){ uploadUserInfo(data){
console.log(this.userInfo._id)
userTable.doc(this.userInfo._id) userTable.doc(this.userInfo._id)
.update(data) .update(data)
.then(res=>{ .then(res=>{
console.log(data)
this.login(data) this.login(data)
}) })
.catch(err=>{ .catch(err=>{
......
{
"bsonType": "object",
"permission": {
"create": "auth.uid != null",
"delete": "doc.uid == auth.uid",
"read": true,
"update": "doc.uid == auth.uid"
},
"properties": {
"_id": {
"description": "存储文档 ID(用户 ID),系统自动生成"
},
"article_status": {
"bsonType": "int",
"description": "文章状态:0 草稿箱 1 已发布",
"maximum": 1,
"minimum": 0
},
"avatar": {
"bsonType": "string",
"description": "缩略图地址",
"label": "封面大图"
},
"category_id": {
"bsonType": "string",
"description": "分类 id,参考`uni-news-categories`表"
},
"comment_count": {
"bsonType": "int",
"description": "评论数量",
"permission": {
"write": false
}
},
"comment_status": {
"bsonType": "int",
"description": "评论状态:0 关闭 1 开放",
"maximum": 1,
"minimum": 0
},
"content": {
"bsonType": "string",
"description": "文章内容",
"label": "文章内容"
},
"excerpt": {
"bsonType": "string",
"description": "文章摘录",
"label": "摘要"
},
"is_essence": {
"bsonType": "bool",
"description": "阅读加精",
"permission": {
"write": false
}
},
"is_sticky": {
"bsonType": "bool",
"description": "是否置顶",
"permission": {
"write": false
}
},
"last_comment_user_id": {
"bsonType": "string",
"description": "最后回复用户 id,参考`uni-id-users` 表"
},
"last_modify_date": {
"bsonType": "timestamp",
"description": "最后修改时间"
},
"last_modify_ip": {
"bsonType": "string",
"description": "最后修改时 IP 地址"
},
"like_count": {
"bsonType": "int",
"description": "喜欢数、点赞数",
"permission": {
"write": false
}
},
"mode": {
"bsonType": "number",
"description": "排版显示模式"
},
"publish_date": {
"bsonType": "timestamp",
"defaultValue": {
"$env": "now"
},
"description": "发表时间"
},
"publish_ip": {
"bsonType": "string",
"description": "发表时 IP 地址",
"forceDefaultValue": {
"$env": "clientIP"
}
},
"title": {
"bsonType": "string",
"description": "标题",
"label": "标题"
},
"user_id": {
"bsonType": "string",
"description": "文章作者ID, 参考`uni-id-users` 表"
},
"view_count": {
"bsonType": "int",
"description": "阅读数量",
"permission": {
"write": false
}
}
},
"required": ["user_id", "title", "content", "article_status", "view_count", "like_count", "is_sticky", "is_essence",
"comment_status", "comment_count", "mode"
]
}
{ {
"bsonType": "object", "bsonType": "object",
"permission": { "permission": {
"read": "'read' in auth.permission", "read": true,
"create": false, "create": false,
"update": "doc._id == auth.uid", "update": "doc._id == auth.uid",
"delete": false "delete": false
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
isChoose:{ isChoose:{
type:Boolean, type:Boolean,
default:false default:false
} },
}, },
methods:{ methods:{
/** /**
......
...@@ -123,13 +123,13 @@ ...@@ -123,13 +123,13 @@
db.collection(dbCollectionName).add(value).then((res) => { db.collection(dbCollectionName).add(value).then((res) => {
uni.showToast({ uni.showToast({
icon: 'none', icon: 'none',
title: '新增成功' title: '反馈成功'
}) })
this.getOpenerEventChannel().emit('refreshData') this.getOpenerEventChannel().emit('refreshData')
setTimeout(() => uni.navigateBack(), 500) setTimeout(() => uni.navigateBack(), 500)
}).catch((err) => { }).catch((err) => {
uni.showModal({ uni.showModal({
content: err.message || '请求服务失败', content: err.message || '反馈失败',
showCancel: false showCancel: false
}) })
}).finally(() => { }).finally(() => {
......
...@@ -12,16 +12,27 @@ ...@@ -12,16 +12,27 @@
}, },
"user_id": { "user_id": {
"bsonType": "string", "bsonType": "string",
"description": "留言反馈用户ID/回复留言用户ID,参考uni-id-users表", "description": "留言反馈用户ID\/回复留言用户ID,参考uni-id-users表",
"foreignKey": "uni-id-users._id" "foreignKey": "uni-id-users._id",
"forceDefaultValue": {
"$env": "uid"
}
},
"ip": {
"forceDefaultValue": {
"$env": "clientIP"
}
}, },
"create_date": { "create_date": {
"bsonType": "timestamp", "bsonType": "timestamp",
"description": "留言时间/回复留言时间" "description": "留言时间\/回复留言时间",
"forceDefaultValue": {
"$env": "now"
}
}, },
"content": { "content": {
"bsonType": "string", "bsonType": "string",
"description": "留言内容/回复内容", "description": "留言内容\/回复内容",
"trim": "right" "trim": "right"
}, },
"imgs": { "imgs": {
......
# clientDB使用许可协议
本协议是数字天堂(北京)网络技术有限公司(以下称“DCloud”)与您之间达成的关于clientDB框架(以下简称本框架)的协议。
本协议签订地点为中华人民共和国北京市海淀区。
您使用本框架即视为您已阅读并同意受本协议的约束。
## 知识产权及使用授权
您可以自由下载、使用、复制本框架而不需要向DCloud付费。
DCloud所拥有的知识产权,包括但不限于商标、专利、著作权、商业秘密、专有数据、源码,并不发生转移或共享。
您使用本框架开发的代码及输出物,包括但不限于网站、移动应用,其知识产权归属您所有。
本框架未包含第三方软件或技术,不涉及额外遵循第三方软件的授权协议问题。
## 您的义务
您不得破解、反编译、逆向工程本框架,不得破解或劫持本框架网络请求,不得对DCloud服务进行网络攻击,不得利用DCloud系统漏洞谋利或侵害DCloud利益,不得替换、删改本框架自带的非用户自定义文件。
未经书面许可您不可利用DCloud产品的全部或部分文件、模块、组件来制作与DCloud争夺用户的产品(通过DCloud插件市场服务开发者不属于此范围)。
如果您违反您的义务,DCloud将有权停止您使用本框架,造成的损失由您自行承担。
如果您给DCloud造成重大损失,或者在接收到DCloud的停止违约通知后拒不改正,DCloud将有权停止对您的DCloud所有产品和服务的使用授权,冻结您在DCloud所有产品服务中的预付款项和应收款项,因此造成的损失由您自行承担。
如果您的行为产生法律问题,DCloud有权追责您的法律责任。
## 隐私条款
本框架未进行任何数据采集、发送等涉及数据隐私的行为。
## 安全
您理解并同意,本框架同其他软件一样,无法承诺绝对的安全性。
当DCloud发现本框架的任何安全漏洞时,将及时在[社区](https://ask.dcloud.net.cn/explore/)发送公告,并将及时发布紧急更新补丁和升级推送通知。
## 免责声明
DCloud不因开发者使用本框架而承担任何法律责任。
## 协议修订
根据发展,DCloud可能会对本协议进行修改。修改时,DCloud会在产品或者网页中显著的位置发布相关信息以便及时通知到用户。如果您选择继续使用本框架,即表示您同意接受这些修改。
{
"id": "unicloud-db", // 必选 插件标识,需要保证唯一性
"name": "unicloud-db", // 必选 插件名称
"version": "1.0.8", // 必选 插件版本
"description": "写法更灵活的客户端访问云端数据方案", // 插件描述
"author": "DCloud", // 插件作者
"license": "MIT",
"homepage": "https://ext.dcloud.net.cn/plugin?id=2314", // 插件地址
"files": [ // 必选 插件自身文件列表(支持通配,规范:https://docs.npmjs.com/files/package.json#files)
],
"bundledFiles": [ // 插件依赖的文件列表,通常是依赖的三方插件的 files 合并
"cloudfunctions/unicloud-db",
"cloudfunctions/common/uni-id",
"js_sdk"
]
}
## 简介
每个查询业务,都要写一个云函数,很麻烦,也占用云函数的总数量。
本插件提供了一个通用的数据库查询云函数,由前端向云函数传递要查询的条件,比如查询哪个表、查询哪些字段、where条件和排序是什么。
> 举例:在前端的list.vue列表页面,可以调用本云函数,传入列表查询条件。然后写content.vue详情页面时,无需再新建一个云函数,可以直接在content.vue页面继续调用相同的本云函数,传入详情的查询条件。
客户端的查询条件语法,与云函数里查询数据库的语法是相同的。[查询api手册](https://uniapp.dcloud.io/uniCloud/cf-database?id=%e6%9f%a5%e8%af%a2%e6%96%87%e6%a1%a3)
与某些小程序云的客户端直接操作数据库不同,本方案有2个明显优势:
- 安全:查询权限是在云函数里控制台的,能查什么表、什么字段,在云端控制。如果全部放在前端,由于前端的不可信任,相当于无法控制权限了。而某些小程序云提供的客户端权限,并不可编程,无法满足开发者的实际业务权限需求
- 包体积:某些小程序云的客户端操作数据库是一个数M大小的js sdk,如果迁移到H5和App,对应用的启动速度、性能、体积影响非常大
综上,本插件的优势在于:
1. 提高开发效率
2. 减少云函数数量
3. 安全,可控制权限
4. 性能好
本项目包括云函数和客户端两部分,需要搭配使用,具体请参考下面文档。
**示例项目使用须知**
1. 下载示例项目后选择服务空间
2. 在db_init.json上右键初始化数据库
3. 上传公共模块及云函数,公共模块用法参考[使用公共模块](https://uniapp.dcloud.net.cn/uniCloud/cf-common)
4. 运行项目即可
示例项目文件介绍:
<pre v-pre="" data-lang="">
<code class="lang-" style="padding:0">
┌─cloudfunctions 云函数
│ ├─common 公共模块
| │ └─uni-curd 数据库查询通用公共模块
| ├─unicloud-db 在云函数中控制权限,并调用uni-curd完成查询
| └─db_init.json 初始化数据库
├─js_sdk 前端公共js目录
| └─unicloud-db 前端的js库,封装了查询语法
├─pages 业务页面文件存放的目录
│ ├─index
│ │ └─index.vue index示例页面
├─main.js Vue初始化入口文件
├─App.vue 应用配置,用来配置App全局样式以及监听 <a href="/frame?id=应用生命周期">应用生命周期</a>
├─manifest.json 配置应用名称、appid、logo、版本等打包信息,<a href="/collocation/manifest">详见</a>
└─pages.json 配置页面路由、导航条、选项卡等页面类信息,<a href="/collocation/pages">详见</a>
</code>
</pre>
- 云函数里包括一个公共模块`uni-curd`和一个云函数`unicloud-db`
- 前端包括一个js sdk`unicloud-db`,然后就是index.vue里的示例调用
- index示例页面,里面包含两个示例一个简单查询一个分页查询
## 客户端公共模块
客户端js-sdk主要负责组装查询逻辑
**示例代码**
```js
// 引入公共模块
import db from '@/js_sdk/unicloud-db/index.js'
const dbCmd = db.command
// 使用unicloud-db
uniCloud.callFunction({
name: 'unicloud-db',
data: {
command: db.collection('list').where({
name: new RegExp('','g'),
time: dbCmd.gt(1105885393581)
}).field({
extra: false
}).get()
},
success(res) {
// ...
},
fail(err) {
// ...
}
})
```
**使用说明**
语法与云函数写查询数据库一致,目前有以下限制:
- 不可使用db.serverDate、db.Geo、db.RegExp
- 上传时会对query进行序列化,除Date类型、RegExp之外的所有不可序列化的参数类型均不支持(例如:undefined)
- 为方便控制禁止前端使用set方法,一般情况下也不需要前端使用set
## 云函数公共模块
云函数公共模块`uni-curd`主要负责解析客户端查询逻辑,对客户端行为做简单的限制
**使用示例**
```js
'use strict';
const uniCurd = require('uni-curd')
const db = uniCloud.database()
const dbCmd = db.command
exports.main = async (event, context) => {
// 这里可以判断用户身份给予不同权限,例如:可以从event里拿到uni-id的token,根据token和客户端参数决定查询权限限制
try {
const res = await uniCurd({
command: event.command,
pagination: event.pagination,
rules: {
list: { // 数据表名
// CRUD权限
create: false,
read: true,
update: false,
delete: false,
// 是否允许使用聚合
aggregate: false,
// 是否允许使用联表查询,联表查询时blockedField不会对被连接的数据表生效
lookup: false,
// 使用聚合时blockField不会覆盖客户端的project,而是在聚合第一阶段插入project,不使用聚合时会在最后阶段插入一个field(会覆盖客户端的field方法)
blockedField: ['extra'],
// 不使用聚合时mixinCondition会在没有where的时候在collection方法之后插入where,有where时会跟where条件进行合并,取原条件且mixinCondition。使用聚合时会在第一阶段插入match使用混入的条件,如果有blockedField会插入在blockedField对应的project之前
mixinCondition: {
time: dbCmd.gt(1000000000000)
},
// 更多用法请参考下方参数说明文档
}
}
})
return res
} catch (e) {
return {
code: 10001,
msg: e.message
}
}
};
```
**参数说明**
|参数名 |类型 |是否必填 |默认值 |说明 |
|:-: |:-: |:-: |:-: |:-: |
|command |Object |是 |- |客户端上传的查询条件 |
|pagination |Object |否 |- |如需分页,请在此字段内配置 |
|rules |Object |是 |- |权限规则 |
**pagination参数说明**
|参数名 |类型 |是否必填 |默认值 |说明 |
|:-: |:-: |:-: |:-: |:-: |
|pageSize |Object |是 |- |每页数量 |
|current |Object |是 |- |当前页码 |
**rules参数说明**
rules下可以对不同的数据表配置不同的权限,比如以下规则代表”数据表list允许插入,数据表goods允许更新“
```js
{
list: {
create: true,
},
goods: {
update: true
}
}
```
|参数名 |类型 |是否必填 |默认值 |说明 |
|:-: |:-: |:-: |:-: |:-: |
|create |Boolean|否 |false |是否开启插入权限 |
|read |Boolean|否 |true |是否开启读权限 |
|update |Boolean|否 |false |是否开启更新权限 |
|delete |Boolean|否 |false |是否开启删除权限 |
|aggregate |Boolean|否 |false |是否允许聚合 |
|lookup |Boolean|否 |false |是否允许联表查询 |
|blockedField |Array |否 |- |屏蔽的数据库字段,请阅读注意事项 |
|mixinCondition |Object |否 |- |混入条件,请阅读注意事项 |
|hooks |Object |否 |- |回调方法 |
**hooks参数说明**
|参数名 |类型 |是否必填 |默认值 |说明 |
|:-: |:-: |:-: |:-: |:-: |
|beforeStageAppend |Function |否 |- |每个阶段被添加之前执行 |
|afterStageAppend |Function |否 |- |每个阶段被添加之后执行 |
|beforeSend |Function |否 |- |最终阶段'get', 'end', 'count', 'add', 'remove', 'update'添加之前执行,在beforeStageAppend之后 |
**回调方法的使用**
回调参数如下:
```js
{
state: {
useAggregate, // 是否使用了聚合
useLookup, // 是否使用了联表查询
type, // 操作类型,可能的值为create、read、update、delete
collection, // 当前数据表名
methodList // 使用到的方法列表
},
stage: {
method, // 当前阶段方法名
args // 当前阶段方法参数
},
exec // 已经组装的查询指令
}
```
回调方法中可以通过返回结果修改数据库指令,例如以下示例在skip之后插入一个limit
```js
afterStageAppend: function({
state,
stage,
exec
}) {
if(stage.method === 'skip') {
return exec.limit(1)
}
},
```
**注意事项**
- 关于blockedField
+ 使用聚合时blockField不会覆盖客户端的project,而是在聚合第一阶段插入project
+ 不使用聚合时会在最后阶段插入一个field(会覆盖客户端的field方法)
+ blockedField仅对读操作生效
- 关于mixinCondition
+ mixinCondition内可以使用数据库操作符
+ 不使用聚合时mixinCondition会在没有where的时候在collection方法之后插入where,有where时会跟where条件进行合并,取原条件且mixinCondition。
+ 使用聚合时会在第一阶段插入match使用混入的条件,如果有blockedField会插入在blockedField对应的project之前
+ mixinCondition会对除插入以外的所有操作生效
+ 使用mixinCondition时客户端不可使用`collection('xxx').doc('xxx')`方法(1.0.8版本起即使有mixinCondition客户端也可以使用doc方法)
- 关于联表查询
+ 连接的数据表也会受所配置的权限规则中对应数据表规则限制,主要是read,目前连接的数据表不会受blockedField限制
**参考**
在线通讯录项目,完整的演示了如何基于clientDB在客户端代码里实现数据的增删改查,是学习clientDB的重要示例项目。该项目插件地址:[https://ext.dcloud.net.cn/plugin?id=2574](https://ext.dcloud.net.cn/plugin?id=2574)
\ No newline at end of file
...@@ -10,10 +10,10 @@ ...@@ -10,10 +10,10 @@
"forceInviteCode": false, "forceInviteCode": false,
"app-plus": { "app-plus": {
"tokenExpiresIn": 2592000, "tokenExpiresIn": 2592000,
"oauth" : { "oauth": {
"weixin" : { "weixin": {
"appid": "wx0411fa6a39d61297", "appid": "wx0411fa6a39d61297",
"appsecret": "fdc6251421d3d688a563b4f00dd540e7" "appsecret": "6c9119430d7be0a147bcbbb73ef33acf"
}, },
"apple": { "apple": {
"bundleId": "io.dcloud.game.cat" "bundleId": "io.dcloud.game.cat"
...@@ -21,18 +21,18 @@ ...@@ -21,18 +21,18 @@
} }
}, },
"mp-weixin": { "mp-weixin": {
"oauth" : { "oauth": {
"weixin" : { "weixin": {
"appid" : "weixin appid", "appid": "wx999bf02c8e05dfc9",
"appsecret" : "weixin appsecret" "appsecret": "b5f608afd332b2c0ded7e6b98ca4ccd3"
} }
} }
}, },
"mp-alipay": { "mp-alipay": {
"oauth" : { "oauth": {
"alipay" : { "alipay": {
"appid" : "alipay appid", "appid": "alipay appid",
"privateKey" : "alipay privateKey" "privateKey": "alipay privateKey"
} }
} }
}, },
...@@ -43,10 +43,10 @@ ...@@ -43,10 +43,10 @@
"smsKey": "71a19f38c954f7d768d68a050486bf15", "smsKey": "71a19f38c954f7d768d68a050486bf15",
"smsSecret": "d6c424b702d73baa3b6e1a1452469213" "smsSecret": "d6c424b702d73baa3b6e1a1452469213"
}, },
"univerify":{ "univerify": {
"appid": "Du9ZOTSzHO9vutboF6UYa3", "appid": "__UNI__BC54A00",
"apiKey":"d1e36bcd497b3795434d900dcfdd44dc", "apiKey": "d1e36bcd497b3795434d900dcfdd44dc",
"apiSecret":"2feb378ff1114362b20ac179b572293e" "apiSecret": "2feb378ff1114362b20ac179b572293e"
} }
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册