
uni.request 传送复杂数据
一、需求:下拉列表筛选显示对应的数据
二、应用到的组件:
dropDown下拉菜单:https://ext.dcloud.net.cn/plugin?id=2650
mescroll:http://www.mescroll.com/uni.html
三、前端代码
uni.request只能传递字符串,但是e.contentActiveIndexList是json对象。将json数据转换为字符串,才能采用uni.request将数据传送到后台。
async onItemSelect(e){
this.course_select = JSON.stringify(e.contentActiveIndexList); //将json数据转换为字符串,才能采用uni.request
this.upCallback(this.page);
},
let res = await this.$myHttp.post({
url: this.$myHttp.urlMap.course_select,
data: {
course_select: this.course_select,
},
needLogin: true
})
转换后发数据形式是:{"headerIndex":0,"index":0},{"headerIndex":1,"index":2},{"headerIndex":2,"index":0}
四、PHP后端代码
再到后台接收数据时变成了这种形式:{"headerIndex":0,"index":0}
需要用到php的htmlspecialchars_decode()函数进行转义
以下代码可以获取到第一组数据的index的值:
json_decode(htmlspecialchars_decode($course_select), true)["0"]["index"]
五、参考文档
https://www.w3schools.com/js/js_json_stringify.asp
http://www.edbiji.com/doccenter/showdoc/4/nav/307.html
https://blog.csdn.net/milli236/article/details/79042713
有更好的思路吗?:)
一、需求:下拉列表筛选显示对应的数据
二、应用到的组件:
dropDown下拉菜单:https://ext.dcloud.net.cn/plugin?id=2650
mescroll:http://www.mescroll.com/uni.html
三、前端代码
uni.request只能传递字符串,但是e.contentActiveIndexList是json对象。将json数据转换为字符串,才能采用uni.request将数据传送到后台。
async onItemSelect(e){
this.course_select = JSON.stringify(e.contentActiveIndexList); //将json数据转换为字符串,才能采用uni.request
this.upCallback(this.page);
},
let res = await this.$myHttp.post({
url: this.$myHttp.urlMap.course_select,
data: {
course_select: this.course_select,
},
needLogin: true
})
转换后发数据形式是:{"headerIndex":0,"index":0},{"headerIndex":1,"index":2},{"headerIndex":2,"index":0}
四、PHP后端代码
再到后台接收数据时变成了这种形式:{"headerIndex":0,"index":0}
需要用到php的htmlspecialchars_decode()函数进行转义
以下代码可以获取到第一组数据的index的值:
json_decode(htmlspecialchars_decode($course_select), true)["0"]["index"]
五、参考文档
https://www.w3schools.com/js/js_json_stringify.asp
http://www.edbiji.com/doccenter/showdoc/4/nav/307.html
https://blog.csdn.net/milli236/article/details/79042713
有更好的思路吗?:)
收起阅读 »
Android获取本地指定文件,图片视频的绝对路径、大小、修改时间、名称
直接贴代码,希望能给一些人灵感(.vue文件),
getMediaFiles () {//获取本地文件
let environment = plus.android.importClass("android.os.Environment");
let sdRoot = environment.getExternalStorageDirectory();//获取手机根目录
this.filePath = {image:[],video:[]};//过滤到的文件信息
this.mapFile(sdRoot);//递归过滤
console.log('this.filePath :>> ', this.filePath);//过滤结果
},
mapFile (path) {// 遍历目录下的所有文件和文件夹
let fileObj = plus.android.importClass("java.io.File");
let files = plus.android.invoke(path,"listFiles");
let len = files.length;
for(let i=0; i<len; i++){
let file = files[i];
// 过滤隐藏文件以及名字叫“Android”的文件夹(自己可以自定义过滤)
if(!plus.android.invoke(file,"isHidden") && plus.android.invoke(file,"getName")!='Android'){// 非隐藏文件执行操作
if(plus.android.invoke(file,"isDirectory")){// 判断是文件还是文件夹
this.mapFile(new fileObj(plus.android.invoke(file,"getAbsolutePath")));//文件夹递归
} else {
let size = this.getFileSize(file)
if (plus.android.invoke(file,"getName").endsWith('.jpg')||plus.android.invoke(file,"getName").endsWith('.png')) {//获取jpg、png文件(可自定义修改)
console.log('file name :>> ', plus.android.invoke(file,"getName"),'; size :>> ', size);
this.filePath.image.push({
path:plus.android.invoke(file,"getAbsolutePath"),//文件绝对路径
name:plus.android.invoke(file,"getName"),//文件名称,包含后缀
size:size,//文件大小
lastModified:plus.android.invoke(file,"lastModified")//文件最后修改时间戳
})
} else if (plus.android.invoke(file,"getName").endsWith('.mp4')||plus.android.invoke(file,"getName").endsWith('.mp3')) {//获取mp3、mp4文件(可自定义修改)
console.log('file name :>> ', plus.android.invoke(file,"getName"),'; size :>> ', size);
this.filePath.video.push({
path:plus.android.invoke(file,"getAbsolutePath"),
name:plus.android.invoke(file,"getName"),
size:size,
lastModified:plus.android.invoke(file,"lastModified")
})
}
}
}
}
},
getFileSize (file) {// 读文件大小
let FileInputStream = plus.android.importClass("java.io.FileInputStream");
let fileSize = new FileInputStream(file);
let size = fileSize.available();
// 单位转换
let fileSizeString;
if(size == 0){
fileSizeString = "0B";
}else if(size < 1024){
fileSizeString = size + "B";
}else if(size < 1048576){
fileSizeString = (size/1024).toFixed(2) + "KB";
}else if (size < 1073741824){
fileSizeString = (size/1048576).toFixed(2) + "MB";
}else{
fileSizeString = (size/1073741824).toFixed(2) + "GB";
}
return fileSizeString
},
直接贴代码,希望能给一些人灵感(.vue文件),
getMediaFiles () {//获取本地文件
let environment = plus.android.importClass("android.os.Environment");
let sdRoot = environment.getExternalStorageDirectory();//获取手机根目录
this.filePath = {image:[],video:[]};//过滤到的文件信息
this.mapFile(sdRoot);//递归过滤
console.log('this.filePath :>> ', this.filePath);//过滤结果
},
mapFile (path) {// 遍历目录下的所有文件和文件夹
let fileObj = plus.android.importClass("java.io.File");
let files = plus.android.invoke(path,"listFiles");
let len = files.length;
for(let i=0; i<len; i++){
let file = files[i];
// 过滤隐藏文件以及名字叫“Android”的文件夹(自己可以自定义过滤)
if(!plus.android.invoke(file,"isHidden") && plus.android.invoke(file,"getName")!='Android'){// 非隐藏文件执行操作
if(plus.android.invoke(file,"isDirectory")){// 判断是文件还是文件夹
this.mapFile(new fileObj(plus.android.invoke(file,"getAbsolutePath")));//文件夹递归
} else {
let size = this.getFileSize(file)
if (plus.android.invoke(file,"getName").endsWith('.jpg')||plus.android.invoke(file,"getName").endsWith('.png')) {//获取jpg、png文件(可自定义修改)
console.log('file name :>> ', plus.android.invoke(file,"getName"),'; size :>> ', size);
this.filePath.image.push({
path:plus.android.invoke(file,"getAbsolutePath"),//文件绝对路径
name:plus.android.invoke(file,"getName"),//文件名称,包含后缀
size:size,//文件大小
lastModified:plus.android.invoke(file,"lastModified")//文件最后修改时间戳
})
} else if (plus.android.invoke(file,"getName").endsWith('.mp4')||plus.android.invoke(file,"getName").endsWith('.mp3')) {//获取mp3、mp4文件(可自定义修改)
console.log('file name :>> ', plus.android.invoke(file,"getName"),'; size :>> ', size);
this.filePath.video.push({
path:plus.android.invoke(file,"getAbsolutePath"),
name:plus.android.invoke(file,"getName"),
size:size,
lastModified:plus.android.invoke(file,"lastModified")
})
}
}
}
}
},
getFileSize (file) {// 读文件大小
let FileInputStream = plus.android.importClass("java.io.FileInputStream");
let fileSize = new FileInputStream(file);
let size = fileSize.available();
// 单位转换
let fileSizeString;
if(size == 0){
fileSizeString = "0B";
}else if(size < 1024){
fileSizeString = size + "B";
}else if(size < 1048576){
fileSizeString = (size/1024).toFixed(2) + "KB";
}else if (size < 1073741824){
fileSizeString = (size/1048576).toFixed(2) + "MB";
}else{
fileSizeString = (size/1073741824).toFixed(2) + "GB";
}
return fileSizeString
},
收起阅读 »

