
图片旋转
uni.getImageInfo({ //获取图片信息
src: url,
success: function(image) {
const orientation = image.orientation;
uni.showToast({
title: image.orientation,
icon: 'none'
})
switch (orientation) {
case 'up': //exif:1 不旋转
rotate = 0;
break;
case 'down': //exif:3 旋转180度
rotate = 180;
break;
case 'right': //exif:6 旋转90度
rotate = 90;
break;
case 'left': //exif:8 旋转270度
rotate = 270;
break;
default:
rotate = 0;
break;
}
if (rotate == 0) {
console.log('up', url);
plus.zip.compressImage({
src: url, //src: (String 类型 )压缩转换原始图片的路径
dst: name, //压缩转换目标图片的路径
quality: 20, //quality: (Number 类型 )压缩图片的质量.取值范围为1-100
overwrite: true, //overwrite: (Boolean 类型 )覆盖生成新文件11
},
function(zip) {
//页面显示图片
console.log(4, zip.target)
console.log(4, name)
that.showPics(zip.target, name);
},
function(error) {
plus.nativeUI.toast("压缩图片失败,请稍候再试");
});
} else {
plus.zip.compressImage({
src: url, //src: (String 类型 )压缩转换原始图片的路径
dst: name, //压缩转换目标图片的路径
quality: 20, //quality: (Number 类型 )压缩图片的质量.取值范围为1-100
overwrite: true, //overwrite: (Boolean 类型 )覆盖生成新文件11
rotate: rotate,
},
function(zip) {
//页面显示图片
console.log(4, zip.target)
console.log(4, name)
that.showPics(zip.target, name);
},
function(error) {
plus.nativeUI.toast("压缩图片失败,请稍候再试");
});
}
}
});
uni.getImageInfo({ //获取图片信息
src: url,
success: function(image) {
const orientation = image.orientation;
uni.showToast({
title: image.orientation,
icon: 'none'
})
switch (orientation) {
case 'up': //exif:1 不旋转
rotate = 0;
break;
case 'down': //exif:3 旋转180度
rotate = 180;
break;
case 'right': //exif:6 旋转90度
rotate = 90;
break;
case 'left': //exif:8 旋转270度
rotate = 270;
break;
default:
rotate = 0;
break;
}
if (rotate == 0) {
console.log('up', url);
plus.zip.compressImage({
src: url, //src: (String 类型 )压缩转换原始图片的路径
dst: name, //压缩转换目标图片的路径
quality: 20, //quality: (Number 类型 )压缩图片的质量.取值范围为1-100
overwrite: true, //overwrite: (Boolean 类型 )覆盖生成新文件11
},
function(zip) {
//页面显示图片
console.log(4, zip.target)
console.log(4, name)
that.showPics(zip.target, name);
},
function(error) {
plus.nativeUI.toast("压缩图片失败,请稍候再试");
});
} else {
plus.zip.compressImage({
src: url, //src: (String 类型 )压缩转换原始图片的路径
dst: name, //压缩转换目标图片的路径
quality: 20, //quality: (Number 类型 )压缩图片的质量.取值范围为1-100
overwrite: true, //overwrite: (Boolean 类型 )覆盖生成新文件11
rotate: rotate,
},
function(zip) {
//页面显示图片
console.log(4, zip.target)
console.log(4, name)
that.showPics(zip.target, name);
},
function(error) {
plus.nativeUI.toast("压缩图片失败,请稍候再试");
});
}
}
});
收起阅读 »

