readme.vue 13.6 KB
Newer Older
study夏羽's avatar
study夏羽 已提交
1

study夏羽's avatar
study夏羽 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
<template>
	<view class="page">
		<alertCode ref="alertCode"></alertCode>
		<uniNoticeBar showIcon="true" iconType="info" text="管理员(admin)拥有任何权限,权限控制对其无效。"></uniNoticeBar>
		
		<view class="uni-title tip">
			一、示例简介
			<text>\n 演示了:
			1.用户可以编辑自己的个人资料。
			2.审核员,审核资料的username字段。
			3.审核期间用户不能修改username字段。
			4.未登陆的游客看不到用户的phone字段 \n \n</text>
			二、需要的资源,schema路径:
			<text>\n uniCloud/database/permission-test.schema.json \n \n</text>
			三、数据的介绍,表字段:
			<text>\n username(姓名), state(审核状态), nickname(昵称), phone(手机号码)</text>
		</view>
		<button @click="toDemo" plain type="primary">查看示例</button>
		
		
		<view class="tips">
			<text>DB Schema的permission规则,分为两部分,一边是对操作数据的指定,一边是对角色的指定,规则中对两者进行关联,匹配则校验通过。</text>
		</view>
		<page-head title="表级权限控制" subTitle="包括增删改查四种权限,分别称为:create、delete、update、read"></page-head>
		<uni-section title="根据true和false控制数据库的相关操作" type="circle" ></uni-section>
			<view class="uni-title pl10">
				配置规则:
				<scroll-view scroll-x class="code-box">
					<show-code :codes='{
						"permission":{
							"read":true
						}
					}'></show-code>
				</scroll-view>
				<text>含义解释:允许任何账户读取本表</text>
			</view>
			<button @click="getFn('uid,username,nickname,state')" plain type="primary">读取表全部数据</button>
			<view  class="uni-title pl10">
				配置规则:
				<scroll-view scroll-x class="code-box">
					<show-code :codes='{
						"permission":{
							"delete":false
						}
					}'></show-code>
				</scroll-view>
				<text>含义解释: 禁止任何账户执行删除表中的记录操作</text>
				<text>\n 但管理员账号不受schema限制,可在底部工具条切换成管理员角色体验</text>
			</view>
			<button @click="removeFn" plain type="primary">删除全部记录数据</button>
			<!-- 你可以尝试切换任何账号,点击如上:读取和删除按钮体验。 -->
		<uni-section title="根据操作的用户id、角色和权限数组" type="circle" ></uni-section>
			<view  class="uni-title pl10">
				配置规则:
				<scroll-view scroll-x class="code-box">
					<show-code :codes='{
						"permission":{
							"create":"auth.uid != null"
						}
					}'></show-code>
				</scroll-view>
				<text>含义解释:表示仅已登陆后的用户才能执行创建操作</text>
			</view>
			<button @click="addFn()" plain type="primary">创建一条数据</button>
		<uni-section title="根据数据库中的目标数据记录"
			type="circle"
		></uni-section>
			<view  class="uni-title pl10 uni-common-mt">
				配置规则:
				<scroll-view scroll-x class="code-box">
					<show-code :codes='{
						"permission":{
							"create":"auth.uid==doc.uid || AUDITOR in auth.role || UPDATE_USER_INFO in auth.permission"
						}
					}'></show-code>
				</scroll-view>
				<!-- 
					<text>{</text>
					<text space="emsp">\n "permission":{</text>
					<text space="emsp">\n  "update":</text>
					<text class="light2" space="ensp">\n        </text>
					<text space="emsp">\n }\n</text>
					<text space="emsp">}</text>
				</view> -->
				<text>含义解释:\n 1.数据创建者 \n 2.角色为审核员 \n 3.拥有编辑权限; \n 三种情况,拥有字段更新权限
				</text>
			</view>
			<button @click="updateFn({nickname:'新昵称'},'uid == $env.uid')" plain type="primary"><text>更新nickname="新昵称"\n(仅当前用户为创建者的数据)</text></button>
			<button @click="updateFn({nickname:'新昵称'})" plain type="primary"><text>更新nickname="新昵称"\n(表中全部数据)</text></button>
		<page-head title="字段级权限控制"></page-head>
		<uni-section title="修改指定字段需要特殊角色" type="circle" ></uni-section>
			<view  class="uni-title pl10 uni-common-mt">
				配置规则:
				<scroll-view scroll-x class="code-box">
					<show-code :codes='{
						"properties":{
							"state":{
								"permission":{
									"write":"AUDITOR in auth.role"
								}
							}
						}
					}'></show-code>
				</scroll-view>
				<!-- <view class="code-box">
					<text space="emsp">"properties":{</text>
					<text space="emsp">\n "state":{</text>
					<text space="emsp">\n  "permission":{ </text>
					<text space="emsp">\n   "write":</text>
					<text class="light2">"AUDITOR' in auth.role"</text>
					<text space="emsp">\n  }</text>
					<text space="emsp">\n }</text>
					<text space="emsp">\n}</text>
				</view> -->
			</view>
				<button @click="updateFn({state:1})" plain type="primary"><text>更新 state = 1</text></button>
			<view  class="uni-title pl10 uni-common-mt">
				<text>含义解释:限角色为审核员才能更新,字段state</text>
			</view>
			
		<uni-section title="修改指定字段时,当前记录的某个字段应当满足某种条件" type="circle" ></uni-section>
			<view class="uni-title pl10 uni-common-mt">
				<view>配置规则:</view><!-- 字段的: -->
				<scroll-view scroll-x class="code-box">
					<show-code :codes='{
						"properties":{
							"username":{
								"permission":{
									"write":"doc.state != 0"
								}
							}
						}
					}'></show-code>
				</scroll-view>
				<!-- <view class="code-box">
					<text space="emsp">"properties":{</text>
					<text space="emsp">\n "username":{</text>
					<text space="emsp">\n  "permission":{ </text>
					<text space="emsp">\n   "write":</text>
					<text class="light2">"doc.state != 0"</text>
					<text space="emsp">\n  }</text>
					<text space="emsp">\n }</text>
					<text space="emsp">\n}</text>
				</view> -->
				<text>含义解释:表示执行该操作需要满足,update的表级权限控制外,还需要满足正在被操作的记录的字段state!=0</text>
			</view>
			<button @click='updateFn({username:"新姓名"})' plain type="primary"><text>更新 username:'新姓名' \n(表中全部数据)</text></button>
			<button @click='updateFn({username:"新姓名"},"uid == $env.uid")' plain type="primary"><text>更新 username:'新姓名' \n(仅当前角色为创建者的数据)</text></button>
			<!-- <view class="uni-title pl10 uni-common-mt">
				<view>注意:</view>
				<text>新创建的数据,默认字段state=0,\n</text>
				<text>通过按钮3,新建1条数据。然后通过按钮5执行本操作,你会得到被拒绝的提示。\n</text>
				<text>如果你执行步骤改为,按钮3-4-5将会顺利执行当前操作:修改username</text>
			</view> -->
		
		<uni-section title="控制特殊字段不可读" type="circle"></uni-section>
			<view  class="uni-title pl10 uni-common-mt">
				配置规则:<!-- phone字段的read:"auth.uid != null" -->
				<scroll-view scroll-x class="code-box">
					<show-code :codes='{
						"properties":{
							"phone":{
								"permission":{
									"read":"auth.uid != null"
								}
							}
						}
					}'></show-code>
				</scroll-view>
				<!-- <view class="code-box">
					<text space="emsp">"properties":{</text>
					<text space="emsp">\n "phone":{</text>
					<text space="emsp">\n  "permission":{ </text>
					<text space="emsp">\n   "read":</text>
					<text class="light2">"auth.uid != null"</text>
					<text space="emsp">\n  }</text>
					<text space="emsp">\n }</text>
					<text space="emsp">\n}</text>
				</view> -->
				<text>含义解释:综合表级任何用户可读的条件下,新增了未登录游客不能读取phone字段</text>
			</view>
			<button  @click="getFn('uid,username,nickname,state')" plain type="primary">读不带phone字段的数据</button>
			<button  @click="getFn('uid,username,nickname,state,phone')" plain type="primary">读带phone字段的数据</button>
		<set-permission ref="set-permission" @change="changePermission"></set-permission>
	</view>