【报Bug】WXSDKInstance.getInstanceViewPortWidth() 空指针问题
bugly上抓到的关键日志:
java.lang.NullPointerException
Attempt to invoke virtual method 'int com.taobao.weex.WXSDKInstance.getInstanceViewPortWidth()' on a null object reference
com.taobao.weex.ui.component.list.BasicListComponent.getScrollEvent(BasicListComponent.java:1396)
com.taobao.weex.ui.component.list.BasicListComponent.fireScrollEvent(BasicListComponent.java:1379)
com.taobao.weex.ui.component.list.BasicListComponent.access$600(BasicListComponent.java:94)
com.taobao.weex.ui.component.list.BasicListComponent$7.onScrolled(BasicListComponent.java:1371)
bugly上抓到的关键日志:
java.lang.NullPointerException
Attempt to invoke virtual method 'int com.taobao.weex.WXSDKInstance.getInstanceViewPortWidth()' on a null object reference
com.taobao.weex.ui.component.list.BasicListComponent.getScrollEvent(BasicListComponent.java:1396)
com.taobao.weex.ui.component.list.BasicListComponent.fireScrollEvent(BasicListComponent.java:1379)
com.taobao.weex.ui.component.list.BasicListComponent.access$600(BasicListComponent.java:94)
com.taobao.weex.ui.component.list.BasicListComponent$7.onScrolled(BasicListComponent.java:1371)