个人开发者承接uni-app项目外包,网站、小程序、APP都可以接
个人开发者接单哦~实力派,质量有保障,价格合理
商城类、社交类、按摩类、即时通讯、哈喽麻豆/集美麻豆(买家秀任务平台)类、音乐类 度有作品可看哦,绝对真实从我这里开发出去的项目
擅长 uniapp、 Weex、Nvue、Php、HTML、Vue、element
除了大游戏,脚本,外挂,其他的度可以开发哦~~
有线上成品作品可看
有需求的老板可联系我
**微信:wu1020yt
QQ:6864952**
同行大哥们就别再下面打广告了,给小弟留条活路
个人开发者接单哦~实力派,质量有保障,价格合理
商城类、社交类、按摩类、即时通讯、哈喽麻豆/集美麻豆(买家秀任务平台)类、音乐类 度有作品可看哦,绝对真实从我这里开发出去的项目
擅长 uniapp、 Weex、Nvue、Php、HTML、Vue、element
除了大游戏,脚本,外挂,其他的度可以开发哦~~
有线上成品作品可看
有需求的老板可联系我
**微信:wu1020yt
QQ:6864952**
同行大哥们就别再下面打广告了,给小弟留条活路
收起阅读 »
【分享】云函数解析抖音开放平台 用户手机号示例
解密抖音用户手机号/字节跳动小程序ACE解密示例
需要引入 crypto; // nodejs 自带包直接使用
亲测可用
let encryptedMobile = 获得的加密手机号;
let keyStr = 你的client_secret;
const algorithm = 'aes-256-cbc';
const ivStr = keyStr.substr(0, 16);
const keyByte = Buffer.from(keyStr)
const ivByte = Buffer.from(ivStr)
const encryptedText = Buffer.from(encryptedMobile,"base64")
try {
const decipher = crypto.createDecipheriv('aes-256-cbc', keyByte, ivByte)
decipher.setAutoPadding(true);
var phone_info = decipher.update(encryptedText, 'binary', 'utf8');
phone_info += decipher.final('utf8');
}catch(err){
console.log('err: ', err)
}
console.log('phone_info: ', phone_info)
解密抖音用户手机号/字节跳动小程序ACE解密示例
需要引入 crypto; // nodejs 自带包直接使用
亲测可用
let encryptedMobile = 获得的加密手机号;
let keyStr = 你的client_secret;
const algorithm = 'aes-256-cbc';
const ivStr = keyStr.substr(0, 16);
const keyByte = Buffer.from(keyStr)
const ivByte = Buffer.from(ivStr)
const encryptedText = Buffer.from(encryptedMobile,"base64")
try {
const decipher = crypto.createDecipheriv('aes-256-cbc', keyByte, ivByte)
decipher.setAutoPadding(true);
var phone_info = decipher.update(encryptedText, 'binary', 'utf8');
phone_info += decipher.final('utf8');
}catch(err){
console.log('err: ', err)
}
console.log('phone_info: ', phone_info)
收起阅读 »

【分享】云函数调用抖音API,分享视频
引用:https://blog.csdn.net/nanfudianchi/article/details/118146659 看本文档了解详情
云函数调用 oss -》上传抖音 /video/upload
实测可用
const client = new OSS({}); //你的OSS
const result = await client.get(videoUrl);//获取到二进制数据
const form = new FormData();
form.append('video', result.content, { // 为方便演示此处直接使用云函数目录下的test.jpg文件
filename: filename,
contentType: 'video/mp4'
});
const videoInfo = await uniCloud.httpclient.request(
`https://open.douyin.com/video/upload/?open_id=${openid}`,
{
method: 'POST',
content: form.getBuffer(), // 请求内容
headers: {
...form.getHeaders(),
'access-token':access_token,
'Content-Disposition':'form-data; name="video"; ; filename="'+ filename +'"'
}, // 请求头
dataType: 'json' // 此处指定为json表示将此请求的返回值解析为json
});
引用:https://blog.csdn.net/nanfudianchi/article/details/118146659 看本文档了解详情
云函数调用 oss -》上传抖音 /video/upload
实测可用
const client = new OSS({}); //你的OSS
const result = await client.get(videoUrl);//获取到二进制数据
const form = new FormData();
form.append('video', result.content, { // 为方便演示此处直接使用云函数目录下的test.jpg文件
filename: filename,
contentType: 'video/mp4'
});
const videoInfo = await uniCloud.httpclient.request(
`https://open.douyin.com/video/upload/?open_id=${openid}`,
{
method: 'POST',
content: form.getBuffer(), // 请求内容
headers: {
...form.getHeaders(),
'access-token':access_token,
'Content-Disposition':'form-data; name="video"; ; filename="'+ filename +'"'
}, // 请求头
dataType: 'json' // 此处指定为json表示将此请求的返回值解析为json
});
收起阅读 »