</template>

<script>
	//import db from '@/js_sdk/uni-clientDB/index.js'
	 const db = uniCloud.database()
	const ptDb = db.collection('permission-test')
	import alertCode from '@/components/alertCode/alertCode.vue';
	import uniNoticeBar from '@/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue'
	export default {
		components: {
			uniNoticeBar,alertCode
		},
		data() {
			return {
				currentRole:""
			}
		},
		mounted() {
			uni.setStorageSync('uni_id_token', '')
			uni.setStorageSync('uni_id_token_expired', '')
		},
		onShow() {
			this.$nextTick(()=>{
				this.$refs['set-permission'].init(0)
			})
		},
		methods: {
			toDemo(){
				uni.navigateTo({
					url:"./permission-demo"
				})
			},
			previewImage(url){
				uni.previewImage({
					urls:[url]
				})
			},
224
			addFn(){
study夏羽's avatar
study夏羽 已提交
225
				uni.showLoading({mask:true})
226
				ptDb.add({
study夏羽's avatar
study夏羽 已提交
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
					nickname:"默认昵称",
					username:"默认姓名",
					phone:"18888888888"
				}).then(e=>{
					console.log(e);
					uni.showModal({
						content: '成功写入一条数据:\n{ "nickname":"默认昵称",\n "username":"默认姓名",\n "phone":"18888888888" }',
						showCancel: false,
						confirmText:"知道了"
					});
				}).catch(err=>{
					console.log(err);
					uni.showModal({
						title:"未登录游客不能写入数据",
						content: "请在底部工具条切换其他角色重试",
						showCancel: false,
						confirmText:"知道了"
					});
				}).finally(() => {
					uni.hideLoading()
				})
			},
249
			removeFn(){
study夏羽's avatar
study夏羽 已提交
250
				uni.showLoading({mask:true})
251
				ptDb.remove().then(e=>{
study夏羽's avatar
study夏羽 已提交
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
					console.log(e,"123");
					uni.showModal({
						content: JSON.stringify(e.result),
						showCancel: false,
						confirmText:"知道了"
					});
				}).catch(err=>{
					console.log(JSON.stringify(err));
					uni.showModal({
						title:"当前角色没有该权限",
						content: `管理员角色不受schema限制,请在底部工具条切换为管理员角色重试`,
						showCancel: false,
						confirmText:"知道了"
					});
				}).finally(() => {
					uni.hideLoading()
				})
			},
			updateNickname(self){
				
			},
273
			updateFn(data,where={}){
study夏羽's avatar
study夏羽 已提交
274 275
				console.log(data);
				uni.showLoading({mask:true})
276
				ptDb.where(where).update(data)
study夏羽's avatar
study夏羽 已提交
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
				.then(e=>{
					console.log(e);
					uni.showModal({
						content: JSON.stringify(e.result),
						showCancel: false,
						confirmText:"知道了"
					});
				}).catch(err=>{
					if('nickname' in data){
						uni.showModal({
							title:"被拒绝,普通用户角色,只能更新自己创建的数据。",
							content: '请在底部工具条切换为审核员角色重试',
							showCancel: false,
							confirmText:"知道了"
						});
					}else if('state' in data){
						uni.showModal({
							title:"当前角色无该操作权限",
							content: '请在底部工具条切换为审核员角色重试',
							showCancel: false,
							confirmText:"知道了"
						});
					}else if("username" in data){
						if(Object.keys(where).length === 0){
							uni.showModal({
								title:"根据表级updat权限设置,普通用户角色限更新自己的数据",
								content:"请在底部工具条切换为审核员角色重试",
								showCancel:false,
								confirmText:"知道了"
							})
						}else{
							uni.showModal({
								title:"被拒绝,更新的数据含字段state==0的数据",
								content:"请在底部工具条切换为审核员角色,将全部数据的state更新为1后重试",
								showCancel:false,
								confirmText:"知道了"
							});
						}
					}else{
						uni.showModal({
							title:err.message,
							showCancel: false,
							confirmText:"知道了"
						});
					}
					console.log("错误------",err);
323
					/* uni.showModal({
study夏羽's avatar
study夏羽 已提交
324 325 326 327 328 329 330 331 332
						title:"执行更新操作失败!",
						content: "schema配置了,更新该字段限:\n 1、数据创建者,2、审核员,3、当然还有无任何权限限制的管理员",
						showCancel: false,
						confirmText:"知道了"
					}); */
				}).finally(() => {
					uni.hideLoading()
				})
			},
333
			getFn(field='uid,username,nickname,state'){
study夏羽's avatar
study夏羽 已提交
334 335
				// console.time('getFn');
				uni.showLoading({mask:true})
336
				ptDb.field(field).get()
study夏羽's avatar
study夏羽 已提交
337 338
				.then(e=>{
					// console.timeEnd('getFn');
339
					console.log(e);
study夏羽's avatar
study夏羽 已提交
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
					if(e.result.data.length){
						this.$refs.alertCode.open(e.result.data)
					}else{
						uni.showModal({
							title:"查询执行成功",
							content:"但目前数据库为空,\n 请滚动页面找到【创建一条数据】点击后重试!",
							showCancel: false,
							confirmText:"知道了"
						});
					}
				}).catch(err=>{
					// console.timeEnd('getFn');
					console.log(err,"err---");
					uni.showModal({
						title:"当前角色无权访问含phone字段数据",
						content: "请在底部工具条切换其他角色重试",
						showCancel: false,
						confirmText:"知道了"
					});
				}).finally(() => {
					uni.hideLoading()
				})
			},
			changePermission(e){
				console.log(e, '切换完成');
				this.currentRole = e.role
			}
		}
	}
</script>

<style scoped>
.code-box{
	background-color:#fffae7;
	padding:5px 15px;
	width: 600rpx;
}
.navigator{
	padding: 16rpx;
	color: #586b95;
}
.page{
	padding-bottom: 100px;
	background-color: #FFFFFF;font-size: 12px;
}
.tip{
	border: dashed 1px #EEEEEE;
	border-radius: 5px;
}
.uni-title {
	width: 700rpx;
	margin:0 25rpx;
	font-size:12px;
	font-weight:500;
	padding:8rpx 20rpx;
	line-height:1.5;
}
.uni-title text{
	font-size:24rpx;
	color:#888;
	word-break: break-word;
}

.pl10{
	padding-left: 20rpx;
}
.title {
	color: #555555;
	font-size: 16px;
	padding:10px 10px;
}
.tips {
	color: #444;
	font-size: 14px;
	padding:10px 20px;
}
.btn-box{
}
button{
	width: 480rpx;
	margin:10px auto;
	font-size: 14px;
	text-align: center;
	line-height: 22px;
	padding: 10rpx;
}
</style>
study夏羽's avatar
study夏羽 已提交
427