【报Bug】WeiXinOAuthService.initUserInfo(WeiXinOAuthService.java:503) 空指针导致闪退问题
bugly上抓到的关键日志:
java.lang.NullPointerException
Attempt to invoke virtual method 'boolean org.json.JSONObject.has(java.lang.String)' on a null object reference
io.dcloud.feature.oauth.weixin.WeiXinOAuthService.initUserInfo(WeiXinOAuthService.java:503)
io.dcloud.feature.oauth.weixin.WeiXinOAuthService$1$1.run(WeiXinOAuthService.java:171)
该bug造成崩溃上报的人数较多,且呈上涨趋势,希望尽快解决
bugly上抓到的关键日志:
java.lang.NullPointerException
Attempt to invoke virtual method 'boolean org.json.JSONObject.has(java.lang.String)' on a null object reference
io.dcloud.feature.oauth.weixin.WeiXinOAuthService.initUserInfo(WeiXinOAuthService.java:503)
io.dcloud.feature.oauth.weixin.WeiXinOAuthService$1$1.run(WeiXinOAuthService.java:171)
该bug造成崩溃上报的人数较多,且呈上涨趋势,希望尽快解决
收起阅读 »
只勾选arm32,上架应用宝提示apk无法运行
不更改任何代码,再勾选x86打包,审核通过。
可能有些审核的人用x86的模拟器吧。
影响不大,就是包大了一点。
不更改任何代码,再勾选x86打包,审核通过。
可能有些审核的人用x86的模拟器吧。
影响不大,就是包大了一点。