【uniapp】解决uni.previewImage图片模糊问题
问题简述:以前开发时也碰到查看大图就模糊的问题,查阅资料知道是css3的3d渲染导致图片模糊,但由于uni.previewImage是uniapp内置组件,不能修改,所以就一直放着在,今天做项目又用到了uni.previewImage,经过苦思冥想想到一个折中的办法来解决,那就是mixin,且只需两步就能解决,灰常nice!
解决步骤:
1、新建一个mixin.js, 复制下面代码到里面:
function v(a, b) {
return +((1000 * a - 1000 * b) / 1000).toFixed(1)
}
module.exports = {
created() {
if (this._setTransform) {
this._setTransform = (x, y, scale, source = '', r, o) => {
if (!(x !== null && x.toString() !== 'NaN' && typeof x === 'number')) {
x = this._translateX || 0
}
if (!(y !== null && y.toString() !== 'NaN' && typeof y === 'number')) {
y = this._translateY || 0
}
x = Number(x.toFixed(1))
y = Number(y.toFixed(1))
scale = Number(scale.toFixed(1))
if (!(this._translateX === x && this._translateY === y)) {
if (!r) {
this.$trigger('change', {}, {
x: v(x, this._scaleOffset.x),
y: v(y, this._scaleOffset.y),
source: source
})
}
}
if (!this.scale) {
scale = this._scale
}
scale = this._adjustScale(scale)
scale = +scale.toFixed(3)
if (o && scale !== this._scale) {
this.$trigger('scale', {}, {
x: x,
y: y,
scale: scale
})
}
var transform = 'translateX(' + x + 'px) translateY(' + y + 'px) scale(' + scale + ')'
this.$el.style.transform = transform
this.$el.style.webkitTransform = transform
this._translateX = x
this._translateY = y
this._scale = scale
}
}
},
destroyed() {
//解决预览模式关闭后,和重复开关预览模式this._setTransform函数无限次执行导致手机卡顿的问题
if (this._FA) {
this._FA.cancel()
}
if (this._SFA) {
this._SFA.cancel()
}
},
methods: {
}
}
2、在main.js里面导入你刚刚创建的mixin.js,并执行全局混入操作:
// main.js
import Vue from 'vue';
import App from './App';
//...省略的代码
import mixin from '@/mixin/mixin.js'
Vue.mixin(mixin);
//...省略的代码
完结,问题解决,O(∩_∩)O!
适用环境:已测试的环境:h5端没问题,其他端我没测试过,有空的小伙伴可以测试了回来反馈一下。
仍存在的问题:
1、双指缩放完毕后图片仍然模糊,但只要单指轻微移动一下就会变成清晰的了;
2、当图片未放大时,左右拖动图片接触边界回弹时会导致【this._setTransform】方法会被无限次执行,在下一次执行移动和缩放时才会停止,但不影响正常使用。(不清楚是不是官方代码的bug还是我修改后产生的bug,不过既然清晰度问题已经解决,就懒得管了)
3、就算退出预览模式【this._setTransform】方法还是会在后台无限次执行,如果重复开关预览模式还会导致手机越来越卡;(不清楚这个问题是不是官方代码存在的问题,我暂时解决的方法是执行destroyed里面的方法)
问题简述:以前开发时也碰到查看大图就模糊的问题,查阅资料知道是css3的3d渲染导致图片模糊,但由于uni.previewImage是uniapp内置组件,不能修改,所以就一直放着在,今天做项目又用到了uni.previewImage,经过苦思冥想想到一个折中的办法来解决,那就是mixin,且只需两步就能解决,灰常nice!
解决步骤:
1、新建一个mixin.js, 复制下面代码到里面:
function v(a, b) {
return +((1000 * a - 1000 * b) / 1000).toFixed(1)
}
module.exports = {
created() {
if (this._setTransform) {
this._setTransform = (x, y, scale, source = '', r, o) => {
if (!(x !== null && x.toString() !== 'NaN' && typeof x === 'number')) {
x = this._translateX || 0
}
if (!(y !== null && y.toString() !== 'NaN' && typeof y === 'number')) {
y = this._translateY || 0
}
x = Number(x.toFixed(1))
y = Number(y.toFixed(1))
scale = Number(scale.toFixed(1))
if (!(this._translateX === x && this._translateY === y)) {
if (!r) {
this.$trigger('change', {}, {
x: v(x, this._scaleOffset.x),
y: v(y, this._scaleOffset.y),
source: source
})
}
}
if (!this.scale) {
scale = this._scale
}
scale = this._adjustScale(scale)
scale = +scale.toFixed(3)
if (o && scale !== this._scale) {
this.$trigger('scale', {}, {
x: x,
y: y,
scale: scale
})
}
var transform = 'translateX(' + x + 'px) translateY(' + y + 'px) scale(' + scale + ')'
this.$el.style.transform = transform
this.$el.style.webkitTransform = transform
this._translateX = x
this._translateY = y
this._scale = scale
}
}
},
destroyed() {
//解决预览模式关闭后,和重复开关预览模式this._setTransform函数无限次执行导致手机卡顿的问题
if (this._FA) {
this._FA.cancel()
}
if (this._SFA) {
this._SFA.cancel()
}
},
methods: {
}
}
2、在main.js里面导入你刚刚创建的mixin.js,并执行全局混入操作:
// main.js
import Vue from 'vue';
import App from './App';
//...省略的代码
import mixin from '@/mixin/mixin.js'
Vue.mixin(mixin);
//...省略的代码
完结,问题解决,O(∩_∩)O!
适用环境:已测试的环境:h5端没问题,其他端我没测试过,有空的小伙伴可以测试了回来反馈一下。
仍存在的问题:
1、双指缩放完毕后图片仍然模糊,但只要单指轻微移动一下就会变成清晰的了;
2、当图片未放大时,左右拖动图片接触边界回弹时会导致【this._setTransform】方法会被无限次执行,在下一次执行移动和缩放时才会停止,但不影响正常使用。(不清楚是不是官方代码的bug还是我修改后产生的bug,不过既然清晰度问题已经解决,就懒得管了)
3、就算退出预览模式【this._setTransform】方法还是会在后台无限次执行,如果重复开关预览模式还会导致手机越来越卡;(不清楚这个问题是不是官方代码存在的问题,我暂时解决的方法是执行destroyed里面的方法)
收起阅读 »
App真机模块一直处于下载中
HBuilder X 3.4.18.20220630 在打andriod 包过程中,提示让下载App真机模块,然后就一直处于下载中
至少有4个小时没有下载下来了
HBuilder X 3.4.18.20220630 在打andriod 包过程中,提示让下载App真机模块,然后就一直处于下载中
至少有4个小时没有下载下来了

