1.0.0版本:
后续优化:
Open api qps request limit reached
display: flex;
justify-content: center;
或者
margin-left: auto;
margin-right: auto;
第一种效果更好
display: flex;
align-items: center;
box-shadow:0px 2px 5px 5px lightgrey;
"/images/delin.png">
"../../images/delin.png">
<form bindsubmit="Submit">
<view name="something">view>
<view name="anotherthing">view>
<button form-type="submit">点击授权登录button>
form>
Submit: function(e){
console.log('用户提交了数据:', e.detail.value)
let {something, anotherthing} = e.detail.value
}
//关闭之前所有页面,跳转,没有返回键,但有Home键
wx.reLaunch({
url: '/pages/home/home',
})
//关闭当前页面,跳转,会出现Home键
wx.redirectTo({
url: '/pages/home/home',
})
//保留页面,跳转,会出现返回键
wx.navigateTo({
url: '/pages/home/home',
})
//隐藏Home键
onShow: function () {
wx.hideHomeButton()
},
//数据权限要重视!否则会出现读不了的情况!
//查询
DB.collection('user').where({
_openid: app.globalData.openId,
}).get({
success: res => {
console.log(res)
if (res.data.length == 0) {
// 没找到数据
wx.reLaunch({
url: '/pages/register/register',
})
} else {
// 找到了数据
app.globalData.userName = res.data[0].username
app.globalData.building = res.data[0].building
app.globalData.unit = res.data[0].unit
app.globalData.door = res.data[0].door
app.globalData.charactor = res.data[0].charactor
wx.reLaunch({
url: '/pages/home/home',
})
}
}
})
//添加
DB.collection('user').add({
data: {
_id: app.globalData.openId,
username: username,
building: building,
unit: unit,
door: door,
charactor: charactor
}
})
//更新
DB.collection('user').doc(app.globalData.openId).update({
data: {
username: username,
building: building,
unit: unit,
door: door,
charactor: charactor
}
})
// 拍摄或从手机相册中选择图片或视频
wx.chooseMedia({
// 最多可以选择的文件个数
count: 9,
// 文件类型
mediaType: ['image'],
// 图片和视频选择的来源
sourceType: ['album', 'camera'],
// 仅在 sourceType 为 camera 时生效,使用前置或后置摄像头
camera: 'back',
success(res) {
// 上传图片暂存路径
console.log(res.tempFiles[0].tempFilePath)
// 图片大小
console.log(res.tempFiles[0].size)
}
})
chooseMedia问题:只上传第一张
chooseImage没问题
wx.chooseImage({
count: n, // 默认9,设置图片张数
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
// console.log(res.tempFilePaths)
// 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
var tempFilePaths = res.tempFilePaths
if (imgbox.length == 0) {
imgbox = tempFilePaths
} else if (max >= imgbox.length) {
imgbox = imgbox.concat(tempFilePaths);
}
that.setData({
imgbox: imgbox
});
console.log('imgbox after add: ', imgbox.length)
}
})
let that = this
wx.scanCode({
onlyFromCamera: true,
success (res) {
console.log(res)
let dustbinCode = res.result
console.log(dustbinCode)
that.setData({
haveDustbinCode: true,
dustbinCode: dustbinCode
})
console.log('获取垃圾桶编码成功')
}
})
可以根据文件 ID 下载文件,用户仅可下载其有访问权限的文件:
wx.cloud.downloadFile({
fileID: '', // 文件 ID
success: res => {
// 返回临时文件路径
console.log(res.tempFilePath)
},
fail: console.error
})
在小程序端可调用 wx.cloud.uploadFile
方法进行上传:
wx.cloud.uploadFile({
cloudPath: 'example.png', // 上传至云端的路径
filePath: '', // 小程序临时文件路径
success: res => {
// 返回文件 ID
console.log(res.fileID)
},
fail: console.error
})
入口如下,其他步骤参考微应用-快速开始。
# 新建 Vue 微应用项目
tcb new vue-app cms-microapp-vue
下载之前需要用 小程序公众号登录 腾讯云,并且进行授权。(用微信登录会重新创建一个账号)
否则会提示需要现在腾讯云的控制台授权(会在浏览器弹出页面),并且授权之后不会立即更新授权状态,需要先退出登录。
# 退出登录
tcb logout
# 重新登录
tcb login
# 新建 Vue 微应用项目
tcb new vue-app cms-microapp-vue
如图下载的VUE模板在C盘目录下,可以找到之后剪切粘贴到其他合适的地方,也可以cd进入目标文件夹之后再执行下载命令。
创一个微应用,上传文件随意,这样就有了microAppID;
按照文档改好ID;
安装依赖
# 先进入VUE项目的根目录(都在根目录操作)
H:
cd zfy\毕业论文\德邻\vue-app
# 再安装依赖
npm i
部署
npm run build
打包压缩
上传更新
这样就是成功了,以后写项目在src里写
# 在终端里执行安装
npm install @cloudbase/js-sdk -S
云开发——Web SDK API 参考——登录认证
目的:分角色登录cms时限制用户是否可以使用微应用
官方没有开发cms直接管理微应用权限的功能,需要自行限制权限
// VUE钩子函数
created() {
let that = this;
// 获取当前用户
window.cloudbase
.auth()
.getLoginState()
.then((res) => {
console.log('current login state: ', res)
console.log('current user: ', res.user.uid)
that.uid = res.user.uid
console.log('this.uid: ', that.uid)
// 调用云函数查询用户信息
window.cloudbase
.callFunction({
name: 'query_cms_users',
data: {
uid: that.uid
}
})
.then((res) => {
console.log('cms调用云函数query_cms_users结果:', res)
console.log('用户角色:', res.result.data[0].username)
that.username = res.result.data[0].username
console.log('this.username: ', that.username)
})
// .catch((ret) => (this.result = JSON.stringify(ret)))
}
)
},
云函数query_cms_users/index.js 代码如下:
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
const db = cloud.database()
// 查询用户信息
return db.collection('wx-ext-cms-users')
.where({
uuid: event.uid
})
.get()
}
如果您采用cms系统的角色逻辑,并且代码固定某个角色有这个页面的权限。您可以参考一下我们cms系统的表结构获取角色信息
- 用户表:wx-ext-cms-users里面的字段uuid就等于你获取到的uid
- 角色和权限表:wx-ext-cms-user-roles里面的_id字段关联的用户表中role数组字段
根据这个关系,您创建一个云函数,然后传入uid,在云函数里面处理下逻辑,返回您需要的信息即可(不可以前端查库,默认私有读写,请用云函数查询这两个数据库信息后组合返回,前端调用云函数即可)
下面这种方式是使用不了的:
// 获取 `user` 集合的引用
import cloudbase from "@cloudbase/js-sdk";
const app = cloudbasae.init({
env: "xxxx-yyy"
});
const db = app.database();
const collection = db.collection("user");
下面这种方式才可以使用:
// 测试数据库调用,可以,但是权限是仅创建者可读写,得用云函数才可以查询到
const db = window.cloudbase.database();
db.collection("imgForCoinPath").where({
dustbinCode: 'MFBK-A-001'
}).get().then(
res => {
console.log('database: ', res) // 所有console都要在then里面才可以打印得出来
}
)
// 使用云函数查询
window.cloudbase.callFunction({
name: 'query_garbageAnalys', // 先去微信开发者工具创建并上传部署
})
.then((res) => {
console.log('cms调用云函数query_gabageAnalys结果:', res)
})
// .catch((ret) => (this.result = JSON.stringify(ret)))
两种方式的本质区别就是:
- window.cloudbase == app对象
- 为什么只能用下面的方式,不知道,可能是因为微信小程序的CMS本身就默认了云环境路径,不需要再特别定义了(更新:VUE模板里的cloudbaserc.json文件里已经默认设置了云环境路径,所以无需再定义)
- 我只试了把定义app对象的那一堆放在方法外面的方式,行不通,没有尝试放在方法内能不能行
# 在终端里执行安装
npm install echarts --save
画图示例代码:
import * as echarts from 'echarts';
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
console.log(myChart);
// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data: ['销量']
},
xAxis: {
data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
},
yAxis: {},
series: [
{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
};
console.log(option);
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
# v3的
npm install element-plus --save
# v2的
npm i element-ui -S
# 安装低版本的npm
npm install npm@6.14.10 -g
v3的:
<template>
<div class="demo-date-picker">
<div class="block">
<span class="demonstration">Default</span>
<el-date-picker
v-model="value1"
type="daterange"
range-separator="To"
start-placeholder="Start date"
end-placeholder="End date"
/>
</div>
<div class="block">
<span class="demonstration">With quick options</span>
<el-date-picker
v-model="value2"
type="daterange"
unlink-panels
range-separator="To"
start-placeholder="Start date"
end-placeholder="End date"
:shortcuts="shortcuts"
/>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const value1 = ref('')
const value2 = ref('')
const shortcuts = [
{
text: 'Last week',
value: () => {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
return [start, end]
},
},
{
text: 'Last month',
value: () => {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
return [start, end]
},
},
{
text: 'Last 3 months',
value: () => {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
return [start, end]
},
},
]
</script>
<style scoped>
.demo-date-picker {
display: flex;
width: 100%;
padding: 0;
flex-wrap: wrap;
}
.demo-date-picker .block {
padding: 30px 0;
text-align: center;
border-right: solid 1px var(--el-border-color);
flex: 1;
}
.demo-date-picker .block:last-child {
border-right: none;
}
.demo-date-picker .demonstration {
display: block;
color: var(--el-text-color-secondary);
font-size: 14px;
margin-bottom: 20px;
}
</style>
v2的:
<template>
<div class="block">
<span class="demonstration">默认span>
<el-date-picker
v-model="value1"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
el-date-picker>
div>
<div class="block">
<span class="demonstration">带快捷选项span>
<el-date-picker
v-model="value2"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
:picker-options="pickerOptions">
el-date-picker>
div>
template>
<script>
export default {
data() {
return {
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit('pick', [start, end]);
}
}]
},
value1: '',
value2: ''
};
}
};
script>
不知道为什么,样式icon出不来,无解(才学浅薄,恳请走过路过的大神指教)