uni-list左侧缩略图右侧图标
<view>
<uni-list>
<uni-list-item v-for="item in listArr" :title="item.title" :note="item.content" thumb="https://web-assets.dcloud.net.cn/unidoc/zh/unicloudlogo.png"
thumb-size="lg" :rightText="item.userid"></uni-list-item>
</uni-list>
</view>
之前做的多表关联,拿到了登录用户的id,但是这样渲染就是一个id而已,需要通过这个id去原表拿到用户的信息展示在这里
联表查询
文档在JQL语法里,对查询数据这一块的内容很多
联表查询的官方示例写法 第一种是之前的写法,现在一般写第二种,先通过查主表构建出一个虚拟表,然后把虚拟表和副表一起联表查询
// 直接关联多个表为虚拟联表再进行查询,旧写法,目前更推荐使用getTemp进行联表查询
const res = await db.collection('order,book').where('_id=="1"').get() // 直接关联order和book之后再过滤
// 使用getTemp先过滤处理获取临时表再联表查询,推荐用法
const order = db.collection('order').where('_id=="1"').getTemp() // 注意结尾的方法是getTemp,对order表过滤得到临时表
const res = await db.collection(order, 'book').get() // 将获取的order表的临时表和book表进行联表查询
在自己的项目中,主表是当前操作的clouddemo表,联表是联的uni-id-users
这是视频中的写法,会报错:使用临时表联表时不可使用filed方法
getData(){
// 先查询主表,构建出一个临时表artTemp
let artTemp = db.collection("cloudDemo").getTemp();
// 再查询副表uni-id-users表,构建临时表userTemp
let userTemp = db.collection("uni-id-users").getTemp()
// 联表查询 主表在前,副表在后
db.collection(artTemp, userTemp).get().then(res=>{
console.log(res);
})
密码虽然是md5加密的但也不能返给用户,而且用户拿来了也没用,这就需要进行字段的过滤field
第二项是头像地址
这么多的字段,只有一部分需要返回到前端,所以需要过滤 现在只拿昵称和用户名
在主表把标题、内容和userid拿过来,userid必须拿,因为主表副表就是通过userid进行关联的
getData(){
// 先查询主表,构建出一个临时表artTemp
let artTemp = db.collection("cloudDemo").field('title,content,userid').getTemp();
// 再查询副表uni-id-users表,构建临时表userTemp
let userTemp = db.collection("uni-id-users").field("_id").getTemp()
// 联表查询 主表在前,副表在后
db.collection(artTemp, userTemp).get().then(res=>{
console.log(res);
})
// db.collection("cloudDemo").get().then(res=>{
// console.log(res);
// this.listArr = res.result.data
// })
},
之前在主表cloudDemo的表结构中设置了关联关系这里才能进行关联查询
原本数据库中的userid是一个字符串,现在是以数组包含对象的形式返回来了
再多拿一个username,这里增加username后,视频中有权限校验未通过的报错提示,自己的没有(应该是已经登陆的原因)
// 先查询主表,构建出一个临时表artTemp
let artTemp = db.collection("cloudDemo").field('title,content,userid').getTemp();
// 再查询副表uni-id-users表,构建临时表userTemp
let userTemp = db.collection("uni-id-users").field("_id,username").getTemp()
// 联表查询 主表在前,副表在后
db.collection(artTemp, userTemp).get().then(res=>{
console.log(res);
})
修改uni-id-users
表的表结构schema
在这个scheam中对于username这一字段的限制是检验用户是否登录或者是否是超级管理员,把read这一项直接改成true,所有用户无论是否登陆都能读取,方便测试,通过把nickname这一项也改成true,允许所有用户操作w
还有头像字段avatar_file
,也把他改成true
"username": {
"bsonType": "string",
"description": "用户名,不允许重复",
"title": "用户名",
"trim": "both",
"permission": {
"read": "doc._id == auth.uid || 'READ_UNI_ID_USERS' in auth.permission",
"write": "'CREATE_UNI_ID_USERS' in auth.permission || 'UPDATE_UNI_ID_USERS' in auth.permission"
}
},
全部改完后,获取四个字段
// 先查询主表,构建出一个临时表artTemp
let artTemp = db.collection("cloudDemo").field('title,content,userid').getTemp();
// 再查询副表uni-id-users表,构建临时表userTemp
let userTemp = db.collection("uni-id-users").field("_id,username,avatar_file,nickname").getTemp()
// 联表查询 主表在前,副表在后
db.collection(artTemp, userTemp).get().then(res=>{
console.log(res);
})
现在拿到了数据就可以把数据赋值给data中设置的变量,然后渲染到页面就可以了
拿到的userid是一个数组,所以在渲染时需要取得数组里的对应项item.userid[0].username
<template>
<view>
<button @click="goLogin">登陆</button>
<button @click="logout">退出登陆</button>
<view>
<uni-list>
<uni-list-item v-for="item in listArr" :title="item.title" :note="item.content" thumb="https://web-assets.dcloud.net.cn/unidoc/zh/unicloudlogo.png"
thumb-size="lg" :rightText="item.userid[0].username"></uni-list-item>
</uni-list>
</view>
</view>
</template>
<script>
import {mutations} from "../../uni_modules/uni-id-pages/common/store.js"
const db=uniCloud.database();
export default {
data() {
return {
listArr:[]
}
},
onLoad() {
this.getData()
},
methods: {
getData(){
// 先查询主表,构建出一个临时表artTemp
let artTemp = db.collection("cloudDemo").field('title,content,userid').getTemp();
// 再查询副表uni-id-users表,构建临时表userTemp
let userTemp = db.collection("uni-id-users").field("_id,username,avatar_file,nickname").getTemp()
// 联表查询 主表在前,副表在后
db.collection(artTemp, userTemp).get().then(res=>{
console.log(res);
this.listArr = res.result.data
})
},
logout(){
mutations.logout();
},
goLogin(){
uni.navigateTo({
url:""
})
}
}
}
</script>