一个UNIAPP开发者如何赚到钱
赚钱,人人都梦寐以求,但不是人人都得偿所愿。很多人费了很大力气,最后一无所获,除了挫败,失落,伤心,焦虑。相信uniapp的开发者,花费时间精力做一个app或者小程序,目的肯定是为了赚钱,至少也是积累项目经验,锻炼自己的能力。锻炼开发能力的不再今天的讨论范围之内。作为一个坚持了两年,uniapp自主开发运营的独立开发者,从项目创意立项,需求分析,建立模型,画草图,到最后变成品,从服务器运维,前后端开发,市场营销推广--发软文,投广告。以及收集各种反馈,判断成败得失。每一个环节都亲自操刀上阵的实践者。来跟大家分享一下,酸甜苦辣,利弊得失。写得不太好,或者太啰嗦,请诸位见谅。
我最近的一个项目叫做,少年儿童习惯养成。发布了安卓app和微信小程序。已经上线。

为什么会做这个项目呢?因为我是两个孩子的父亲,如何跟孩子打交道,给他们培养良好的行为习惯,是我的刚性需求。特别是孩子很叛逆的时候。所以整个项目的创意立项,是自然而然完成的。我经常要给孩子检查作业,修正他们生活中的不良习惯,诸如,拖延,爱发脾气,不讲卫生,沉溺手机游戏和电视垃圾短视频。而我在上班,确定了很多规则,但是时间一长,往往就忘掉了。这是一个危险的信号,孩子发现爸爸妈妈,记性不太好呃,他们自己定的规则都会忘记,这会给他们造成一种印象,不必太在意规则,他们太忙,他们会忘记的。久而久之,不仅没有塑造好习惯,甚至会滋生他们的侥幸和漠视父母的权威。这是一个危险的信号。许多新手父母,也许认识不到这一点:权威的陨落,就是失控的开始。这里废了这么多话,其实我想说的是,一个项目能不能赚钱,它提供了什么价值是很重要的。它是刚需吗?消费者会认可吗?他们愿意为此掏钱吗?他们每天都会使用吗?他们会有更好的选择吗?开始做一个项目之前,不妨多问问,多想想,它值得做吗?它真值得做吗?这个问题想透,想明白,然后才开始后边的。否则绝对赚不到钱。只会浪费时间。在正确的做事,和做正确的事情之间,此时的重点就是要做正确的事。
连载分享,未完待续。
赚钱,人人都梦寐以求,但不是人人都得偿所愿。很多人费了很大力气,最后一无所获,除了挫败,失落,伤心,焦虑。相信uniapp的开发者,花费时间精力做一个app或者小程序,目的肯定是为了赚钱,至少也是积累项目经验,锻炼自己的能力。锻炼开发能力的不再今天的讨论范围之内。作为一个坚持了两年,uniapp自主开发运营的独立开发者,从项目创意立项,需求分析,建立模型,画草图,到最后变成品,从服务器运维,前后端开发,市场营销推广--发软文,投广告。以及收集各种反馈,判断成败得失。每一个环节都亲自操刀上阵的实践者。来跟大家分享一下,酸甜苦辣,利弊得失。写得不太好,或者太啰嗦,请诸位见谅。
我最近的一个项目叫做,少年儿童习惯养成。发布了安卓app和微信小程序。已经上线。
为什么会做这个项目呢?因为我是两个孩子的父亲,如何跟孩子打交道,给他们培养良好的行为习惯,是我的刚性需求。特别是孩子很叛逆的时候。所以整个项目的创意立项,是自然而然完成的。我经常要给孩子检查作业,修正他们生活中的不良习惯,诸如,拖延,爱发脾气,不讲卫生,沉溺手机游戏和电视垃圾短视频。而我在上班,确定了很多规则,但是时间一长,往往就忘掉了。这是一个危险的信号,孩子发现爸爸妈妈,记性不太好呃,他们自己定的规则都会忘记,这会给他们造成一种印象,不必太在意规则,他们太忙,他们会忘记的。久而久之,不仅没有塑造好习惯,甚至会滋生他们的侥幸和漠视父母的权威。这是一个危险的信号。许多新手父母,也许认识不到这一点:权威的陨落,就是失控的开始。这里废了这么多话,其实我想说的是,一个项目能不能赚钱,它提供了什么价值是很重要的。它是刚需吗?消费者会认可吗?他们愿意为此掏钱吗?他们每天都会使用吗?他们会有更好的选择吗?开始做一个项目之前,不妨多问问,多想想,它值得做吗?它真值得做吗?这个问题想透,想明白,然后才开始后边的。否则绝对赚不到钱。只会浪费时间。在正确的做事,和做正确的事情之间,此时的重点就是要做正确的事。
连载分享,未完待续。
收起阅读 »
uni-app返回上一页终极处理办法
注意:注意针对自定义顶部导航,或者是使用了uni.navigateBack这个方法的界面。
//如果当前界面存在上一个界面,就返回上一个界面
//如果当前界面是分享进入的,没有上一个界面,这样的情况直接返回到指定的界面上去。
back() {
/*uni.navigateBack({
delta: 1
})*/
//@zxyuns 处理兼容,如果没有上一级界面则返回首页
const pages = getCurrentPages();
if (pages.length === 2) {
uni.navigateBack({
delta: 1
});
} else if (pages.length === 1) {
uni.switchTab({
url: '/pages/home/home',
})
} else {
uni.navigateBack({
delta: 1
});
}
},
注意:注意针对自定义顶部导航,或者是使用了uni.navigateBack这个方法的界面。
//如果当前界面存在上一个界面,就返回上一个界面
//如果当前界面是分享进入的,没有上一个界面,这样的情况直接返回到指定的界面上去。
back() {
/*uni.navigateBack({
delta: 1
})*/
//@zxyuns 处理兼容,如果没有上一级界面则返回首页
const pages = getCurrentPages();
if (pages.length === 2) {
uni.navigateBack({
delta: 1
});
} else if (pages.length === 1) {
uni.switchTab({
url: '/pages/home/home',
})
} else {
uni.navigateBack({
delta: 1
});
}
},
收起阅读 »

