unicloud37-项目改造 修改页面读取已上传文章

50 阅读1分钟

修改页面改造

先写一个上传组件,并把imageValue变量双向绑定到data中,用来将添加的图片展示在页面中

<template>
  <view class="edit">
    <form @submit="onSubmit">
      <view class="item">
        <!-- 标题输入框 -->
        <input v-model="formValue.title" type="text" name="title" placeholder="请输入标题"></input>
      </view>

      <view class="item">
        <!-- 作者输入框 -->
        <input v-model="formValue.author" type="text" name="author" placeholder="请输入作者"></input>
      </view>

      <view class="item">
        <!-- 多行输入框 -->
        <textarea v-model="formValue.content" name="content" placeholder="请输入内容"></textarea>
      </view>
      
      <view class="item">
        <uni-file-picker
          v-model="imageValue"
          fileMediatype="image"
          mode="grid"
          @success="uploadSuccess"
        />
      </view>

      <view class="item">
        <button form-type="reset">重置</button>
        <!-- 对按钮进行双向绑定,这样用户每次输入值才能动态的调用判断方法 判断按钮 -->
        <button form-type="submit" type="primary" :disabled="inDisabled(formValue)">提交</button>
      </view>
    </form>
  </view>
</template>

<script>
  // 因为要通过详情页传过来的id获取数据,所以要定义一个全局id
  let id;
  export default {
    data() {
      return {
        imageValue:[],
        formValue:{
          title:"",
          author:"",
          content:""
        }
      };
    },

根据文档,要想把图片回显到页面,必须要有url和后缀、文件名

image.png

这里原本的url是一个数组形式,通过map给他改造成文档需要的数组包含对象的结构,但是文档要求三个必填项,这里只有一个url也能回显,不知道什么原因

还有一个问题是,这里代码中写的是通过map遍历值成为url:item,按理说就一个url:"图片地址"的键值对,另外一个path的键值对不知道哪里来的

image.png

<template>
  <view class="edit">
    <form @submit="onSubmit">
      <view class="item">
        <!-- 标题输入框 -->
        <input v-model="formValue.title" type="text" name="title" placeholder="请输入标题"></input>
      </view>

      <view class="item">
        <!-- 作者输入框 -->
        <input v-model="formValue.author" type="text" name="author" placeholder="请输入作者"></input>
      </view>

      <view class="item">
        <!-- 多行输入框 -->
        <textarea v-model="formValue.content" name="content" placeholder="请输入内容"></textarea>
      </view>
      
      <view class="item">
        <uni-file-picker
          v-model="imageValue"
          fileMediatype="image"
          mode="grid"
          @success="uploadSuccess"
        />
      </view>

      <view class="item">
        <button form-type="reset">重置</button>
        <!-- 对按钮进行双向绑定,这样用户每次输入值才能动态的调用判断方法 判断按钮 -->
        <button form-type="submit" type="primary" :disabled="inDisabled(formValue)">提交</button>
      </view>
    </form>
  </view>
</template>

<script>
  // 因为要通过详情页传过来的id获取数据,所以要定义一个全局id
  let id;
  export default {
    data() {
      return {
        imageValue:[],
        formValue:{
          title:"",
          author:"",
          content:""
        }
      };
    },
    onLoad(e) {
      // 把获取到的id赋值给全局id,这样整个页面哪里都能直接使用id了
      id=e.id
      // 调用获取新闻详情的方法,一进入页面就获取数据
      this.getDetail()
    },
    methods:{
      // 获取要修改新闻的详情
      getDetail(){
        uniCloud.callFunction({
          name:"art_get_row",
          data:{
            // id:id
            id
          }
        }).then(res=>{
          this.formValue = res.result.data[0]
          console.log(this.formValue);
          // 如果没有图片,这里结束代码,有图片才执行后续的代码
          // 不写这一句的话。如果没有图片的文章页面会报错
          if(!this.formValue.picurls) return;
          // 将图片展示在页面中,获取回来的值formValue中是有图片url的
          // 要将获取到的图片回显到页面,根据文档,还需要后缀名和文件名
          let urls=this.formValue.picurls.map(item=>{
            return {url:item}
          })
          console.log(urls);
          // 所以将他赋值给imageValue,绑定到上传组件,就能将图片显示在页面
          this.imageValue = urls;
        })
      },
      // 判断按钮的是否禁用
      // 这里是通过obj接收值所以不用写this,不传值也可以,写上this.一样
      inDisabled(obj){
        // 循环判断key的三个值是否为空,不为空就返回true,使按钮变为可用状态
        for(let key in obj){
          // obj[key]和obj.key一样的效果,打印出来的值就是用户输入的值
          // console.log(obj[key]);
          if(!obj[key]){
            return true
          }
        }
      },
      // 点击提交触发此方法
      onSubmit(e){
        // 获取到用户输入并赋值 
        // 这一句不用了,因为上面formValue是双向绑定的
        // 可以直接拿到用户修改的值
        // 在下面直接把formValue放在data中传递到后端即可
        // let detail=e.detail.value
        // 接收云函数传过来的值
        uniCloud.callFunction({
          name:"art_update_row",
          // 将获取到的用户输入传递到服务器
          data:{
            // detail:detail
            detail:this.formValue
          }
        }).then(res=>{
          uni.showToast({
            title:"修改成功"
          })
          setTimeout(()=>{
            uni.navigateBack()
          },800)
        })
      }
    }
  }
</script>

接下来是写上传成功方法,然后把图片url赋值到data中

    data() {
      return {
        // 上传成功的图片url
        picurls:[],
        imageValue:[],
        formValue:{
          title:"",
          author:"",
          content:""
        }
      };
    },
    
          // 图片上传成功,把url保存到data中
      uploadSuccess(e){
        this.picurls = e.tempFilePaths
      },

然后在调用云函数的方法中,传递url,最后在云函数中将url保存到数据库

// 点击提交触发此方法
      onSubmit(e){
        // 获取到用户输入并赋值 
        // 这一句不用了,因为上面formValue是双向绑定的
        // 可以直接拿到用户修改的值
        // 在下面直接把formValue放在data中传递到后端即可
        // let detail=e.detail.value
        // 接收云函数传过来的值
        uniCloud.callFunction({
          name:"art_update_row",
          // 将获取到的用户输入传递到服务器
          data:{
            // detail:detail
            detail:this.formValue,
            picurls:this.picurls
          }
        }).then(res=>{
          uni.showToast({
            title:"修改成功"
          })
          setTimeout(()=>{
            uni.navigateBack()
          },800)
        })
      }
    }

然后在云函数中接收值并保存到数据库

const db=uniCloud.database()
exports.main = async (event, context) => {
	let {detail,picurls} = event;
  return await db.collection("article").doc(detail._id).update({
    title: detail.title,
    author: detail.author,
    content: detail.content,
    picurls:picurls
  })
};

数据库里有值了 image.png

下一节将图渲染到页面中