HBuilderX调试安卓模拟器Genymotion
HBuilderX和Genymotion都不做介绍了
HBuilderX 版本号 3.0.7.2021123 安装路径:D:\HBuilderX
Genymotion 版本号 3.0.2 安装路径:D:\Program Files (x86)\Genymobile\Genymotion\
1.设置Genymotion adb

端口可不设
2.启动模拟器
在CMD中分别执行
d:
cd D:\Program Files (x86)\Genymobile\Genymotion\tools
.\adb devices
结果显示
List of devices attached
192.168.43.101:5555 offline
3.在Genymotion中执行
cd D:\HBuilderX\plugins\launcher\tools\adbs
.\adb connect 192.168.43.101:5555
4.我写了一个bat文件,双击运行就可以联机测试了
@echo off
echo string...
d:
cd D:\Program Files (x86)\Genymobile\Genymotion\tools\
for /f "delims=" %%i in ('.\adb devices^|find /i ":"') do set str2=%%i
cd D:\HBuilderX\plugins\launcher\tools\adbs
.\adb connect %str2
没有测试多个模拟器
HBuilderX和Genymotion都不做介绍了
HBuilderX 版本号 3.0.7.2021123 安装路径:D:\HBuilderX
Genymotion 版本号 3.0.2 安装路径:D:\Program Files (x86)\Genymobile\Genymotion\
1.设置Genymotion adb
端口可不设
2.启动模拟器
在CMD中分别执行
d:
cd D:\Program Files (x86)\Genymobile\Genymotion\tools
.\adb devices
结果显示
List of devices attached
192.168.43.101:5555 offline
3.在Genymotion中执行
cd D:\HBuilderX\plugins\launcher\tools\adbs
.\adb connect 192.168.43.101:5555
4.我写了一个bat文件,双击运行就可以联机测试了
@echo off
echo string...
d:
cd D:\Program Files (x86)\Genymobile\Genymotion\tools\
for /f "delims=" %%i in ('.\adb devices^|find /i ":"') do set str2=%%i
cd D:\HBuilderX\plugins\launcher\tools\adbs
.\adb connect %str2
没有测试多个模拟器
收起阅读 »
nvue 样式编译模式介绍
HBuilderX 3.1.0+ 开始支持新的样式编译模式
- weex 编译模式:老模式,样式支持与普通 weex 相同
- uni-app 编译模式:新模式,在 weex 原有样式基础上支持组合选择器(相邻兄弟选择器、普通兄弟选择器、子选择器、后代选择器),目前已知问题:list 组件内嵌套的组件动态更新 class 无效,将在 3.1.2 修复
3.1.0 alpha 版为 uni-app 模式,3.1.1 开始缺省值为 weex 模式,切换编译模式需要重新运行
配置方式
// manifest.json
{
// ...
/* App平台特有配置 */
"app-plus": {
"nvueStyleCompiler": "uni-app"
}
}
HBuilderX 3.1.0+ 开始支持新的样式编译模式
- weex 编译模式:老模式,样式支持与普通 weex 相同
- uni-app 编译模式:新模式,在 weex 原有样式基础上支持组合选择器(相邻兄弟选择器、普通兄弟选择器、子选择器、后代选择器),目前已知问题:list 组件内嵌套的组件动态更新 class 无效,将在 3.1.2 修复
3.1.0 alpha 版为 uni-app 模式,3.1.1 开始缺省值为 weex 模式,切换编译模式需要重新运行
配置方式
// manifest.json
{
// ...
/* App平台特有配置 */
"app-plus": {
"nvueStyleCompiler": "uni-app"
}
}
收起阅读 »