【Redis-lua脚本】踩坑经验分享
Redis
List类型
获取指定下标的元素
// 这里的key应为string类型,index为number类型且下标0对应第一个元素(lua的table下标从1开始)
redis.call('lindex',key,index)
Lua脚本
1.尽量不要使用while,repeat...until这种条件循环,因为一旦不能退出循环就会直接把redis服务搞崩。慎用!!!
未完待续。。。
文章不定时更新,都是本人实际开发过程中遇到过的坑,分享出来以供参考
Redis
List类型
获取指定下标的元素
// 这里的key应为string类型,index为number类型且下标0对应第一个元素(lua的table下标从1开始)
redis.call('lindex',key,index)
Lua脚本
1.尽量不要使用while,repeat...until这种条件循环,因为一旦不能退出循环就会直接把redis服务搞崩。慎用!!!
未完待续。。。
文章不定时更新,都是本人实际开发过程中遇到过的坑,分享出来以供参考

小说APP 自动采集数据成套代码一键安装
新增功能
可以随系统版本语言变换APP语言
目前支持 繁体 简体中文,英语,日语,韩语等
接入了google 广告
介绍
本阅读器牛逼之处在于无需部署服务器,只要自己在我的-规则设置-添加规则就可以实现APP自动抓取目标站数据,转换为可以阅读的小说内容
支持换源模式,一个小说规则挂了,我们换源看
书架支持9宫格和列表模式
安装说明
下载后请删除项目根目录下package.json文件-点击测试
当运行APP后在我的-规则设置-点击“内置测试书源导入”进行导入
如果不懂请加QQ2010409646
阅读器支持4中翻页模式
覆盖
左右平移
上下平移
无动画移动
支持多种行间距模式
最小
较小
适中
较大
最大
超大
支持字号设置
支持简体繁体切换
支持单手模式
背景色彩支持6中切换方式
核心功能支持阅读源切换功能
新增功能
可以随系统版本语言变换APP语言
目前支持 繁体 简体中文,英语,日语,韩语等
接入了google 广告
介绍
本阅读器牛逼之处在于无需部署服务器,只要自己在我的-规则设置-添加规则就可以实现APP自动抓取目标站数据,转换为可以阅读的小说内容
支持换源模式,一个小说规则挂了,我们换源看
书架支持9宫格和列表模式
安装说明
下载后请删除项目根目录下package.json文件-点击测试
当运行APP后在我的-规则设置-点击“内置测试书源导入”进行导入
如果不懂请加QQ2010409646
阅读器支持4中翻页模式
覆盖
左右平移
上下平移
无动画移动
支持多种行间距模式
最小
较小
适中
较大
最大
超大
支持字号设置
支持简体繁体切换
支持单手模式
背景色彩支持6中切换方式
核心功能支持阅读源切换功能

