- 小白变大神二:云数据库基础读写工具函数
《小白变大神,微信小程序云开发快速入门与成本控制实战》系列文章 第二篇:云数据库基础读写工具函数 前言 在上一篇文章中,我们创建了一个空页面 Todolist,介绍了数据库权限的基础知识,然后通过在表名称的前面添加 p_ 前缀来区分生产环境和开发环境。 阅读本篇文章之前,强烈建议你先阅读上一篇文章:《小白变大神:一、初识数据库》,并且请根据上一篇文章创建对应的数据库表。 在本篇文章中,我们将继续完善 Todolist 的功能,并提供几个较为基础的数据库读写工具函数。 学习完本篇文章后,你将可直接把读写数据库的代码库应用到你的项目中,提高开发效率。 Todolist 的写入与刷新 使用微信默认样式 考虑到本教程的主要目的是讲解云开发环境的 JavaScript 代码,因此我们在页面UI上使用微信默认方案 WeUI,请向你的 app.json 文件添加下面的配置,这样当你把我的 wxml 代码复制到你的项目中时,你能得到和我一样的页面UI效果。 [代码]// 向app.json文件添加下面的配置,让你的页面UI效果和我的一样 { "useExtendedLib": { "weui": true }, "style": "v2", } [代码] 我假设你已经了解了小程序的 WeUI 和 WXML。 获取代码库 WxMpCloudBooster 建议你在阅读本系列文章时,自己新建一个项目,然后跟着我的步骤在你的电脑上实践。因此,在本篇文章中,你需要先获取 WxMpCloudBooster 库中的代码。 你可以在github代码库:sdjl/WxMpCloudBooster下载,或者使用如下的命令: [代码]# 获取项目 git clone https://github.com/sdjl/WxMpCloudBooster.git # 切换到本篇文章(文章二)对应的代码库 cd WxMpCloudBooster git checkout article2 [代码] 注意:建议 checkout 到 article2,否则你拿到的代码可能和本文中不一致 添加 Todolist 页面UI 获取 WxMpCloudBooster 项目代码并切换到 article2 分支后,请你复制 miniprogram/pages/todo/todo.wxml 文件到你的项目中。刷新页面获得如图所示效果: [图片] 提示:为了减少文章篇幅,我不在文章中放置完整的 wxml 代码,你可以点击这里跳转查看 article2 的代码 数据绑定函数:_inputChange 查看代码库(代码库指WxMpCloudBooster,以后同)中的 miniprogram/pages/todo/todo.js 文件,你会看到如下代码: [代码]'use strict' import utils from '../../utils/utils' Page({ behaviors: utils.behaviors(), data: { todo_list: [], // 未完成事项列表 done_list: [], // 已完成事项列表 new_title: '', // 新增待办事项的内容,与输入框绑定 }, // ... }) [代码] 首先,我们在 data 中定义了一个 new_title 变量,用于存放 <textarea> 输入框中新建 todo 的内容。但是,当我们在 <textarea> 中输入文字时,系统并不会自动更新 data.new_title 的值,因此我们需要在 wxml 中使用 _inputChange 函数来实现数据绑定。代码如下: [代码]<textarea class="weui-textarea" value="{{new_title}}" bind:input="_inputChange" data-field="new_title" placeholder="这里是一个<textarea>输入框" placeholder-class="weui-input__placeholder" /> [代码] _inputChange 函数可以在代码库的 miniprogram/utils/page_behaviors.js 文件中找到: [代码]module.exports = Behavior({ methods: { // page_behaviors.js 中的函数都有下划线 _ _inputChange(e) { const { field } = e.currentTarget.dataset this.setData({ [`${field}`]: e.detail.value }) }, }, }) [代码] 我假设你已经了解了小程序的 事件机制 和 Behavior 为了在 todo.wxml 中使用 _inputChange 函数,我们需要在 todo.js 中引入 behaviors : [代码]Page({ behaviors: utils.behaviors(), }) [代码] 这里的 behaviors 是 Page 的一个内置属性,可在 Page文档中 查看。 在 utils.js 中可查看 behaviors 函数: [代码]const PAGE_BEHAVIORS = require('page_behaviors') const utils = { behaviors(){ return [ PAGE_BEHAVIORS, ] } } [代码] 提醒:当你修改 Behavior 文件时,需要重新编译小程序 这样,当你在 <teatarea> 中输入文字时,data.new_title 的值会自动更新,从而实现了数据绑定。 随着本教程的深入,page_behaviors.js 文件的功能会越来越丰富。 写入数据函数:utils.addDoc 假设你已经根据上一篇文章创建了 todo 和 p_todo 表,且两个表的数据库权限均选择了“自定义安全规则”,并使用了如下的安全配置: [代码]{ "read": "doc._openid == auth.openid", "write": "doc._openid == auth.openid" } [代码] 为了向 todo 表中写入数据,我们需使用 utils.js 中的 addDoc 函数: [代码]addDoc(c, d) { const _ = this return new Promise((resolve, reject) => { _.coll(c).add({ data: d }) .then(res => { resolve(res._id) }) .catch(e => { reject(e) }) }) } [代码] 正如上一篇文章中所说,addDoc 中的 coll 函数会自动根据环境判断使用 todo 还是 p_todo 表。当你在微信开发者工具中运行时,addDoc 会向 todo 表中写入数据,而在生产环境或真机预览时,addDoc 会向 p_todo 表中写入数据,并且以后提供的所有数据库操作函数都会自动判断。 然后在 todo.js 中使用 addDoc 函数: [代码]async addTodo (e) { const _ = this const { new_title } = _.data utils.addDoc('todo', {title: new_title, status: '未完成'}) .then(new_todo_id => { _.updateTodoList() _.setData({ new_title: '' // 清空输入框 }) }) } [代码] 这样就完成了点击“添加 todo”按钮时创建新 todo 的功能。 数据读取函数:utils.docs 与 utils.myDocs 新建 todo 后,需要在 updateTodoList 函数中重新读取 todo_list 列表,并重新渲染页面。 因此我们需要一个读取数据的函数 utils.docs。 但是,在上一篇文章中我们讲到,当你使用“自定义安全规则”且规则中有 auth.openid == doc._openid 时,需要在查询语句中添加 _openid: ‘{openid}’ 条件(否则会抛出没有权限的异常)。 因此,代码库中还提供了 utils.myDocs 函数,此函数专门用于读取上述权限设置的数据。 utils.js 文件中这两个函数的定义如下(完整的代码请查看代码库): [代码]docs ({ c, w = {}, page_num = 0, page_size = 20, only = '', except = '', created = false, order_by = {}, mine = false, } = {}) { // 代码请查看代码库 }, myDocs (args) { args.mine = true return this.docs(args) } [代码] 有了这两个工具函数后,我们就可以在 updateTodoList 函数中重新读取 todo_list,并重新渲染页面。 [代码]async updateTodoList () { const _ = this utils.myDocs({c: 'todo', w: {status: '未完成'} }) .then(docs => { _.setData({ todo_list: docs }) }) } [代码] utils.docs 的参数详解 utils.docs 函数支持多个参数,下面我们来详细解释这些参数的用法: c 参数 c 参数是唯一一个必传的,表示 collection 集合名称。当运行在生产环境时会自动添加 p_ 前缀,因此请勿在这里输入p_前缀,其他数据库操作函数也一样。 w 参数 w 参数表示查询条件 where,如 w: {status: ‘未完成’}。 还可以在 w 中使用“点表示法”,如: [代码]utils.docs( c: 'xxx', w: { 'people[0].name': '张三' } ) [代码] 这里的查询条件规则与官方文档中的规则一致。 page_num 和 page_size 参数 page_num 和 page_size 参数用于分页读取数据,page_num 从0开始,page_size 最大为20(微信限制每次最多读取20条数据)。 我个人认为,微信限制前端每次最多读取20条数据主要是为了避免加载时间过长,从而保障用户体验(毕竟有许多小白什么代码都敢写,可查看 get函数文档)。 在下篇文章中我会提供 utils.allDocs 函数,可实现仅消耗一次调用次数就能读取所有数据。 only 和 except 参数 only 和 except 参数用于控制返回的字段,当你仅需要返回 _id 和 _openid 时,可以这样写: [代码]utils.docs( c: 'xxx', only: '_id, _openid' ) [代码] 同样的,当你不需要返回 _openid 和 created 字段,其他字段都返回时,可以这样写: [代码]utils.docs( c: 'xxx', except: '_openid, created' ) [代码] 但是,当你使用 only 时,无论 only 中是否写了 _id,_id 都会返回。除非你同时使用 except 显性排除了 _id,如: [代码]utils.docs( c: 'xxx', only: 'title, content', except: '_id' ) [代码] 这是因为通常使用 only 时,我们实际上需要 _id 字段,但是每次都写 _id 会很麻烦。 created 参数 created 参数用于控制是否给返回的数据添加创建时间字段,共有4个字段:created、created_str、yymmdd、hhmmss。 通常你并不需要在创建数据时写入当前时间字段,因为我们可以从 _id 中分析出创建这个数据的时间。除非你需要根据此字段进行排序或其他查询操作。 这4个时间字段的格式如下: created:javascript 的 Date 对象 created_str:完整时间字符串,如:‘2024-07-26 12:02:00’ yymmdd:日期,如:‘2024-07-26’ hhmmss:时间,如:‘12:02:00’ 注意:如果数据是在云函数中创建的,需要把云函数的时区设置为 UTC+8(即在云函数中添加 TZ=Asia/Shanghai 配置),这个我们以后再详细讲解。 样例代码如下: [代码]const docs = await utils.docs({ c: 'xxx', created: true, }) console.log(docs[0].created) // Date 时间对象 console.log(docs[0].yymmdd) // '2024-07-26' [代码] order_by 参数 order_by 参数用于控制返回数据的排序,当你仅需根据一个字段升序排序时,可以直接写字段名,如: [代码]utils.docs({ c: 'xxx', order_by: 'rank', }) [代码] 当需要使用降序或多字段排序时,需传入一个对象,如: [代码]utils.docs({ c: 'xxx', order_by: {school: true, grade: 'desc', 'math.score': 0} }) [代码] 以上查询先按 school 升序,再按 grade 降序,最后按 math.score 降序。 在 order_by 中,‘asc’、1 或 true 均表示升序,‘desc’、0 或 false 均表示降序。 mine 参数与 myDocs 函数 由于我们使用了“自定义安全规则”且读取规则为 auth.openid == doc._openid(以后简称“自己的数据”),此时系统要求我们在查询数据时必须在 where 中添加 _openid: ‘{openid}’ 条件,否则会抛出没有权限的异常,如图所示: [图片] 当 mine=true 时,docs 函数会自动添加 _openid: ‘{openid}’ 条件。 但这样在阅读代码时语义不直观,因此建议用 myDocs 代替,myDocs 的参数和功能与 docs 一致,只是 mine 参数默认为 true。 以后还会有许多类似的函数对,如 getDoc、getMyDoc 等。记住一个简单的原则即可:使用 utils 库时,当操作“自己的数据”时,请使用对应的 my 函数。 其他依赖工具函数 utils.docs 依赖了其他 utils 中的函数,部分被依赖的函数如下(具体实现请在代码库中查看): [代码]const utils = { // 判断值是否为undefined或null isNone (i) {}, // 判断值是否为空对象{}、空数组[]、空字符串''、空内容串' '、undefined、null isEmpty (i) {}, // 判断值是否为数组 isArray(i) {}, // 判断值是object但不是数组、null、undefined isObject(i) {}, // 判断值是否为字符串 isString(i) {}, // 拆分字符串,返回数组 // 函数会过滤掉空字符串,并去除两边的空白 split (s, char = ' ') {}, // 判断某个元素是否在数组或对象中 in (item, arr) {}, // 从数据_id中获取时间,返回Date对象 getTimeFromId (id) {}, // 返回时间的年月日字符串,如:'2023-07-01' yymmdd (t) {}, // 返回时间的时分秒字符串,如:'01:02:03' hhmmss (t) {}, // 返回时间的完整字符串,如:'2023-07-01 01:02:03' dateToString (t) {}, } [代码] 随着本系列教程的深入,utils.js 会提供更多的工具函数,希望能帮你提高开发效率。 Todolist 列表显示效果 好了,目前我们已经完成了 todo 的添加功能,当你在输入框中输入文字并点击“添加 todo”按钮时,会在页面中显示新的 todo。效果如图所示: [图片] Todolist 的完成与删除 更新数据函数:utils.updateDoc 与 utils.updateMyDoc utils.js 中提供了数据更新函数,用于更新一个文档,代码如下: [代码]updateDoc (c, id, {_openid, _id, ...d}, {mine = false} = {}) { const _ = this const w = {_id: id} return new Promise((resolve, reject) => { _.coll(c) .where({...w, ...(mine ? {_openid: '{openid}'} : {})}) .limit(1) .update({data: d}) .then(res => { if(res.stats.updated > 0){ resolve(true) } else { resolve(false) } }) .catch(reject) }) }, updateMyDoc (c, id, d) { return this.updateDoc(c, id, d, {mine: true}) } [代码] 同样的,如果要更新“自己的数据”,请使用 updateMyDoc。这两个函数的前三个参数分别表示: c:集合名称 id:文档的 _id d:要更新的数据 这里数据 d 可以使用“点表示法”,如: [代码]utils.updateDoc('todo', todo_id, { 'author.name': '张三' }) .then(res => { if(res === true){ console.log('更新成功') } else { console.log('更新失败') } }) [代码] 注意:只有文档存在且数据有变化时,res 才会返回 true。 在 updateDoc 中排除 _openid 和 _id 字段 系统的 update 函数不允许传入 _openid 和 _id 字段,否则会抛出异常,如图所示: [图片] 但是,在实际开发中,我们经常会先读取一个 doc 文档,然后修改这个文档后使用当前 doc 去更新,如: [代码]const doc = await utils.getDoc('todo', todo_id) doc.status = '已完成' // ... 其他修改doc的代码 utils.updateDoc('todo', todo_id, doc) // 这里的 doc 中包含了 _openid 和 _id 字段 [代码] 此时因为 doc 中包含了 _openid 和 _id 字段,所以会抛出上图所示异常。 为了解决这个问题,我们在 updateDoc 函数中使用了解构赋值 {_openid, _id, …d} 来排除 _openid 和 _id 字段。 现在,你就不需要担心向 updateDoc 和 updateMyDoc 函数传入 _openid 和 _id 了。 为什么不直接 [代码]delete doc._openid[代码] ?,原因一是你可能需要使用 _id,原因二是可能会引起其他代码的 bug。 设置 todo 已完成 为了实现点击 todo 左边的圆圈时把 todo 的状态改为“已完成”,我们先在 todo.wxml 绑定 completeTodo 事件(完整代码请看代码库): [代码]<label wx:for="{{todo_list}}"> <view bind:tap="completeTodo" data-id="{{item._id}}"> <!-- 这里是一个圆圈 --> </view> </label> [代码] 然后在 todo.js 中实现 completeTodo 函数: [代码]async completeTodo (e) { const _ = this const { id } = e.currentTarget.dataset utils.updateMyDoc('todo', id, { status: '已完成' }) .then(() => { _.updateTodoList() }) } [代码] 修改 updateTodoList 函数,把已完成的 todo 放到 data.done_list 中: [代码]async updateTodoList () { const _ = this _.setData({ todo_list: await utils.myDocs({c: 'todo', w: {status: '未完成'} }), done_list: await utils.myDocs({c: 'todo', w: {status: '已完成'} }), }) }, [代码] 点击圆圈后,todo 会从未完成移动到已完成中,效果如图所示: [图片] 提示:这里只是为了演示数据库查询功能,实际开发时不应该在 updateTodoList 中读取数据库,以免消耗“调用次数” 删除数据函数:utils.removeDoc 与 utils.removeMyDoc 删除数据的函数如下: [代码]removeDoc (c, id, {mine = false} = {}) { const _ = this const w = {_id: id} return new Promise((resolve, reject) => { _.coll(c) .where({...w, ...(mine ? {_openid: '{openid}'} : {})}) .limit(1) .remove() .then(async res => { if(res.stats.removed > 0){ resolve(true) } else { resolve(false) } }) .catch(e => { resolve(false) }) }) }, removeMyDoc (c, id) { return this.removeDoc(c, id, {mine: true}) } [代码] 同样删除“自己的数据”时要使用 removeMyDoc 函数。 删除 todo 为了简化本教程的操作,我们直接使用 longtap 事件来删除 todo,你可以在未完成和已完成的 todo 中添加如下代码: [代码]<view class="weui-cell__bd" bind:longtap="deleteTodo" data-id="{{item._id}}" > <view>{{item.title}}</view> </view> [代码] 然后在 todo.js 中实现 deleteTodo 函数: [代码]async deleteTodo (e) { const _ = this const { id } = e.currentTarget.dataset utils.removeMyDoc('todo', id).then(_.updateTodoList) } [代码] 好了,现在你可以长按 todo 来删除它了。 代码库 本系列教程搭配了一个github代码库:sdjl/WxMpCloudBooster,你可以在这里找到文章中的代码: [代码]# 获取项目 git clone https://github.com/sdjl/WxMpCloudBooster.git # 切换到文章二对应的代码库 cd WxMpCloudBooster git checkout article2 [代码] 我每发布一篇文章,就会提交一个 commit,你可以使用 git checkout article + n 来切换到第 n 篇文章对应的代码。 下篇预告 在下篇文章中,我会进一步介绍更多的数据库读写函数,以及提供云函数中操作数据库的版本,并探讨数据库在使用上有哪些限制。届时我们将结束数据库的基础教程,之后会开启其他内容的学习之旅。 我将会在以后的文章中提供更丰富的代码库,你可以把 utils/ 导入到你自己的项目,实现高效率开发,最终变成大神。 本文作者刘永辉,安顺果然赞科技有限公司,转载请注明出处。
2024-07-26 - 「笔记」小程序备案驳回原因整理(不定期更新)
修改字段 待完善原因 修改建议 主体备案证件OR主办单位 证件 主办单位证件涉及前置或专项审批-你单位名称/经营范围/小程序名称/小程序服务内容涉及食品经营 你单位涉及食品相关内容,需要提供《食品经营许可证》、《食品生产许可证》或《仅销售预包装食品经营者备案信息采集表》请通过主体其他补充材料接口上传。 主体备案证件OR主办单位证件 主体证件图片不清晰 请上传清晰完整、不遮挡关键信息/图像、边角齐全、在有效期内的主体有效证件。 主体备案证件OR主办单位证件 主体证件边角不齐全 请上传清晰完整、不遮挡关键信息/图像、边角齐全、在有效期内的主体有效证件。 主体备案证件OR主办单位证件 主体负责人证件非原件彩色扫描件或拍照件 请上传清晰完整、不遮挡关键信息/图像、边角齐全、在有效期内的主体负责人有效证件彩色扫描件或者彩色拍照件。 主体备案证件OR主办单位证件 主办单位证件涉及前置或专项审批-你单位涉及危险化学品 经营范围涉及危化品的,需提供《危险化学品经营许可证》,如实际小程序不涉及的可提供情况说明书,并上传在小程序其他材料位置。 主体备案证件OR主办单位证件 主办单位证件涉及前置或专项审批-北京涉及金融相关关键字 你单位名称/经营范围涉及“金融”相关前置审批关键字。 注:承诺书需上传在小程序其他材料接口。 主体备案证件OR主办单位证件 主办单位证件涉及前置或专项审批-单位名称/经营范围涉及“文化”相关前置审批关键字 你单位名称/经营范围涉及“文化”相关前置审批关键字,如小程序实际经营相关内容,请提供文化和旅游厅审批的《网络文化经营许可证》,前置审批项需选择“文化”;如小程序内容不涉及,需在小程序备注中详细备注小程序从事内容,并承诺不涉及文化前置审批内容。 主体备案证件OR主办单位证件 主办单位证件涉及前置或专项审批-单位名称/经营范国涉及“药品和医疗器械”相关前置审批关键字 你单位名称/经营范围涉及“药品和医疗器械”相关前置审批关键字,如小程序实际经营相关内容,请提供食品药品监督管理局审批的《互联网药品信息服务资格证书》,前置审批项需选择“药品和医疗器械”如小程序内容不涉及,需在小程序备注中详细备注小程序从事内容,并承诺不涉及药品和医疗器械前置审批内容。 主体备案证件OR主办单位证件 主办单位证件涉及前置或专项审批-贵州涉及前置审批关键字 你单位名称、经营范围涉及前置审批关键字,如涉及请配合提供前置审批文件,如实际小程序内容不涉及需配合提供承诺书,承诺书模板下载链接:https://developers.weixin.qq.com/miniprogram/product/record_material.html 注:承诺书需上传在小程序其他材料接口。 主体备案证件OR主办单位证件 主办单位证件照片不符合要求-上海主办单位证件非最新横版营业执照 请提供你单位已获得的最新横版营业执照,如未获得,请办理成功之后再提交当前订单。 主体备案证件OR主办单位证件 主办单位证件照片不符合要求-主办单位证件模糊/ 不真实 请提供真实有效的主体证件,并提供在当地经营的有效证明(企业至少近期3个月以上的纳税证明或主体负责人及小程序负责人的当地社保证明),并将材料上传至小程序其他补充材料位置。 主体备案证件OR主办单位证件 主办单位证件照片不符合要求-电子营业执照不支持备案 请提供你单位获得的纸质版营业执照彩色原件拍照件或彩色原件扫描件。 主体备案证件OR主办单位证件 你单位名称/经营范围/小程序名称/小程序服务内容涉及食品经营 你单位涉及食品相关内容,需要提供《食品经营许可证》或《预包装食品经营许可证》,请通过主体其他补充材料接口上传。 主体备案证件OR主办单位证件 你单位涉及食品经营 管局要求如涉及食品经营需要提供食品经营许可证,请通过补充材料接口上传。 主体备案证件OR主办单位证件 备案主体涉及特殊关键字 备案主体为律师事务所的,需提供字迹清晰、页面完整的《律师事务所执业许可证》副本进行备案,上传附件应包含许可证副本首页、登记事项首页、最新年审页与变更登记名称、住所页;请通过主体其他补充材料接口传,为了保证清晰度,切勿拼图上传。 主体备案证件OR主办单位证件 备案主体涉及特殊关键字-经营范围涉及“出版”相关关键字 你单位名称/经营范围涉及“出版”相关前置审批关键字,需要提供《互联网出版物许可证》材料。 主体备案证件OR主办单位证件 湖北涉及电子商务或互联网销售 你单位名称/小程序名称/小程序服务内容/经营范围涉及电子商务或百联网销售,如实际小程序内容涉及需配合提供《增值电信业务经营许可证》如不涉及请配合提供“电子商务情况说明书”,说明下模板下载链接:https://developers.weixin.qq.com/miniprogram/product/record_material.html 注:说明书需上传在小程序其他材料接口。 主体备案证件OR主办单位证件 湖南涉及前置审批关键词-涉及出版前置审批关键字 小程序名称、服务内容不涉及前置审批,仅经营范围涉及前置审批关键字,需要备注说明小程序实际从事内容,并需要用户咨询相关前置审批部门后回复无需办理的,需按照格式注明:咨询xxxx单位(前置审批主管部门名称) ,电话xxxxxxx,回复无需办理前置审批。(内容主管部门、咨询电话信息,仅供参考,以实际情况为准 咨询部门:湖南省新闻出版局、省电影局 咨询电话:根据用户所在地自助查询) 主体备案证件OR主办单位证件 湖南涉及前置审批关键词-涉及教育、培训等关键字 小程序名称、服务内容不涉及前置审批,仅经营范围涉及前置审批关键字,需要备注说明小程序实际从事内容,并需要用户咨询相关前置审批部门后回复无需办理的,需按照格式注明:咨询xxxx单位(前置审批主管部门名称) ,电话xxxxxxx,回复无需办理前置审批。(内容主管部门、咨询电话信息,仅供参考,以实际情况为准 咨询部门:当地教育主管部门 咨询电话:根据所在地自助查询) 主体备案证件OR主办单位证件 湖南涉及前置审批关键词-涉及文化前置审批关键字 小程序名称、服务内容不涉及前置审批,仅经营范围涉及前置审批关键字,需要备注说明小程序实际从事内容,并需要用户咨询相关前警审批部门后回复无需办理的,需按照格式注明:咨询xxxx单位(前置审批主管部门名称) ,电话xxxxxxx,回复无需办理前置审批(内容主管部门、咨询电话信息,仅供参考,以实际情况为准。 咨询部门:湖南省文化和旅游厅咨询电话:0731-82213010) 主体备案证件OR主办单位证件 湖南涉及前置审批关键词-涉及金融前置审批关键字 小程序名称、服务内容不涉及前置审批,仅经营范围涉及前置审批关键字,需要备注说明小程序实际从事内容,并需要用户咨询相关前置审批部门后回复无需办理的,需按照格式注明:咨询xxxx单位(前置审批主管部门名称),电话xxxxx,回复无需办理前置审批。 (内容主管部门、咨询电话信息,仅供参考,以实际情况为准 咨询部门:当地金融局 咨询电话:根据所在地自助查询) 主体类型 主体性质选择错误 你的主体性质选择错误,请根据你提供的证件选择正确的主体性质。 主体补充材料 你提供的补充材料不符合要求 你提供的补充材料不符合要求,请确保你提供的补充材料清晰完整,内容与实际情况相符(包括但不限于材料内容、法人签字、盖章、写日期等信息均符合正常逻辑,且有效期不小于60天)注:如涉及到需要勾选的地方,请根据订单中实际情况勾选,不勾、错勾均不可以。 主体补充材料 补充材料上传位置错误 请将该材料上传至小程序 其他补充材料接口。 主体负责人应急联系方式 应急联系方式不符合要求-天津政企要求:一、应急联系方式需为本单位员工,二、应急联系方式需按要求备注 应急联系方式需为本单位员工,且需要在小程序备注中备注:应急联系电话手机号使用人为XXX公司员工XXX。 主体负责人有效证件类型 主体负责人信息真实性核验不通过-负责人证件号码 不能为其他主体备案过 请提供未备案过的主体负责人信息 主体负责人有效证件类型 负责人证件号码不能为其他主体备案过 请提供末备案过的主体负责人信息。 主体负责人证件 水印遮挡有效字体 或水印内容有误 请上传清晰完、不遮挡关键信息/图像边角齐全、在有效期内的主体负责人有效证件;且水印内容与小程序备案有关。 主体负责人证件 证件不能添加水印/公章 订单中的图片必须为彩色原件拍照件或彩色扫描件,请勿添加水印或公章,请修改后重新提交。 主体负责人证件 请负责人提供补充材料 请主体负责人提交在本单位缴纳至少3个月的社保证明或本行政区域内的居住证。 主办单位名称 主办单位证件涉及前置或专项审批-单位名称/经营范围涉及“危化品“关键字 单位名称/经营范围涉及“危化品“关键字如小程序涉及请配合提供前置审批文件,如不涉及请提供《不涉及危化品情况说明书》,并上传至小程序补充材料接口。承诺内容应包含:小程序实际经营内容xxxxx与用途xxxxxx并承诺实际不涉及危化品等需主管部门前置审批的相关内容:承诺书须有单位法定代表人签字(尽量正楷),加盖公司公章,日期(有效期需要在60天内),方视为有效。 主办单位名称 主办单位证件涉及前置或专项审批-广东单位名称涉及金融关键字 1、请优先提供金融办等金融监管部门的批文。2、如果确认无法拿不到的金融文件的,需提供一份情况说明书,内容必须写清楚“咨询单位、部门、电话,接电人的答复和态度是什么,以及介绍公司是做什么的,并承诺不利用互联网从事金融服务,不做网贷,不做P2P”等,如果违反需承担关闭小程序、注销备案、主体进入黑名单处罚。 3、法人手写签字或签名章(尽量正楷)、盖单位公章、写日期并上传在主体其他补充材料。 主办单位名称 主办单位证件涉及前置或专项审批-广东涉及非学科类校外培训需提供承诺书 承诺书内容需包含:1)写清楚小程序具体从事内容是什么,并承诺不涉及学科类校外培训活动等。2)单独起一段(文字不得修改):我单位/公司(按实际情况选择不能都保留)承诺未经教育部门批准不从事学科类校外培训活动,如有违背接受被注销备案、关停小程序等处理措施。3)公司落款,加盖公司公章、日期 注:承诺书需上传至小程序基他补充材料接口。 主办单位名称 备案主体涉及特殊关键字-广东涉及非学科类校外培训需提供承诺书 承诺书内容需包含:1)写清楚小程序具体从事内容是什么,并承诺不涉及学科类校外培训活动等。2)单独起一段(文字不得修改):我单位/公司(按实际情况选择不能都保留)承诺末经教育部门批准不从事学科类校外培训活动,如有违背接受被注销备案、关停小程序等处理措施。3)公司落款,加盖公司公章、日期 注:承诺书需上传至小程序其他补充材料接口。 主办单位名称 备案主体涉及特殊关键字-经营范围涉及“电影、电视”关键字 经营范围涉及“电影、电视”关键字请提供《不涉及电影电视情况说明书》,并上传至小程序补充材料接口。承诺内容应包含小程序实际经营内容与用途,并承诺实际不涉及电影、电视节目、影视制作等需主管部门前置审批的相关内容;承诺书须有单位法定代表人签字,加盖公司公章,日期,方视为有效。 主办单位名称 备案主体涉及特殊关键字-经营范围涉及”金融“关键字 经营范围涉及“金融”关键字请提供《不涉及金融情况说明书》,并上传至小程序补充材料接口。承诺内容应包含: 小程序实际经营内容xxxxx与用途xxxxxx,并承诺实际不涉及互联网金融等需主管部门前置审批的相关内容:承诺书须有单位法定代表人签字 ,加盖公司公章,日期方视为有效。 主办单位名称 经营范围涉及“教育”关键字 经营范围涉及“教育”关键字请提供《不涉及教育情况说明书》,并上传至小程序补充材料接口。承诺内容应包含:小程序实际经营内容xxxxx与用途xxxxxx,并承诺实际不步及学科培训、校外培训等需主管部门前置审批的相关内容;承诺书须有单位法定代表人签字,加盖公司公章,日期,方视为有效。 主办单位名称 经营范围涉及“文化”关键字 经营范围涉及“文化”关键字如小程序涉及请配合提供前置审批文件,如不涉及请提供《不涉及文化情况说明书》,并上传至小程序补充材料接口。承诺内容应包含:小程序实际经营内容与用途,并承诺实际不涉及网络文化等需主管部门前置审批的相关内容: 承诺书须有单位法定代表人签字,加盖公司公章,日期,方视为有效。 主办单位名称 经营范围涉及”药品和医疗器械“关键字 经营范围涉及”药品和医疗器械“关键字请提供《不涉及药品和医疗器械情况说明书》,并上传至小程序补充材料接口。承诺内容应包含:小程序实际经营内容xxxxx与用途xxxxxx,并承诺实际不涉及药品、医疗器械等需主管部门前置审批的相关内容;承诺书须有单位法定代表人签字,加盖公司公章日期,方视为有效。 主办单位证件类型 主体证件类型选择错误 请将主体证件类型修改为和主体证件一致。 主办单位通信地址 主办单位通讯地址不详细 通讯地址需精确到具体的门牌号,例如:xx省xx市xxx县xx路xx号xx号楼xx单元xx室,且不能使用特殊符号(如:2#楼2-3-301),如果已经是最详细的地址,无门牌号的,请在主体备注中说明“通信地址已为最详细”。 主办单位通信地址 主办者通讯地址不详细-个人通讯地址不详细 个人通讯地址需精确到具体的门牌号,例如:xx省xx市xxx县xx路xx号xx号楼xx单元xx室,若已经是最详细的地址,无门牌号的,请在主体备注中说明“通信地址已为最详细”。 人脸核身 活体核验照片衣着不符合要求 请小程序负责人在纯白色背景下(如白色墙体)拍摄,注意背景无杂物、露出清晰的五官和双肩、表情自然、穿着正常应季服装等。 其他 小程序主办者冲突 小程序主办者冲突,修改建议:请核实您在核实已备案成功的信息已当前填写的备案信息否一致后在平台重新提交报备申请。 其他 身份第二次验证未通过 请确保订单中的身份证必须为最新,请修改后重新提交;如确认订单中的身份证均为最新,请配合按照以下流程操作:下载CTID APP并使用nfc读卡方式开通网证,使用另一部手机拍摄网证开通认证全过程(需拍摄到手机屏幕操作过程以及身份证正反面信息)然后重新提交订单即可。注:如确认身份证为最新且因该问题多次被退回的,请通过小程序备案客服侧反馈提交以上拍摄视频。 其他 身份验证未通过 请确保订单中小程序负责人的身份证必须为最新,请修改后重新提交;如确认订单中的身份证均为最新,请配合按照以下流程操作:1、下载CTID APP并使用nfc读卡方式开通网证,然后重新提交订单即可 2、重新提交后仍因此问题多次被退回的,建议咨询证件对应部门。 前置审批材料 备案主体涉及小游戏-小游戏问题联系客服途径 途径一:https://work.weixin.qq.com/kfid/kfcca4feec277f91616 ;途径二:或微信小游戏助手(微信号minigame3)注:建议优先联系途径一。 前置审批材料 小程序服务内容涉及前置审批-四川、广东、上海涉及视频、短剧相关前置审批 涉及视频类请提供《信息网络传播视听节目许可证》,前置审批项选择“广播电视节目”,服务类目选择“休闲娱乐-视频”,《信息网络传播视听节目许可证》上传至前置审批位置。 前置审批材料 小程序服务内容涉及前置审批-浙江涉及视频、短剧 相关前置审批 小程序涉及视频、微短剧类的,不接受《信息网络传播视听节目许可证》只认可平台属地广电提供的审批文件;请将对应文件上传至前置审批位置。 小程序名称 备案信息真实性核验-个人 真实性核验未通过 按照备案信息真实性核验的要求,需小程序开发者提供如下材料:一、情况说明,内容应包含:①详细说明小程序具体从事什么;②本单位承诺,所提交的备案信息及材料均真实、合法、有效,所备案的小程序为本单位合法经营并负责管理,如有违及自愿承担相应法律表任和接受注销备案、下线小程序、列入黑名单等处罚结果。二、本人近三个月的社保或纳税证明并上传在小程序其他材料位置。 小程序名称 小 程序名称非纯中文 小程序名称非中文时,必须在小程序备注位置写明小程序中文名称及小程序主要服务内容,并在备注中添加“承诺遵守中华人民共和国法律法规”,填写小程序名称的中文注释。 小程序名称 小程序名称/服务内容涉及教育、校外培训等内容 如小程序内容涉及校外培训等内容必须提供对应资质:学科类培训-教育部门审批的证;文旅部门负责文化艺术类培训机构;体育部门负责体育类培训机构;科技部门负责科技类培训机构:请根据你单位涉及的培训内容,提供正确的资质文件,并上传在小程序其他补充材料接口;如小程序实际内容并不涉及,请修改小程序名称服务内容、备注等信息。 小程序名称 小程序名称不符合个人备案 要求 小程序名称涉及企业/单位/商城等非个人性质,请修改为与实际小程序业务有关的名称;如果你是企业小程序,请使用企业证件进行备案。参考指引:https://developers.weixin.qq.com/miniprogram/product/record/receord_category.html 小程序名称 小程序名称不符合要求-小程序名称与单位名称无关 你的小程序名称与单位名称无关联或涉及其他地域或单位,请将小程序名称修改为与本单位实际情况一致,且具有实际意义,并在小程序备注中详细描述小程序经营内容。(如小程序名称为你单位的注册商标,请将商标证书上传至小程序其他材料接口。) 小程序名称 小程序名称不符合要求-小程序名称涉及违规 你的小程序名称涉及色情、暴力、低俗、擦边、反动、侮辱性、封建迷信等国家法律法规禁止、违反公序良俗的内容,请修改。 小程序名称 小程序名称与单位名称无关 你的小程序名称与单位名称无关联或涉及其他单位,请将小程序名称修改为与本单位实际情况一致,且具有实际意义,并在小程序备注中详细描述小程序经营内容。 小程序名称 小程序名称与单位名称无关 你单位的小程序名称与当前主体性质不符,请修改小程序名称,请确保需要与您当前备案主体相关联。 小程序名称 小程序名称与单位经营范围无关 按照管局要求,小程序名称需要与备案主体性质相符合,通过名称可以看出小程序的具体含义,并在小程序备注中详细描述小程序的涉及内容。 小程序名称 小程序名称与单位经营范围无关 你的小程序名称与企业经营范围无关联,请将小程序名称修改为符合企业经营范围,且具有实际意义,并在小程序备注中详细描述小程序经营内容。(如小程序名称为你单位的注册商标,请将商标证书上传至小程序其他材料接口) 小程序名称 小程序名称涉及前置审批-福建小程序名称涉及剧本杀 小程序名称或备注涉及剧本杀,请提供属地文旅部门下发的备案文件;如不涉及请修改小程序名称或备注。 小程序名称 小程序名称涉及前置审批内容 小程序名称涉及前置审批/专项审批相关关键字(新闻/金融/宗教/医疗器械/网约车/校外培训/广播电影电视节目/文化/出版等),请上传对应前置审批资质;若实际不涉及,请修改为不涉及前置审批关键字的名称。 小程序名称 小程序名称重复 同一个主体下,该App,小程序或快应用上报的名称已存在或已提交备案申请,请勿重复报备;请修改后重新提交。 小程序名称 小程序备案个数较多-备案小程序较多 请配合提供《情况说明书》,内容需包含小程序实际经营内容、承诺“遵守互联网信息服务相关法律法规和行政管理规定,按照备案项目范围提供互联网信息服务,不发布未经许可和法律法规禁止发布的信息”,并法人签字、加盖公司公章写日期,上传至小程序其他材料接口。 小程序名称 非国家级单位小程序命名不符合要求 非国家级单位,不得以中国、中华中央、人民、人大、国家等字头命名。 小程序备注 个人小程序备注不符合要求 小程序备注不符合个人性质,不能涉及企业或经营性等情况,请修改为符合个人性质的备注或删减备注。 小程序备注 四川不涉及前置审批备注要求 小程序主要从事内容为xxxxxx,承诺不涉及xxxxx等前置审批内容。 小程序备注 小程序不涉及前置审批备注要求-不涉及前置审批备注要求 请补充填写备注,格式参考:“小程序主要从事内容为xxxxxxx,承诺不涉及xxxxx等前置审批内容” (注:切勿一句话描述为公司旗下产品或公司项目等无实际意义的内容) 小程序备注 小程序名称/小程序服务内容不符合主体性质 小程序名称或小程序服务内容与你当前备案的主体性质不相符,请在备注中详细描述具体含义及小程序后期从事的内容。 小程序备注 小程序备注不符合要求 小程序备注不符合要求,请修改或删减备注。 小程序备注 小程序备注不符合要求-小 程序备注超出营业执照经 营范围 小程序从事业务必须依照营业执照经营范圉来开展,不得超范围经营(且不能照抄经营范围填写在备注中,切勿涉及烟草危化品等不能互联网经营的业务),请详细描述小程序实际从事内容,修改后重新提交。 小程序备注 小程序备注不符合要求-小程序备注不详细 需描述小程序具体使用用途;如果是提供服务、销售产品的,需要具体说明提供的是x服务,用途是xx;销售的是xx产品。 小程序备注 小程序备注不符合要求-小程序备注不详细 需描述小程序具体使用用途;如果是提供服务、销售产品的,需要具体说明提供的是xx服务,用途是xx;销售的是xx产品。 小程序备注 小程序备注与企业性质不符合 小程序从事业务必须依照营业执照经营范围来开展,不得超范围经营(且不能照抄经营范围填写在备注中,切勿涉及烟草、危化品等不能互联网经营的业务),请详细描述小程序实际从事内容,修改后重新提交。 小程序备注 河南小程序备注 请务必清晰备注小程序实际经营内容。(注:切勿一句话描述为公司旗下产品或公司项目等无实际意义的内容) 小程序补充材料 你提供的补充材料不符合要求 你提供的补充材料不符合要求,请确保你提供的补充材料清晰完整目在有效期内。 小程序补充材料 承诺书不符合要求-承诺书不清晰完整 请确保提供的承诺书边角齐全,内容清晰完整,请修改后重新提交。 小程序负责人姓名 小程序负责人必须为法人 根据管局要求,小程序负责人须为单位的法定代表人,请将小程序负责人信息修改为单位法定代表人的信息。 小程序负责人应急联系方 应急联系方式真实性核验未通过-核实应急联系人不知情 按照备案信息真实性要求,请填写应急联系人的有效手机号码并接听电话。 小程序负责人手机号码 小程序负责人联系方式不能为其他主体备案过 该手机号码已被其他主办单位备案使用,且与你的信息不一致,请提供小程序负责人使用的、未备案过的有效手机号码。 小程序负责人手机号码 手机号码无人接听 请在订单审核期间保持电话畅通并注意接听电话,审核员需与你电话沟通核实备案信息有关情况。 小程序负责人有效证件号码 小程序负责人证件号码不能为其他主体备案过 请提供未备案过的小程序负责人信息,建议本单位/公司具体负责小程序管理、小程序维护的相关人员。 小程序负责人有效证件号码 小程序负责人证件号码不能为其他主体备案过 请提供未备案过的小程序负责人信息,建议本单位/公司具体负责小程序管理、小程序维护的相关人员。 小程序负责人法人授权书 上海小程序负责人授权书不符合要求 请使用上海小程序负责人授权书模板,小程序负责人授权书内容填写与实际负责人信息一致,授权书内容清晰完整,并且需要法人手写签字(尽量正楷)、公章清晰完整、填写日期。授权模板下载链接:https://developers.weixin.qq.com/miniprogram/product/record_material.html 小程序负责人法人授权书 小程序负责人授权书不符合要求 请确保小程序负责人授权书内容填写与实际负责人信息致,授权书内容清晰完整,并且需要法人手写签字(尽量正楷)、公章清晰完整、填写日期。 小程序负责人法人授权书 授权书内容不符合要求-小程序负责人授权书日期不符合要求 授权书必须填写日期,且有效期不小于60天。 小程序负责人电子邮箱 小程序负责人电子邮件不能为其他主体备案过 该手机号码已被其他主办单位备案使用,且与你的信息不一致,请提供小程序负责人使用的、未备案过的电子邮件。 小程序负责人证件 小程序负责人年龄不符合要求 小程序负责人年龄不符合要求(男不大于60周岁,女不大于55周岁),请修改负责人后重新提交。 小程序负责人证件 负责人证件非最新 请确保订单中的身份证必须为最新,请修改后重新提交请上传最新的负责人有效证件。 居住证/暂住证 居住证不符合要求-居住证 已过期/没有有效期 居住证有效期是一年,居住证中没有有效期或显示已过期的,必须提供辅助材料证明在有效期内,如不满足条件建议选择户籍地进行备案。 承诺书 互联网信息服务备案承诺书不符合企业要求 按照属地管局要求,请正确填写承诺书模板信息,请法人签字,并保持正楷签字、使用备案主体公章且清晰、如实写明日期(有效期不小于60天)内容清晰完整。(注:如个体工商户和无公章,需写身份证号、按手印,并需要在主体备注“个体工商户无公章”)(承诺书模板下载链接:https://developers.weixin.qq.com/miniprogram/product/record_material.html) 承诺书 承诺书内容不符合要求-承诺书日期不符合要求 承诺书必须填写日期,且有效期需要在60天内。 服务内容类型 小程序服务内容 不符合企业性质 请修改服务内容符合企业性质,需在你单位营业范围内开展工作;参考指引:https://developers.weixin.qq.com/miniprogram/product/record/receord_category.html 服务内容类型 小程序服务内容不符合个人性质 请修改服务内容符合个人性质,或者使用企业证件进行备案;参考指引:https://developers.weixin.qq.com/miniprogram/product/record/receord_category.html 服务内容类型 小程序服务内容不符合企业性质 请修改服务内容符合企业性质需在你单位营业范围内开展工作。 服务内容类型 小程序服务内容不符合企业性质 请修改服务内容符合企业性质,需在你单位营业范围内开展工作;参考指引:https://developers.weixin.qq.com/miniprogram/product/record/receord_category.html 服务内容类型 小程序服务内容与主体性质不相符-小程序服务内容不符合企业性质 请修改服务内容符合企业性质,需在你单位营业范围内开展工作;参考指引:https://developers.weixin.qq.com/miniprogram/product/record/receord_category.html 服务内容类型 小程序服务内容与主体性质不相符-小程序服务内容涉及政务服务 当前主体非政府机关,请勿选择政务服务,请根据你单位营业范围内的业务重新选择相符的服务内容。 服务内容类型 小程序服务内容选择错误 请根据小程序实际从事内容选择正确的小程序服务内容。 法人授权书 授权书内容不符合要求-主体负责人授权书日期不符合要求 授权书必须填写日期,且有效期不小于60天。 法人授权书 授权书模板不符合要求 你提供的授权书模板不符合要求,请提供符合要求的模板,模板请参考:https://developers.weixin.qq.com/miniprogram/product/record_material.html - 小程序主办者冲突 放弃备案并重提,修改备案类型为新增小程序或无主体新增小程序。 - 其他-身份验证未通过 请确保订单中的主体负责人身份证有效期必须为最新,请修改后重新提交;如确认订单中的身份证均为最新,请配合按照以下流程操作: 1、下载CTID APP并使用nfc读卡方式开通网证,录制网证视频留存,然后重新提交订单;2、重新提交后仍因此问题多次被退回的,将视频发给前端客服,位置小程序发布流程-小程序信息/程序类目 – 查询详情 联系客服按钮。 - 单位名称或证件类型及证件号码与已备案信息不一致 你本次申请备案的主体在工信部备案系统已有备案信息,且与微信平台提交的主体证件信息(单位名称或证件类型及号码)不一致,导致工信部备案系统校验冲突。需要你返回原接入商平台核实后变更主体备案信息,确认与微信平台提交的主体证件信息(单位名称、证件类型、证件号码)保持一致后,重新在微信平台提交小程序备案申请。 - 同一主体同一时间不能有多个流程中的备案 你的主体在其他平台(或接入商)已有等待管局审核中的首次备案申请(示例:当前你的主体有网站APP或小程序正在等待管局审核中),故需要退回当前备案订单待管局审核通过获得主体备案号后,重新在微信平台提交备案申请。 - 同一主体同一时间不能有多个流程中的备案 管局系统驳回:网站主办者冲突(主办者名称或证件类型及号码),请核实后再次报备。修改意见:同一主体同一时间不能有多个流程中的备案,建议放弃当前订单,待你流程中其他订单管局审核有结果了之后,再提交当前订单。 - 备案主体冲突 订单提交失败,请核实你单位是否已取得备案号,并确认之前备案信息是否为最新,如信息不一致,请至原接入商将备案信息变更为最新信息之后,待管局审核通过,再来提交当前订单。 - 小程序主办者冲突 你的主体证件已经在其他平台备案,不能同时在微信平台提交首次备案,请核实后在平台重新提交报备申请。 - 短信核验未通过(自动驳回) 你的订单未完成工信部的短信验证,已被管局系统驳回;请重新提交订单后,在收到工信部系统下发短信验证码的24小时内,按照短信提示的流程进行短信验证。 - 系统校验备案类型错误 您单位之前备案成功过两个网站,您此次订单理应是无主体新增备案,然而您的订单是首次备案,这是系统校验错误,请重新提交订单让系统重新校验正确就好。非常不好意思,请系统又未校验正确,麻烦您再次提交。 - 身份证校验未通过 请确保订单中的身份证必须为最新,请修改后重新提交。 - 其他 根据《中华人民共和国网络安全法》中落实网络实名制要求,请提交法定代表人或者网站负责人在本单位缴纳至少3个月的的社保证明或本行政区域内居住证。 - 其他 主体负责人证件与系统信息不一致。 - 其他 主办单位名称/经营范围涉及前置审批;请核实是否从事相关互联网前置审批服务业务,如从事请出具前置审批文件,如不从事需详细备注。 - 其他 已开通网站打开为违规站,请关闭。 - 其他 请提供相应建站依据。 - 其他 调用公安身份证接口核验证件真实性未通过未通过信息为服务负责人xx:(请确定是不是最新的身份证)。 - 其他 同一个主体下,该App,小程序或快应用上报的名称已存在或已提交备案申请,请勿重复报备。 - 其他 企业名称或申报的小程序服务内容或涉及“游戏”,根据《互联网信息服务管理办法》《网络出版服务管理规定》,请如实填写服务内容并在前置审批栏上传许可文件,如不涉及,请正确选择小程序服务内容并提交小程序服务内容不涉及相关前置审批的情况说明,情况说明需加盖公章。 - 其他 单位名称、经营范围、涉及金融关键词的必须提供金融审批文件,暂时不支持写承诺书。 - 其他 主办单位通用信息地址填写的与实际不符。 - 其他 管局驳回原因:(1003)网站主办者冲突-单位名称或证件类型及证件号码与已备家信息不一致,修改建议:你本次申请备案的主体在工信部备案系统已有备案信息,且与微信平台提交的主体证件信息(单位名称或证件类型及号码)不一致,导致工信部备案系统校验冲突。需要你返回原接入商平台核实后变更主体备案信息,确认与微信平台提交的主体证件信息(单位名称、证件类型、证件号码)保持一致后,重新在微信平台提交小程序备案申请。请查看原接入商中填写的主体证件类型是不是:民办非企业单位主体证件号码,注意大小写是否一致。 - 其他 目前用户可以修改主体负责人为非法人(要求高管);请您提供如下资料,上传至主体附件位置:(1)提供身份证真实有效的、验证过程的《情况说明》,写明实际情况(法人XXX身份证备案时核验未通过,实体身份证信息与CTID网证APP信息比对结果一致,更换主体负责人为高管),情况说明加盖单位公章和法人签字;(2)网证APP查询到的关键信息手机截屏图片若干张(目前的法人的身份证照片中的法人身份证号码少了一位);(3)提供授权本单位(公司)高管(注明职务)做备案的主体负责人授权书。 - 其他 已备案的小程序中有“1对1“等字眼,涉及到“校外培训”前置审批项,请上传教育部门的前置审批文件。否则请尽快修改相关名 称。 未修改之前,新的备案不予通过。 - 其他 根据《互联网金融风险专项整治工作实施方案》国办发(2016)21号令第条第二款、第三条第一款《互联网信息服务管理办法》国务院(292)号令第五条,《关于促进互联网金融健康发展的指导意见》银发〔2015〕221号第十三条,《防范和处置非法集资条例》第二条,《关于进一步规范金融营销宣传行为的通知》第一条第二款等相关规定,应取得金融部门前置许可或有关证明文件再与接入商联系提交备案信息。 备注:不同地区备案要求不完全一致,排序不分先后,以上数据来源于开放社区仅供参考,如有新增驳回原因可以留言补充。 附:各省/市通信管理局ICP备案咨询电话 通信管理局 官网地址 备案咨询电话 北京通信管理局 https://bjca.miit.gov.cn/ 010-63310094 天津通信管理局 https://tjca.miit.gov.cn/ 022-58920596 河北通信管理局 https://hbca.miit.gov.cn/ 0311-81582202,0311-81582209 山西通信管理局 https://sxca.miit.gov.cn/ 0351-8788032 内蒙古通信管理局 https://nmca.miit.gov.cn/ 0471-6684287 辽宁通信管理局 https://lnca.miit.gov.cn/ 024-86581188 吉林通信管理局 https://jlca.miit.gov.cn/ 0431-82006727 黑龙江通信管理局 https://hljca.miit.gov.cn/ 0451-87907597 上海通信管理局 https://shca.miit.gov.cn/ 021-63905006 江苏通信管理局 https://jsca.miit.gov.cn/ 025-58500033 浙江通信管理局 https://zjca.miit.gov.cn/ 0571-87078277 安徽通信管理局 https://ahca.miit.gov.cn/ 0551-65680618 福建通信管理局 https://fjca.miit.gov.cn/ 0591-28355716 江西通信管理局 https://jxca.miit.gov.cn/ 0791-86207387 山东通信管理局 https://sdca.miit.gov.cn/ 0531-82092828,0531-82092857 河南通信管理局 https://hca.miit.gov.cn/ 0371-65795120 湖北通信管理局 https://hubca.miit.gov.cn/ 027-87796822,027-87796833 湖南通信管理局 https://hunca.miit.gov.cn/ 0731-82260326 广东通信管理局 https://gdca.miit.gov.cn/ 020-87628386 广西通信管理局 https://gxca.miit.gov.cn/ 0771-2628797 海南通信管理局 https://hnca.miit.gov.cn/ 0898-65203155 重庆通信管理局 https://cqca.miit.gov.cn/ 023-68583855 四川通信管理局 https://scca.miit.gov.cn/ 028-87015272 贵州通信管理局 https://gzca.miit.gov.cn/ 0851-85611000 云南通信管理局 https://ynca.miit.gov.cn/ 0871-63533156 西藏通信管理局 https://xzca.miit.gov.cn/ 0891-6329494 陕西通信管理局 https://shxca.miit.gov.cn/ 029-965107 甘肃通信管理局 https://gsca.miit.gov.cn/ 0931-8788918 青海通信管理局 https://qhca.miit.gov.cn/ 0971-8116884 宁夏通信管理局 https://nxca.miit.gov.cn/ 0951-6198315 新疆通信管理局 https://xjca.miit.gov.cn/ 0991-2388862 (数据来源于各省/市通信管理局官网,更新于2025年4月)
04-27 - 微信小程序-父子组件通讯(传值)
目录 1.父组件传值给子组件 2.子组件传值给父组件 vue、微信小程序都能封装组件,那么就会涉及到一个问题,组件之间的通讯 1.父组件传值给子组件 父组件使用子组件: [代码]<Tabs tabs="{{tabsList}}"> ..... ..... [代码] 组件中: [代码]/** * 组件的属性列表 */ properties: { tabs: { // 类型 type: Array, // 默认值 value: [] } }, // 监听传入的变量,当传入的值发生变化时,触发方法 observers: { 'tabs': function (val) { // val=》就是父组件传入组件中的tabsList数据 console.log(val); } }, data: { }, /** * 子组件的方法列表 */ methods: { //子组件 发生点击事件时触发 handleItemTap (e) { // 1 获取点击的索引 const { index } = e.currentTarget.dataset; // 2 触发 父组件中的事件,传递数据给父组件 把当前点击的index数据传给父组件 this.triggerEvent("tabsItemChange", { index: index }); } } [代码] 这样,就能将tabsList这个数组传给子组件中的tabs变量,以供给子组件使用了 注意,在子组件中得到父组件传入的数据,不用再到data中声明一次,直接通过this.data.tabs就能拿到传入的数据了。 2.子组件传值给父组件 一般在子组件中做了某些操作后,就要返回数据给父组件,最常见的就是:子组件中点击后触发一个方法,返回数据给父组件 [图片] this.triggerEvent(“方法名称”, {key: val }); 这样就能将 {key: val } 这个数据通过一个方法返回给父组件 而父组件中,需要通过bind绑定子组件返回的这个方法,进而拿到传过来的数据 接下来用这个来做演示:this.triggerEvent(“tabsItemChange”, {name: ‘cj’ }); tabsItemChange ====> 就是bind要绑定的方法,至于父组件中要给这个绑定的方法关联什么名字的函数,随便起名字都行,这里我就起名叫做【getSonNameChange】 [代码] <Tabs tabs="{{tabsList}}" bindtabsItemChange="getSonNameChange"> [代码] 然后在父组件的js文件中声明这个函数,获取子组件传过来的数据,注意:是在父组件的js中定义这个函数! [代码] // 获取从子组件传回来的数据 getSonNameChange (e) { // 获取子组件传过来的数据 const { name } = e.detail }, [代码] 此时,就能获取到子组件传给父组件的数据了 注意: 子组件可以直接传一个对象给父组件,这样就不用把每个键值对都写出来了 [代码] handleItemTap (e) { const sonData = { key1: value1, key2: value2, key3: value3 } // 2 触发 父组件中的事件,传递数据给父组件 this.triggerEvent("tabsItemChange", sonData); } [代码]
2023-10-16 - TDesign 是什么
TDesign 是什么 TDesign 是腾讯各业务团队在服务业务过程中沉淀的一套企业级设计体系。 TDesign 具有统一的 价值观,一致的设计语言和视觉风格,帮助用户形成连续、统一的体验认知。在此基础上,TDesign 提供了开箱即用的 UI 组件库、设计指南 和相关 设计资产,以优雅高效的方式将设计和研发从重复劳动中解放出来,同时方便大家在 TDesign 的基础上扩展,更好的的贴近业务需求。 为什么会有 TDesign 过去,腾讯内部众多团队搭建了不同的设计体系和组件库产品,以满足各自的业务诉求,提升研发效能。这些体系各自独立维护,彼此割裂。并且,随着内部业务的规模不断扩大,这种割裂的局面愈发严重。 为了应对这一情况,腾讯内部建立了 开源协同委员会,参考开源社区的组织方式,将同类项目的不同技术团队聚合在一起,开源共建。TDesign 在这样的背景下应运而生,在腾讯内部以开源协同的方式,共建一个完善、易用的设计体系和组件库产品。 [图片] TDesign 的发展 TDesign 在创建之初就严格按照开源协作的原则运作,包括源代码在内的协作方案讨论、组件设计及 API 制定的过程也完全在公司内源上开放。也得到了公司内开发和设计同学的广泛关注,无论以什么身份参与,TDesign 都同样遵循平等、公开且严格的原则来对待,很多同学从个人项目中试用组件库开始,到提交第一个 [代码]Bug Issue[代码],再到提交第一个 [代码]Feature MR[代码],最后逐步参与到 [代码]MR Review[代码] 和方案制定工作中,成为核心贡献者。在过去的一年中,TDesign 关闭了 1k+ [代码]Issue[代码],进行了 5k+ 次 [代码]CR[代码],保持 每周迭代 发布新版本。 组件库目前支持多个业界主流的开发技术栈,桌面端 Vue2、Vue3 已发布 1.x 版本,桌面端 React 和移动端 Vue3、微信小程序已发布 [代码]Beta[代码] 版本,移动端 React、QQ小程序发布 [代码]Alpha[代码] 内测版本: 桌面端 仓库 描述 状态 tdesign-vue Vue 2.x 技术栈 [代码]1.0 LTS[代码] tdesign-vue-next Vue 3.x 技术栈 [代码]1.0 LTS[代码] tdesign-react React 16.x 技术栈 [代码]1.0 LTS[代码] tdesign-angular 基于 Angular 10 实现 [代码]待上线[代码] 移动端 仓库 描述 状态 tdesign-mobile-vue Vue 3.x 技术栈 [代码]Beta[代码] tdesign-miniprogram 微信小程序 [代码]1.0 LTS[代码] tdesign-mobile-react React 16.x 技术栈 [代码]Alpha[代码] tdesign-flutter 1.17.0 [代码]待上线[代码] 同时,TDesign 与腾讯内部在各自的领域具有丰富行业经验业务团队正协作中,提供更多具有业务属性的组件库产品,未来会有包括政务、零售等多个不同风格及组件类型的组件库产品开放出来,敬请期待! TDesign 后续发展详细规划请参阅 后续计划。 产品特性 完整 TDesign 官方提供了多种业界主流的开发技术栈支持。目前,TDesign 已经支持了 Vue 2、Vue 3、React 和移动端 Vue 3、微信小程序 的开发,其他技术栈如 Augular、Flutter 正在开发中。 为了实现开发与设计之间的高效协同,TDesign 中包含了丰富可复用的设计组件资源,如色彩体系、文字系统、动效设计、图标元素、布局结构等,覆盖支持 Axure、Sketch、Figma、Adobe XD 等各大产品设计软件,将设计和开发者从重复劳动中释放出来。 除了常规设计资源,TDesign 还提供了辅助设计工具如 Sketch 设计插件,也支持在 即时设计、Pixso、墨刀 等市面常用设计工具中使用 TDesign 设计物料。 [图片] 一致 TDesign 将腾讯内部多年设计经验提炼总结为专业的设计指南,其所提供的通用设计解决方案,能够帮助产品经理、设计师、开发者等角色高效完成企业级产品的设计和研发,并保持设计语言和风格的一致,满足用户体验的要求。 基于 TDesign 的设计体系规范,TDesign 同时上线了组件库的桌面端和移动端,提供了多个技术栈实现版本。通过一系列协作流程和辅助工具,保证各技术栈 组件 API 和实现产物一致。借助这些能力,使得项目即便使用了多种不同的技术架构或技术栈,开发者也可通过 TDesign 通用设计组件库进行开发,显著降低学习成本,在构建统一/多端覆盖/跨技术栈的前端应用时更具优势。 [图片] 易用 TDesign 设计体系在形成过程中,提炼了不同业务、场景的设计经验,提供了通用的 设计指南 以降低使用门槛。对于不同企业产品的品牌定制需求,TDesign 支持使用者对设计风格进行扩展,目前已经将设计样式梳理归纳为 Design Token,形成一套企业内部的语义化设计规范,方便后续进行统一的管理和使用扩展。 [图片] 在主题配置方面,TDesign 提供了明亮和 暗色 两种模式,支持一键切换,提升用户的使用体验。后续,TDesign 还会推出针对于不同垂直领域的行业组件,覆盖更多的业务范围。产品团队可以借助内置的行业主题,快速配置对应需求,启动业务开发。 TDesign 同步上线了一款开箱即用的中后台框架 TDesign Starter Kit,开发者可以通过它快速体验组件能功能,也可以将它修改为项目基础脚手架工程,快速实现从 0 到 1 的产品开发上线。 欢迎加入 TDesign 通过对外开源,TDesign 希望将服务范围扩大至外部团队,同时开源也是一个新的起点,借助社区的力量,TDesign 期望获得与同道交流学习的机会,逐步建立起活跃的社区,以便持续打磨完善组件库和相关生态产品。 如果你希望参与 TDesign 的开源共建,请先阅读 《如何贡献》,期待你的参与! ❤️ 感谢 TDesign 所有的贡献者,他们是超过 270 位伙伴们。
2023-03-22 - 微信小程序中安全区域计算和适配
前言 自从iphoneX问世之后,因为iphoneX、iphoneXR和后续全面屏手机设备,因为物理Home键被底部小黑条代替了,这时候很多前端小伙伴在开发的过程都会遇到 “全面屏”和“非全面屏”的兼容性问题,普遍问题就是底部按钮或者选项卡与底部黑线重叠 解释 根据官方解释: 安全区域指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)的影响。 具体区域如图展示 [图片] 适配方案 当前有效的解决方式有几种 使用已知底部小黑条高度34px/68rpx来适配 使用苹果官方推出的css函数env()、constant()适配 使用微信官方API,getSystemInfo()中的safeArea对象进行适配 使用已知底部小黑条高度34px/68rpx来适配 这种方式是根据实践得出,通过物理方式测出iPhone底部的小黑条(Home Indicator)高度是34px,实际在开发者工具选中真机获取到高度也是34px,所以直接根据该值,设置margin-bottom、padding-bottom、height也能实现。同时这样做要有一个前提,需要判断当前机型是需要适配安全区域的机型。 但是这种方案相对来说是不推荐使用的。比较是一个比较古老原始的方案 使用苹果官方推出的css函数env()、constant()适配 这种方案是苹果官方推荐使用env(),constant()来适配,开发者不需要管数值具体是多少。 env和constant是IOS11新增特性,有4个预定义变量: safe-area-inset-left:安全区域距离左边边界的距离 safe-area-inset-right:安全区域距离右边边界的距离 safe-area-inset-top:安全区域距离顶部边界的距离 safe-area-inset-bottom :安全距离底部边界的距离 具体用法如下: Tips: constant和env不能调换位置 [代码] padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/ padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/ [代码] 其实利用这个能解决大部分的适配场景了,但是有时候开发需要自定义头部信息,这时候就没办法使用css来解决了 使用微信官方API,getSystemInfo()中的safeArea对象进行适配 通过 wx.getSystemInfo获取到各种安全区域信息,解析出具体的设备类型,通过设备类型做宽高自适应,话不多说,直接上代码 代码实现 [代码] const res = wx.getSystemInfoSync() const result = { ...res, bottomSafeHeight: 0, isIphoneX: false, isMi: false, isIphone: false, isIpad: false, isIOS: false, isHeightPhone: false, } const modelmes = result.model const system = result.system // 判断设备型号 if (modelmes.search('iPhone X') != -1 || modelmes.search('iPhone 11') != -1) { result.isIphoneX = true; } if (modelmes.search('MI') != -1) { result.isMi = true; } if (modelmes.search('iPhone') != -1) { result.isIphone = true; } if (modelmes.search('iPad') > -1) { result.isIpad = true; } let screenWidth = result.screenWidth let screenHeight = result.screenHeight // 宽高比自适应 screenWidth = Math.min(screenWidth, screenHeight) screenHeight = Math.max(screenWidth, screenHeight) const ipadDiff = Math.abs(screenHeight / screenWidth - 1.33333) if (ipadDiff < 0.01) { result.isIpad = true } if (result.isIphone || system.indexOf('iOS') > -1) { result.isIOS = true } const myCanvasWidth = (640 / 375) * result.screenWidth const myCanvasHeight = (1000 / 667) * result.screenHeight const scale = myCanvasWidth / myCanvasHeight if (scale < 0.64) { result.isHeightPhone = true } result.navHeight = result.statusBarHeight + 46 result.pageWidth = result.windowWidth result.pageHeight = result.windowHeight - result.navHeight if (!result.isIOS) { result.bottomSafeHeight = 0 } const capsuleInfo = wx.getMenuButtonBoundingClientRect() // 胶囊热区 = 胶囊和状态栏之间的留白 * 2 (保持胶囊和状态栏上下留白一致) * 2(设计上为了更好看) + 胶囊高度 const navbarHeight = (capsuleInfo.top - result.statusBarHeight) * 4 + capsuleInfo.height // 写入胶囊数据 result.capsuleInfo = capsuleInfo; // 安全区域 const safeArea = result.safeArea // 可视区域高度 - 适配横竖屏场景 const screenHeight = Math.max(result.screenHeight, result.screenWidth) const height = Math.max(safeArea.height, safeArea.width) // 状态栏高度 const statusBarHeight = result.statusBarHeight // 获取底部安全区域高度(全面屏手机) if (safeArea && height && screenHeight) { result.bottomSafeHeight = screenHeight - height - statusBarHeight if (result.bottomSafeHeight < 0) { result.bottomSafeHeight = 0 } } // 设置header高度 result.headerHeight = statusBarHeight + navbarHeight // 导航栏高度 result.navbarHeight = navbarHeight [代码]
2022-11-04 - 那些微信小程序开发踩过的坑
小程序页面栈最多十层 问题:小程序内超过十层路由,你会发现wx.navigateTo跳转不到下一个页面。这是因为使用wx.navigateTo跳转会把当前页面保存到页面栈中,而小程序页面栈最多十层。 解决:超过十层使用redirectTo(重定向)操作 或者参考https://developers.weixin.qq.com/community/develop/article/doc/000a08e12185187bd5cebf3f651013 IOS使用New Date()报错IOS 的 Date 构造函数 不支持2018-04-26这种格式的日期,必须转换为2018/04/26这种格式,可以使用 replace(/-/g, '/')处理image组件使用webp图片时,IOS需要设置webp属性.Android手机在onShow内调用 wx.showModal ,如果不关闭弹窗(直接点击右上角退出小程序),弹窗不会销毁,再次进入页面触发onShow时会出现两次弹窗,IOS正常小程序中使用 web-view打开pdf , IOS 可以正常打开,Android 打开为空白 解决:使用wx.downloadFile和wx.openDocument 在手机相册中选择完图片后直接跳转会出现闪回的现象 原因:在选择完图片后,会重新执行一遍page的onShow生命周期 解决:在选择完图片后,做一个sleep延时1秒,再进行跳转 textarea 层级问题 问题:textarea的placeholder会显示在弹窗的层级之上 解决:使用wx:if 判断当没有值的时候用view代替textarea 最好封装为组件 或者 弹出层使用cover-view组件,而不是view,覆盖住所有原生组件。 小程序的 web-view 中页面跳转后,点击 Android 手机上的物理返回按钮会返回前一个页面。而点击左上角的返回按钮,会直接关闭整个 web-view。有关 web-view 中有背景音乐,后台后无法关闭的问题 https://developers.weixin.qq.com/community/develop/doc/c75139c842a40c67cade23d3f66e7992 var hiddenProperty = 'hidden' in document ? 'hidden' : 'webkitHidden' in document ? 'webkitHidden' : 'mozHidden' in document ? 'mozHidden' : null; if (hiddenProperty) { var visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange'); var onVisibilityChange = function() { if (document[hiddenProperty]) { !MpMovie.video.paused && MpMovie.video.pause(); } }; document.addEventListener(visibilityChangeEvent, onVisibilityChange);
2022-11-07 - 图片安全检测data exceed max size解决方案
最近在重构小程序恋爱小清单,在用云函数做图片的安全检测时报了一个错:cloud.callFunction:fail Error: data exceed max size 也就是图片超过了大小限制。 早期的版本是通过画布将图片缩小(wx.canvasToTempFilePath),接着读取文件流(wx.getFileSystemManager().readFile),然后再提交云函数检测,过程感觉有些繁琐复杂 最近发现其实有更简单的方法,可以借助临时的CDN,传递大数据,最终在云函数端会收到一个CDN地址,接着通过request-promise读取文件流,然后再做安全检测,相比旧版的方法个人感觉简单清爽不少。 参考官方文档: https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/utils/Cloud.CDN.html 代码如下: 小程序端: const api = require("api.js"); /** * 图片安全检测 * 借助临时CDN传递大数据 * @param filePath 图片的临时文件路径 (本地路径) * @returns {Promise<unknown>} */ const imgSecCheckViaCDN = (filePath) => { return new Promise(function (resolve, reject) { api.callCloudFunction("securityCheck", { type: "imgSecCheckViaCDN", imgData: wx.cloud.CDN({ type: "filePath", filePath, }) }, res => { console.log("图片安全检测结果:", JSON.stringify(res)); const result = res.result; if (result.success) { resolve(result); } else { reject(result); } }, reject); }); } api.js /** * 云函数调用 * @param name * @param data * @param success * @param fail * @param complete */ const callCloudFunction = function (name, data, success, fail, complete) { //执行云函数 wx.cloud.callFunction({ // 云函数名称 name: name, // 传给云函数的参数 data: Object.assign({}, data, {env: env.activeEnv}) }).then(res => { typeof success == 'function' && success(res); }).catch(res => { typeof fail == 'function' && fail(res); }).then(res => { typeof complete == 'function' && complete(res); }); }; module.exports = {callCloudFunction} 云函数端: // 云函数入口文件 const cloud = require('wx-server-sdk'); const responce = require('easy-responce'); const requestHelper = require('./utils/requestHelper'); const headers = { encoding: null, headers: { "content-type": "application/octet-stream", // "content-type": "video/mpeg4", }, }; // 云函数入口函数 exports.main = async (event, context) => { cloud.init({ env: event.env }); let result = {}; try { const {type, content, imgData} = event; let {buffer} = event; console.log("检测类型:", type, "文本内容:", content, "图片内容:", imgData); switch (type) { case "imgSecCheckViaCDN": const imageResponse = await requestHelper.request(imgData, headers, {}); buffer = imageResponse.body; case "imgSecCheck": result = await cloud.openapi.security.imgSecCheck({ media: { contentType: 'image/png', // value: Buffer.from(imgBase64, "base64") value: Buffer.from(buffer) } }); break; case "msgSecCheck": result = await cloud.openapi.security.msgSecCheck({content}); break; default: console.log("不支持的检测类型:", type); break; } } catch (e) { console.error(e); result = e; } console.log("检测结果:", result); const {errCode, errMsg} = result; return errCode !== 87014 ? responce.success({errCode}) : responce.fail(errMsg); }; requestHelper.js const rp = require('request-promise'); /** * http请求 * @param url * @param options * @param data * @param autoFollowRedirect * @returns {Promise<unknown>} */ const request = function (url, options, data, autoFollowRedirect = true) { return new Promise(function (resolve, reject) { const p = Object.assign({ json: true, resolveWithFullResponse: true, followRedirect: autoFollowRedirect }, options, data, {url}); console.log("请求参数:", JSON.stringify(p)); return rp(p) .then(async function (repos) { //console.log("获取到最终内容,执行回调函数:", repos); return resolve(repos); }) .catch(async function (err) { if (err && (err.statusCode === 301 || err.statusCode === 302)) { // console.log("停止重定向,重定向信息:", err); console.log("停止重定向"); return resolve(err); } console.error("重定向失败:", err); return reject(err); }); }); } module.exports = {request }
2022-10-21 - 微信小程序通过NFC是否能读取身份证信息?
暂不支持此功能,可参考文档: https://developers.weixin.qq.com/miniprogram/dev/framework/device/nfc.html 暂仅支持 HCE(基于主机的卡模拟)模式,即将安卓手机模拟成实体智能卡。 适用机型:支持 NFC 功能,且系统版本为 Android 5.0 及以上的手机 适用卡范围:符合ISO 14443-4 标准的 CPU 卡
2019-10-09 - 云函数使用云存储的word模板文件生成新的word
今天遇到一个场景是需要使用云数据库里的数据生成word文件,word文件有模板,在这里做一下经验分享,如果各位大佬有其他方法,欢迎分享,下面直接上过程 1、需要的插件 使用“npm install docx-templates”命令安装 右键云函数,选择“在内建终端中打开”,执行命令 [图片] 2、云函数实现 因为云函数不能直接读取云存储的文件,所以这里先下载然后读取 exports.main = async (event, context) => { const word = cloud.downloadFile({ fileID:'这里使用你云存储的fileID' }) const template = (await word).fileContent const buffer = await createReport({ template, data: { name: '替换的内容', // 这里的key值和你在word模板里面写的要一致,可以有多个 }, cmdDelimiter: ['{', '}'] // 分隔符 }) const time = new Date(); const preDir = time.getFullYear()+"/"+(time.getMonth()+1)+"/"+time.getDate() const stringRandom = require('string-random') const randfilename = stringRandom(32) //随机文件名 const cloudPath = `templates/docx/${preDir}/${randfilename}.docx` //文件 return await cloud.uploadFile({ cloudPath, fileContent: Buffer.from(buffer, 'hex') }) } word模板文件内容(根据自己的实际使用去修改) [图片] 使用后生成的新的文件内容 [图片] 备注:没有找到云函数直接操作云存储的方法,各位大神如果知道,可以发享一下,欢迎评论留言 在解决这个问题搜到的比较有用的文章链接:https://blog.csdn.net/xjc8289555/article/details/118084368这个里面的代码我在使用上发现他的文件读取会有一点问题(云环境的原因),所以做了一些改动,但是确实是帮助到我了
2022-03-18 - [开盖即食]小程序那点事(1)---云开发的一些实战应用分享
[图片] 一、常用云函数 分享一些入门的云函数功能 [代码]const cloud = require('wx-server-sdk') cloud.init() exports.main = async(event, context) => { console.log(event.txt); const { value,type } = event; //返回服务器时间 if(type == "serverTime"){ return Date.now(); } //返回用户各类id if(type == "info"){ const wxContext = cloud.getWXContext() return { event, openid: wxContext.OPENID, appid: wxContext.APPID, unionid: wxContext.UNIONID, } } //检查内容 if(type == 'checkContent'){ try { let result = await cloud.openapi.security.msgSecCheck({ content: value }); return result; } catch (err){ return err; } } //检查图片 if(type == 'checkImg'){ try { // const result = await cloud.openapi.security.msgSecCheck({ // content: event.txt // }) const result = await cloud.openapi.security.imgSecCheck({ media: { header: { 'Content-Type': 'application/octet-stream' }, contentType: 'image/png', //这里也可动态配置 value: Buffer.from(value) } }) // result 结构 // { errCode: 0, errMsg: 'openapi.templateMessage.send:ok' } console.log(result); return result; } catch (err) { return err } } } [代码] 二、给接口添加签名sign/加密 [图片] 利用云函数来签名接口,防止用户伪造或者绕过小程序直接用postman/脚本/爬虫 调用抓取后端数据。同理,也可以对数据全加密 [代码]// 云函数部分 const cloud = require('wx-server-sdk'); const crypto = require("crypto"); const salt = '996-007-icu-no-overtime'; //加密用的盐,需要跟后端约定好 cloud.init() // 云函数入口函数 exports.main = async (event, context) => { //const wxContext = cloud.getWXContext() let json = event.json; json.salt = salt; //排序 let arr = [] for (let i in json) { arr.push({ key: i, value: json[i] }); }; //首字母排序,你也可以不排,但是考虑到到时候要合后端验证一致,排序方便点 arr.sort((a, b) => { return a.key.charCodeAt(0) - b.key.charCodeAt(0); }); let secret = ''; for (let y = 0; y < arr.length; y++) { secret += arr[y].key + arr[y].value; }; let md5 = crypto.createHash("md5"); // 创建 md5 let md5Sum = md5.update(secret).digest("Hex"); // update 加密 //console.log(md5Sum) return { md5Sum, //secret, } } //页面调用部分 let t = new Date().getTime(); let sign = 'isEmpty'; try { //通过云函数获取加密签名 let result = (await wx.cloud.callFunction({ name: "overTime007", data: { json: { t, characterName, realm, } } })).result; sign = result.md5Sum; } catch (err) { console.log(err); sign = "signFail"; }; [代码] 三、数据库简单增删改查 小程序端和云开发端都可以对数据库进行操作,但云端更安全且权限更大。如果遇到小程序端无法操作的情况,可以先检查下数据权限问题 [图片] [代码]const db = wx.cloud.database(); // 向集合overTime中添加数据 db.collection('overTime').add({ data: { description: 'test', t: new Date(), tags: [ '云开发', '数据库' ], done: false } }).then(res => { console.log(res) }) //删除 db.collection('overTime').doc('t996_007').remove().then(res => { console.log(res) }) //修改 db.collection('overTime').doc('t996_007').update({ data: { description: 'test2', done: true } }).then(res => { console.log(res) }) //查询 db.collection('overTime').get().then(res => { console.log(res.data) }) [代码] 云开发强大在于用简单的函数就能完成很多需要服务器配置的功能,官方也推出低代码,一键生成环境等功能,大大提高了效率,降低开发门槛。 官方相关文档: https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/product/wxcloudrun.html https://developers.weixin.qq.com/community/business/course/00068c2c0106c0667f5b01d015b80d 如有疑问请留言~ 觉得有用,请点个赞哦,我会继续努力分享有用的实战内容~
2022-02-08 - 微信云开发基础能力讲解
云数据库、云存储、云函数、云调用等云开发基础能力的使用介绍 [视频] 点此跳转:小程序云开发训练营活动页面
2021-11-26