随机间隔时间持续执行暂停视频播放的方法,欢迎交流
<script>
export default {
data() {
videoContext:null
}
onReady(){
this.videoContext = uni.createVideoContext('myVideo');
setInterval(this.pauseVideo, this.getRandomInt(1,10)*60*1000); //按最小1分钟,最大10分钟执行pauseVideo函数
}
methods: {
pauseVideo(){
this.videoContext.pause();
},
/*随机时间
*得到一个两数之间的随机整数
*/
getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值
},
}
}
</script>
<script>
export default {
data() {
videoContext:null
}
onReady(){
this.videoContext = uni.createVideoContext('myVideo');
setInterval(this.pauseVideo, this.getRandomInt(1,10)*60*1000); //按最小1分钟,最大10分钟执行pauseVideo函数
}
methods: {
pauseVideo(){
this.videoContext.pause();
},
/*随机时间
*得到一个两数之间的随机整数
*/
getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值
},
}
}
</script>
收起阅读 »

生成二维码报错gen is not defined,解决方法下面这个博客
https://blog.csdn.net/CQWNB/article/details/113576424
https://blog.csdn.net/CQWNB/article/details/113576424

uniapp前端图片和视频直传华为云OBS记录
uniapp 官方合作的云存储是阿里云和腾讯云,但我们公司选的云存储服务恰好都不是这两家,是华为云 OBS。网上搜了多次,没有能成功的案例分享。但是,考虑到网上关于华为云性能优异的测评报告,以及我对华为这家公司的好感,我还是想努力把这条路走通。因此,走上了坚苦的踩坑之路。
但大家不必重复这个踩坑经历了,我直接上拿走即用的代码。
技术路线确定:
- 前端产生签名前端直传华为云OBS:好处是不经过自家服务器周转,减少一个环节,上传速度更快。坏处:前端产生签名的过程中,会将 AK,SK 等核心账号信息暴露,是极其危险的。
- 后端签名前端获取后直传华为云OBS:好处同上,而且由于是后端生成签名,前端获取有时效性的签名后直传云端,因此没有泄露核心账号信息的风险。
我选择第二条路线。以下是上传视频文件的步骤(图片上传相似,多文件在上传前增加一个循环而已。下面不只是前端代码,也包括必要的后端代码):
1.后端生成上传文件到OBS 的签名(PHP)的代码:
在做这一步之前,让后台技术同事先在服务器目录下安装 OBS的 PHP SKD,这一步有详细文档,此处忽略。
$object = $this->input->post('file_name')?:''; //文件名
$file_type = $this->input->post('file_type')?: ''; //文件类型
$obsClient = new ObsClient ( [
'key' => '***', //OBS 中的 AK
'secret' => '***', //OBS 中的 SK
'endpoint' => 'https://obs.cn-north-4.myhuaweicloud.com', //注意实际的终点可能不同
'signature' => 'obs',
] );
// URL有效期,3600秒
$expires = 3600;
// 上传对象
$resp = $obsClient->createPostSignature( [
'Bucket' => '***', //你自己的桶名(bucket)
'Key' => $object,
'Expires' => $expires,
'FormParams' => [
'x-obs-acl' => 'public-read',
'content-type' => $file_type,
]
] );
// printf($resp);
$data['Accesskeyid'] = '***'; //AK
$data['Policy'] = $resp['Policy'];
$data['Signature'] = $resp['Signature'];
echo json_encode($data);
} ```
2. 前端选择视频文件,生成必要信息:
```select_video(){
var _this = this;
uni.chooseVideo({
maxDuration: 60, //拍摄视频最长拍摄时间,单位秒
count:1, //上传视频的数量
sourceType:['camera','album'],
success: (res) => {
console.log(res)
_this.video_src = res.tempFilePath;
let index1 = res.tempFilePath.lastIndexOf('/');
let index2 = res.tempFilePath.lastIndexOf('.');
_this.file_name = res.tempFilePath.substring(index1+1,res.tempFilePath.length); //获取文件名
_this.file_type = res.tempFilePath.substring(index2+1, res.tempFilePath.length); // 获取文件后缀名,即文件类型
_this.key = 'video/' + _this.file_name;
console.log(_this.file_name)
_this.is_video = 1;
},
})
}, ```
3. 前端获取上传文件的签名并直传 OBS(一步完成):
可以写在当前页面,也可以封装成公共方法,建议封装。
``` function get_obs_signature(file_path, file_name, file_type){
console.log(file_name)
return new Promise((resolve, reject)=>{
uni.request({
url: '***', //PHP获取签名的接口路径
method: 'POST',
header:{
'Content-Type': 'application/x-www-form-urlencoded'
},
data: {
file_name: file_name,
file_type: file_type
},
success: (res) => {
console.log(res.data)
resolve(res.data)
}
})
}).then(res=>{
let policy = res.Policy;
let signature = res.Signature;
let ak = res.Accesskeyid;
console.log(policy)
uni.uploadFile({
url: 'https://***.obs.cn-north-4.myhuaweicloud.com', //用你自己的 bucket 名替换星号
filePath: file_path,
name: 'file',
formData: {
'key': file_name,
'AccessKeyId': ak,
'Policy': policy,
'x-obs-acl': 'public-read',
'content-type': file_type,
'Signature': signature
},
success:(res)=>{
console.log(res);
}
})
}) ```
4. 获取上传后的文件路径:
OBS 默认不返回上传成功的路径,那该怎么办?其实很简单,存储在 OBS 的文件都有规律,通过以下方法可以拼接:
obs_url = 'https://***.obs.cn-north-4.myhuaweicloud.com/' + _this.key; //用你自己的 bucket 名替换星号
uniapp 官方合作的云存储是阿里云和腾讯云,但我们公司选的云存储服务恰好都不是这两家,是华为云 OBS。网上搜了多次,没有能成功的案例分享。但是,考虑到网上关于华为云性能优异的测评报告,以及我对华为这家公司的好感,我还是想努力把这条路走通。因此,走上了坚苦的踩坑之路。
但大家不必重复这个踩坑经历了,我直接上拿走即用的代码。
技术路线确定:
- 前端产生签名前端直传华为云OBS:好处是不经过自家服务器周转,减少一个环节,上传速度更快。坏处:前端产生签名的过程中,会将 AK,SK 等核心账号信息暴露,是极其危险的。
- 后端签名前端获取后直传华为云OBS:好处同上,而且由于是后端生成签名,前端获取有时效性的签名后直传云端,因此没有泄露核心账号信息的风险。
我选择第二条路线。以下是上传视频文件的步骤(图片上传相似,多文件在上传前增加一个循环而已。下面不只是前端代码,也包括必要的后端代码):
1.后端生成上传文件到OBS 的签名(PHP)的代码:
在做这一步之前,让后台技术同事先在服务器目录下安装 OBS的 PHP SKD,这一步有详细文档,此处忽略。
$object = $this->input->post('file_name')?:''; //文件名
$file_type = $this->input->post('file_type')?: ''; //文件类型
$obsClient = new ObsClient ( [
'key' => '***', //OBS 中的 AK
'secret' => '***', //OBS 中的 SK
'endpoint' => 'https://obs.cn-north-4.myhuaweicloud.com', //注意实际的终点可能不同
'signature' => 'obs',
] );
// URL有效期,3600秒
$expires = 3600;
// 上传对象
$resp = $obsClient->createPostSignature( [
'Bucket' => '***', //你自己的桶名(bucket)
'Key' => $object,
'Expires' => $expires,
'FormParams' => [
'x-obs-acl' => 'public-read',
'content-type' => $file_type,
]
] );
// printf($resp);
$data['Accesskeyid'] = '***'; //AK
$data['Policy'] = $resp['Policy'];
$data['Signature'] = $resp['Signature'];
echo json_encode($data);
} ```
2. 前端选择视频文件,生成必要信息:
```select_video(){
var _this = this;
uni.chooseVideo({
maxDuration: 60, //拍摄视频最长拍摄时间,单位秒
count:1, //上传视频的数量
sourceType:['camera','album'],
success: (res) => {
console.log(res)
_this.video_src = res.tempFilePath;
let index1 = res.tempFilePath.lastIndexOf('/');
let index2 = res.tempFilePath.lastIndexOf('.');
_this.file_name = res.tempFilePath.substring(index1+1,res.tempFilePath.length); //获取文件名
_this.file_type = res.tempFilePath.substring(index2+1, res.tempFilePath.length); // 获取文件后缀名,即文件类型
_this.key = 'video/' + _this.file_name;
console.log(_this.file_name)
_this.is_video = 1;
},
})
}, ```
3. 前端获取上传文件的签名并直传 OBS(一步完成):
可以写在当前页面,也可以封装成公共方法,建议封装。
``` function get_obs_signature(file_path, file_name, file_type){
console.log(file_name)
return new Promise((resolve, reject)=>{
uni.request({
url: '***', //PHP获取签名的接口路径
method: 'POST',
header:{
'Content-Type': 'application/x-www-form-urlencoded'
},
data: {
file_name: file_name,
file_type: file_type
},
success: (res) => {
console.log(res.data)
resolve(res.data)
}
})
}).then(res=>{
let policy = res.Policy;
let signature = res.Signature;
let ak = res.Accesskeyid;
console.log(policy)
uni.uploadFile({
url: 'https://***.obs.cn-north-4.myhuaweicloud.com', //用你自己的 bucket 名替换星号
filePath: file_path,
name: 'file',
formData: {
'key': file_name,
'AccessKeyId': ak,
'Policy': policy,
'x-obs-acl': 'public-read',
'content-type': file_type,
'Signature': signature
},
success:(res)=>{
console.log(res);
}
})
}) ```
4. 获取上传后的文件路径:
OBS 默认不返回上传成功的路径,那该怎么办?其实很简单,存储在 OBS 的文件都有规律,通过以下方法可以拼接:
obs_url = 'https://***.obs.cn-north-4.myhuaweicloud.com/' + _this.key; //用你自己的 bucket 名替换星号
收起阅读 »

直播类小程序,没有相关证书如何过类目,如何快速上架
本人可以帮助没有直播资质的客户快速的进行微信小程序的上架,包过类目,包过审核,包上架
本人可以帮助没有直播资质的客户快速的进行微信小程序的上架,包过类目,包过审核,包上架

cover-view里的文本不能换行-vue
cover-view里的文本不能换行可能是样式问题,在这个范围内再去找问题,一般 white-space: normal;可以解决问题,防止万一加一个!important,在cover-view就可以,但是存在换行成功,却没有文字显示,同时高度有变化却没有设置高度,这时再加上 line-height:normal!important;,让其显示出来,
原因如下:
cover-view默认属性有(好像是小程序的):
cover-view {
display:block;
line-height:1.2;
overflow:hidden;
white-space:nowrap;
pointer-events:auto;
}
注意:可以换行后,每个cover-view建议加一个高度或是单行white-space属性不为normal,如果单行没有高度或是单行white-space属性为normal,在安卓中可能不显示。
参考:https://www.jianshu.com/p/3c255f5c94f9?from=singlemessage
cover-view里的文本不能换行可能是样式问题,在这个范围内再去找问题,一般 white-space: normal;可以解决问题,防止万一加一个!important,在cover-view就可以,但是存在换行成功,却没有文字显示,同时高度有变化却没有设置高度,这时再加上 line-height:normal!important;,让其显示出来,
原因如下:
cover-view默认属性有(好像是小程序的):
cover-view {
display:block;
line-height:1.2;
overflow:hidden;
white-space:nowrap;
pointer-events:auto;
}
注意:可以换行后,每个cover-view建议加一个高度或是单行white-space属性不为normal,如果单行没有高度或是单行white-space属性为normal,在安卓中可能不显示。
参考:https://www.jianshu.com/p/3c255f5c94f9?from=singlemessage
收起阅读 »