DCloud 开发者中心升级公告
为了给广大开发者提供更优质稳定的服务,DCloud 将于2022年7月23日晚上22点对开发者中心(dev.dcloud.net.cn)进行全面升级,升级时间预计为8小时,如遇问题恢复时间可能会顺延。
本次升级由于涉及到系统底层变动(改为uni-admin,前端为uni-app,后端基于uniCloud私有云),升级过程中开发者中心将暂停访问,请各位开发者安排好时间,避免对自己的业务产生影响。
系统升级过程中,除开发者中心外,以下功能也将暂停使用,升级完成后恢复
- 注册账号、修改密码、找回密码
- 创建应用、重新生成 Appid
- 云端证书打包
升级完成后,开发者中心(dev.dcloud.net.cn)将以全新面貌重新开放,届时如有问题也欢迎大家积极反馈。
已登录用户无法退出的问题,请先清除浏览器本地缓存,然后刷新页面重试。
为了给广大开发者提供更优质稳定的服务,DCloud 将于2022年7月23日晚上22点对开发者中心(dev.dcloud.net.cn)进行全面升级,升级时间预计为8小时,如遇问题恢复时间可能会顺延。
本次升级由于涉及到系统底层变动(改为uni-admin,前端为uni-app,后端基于uniCloud私有云),升级过程中开发者中心将暂停访问,请各位开发者安排好时间,避免对自己的业务产生影响。
系统升级过程中,除开发者中心外,以下功能也将暂停使用,升级完成后恢复
- 注册账号、修改密码、找回密码
- 创建应用、重新生成 Appid
- 云端证书打包
升级完成后,开发者中心(dev.dcloud.net.cn)将以全新面貌重新开放,届时如有问题也欢迎大家积极反馈。
已登录用户无法退出的问题,请先清除浏览器本地缓存,然后刷新页面重试。
收起阅读 »
邮箱、静默发邮件、系统UI发送邮件、支持文本、html、附件发送
邮箱、静默发邮件、系统UI发送邮件、支持文本、html、附件发送:https://ext.dcloud.net.cn/plugin?id=8839
邮箱、静默发邮件、系统UI发送邮件、支持文本、html、附件发送:https://ext.dcloud.net.cn/plugin?id=8839