草庐IT

云开发-2-上传-云函数-数据库-添加

云高风轻 2023-03-28 原文

1. 前言

  1. 微信云开发
  2. 万事开头难,第二篇接上

2. vant组件使用

  1. 需要使用的组件可以在单个页面的json文件配置
  2. 常用的组件可以直接在app.json里面配置,其他界面就不用再配置了
  3. 直接配置 和window同级的属性
 "window": {},
 "pages": [
        "pages/index/index",
       "pages/addTodo/addTodo"
    ],
 "usingComponents": {
        "van-cell": "@vant/weapp/cell/index",
        "van-cell-group": "@vant/weapp/cell-group/index",
        "van-button": "@vant/weapp/button/index",
        "van-icon": "@vant/weapp/icon/index"
    }

3. index首页 添加功能

  1. 上面app.json配置过了 首页 和 添加页面
  2. 布局 wxml,点击跳转添加页面
<view class="plusBtn">
<navigator url="/pages/addTodo/addTodo">
    <van-icon  name="plus" size=" 100rpx" color="#FFF"/>
</navigator>
</view>

4. 添加页面 布局

  1. 这个是想去地方的一个清单吧,列入计划
  2. title:字段 想去地方的名字
    imageUrl: 想去地方的美景图片,激励自己
    locationInfo: 想去地方的位置信息
    status: 状态 羡慕中/?还没去,已完成??
  3. 效果
    添加布局.png
  1. 布局 wxml
<van-cell-group>
    <van-cell title="{{task.title}}" border="{{ false }}" value="{{task.status === 0 ? '羡慕中?' :  '已完成?'}}">
        <van-icon slot="right-icon" name="{{task.status === 0 ? 'cross' :  'success'}}" class="custom-icon" />
    </van-cell>
    <van-cell wx:if="{{task.locationInfo}}" bind:click="showLocation" title="位置" icon="location-o" value="{{task.locationInfo.name}}" label="{{task.locationInfo.address}}">
    </van-cell>
</van-cell-group>
<image wx:if="{{task.image}}" src="{{task.image}}"></image>
<view>
</view>
  1. 布局和是否是云开发没有关系,还是以前的写法

5. 添加页面 逻辑

5.1 选择图片功能

  1. 从基础库 2.21.0 开始,本接口wx.chooseImage停止维护,请使用 wx.chooseMedia 代替
  2. 可以自己改为 wx.chooseMedia,返回的字段不一样了要注意.
  3. wx.cloud.uploadFile 将本地资源上传至云存储空间,如果上传至同一路径则是覆盖
  4. cloudPath 图片名字这里为了尽量不重名用了随机数
  5. try catch配合async/await使用
  6. 注意返回结果
  7. imageUrl data里面声明
 selectImg() {
        wx.chooseImage({
            count: 0,
            success: async res => {
                console.log("选择图片:", res);
                try {
                    let res2 = await wx.cloud.uploadFile({
                        cloudPath: `${Math.floor(Math.random()*100000000)}.png`,
                        filePath: res.tempFilePaths[0], // 文件路径
                    })
                    this.setData({
                        imageUrl: res2.fileID
                    })
                    // res2.fileID
                    console.log("上传成功", res2.fileID)
                } catch (error) {
                    console.log("上传失败:", error);
                }
            }
        })
    },

5.2 获取指定位置

  1. 地图必须点击右上角确定 才算完成
  2. 注意不需要在app.json配置权限了
    公告.png
  3. pageData当前页面的数据但是不用来显示在界面上,pageData名字随便起,用起来方便,个人习惯
 pageData: {
        locationInfo: {}
    },
 chooseLocation() {
        wx.chooseLocation({
            success: res => {
                this.pageData.locationInfo = res
                console.log("获取位置------res:", res);
            },
            complete() {
                console.log("选择 位置 完成");
            }
        })
    },

5.3 提交

  1. 调用云函数 固定格式wx.cloud.callFunction({name:"云函数名字"},data:参数)
  2. 提交完成跳转到详情页pages/todoDetail/todoDetail?id=' + result._id
  3. id方便 详情页进行 查询语句
  4. 云函数下边写
  async onSubmit(event) {
        console.log("event:", event);
        let {result} = await  wx.cloud.callFunction({
            name:"addTodo",
            data: {
                title: event.detail.value.title,
                image:this.data.imageUrl,
                locationInfo:this.pageData.locationInfo
            }
        })
        console.log("提交成功:", result);
        wx.showToast({
            title: '添加成功',
            icon: "success",
            success: res => {
                wx.navigateTo({
                    url: '/pages/todoDetail/todoDetail?id=' + result._id,
                })
            }
        })
    },

5.4本地添加

// 本地直接 添加也可以 ,这样就不用写云函数了
    let result = await todos.add({
            data: {
                title: event.detail.value.title,
                image: this.data.imageUrl,
                locationInfo: this.pageData.locationInfo
            }
        })

6. 添加云函数

  1. cloudfunctions右键新建云函数
    1.png
  2. index.js逻辑
// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({
    env: cloud.DYNAMIC_CURRENT_ENV
});
// 数据库对象
const db = cloud.database()
// 链接数据库
const todos = db.collection("todos")

// 云函数入口函数
exports.main = async (event, context) => {
    const wxContext = cloud.getWXContext()
    // console.log("云函数:",event);
    return await todos.add({
        data: {
            ...event, 
            "_openid":wxContext.OPENID
        }
    })

}
  1. collcetion.add 新增记录,如果传入的记录对象没有 _id 字段,则由后台自动生成 _id;若指定了 _id,则不能与已有记录冲突
  2. _openid 字段名字必须有这个, OPENID 用户的标识,唯一的
  3. 本地直接add的 添加的时候会自动获取 _openid,所以不需要在手动添加
  4. 每次修改云函数后 记得右键 重新部署
    部署.png

7.注意事项

  1. 我这个版本云函数执行add的时候并没有添加_openid字段,导致 get查询的时候查不到数据,但是数据库又有添加记录
  2. 类似的问题 都检查下 _openid字段
  3. 图示
    1.jpg

8. 后记

  1. 写篇再加点 本地调试的讲解吧 .这篇就到这

参考资料

微信云开发
vant


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉

有关云开发-2-上传-云函数-数据库-添加的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  4. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  5. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  6. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  7. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  8. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  9. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  10. ruby - 可以通过多少种方法将方法添加到 ruby​​ 对象? - 2

    当谈到运行时自省(introspection)和动态代码生成时,我认为ruby​​没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby​​的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资

随机推荐