
微信开发者工具1.06.2402040,使用uview-plus报错,无依赖uview-plus
打开本地设置 ——> 上传时过滤无依赖文件选项;重新勾选,便可解决这个问题
打开本地设置 ——> 上传时过滤无依赖文件选项;重新勾选,便可解决这个问题

开源VUE盲盒小程序源码多端二开搭建(app+h5+pc+小程序)带数码商城和交友盲盒系统
本文将围绕盲盒小程序源码的设计、实现及运维过程,详细介绍从项目构思到最终上线的全流程,旨在为读者提供一个全面的参考和指导。
源码设计:n.ymzan.top
一、项目背景与需求分析
1.1 项目背景
盲盒小程序旨在为用户提供一个线上购买和开启盲盒的平台,用户可以通过小程序轻松购买盲盒,并在开启后获得随机的商品。这种新颖的消费模式不仅满足了用户的猎奇心理,还通过社交分享等功能增强了用户之间的互动和粘性。
1.2 需求分析
在项目启动前,我们进行了详细的需求分析,主要包括以下几个方面:
用户注册与登录:用户可以通过邮箱或手机号进行注册,支持第三方社交账号登录。
盲盒购买:用户可以在小程序中浏览盲盒列表,选择心仪的盲盒进行购买,支持多种支付方式。
盲盒开启:用户购买盲盒后,可以立即开启,系统根据预设的概率算法决定用户获得的商品。
商品展示:展示盲盒内的商品信息,包括图片、描述、价格等。
订单管理:用户可以查看自己的购买记录和订单状态,支持订单跟踪和售后服务。
社交分享:用户可以将自己的开箱体验分享到社交平台,增加用户之间的互动和传播。
二、技术选型与架构设计
2.1 技术选型
基于项目的需求,我们选择了以下技术栈进行开发:
前端:uniapp。uniapp 是一个使用 Vue.js 开发所有前端应用的框架,支持编译到 iOS、Android、H5、以及各种小程序等多个平台,极大地提高了开发效率。
后端:PHP TP6 框架。TP6 是一个现代化的 PHP 后端开发框架,拥有简洁的语法、丰富的功能组件和高效的性能,适合快速开发企业级应用。
数据库:MySQL。MySQL 是一个流行的关系型数据库管理系统,支持大型数据库和事务处理,能够满足本项目的数据存储需求。
2.2 架构设计
项目的整体架构采用前后端分离的模式,前端负责页面展示和用户交互,后端负责业务逻辑处理和数据库操作。具体架构如下:
前端:使用 uniapp 开发,包括页面设计、用户交互、API 接口调用等。
后端:使用 PHP TP6 框架,包括用户注册登录、盲盒购买逻辑、数据库操作等。
数据库:使用 MySQL 存储用户信息、盲盒信息、商品信息、订单信息等数据。
三、开发实现
3.1 前端开发
3.1.1 用户注册与登录
在 pages 文件夹下创建 register 和 login 页面,分别用于用户注册和登录。使用 uniapp 提供的表单组件和 API 接口调用功能,实现用户信息的提交和验证。
vue
// register.vue
async submitForm() {
const formData = {
username: this.username,
password: this.password,
};
try {
const res = await uni.request({
url: '/api/user/register',
method: 'POST',
data: formData,
});
if (res.data.code === 0) {
uni.showToast({
title: '注册成功',
icon: 'success',
});
this.$router.push('/pages/login');
} else {
uni.showToast({
title: '注册失败',
icon: 'none',
});
}
} catch (err) {
console.error(err);
}
}
3.1.2 盲盒购买与开启
在 pages 文件夹下创建 blindbox 页面,用于展示盲盒列表和购买操作。用户点击购买按钮后,调用后端接口完成购买操作,并实时更新页面状态。
vue
// blindbox.vue
async buyBlindBox(id) {
try {
const res = await uni.request({
url: /api/blindbox/buy/${id}
,
method: 'POST',
});
if (res.data.code === 0) {
uni.showToast({
title: '购买成功',
icon: 'success',
});
this.getBlindBoxList(); // 重新加载盲盒列表
} else {
uni.showToast
({
title: '购买失败',
icon: 'none',
});
}
// 开启盲盒
if (res.data.opened) {
this.openBlindBox(res.data.blindboxId);
}
} catch (err) {
console.error(err);
uni.showToast({
title: '网络错误',
icon: 'none',
});
}
}
async openBlindBox(blindboxId) {
try {
const res = await uni.request({
url: /api/blindbox/open/${blindboxId},
method: 'GET',
});
if (res.data.code === 0) {
uni.showModal({
title: '恭喜你!',
content: 你获得了${res.data.product.name}!,
showCancel: false,
success: () => {
// 可以添加分享到朋友圈或社交平台的逻辑
this.shareToFriends(res.data.product);
}
});
} else {
uni.showToast({
title: '开启失败',
icon: 'none',
});
}
} catch (err) {
console.error(err);
uni.showToast({
title: '网络错误',
icon: 'none',
});
}
}
shareToFriends(product) {
uni.share({
provider: 'weixin', // 指定分享到微信
title: 我获得了${product.name}!,
path: '/pages/blindbox/detail?productId=' + product.id, // 分享的页面路径
success: () => {
uni.showToast({
title: '分享成功',
icon: 'success',
});
},
fail: () => {
uni.showToast({
title: '分享失败',
icon: 'none',
});
}
});
}
### 3.2 后端开发
#### 3.2.1 用户注册与登录
在 PHP TP6 框架中,创建 User
模型和 UserController
控制器来处理用户注册和登录的逻辑。
```php
// UserController.php
public function register(Request $request)
{
$data = $request->post();
$user = new User();
$user->username = $data['username'];
$user->password = password_hash($data['password'], PASSWORD_DEFAULT);
if ($user->save()) {
return json(['code' => 0, 'msg' => '注册成功']);
} else {
return json(['code' => 1, 'msg' => '注册失败']);
}
}
public function login(Request $request)
{
$data = $request->post();
$user = User::where('username', $data['username'])->find();
if ($user && password_verify($data['password'], $user->password)) {
// 生成Token等操作
return json(['code' => 0, 'msg' => '登录成功', 'token' => 'your_token_here']);
} else {
return json(['code' => 1, 'msg' => '用户名或密码错误']);
}
}
3.2.2 盲盒购买与开启
在 BlindBox 模型和 BlindBoxController 控制器中处理盲盒的购买和开启逻辑。
php
// BlindBoxController.php
public function buy($id, Request $request)
{
// 验证用户身份、库存等
// ...
$blindbox = BlindBox::find($id);
if (!$blindbox || $blindbox->stock <= 0) {
return json(['code' => 1, 'msg' => '盲盒不存在或库存不足']);
}
// 减库存、创建订单等操作
$blindbox->stock--;
$blindbox->save();
// 假设这里直接开启盲盒
$product = $this->openBlindBox($blindbox);
return json([
'code' => 0,
'msg' => '购买成功',
'opened' => true,
'blindboxId' => $blindbox->id,
'product' => $product,)
本文将围绕盲盒小程序源码的设计、实现及运维过程,详细介绍从项目构思到最终上线的全流程,旨在为读者提供一个全面的参考和指导。
源码设计:n.ymzan.top
一、项目背景与需求分析
1.1 项目背景
盲盒小程序旨在为用户提供一个线上购买和开启盲盒的平台,用户可以通过小程序轻松购买盲盒,并在开启后获得随机的商品。这种新颖的消费模式不仅满足了用户的猎奇心理,还通过社交分享等功能增强了用户之间的互动和粘性。
1.2 需求分析
在项目启动前,我们进行了详细的需求分析,主要包括以下几个方面:
用户注册与登录:用户可以通过邮箱或手机号进行注册,支持第三方社交账号登录。
盲盒购买:用户可以在小程序中浏览盲盒列表,选择心仪的盲盒进行购买,支持多种支付方式。
盲盒开启:用户购买盲盒后,可以立即开启,系统根据预设的概率算法决定用户获得的商品。
商品展示:展示盲盒内的商品信息,包括图片、描述、价格等。
订单管理:用户可以查看自己的购买记录和订单状态,支持订单跟踪和售后服务。
社交分享:用户可以将自己的开箱体验分享到社交平台,增加用户之间的互动和传播。
二、技术选型与架构设计
2.1 技术选型
基于项目的需求,我们选择了以下技术栈进行开发:
前端:uniapp。uniapp 是一个使用 Vue.js 开发所有前端应用的框架,支持编译到 iOS、Android、H5、以及各种小程序等多个平台,极大地提高了开发效率。
后端:PHP TP6 框架。TP6 是一个现代化的 PHP 后端开发框架,拥有简洁的语法、丰富的功能组件和高效的性能,适合快速开发企业级应用。
数据库:MySQL。MySQL 是一个流行的关系型数据库管理系统,支持大型数据库和事务处理,能够满足本项目的数据存储需求。
2.2 架构设计
项目的整体架构采用前后端分离的模式,前端负责页面展示和用户交互,后端负责业务逻辑处理和数据库操作。具体架构如下:
前端:使用 uniapp 开发,包括页面设计、用户交互、API 接口调用等。
后端:使用 PHP TP6 框架,包括用户注册登录、盲盒购买逻辑、数据库操作等。
数据库:使用 MySQL 存储用户信息、盲盒信息、商品信息、订单信息等数据。
三、开发实现
3.1 前端开发
3.1.1 用户注册与登录
在 pages 文件夹下创建 register 和 login 页面,分别用于用户注册和登录。使用 uniapp 提供的表单组件和 API 接口调用功能,实现用户信息的提交和验证。
vue
// register.vue
async submitForm() {
const formData = {
username: this.username,
password: this.password,
};
try {
const res = await uni.request({
url: '/api/user/register',
method: 'POST',
data: formData,
});
if (res.data.code === 0) {
uni.showToast({
title: '注册成功',
icon: 'success',
});
this.$router.push('/pages/login');
} else {
uni.showToast({
title: '注册失败',
icon: 'none',
});
}
} catch (err) {
console.error(err);
}
}
3.1.2 盲盒购买与开启
在 pages 文件夹下创建 blindbox 页面,用于展示盲盒列表和购买操作。用户点击购买按钮后,调用后端接口完成购买操作,并实时更新页面状态。
vue
// blindbox.vue
async buyBlindBox(id) {
try {
const res = await uni.request({
url: /api/blindbox/buy/${id}
,
method: 'POST',
});
if (res.data.code === 0) {
uni.showToast({
title: '购买成功',
icon: 'success',
});
this.getBlindBoxList(); // 重新加载盲盒列表
} else {
uni.showToast
({
title: '购买失败',
icon: 'none',
});
}
// 开启盲盒
if (res.data.opened) {
this.openBlindBox(res.data.blindboxId);
}
} catch (err) {
console.error(err);
uni.showToast({
title: '网络错误',
icon: 'none',
});
}
}
async openBlindBox(blindboxId) {
try {
const res = await uni.request({
url: /api/blindbox/open/${blindboxId},
method: 'GET',
});
if (res.data.code === 0) {
uni.showModal({
title: '恭喜你!',
content: 你获得了${res.data.product.name}!,
showCancel: false,
success: () => {
// 可以添加分享到朋友圈或社交平台的逻辑
this.shareToFriends(res.data.product);
}
});
} else {
uni.showToast({
title: '开启失败',
icon: 'none',
});
}
} catch (err) {
console.error(err);
uni.showToast({
title: '网络错误',
icon: 'none',
});
}
}
shareToFriends(product) {
uni.share({
provider: 'weixin', // 指定分享到微信
title: 我获得了${product.name}!,
path: '/pages/blindbox/detail?productId=' + product.id, // 分享的页面路径
success: () => {
uni.showToast({
title: '分享成功',
icon: 'success',
});
},
fail: () => {
uni.showToast({
title: '分享失败',
icon: 'none',
});
}
});
}
### 3.2 后端开发
#### 3.2.1 用户注册与登录
在 PHP TP6 框架中,创建 User
模型和 UserController
控制器来处理用户注册和登录的逻辑。
```php
// UserController.php
public function register(Request $request)
{
$data = $request->post();
$user = new User();
$user->username = $data['username'];
$user->password = password_hash($data['password'], PASSWORD_DEFAULT);
if ($user->save()) {
return json(['code' => 0, 'msg' => '注册成功']);
} else {
return json(['code' => 1, 'msg' => '注册失败']);
}
}
public function login(Request $request)
{
$data = $request->post();
$user = User::where('username', $data['username'])->find();
if ($user && password_verify($data['password'], $user->password)) {
// 生成Token等操作
return json(['code' => 0, 'msg' => '登录成功', 'token' => 'your_token_here']);
} else {
return json(['code' => 1, 'msg' => '用户名或密码错误']);
}
}
3.2.2 盲盒购买与开启
在 BlindBox 模型和 BlindBoxController 控制器中处理盲盒的购买和开启逻辑。
php
// BlindBoxController.php
public function buy($id, Request $request)
{
// 验证用户身份、库存等
// ...
$blindbox = BlindBox::find($id);
if (!$blindbox || $blindbox->stock <= 0) {
return json(['code' => 1, 'msg' => '盲盒不存在或库存不足']);
}
// 减库存、创建订单等操作
$blindbox->stock--;
$blindbox->save();
// 假设这里直接开启盲盒
$product = $this->openBlindBox($blindbox);
return json([
'code' => 0,
'msg' => '购买成功',
'opened' => true,
'blindboxId' => $blindbox->id,
'product' => $product,)

开发ios应用,6.7寸和5.5寸的截屏方法
无论是使用hbuilderx还是使用原生的ios语言开发,上架都需要截屏,当前最新的上架是需要6.7寸、6.5寸、5.5寸,假如支持ipad,还需要ipad最新4代的13英寸、2代13英寸。
但是最新的版本的xcode模拟器,发现安装完后,模拟器默认只是支持iphone15这些最新的设备,默认最新的sdk已经不支持以前的5.5寸那些旧设备。
假如要5.5寸截屏,需要在xcode下载很旧的sdk,好几十G,本身xcode就很大,旧版本的sdk更大,还经常下载失败。但是在苹果的上架流程中,5.5寸可是必须要提供的,苹果还真不考虑我们开发者的感受啊,最新版的xcode默认还不能截屏5.5寸,还需要自己去下载旧版的sdk,可是旧版的sdk下载起来比较麻烦,而是很占体积,把旧的sdk都下载下来,要占几十个G的硬盘呢。
没有模拟器可以截屏,我们假如去买个旧版的5.5寸的真机设备去截屏也不现实,那可是淘汰产品,谁买谁就是冤大头。
其实,假如只是想上架截屏,其实并不一定需要用模拟器截屏
可以使用在线合成截屏的平台,这里我推荐香蕉云编,可以实现最新尺寸的截屏:
https://www.yunedit.com/jietu
无论是使用hbuilderx还是使用原生的ios语言开发,上架都需要截屏,当前最新的上架是需要6.7寸、6.5寸、5.5寸,假如支持ipad,还需要ipad最新4代的13英寸、2代13英寸。
但是最新的版本的xcode模拟器,发现安装完后,模拟器默认只是支持iphone15这些最新的设备,默认最新的sdk已经不支持以前的5.5寸那些旧设备。
假如要5.5寸截屏,需要在xcode下载很旧的sdk,好几十G,本身xcode就很大,旧版本的sdk更大,还经常下载失败。但是在苹果的上架流程中,5.5寸可是必须要提供的,苹果还真不考虑我们开发者的感受啊,最新版的xcode默认还不能截屏5.5寸,还需要自己去下载旧版的sdk,可是旧版的sdk下载起来比较麻烦,而是很占体积,把旧的sdk都下载下来,要占几十个G的硬盘呢。
没有模拟器可以截屏,我们假如去买个旧版的5.5寸的真机设备去截屏也不现实,那可是淘汰产品,谁买谁就是冤大头。
其实,假如只是想上架截屏,其实并不一定需要用模拟器截屏
可以使用在线合成截屏的平台,这里我推荐香蕉云编,可以实现最新尺寸的截屏:
https://www.yunedit.com/jietu
收起阅读 »
uniapp 使用input软键盘弹出时,placeholder上移的问题
不设置最外层的父元素高度。更多详情,请参考:https://developers.weixin.qq.com/community/develop/article/doc/000a00e1fd0790488e6a034f156813?highline=uniapp%20%E4%BD%BF%E7%94%A8input%E8%BD%AF%E9%94%AE%E7%9B%98%E5%BC%B9%E5%87%BA%E6%97%B6%E5%B0%86input%E6%A1%86%E5%86%85%E5%AE%B9%E4%B8%8A%E7%A7%BB%E7%9A%84%E9%97%AE%E9%A2%98
不设置最外层的父元素高度。更多详情,请参考:https://developers.weixin.qq.com/community/develop/article/doc/000a00e1fd0790488e6a034f156813?highline=uniapp%20%E4%BD%BF%E7%94%A8input%E8%BD%AF%E9%94%AE%E7%9B%98%E5%BC%B9%E5%87%BA%E6%97%B6%E5%B0%86input%E6%A1%86%E5%86%85%E5%AE%B9%E4%B8%8A%E7%A7%BB%E7%9A%84%E9%97%AE%E9%A2%98
收起阅读 »
PHP框架的性能比较
基准测试结果表明,在页面加载时间方面,codeigniter 最快,其次是 laravel、symfony 和 zend framework。在数据库操作方面,codeigniter 最快,其次是 laravel、symfony 和 zend framework。在内存使用方面,codeigniter 最少,其次是 laravel、symfony 和 zend framework。实战案例表明,codeigniter 非常适合小型项目,而 laravel 和 symfony 适用于中型到大型项目,zend framework 适用于企业级应用,但性能较差。
PHP框架性能比较
在选择PHP框架时,性能是一个关键考虑因素。本文将比较常见的 PHP 框架的性能,并提供实战案例来展示其差异http://m.bokequ.com/moban/1252.html
比较的框架
Laravel: 一个流行的 MVC 框架,以其易用性和强大的特性而闻名。
Symfony: 一个广泛的框架,提供丰富的组件库和灵活的配置选项。
Zend Framework: 一个老牌的企业级框架,以其稳定性和安全性而闻名。
CodeIgniter: 一个轻量级的 MVC 框架,非常适合小型到中型的项目。
基准测试
我们使用以下基准测试来比较这些框架:
页面加载时间:加载一个简单页面的时间
数据库操作:执行数据库查询的速度
内存使用:框架运行时所需的内存量
实战案例
我们创建一个简单的博客应用程序,使用每个框架来显示一页包含 10 篇文章的帖子。我们使用 Apache Bench 进行基准测试,每秒发送 100 个请求持续 10 分钟。
结果
页面加载时间:Laravel
数据库操作:CodeIgniter
内存使用:CodeIgniter
结论
从基准测试和实战案例中可以看出,CodeIgniter 在性能方面表现出色,非常适合小型项目。 Laravel 和 Symfony 在性能和功能方面实现了良好的平衡,适用于中型到大型项目。 Zend Framework 是企业级应用程序的首选,提供卓越的稳定性和安全性,但它的性能也受到影响。
基准测试结果表明,在页面加载时间方面,codeigniter 最快,其次是 laravel、symfony 和 zend framework。在数据库操作方面,codeigniter 最快,其次是 laravel、symfony 和 zend framework。在内存使用方面,codeigniter 最少,其次是 laravel、symfony 和 zend framework。实战案例表明,codeigniter 非常适合小型项目,而 laravel 和 symfony 适用于中型到大型项目,zend framework 适用于企业级应用,但性能较差。
PHP框架性能比较
在选择PHP框架时,性能是一个关键考虑因素。本文将比较常见的 PHP 框架的性能,并提供实战案例来展示其差异http://m.bokequ.com/moban/1252.html
比较的框架
Laravel: 一个流行的 MVC 框架,以其易用性和强大的特性而闻名。
Symfony: 一个广泛的框架,提供丰富的组件库和灵活的配置选项。
Zend Framework: 一个老牌的企业级框架,以其稳定性和安全性而闻名。
CodeIgniter: 一个轻量级的 MVC 框架,非常适合小型到中型的项目。
基准测试
我们使用以下基准测试来比较这些框架:
页面加载时间:加载一个简单页面的时间
数据库操作:执行数据库查询的速度
内存使用:框架运行时所需的内存量
实战案例
我们创建一个简单的博客应用程序,使用每个框架来显示一页包含 10 篇文章的帖子。我们使用 Apache Bench 进行基准测试,每秒发送 100 个请求持续 10 分钟。
结果
页面加载时间:Laravel
数据库操作:CodeIgniter
内存使用:CodeIgniter
结论
从基准测试和实战案例中可以看出,CodeIgniter 在性能方面表现出色,非常适合小型项目。 Laravel 和 Symfony 在性能和功能方面实现了良好的平衡,适用于中型到大型项目。 Zend Framework 是企业级应用程序的首选,提供卓越的稳定性和安全性,但它的性能也受到影响。
收起阅读 »
网站如何实现https重定向(301)到http
对于个人网站站注册比较少的,服务器配置不是很好的,没必要https,https跳转到http是要时间的,会影响网站打开的速度。免费的https每年都要更换。个人博客网站https有一段时间了,而且很多页面都有收录排名,现在已去掉https了,用户搜索从https进网站无法打开页面。去掉后https对面网站有一定的影响,所有这里就要实现访问https自动跳转到http
网站设置http跳转到https比较容易,如相反方向将https跳转到http,不是专搞程序的,有点难设置。网上文章也有很多"HTTPS重定向到HTTP的解决方法"。但很多都是没用的,都是转载别人没测试过,搞的网站打不开。
将以下代码放在你网站根目录下的.htaccess文件,没有.htaccess可以新建一个。域名换成你自己的域名,经测试有效
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.bokequ.com%{REQUEST_URI} [L,R=301,NE]
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} https [OR]
RewriteCond %{SERVER_PORT} ^443$
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?bokequ.com/.*$ [NC]
RewriteRule \.(gif|jpg|png|tif|js|css|xls|xlsx|zip|rar|pdf|ods|ots)$ - [F,NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php/$1 [L]
对于个人网站站注册比较少的,服务器配置不是很好的,没必要https,https跳转到http是要时间的,会影响网站打开的速度。免费的https每年都要更换。个人博客网站https有一段时间了,而且很多页面都有收录排名,现在已去掉https了,用户搜索从https进网站无法打开页面。去掉后https对面网站有一定的影响,所有这里就要实现访问https自动跳转到http
网站设置http跳转到https比较容易,如相反方向将https跳转到http,不是专搞程序的,有点难设置。网上文章也有很多"HTTPS重定向到HTTP的解决方法"。但很多都是没用的,都是转载别人没测试过,搞的网站打不开。
将以下代码放在你网站根目录下的.htaccess文件,没有.htaccess可以新建一个。域名换成你自己的域名,经测试有效
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.bokequ.com%{REQUEST_URI} [L,R=301,NE]
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} https [OR]
RewriteCond %{SERVER_PORT} ^443$
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?bokequ.com/.*$ [NC]
RewriteRule \.(gif|jpg|png|tif|js|css|xls|xlsx|zip|rar|pdf|ods|ots)$ - [F,NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php/$1 [L]
收起阅读 »

漏扫中“未配置网络安全属性风险”如何正确姿势进行配置
一个产品中漏扫出现了“未配置网络安全属性风险”。
初期查到官网有解决方案:https://uniapp.dcloud.net.cn/tutorial/app-sec-android.html
实践了一下,发现还是需要很多细节需要纠结。测试了几遍漏扫。留下以下资料供大家参考
新加目录结构和文件
/nativeResources
--android
----res
------raw
--------my_ca (文件是https证书的nginx的.key文件内容)
------xml
--------network_security_config.xml
/AndroidManifest.xml
/manifest.json (需要修改)
network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">你接口的域名</domain>
<trust-anchors>
<certificates src="@/raw/my_ca"/>
</trust-anchors>
</domain-config>
</network-security-config>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
package="包名">
<application android:networkSecurityConfig="@xml/network_security_config"></application>
</manifest>
manifest.json
...
"distribute" : {
/* android打包配置 */
"android" : {
"networkSecurityConfig" : "xml/network_security_config.xml", //新加入的行
...
一个产品中漏扫出现了“未配置网络安全属性风险”。
初期查到官网有解决方案:https://uniapp.dcloud.net.cn/tutorial/app-sec-android.html
实践了一下,发现还是需要很多细节需要纠结。测试了几遍漏扫。留下以下资料供大家参考
新加目录结构和文件
/nativeResources
--android
----res
------raw
--------my_ca (文件是https证书的nginx的.key文件内容)
------xml
--------network_security_config.xml
/AndroidManifest.xml
/manifest.json (需要修改)
network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">你接口的域名</domain>
<trust-anchors>
<certificates src="@/raw/my_ca"/>
</trust-anchors>
</domain-config>
</network-security-config>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
package="包名">
<application android:networkSecurityConfig="@xml/network_security_config"></application>
</manifest>
manifest.json
...
"distribute" : {
/* android打包配置 */
"android" : {
"networkSecurityConfig" : "xml/network_security_config.xml", //新加入的行
...
收起阅读 »

使用usingComponents后没有占位组件而导致的微信小程序报错,xxx组件not found!
在manifest.json直接写死,编译进去,具体看附件或代码
{
"name": "test",
"appid": "__UNI__9E404E0",
"description": "",
"versionName": "1.0.0",
"versionCode": "100",
"transformPx": false,
"app-plus": {
/* 5+App特有相关 */
"usingComponents": true,
"nvueCompiler": "uni-app",
"nvueStyleCompiler": "uni-app",
"splashscreen": {
"alwaysShowBeforeRender": true,
"waiting": true,
"autoclose": true,
"delay": 0
},
"modules": {},
/* 模块配置 */
"distribute": {
/* 应用发布信息 */
"android": {
/* android打包配置 */
"permissions": [
]
},
"ios": {},
/* ios打包配置 */
"sdkConfigs": {}
}
},
/* SDK配置 */
"quickapp": {},
/* 快应用特有相关 */
"mp-weixin": {
/* 小程序特有相关 */
"appid": "",
"setting": {
"urlCheck": false
},
"usingComponents": {
"uni-link": "/uni_modules/uni-link/components/uni-link/uni-link"
},
"componentPlaceholder": {
"uni-link": "view"
}
},
"vueVersion": "3"
}
在manifest.json直接写死,编译进去,具体看附件或代码
{
"name": "test",
"appid": "__UNI__9E404E0",
"description": "",
"versionName": "1.0.0",
"versionCode": "100",
"transformPx": false,
"app-plus": {
/* 5+App特有相关 */
"usingComponents": true,
"nvueCompiler": "uni-app",
"nvueStyleCompiler": "uni-app",
"splashscreen": {
"alwaysShowBeforeRender": true,
"waiting": true,
"autoclose": true,
"delay": 0
},
"modules": {},
/* 模块配置 */
"distribute": {
/* 应用发布信息 */
"android": {
/* android打包配置 */
"permissions": [
]
},
"ios": {},
/* ios打包配置 */
"sdkConfigs": {}
}
},
/* SDK配置 */
"quickapp": {},
/* 快应用特有相关 */
"mp-weixin": {
/* 小程序特有相关 */
"appid": "",
"setting": {
"urlCheck": false
},
"usingComponents": {
"uni-link": "/uni_modules/uni-link/components/uni-link/uni-link"
},
"componentPlaceholder": {
"uni-link": "view"
}
},
"vueVersion": "3"
}
收起阅读 »

ios应用可通过企业证书打包直接安装在iphone
做过安卓开发的同学们都知道,安卓的安装是比较简单的,可以直接在android手机上安装,不需要通过在线商店安装。
但是iphone和ipad这些ios系统的手机不一样,假如你是使用普通苹果账号打包的app store类型的ipa包,是无法直接安装在ios手机的,需要上架到app store苹果商店才能安装。
不过,ios想直接安装,还是有办法的,就是注册苹果企业开发者账号,通过企业开发者账号,生成in house类型的证书和描述文件(证书profile文件),通过in house类型的证书和描述文件打包出来的ipa文件,可以上传到像香蕉云编这种应用内测的平台,生成二维码安装。
注册企业账号和生成企业证书的过程比较麻烦,假如需要,可参考下面这个教程:
https://blog.csdn.net/weixin_48914851/article/details/140758473
做过安卓开发的同学们都知道,安卓的安装是比较简单的,可以直接在android手机上安装,不需要通过在线商店安装。
但是iphone和ipad这些ios系统的手机不一样,假如你是使用普通苹果账号打包的app store类型的ipa包,是无法直接安装在ios手机的,需要上架到app store苹果商店才能安装。
不过,ios想直接安装,还是有办法的,就是注册苹果企业开发者账号,通过企业开发者账号,生成in house类型的证书和描述文件(证书profile文件),通过in house类型的证书和描述文件打包出来的ipa文件,可以上传到像香蕉云编这种应用内测的平台,生成二维码安装。
注册企业账号和生成企业证书的过程比较麻烦,假如需要,可参考下面这个教程:
https://blog.csdn.net/weixin_48914851/article/details/140758473
收起阅读 »
使用switch无法进行数据的双向绑定
当你form表单使用switch进行操作时,
<switch @change="binddata('itExistDimension', $event.detail.value)" :checked="formData.itExistDimension"></switch>
可以这样使用,但是无法更新formData的itExistDimension的值,必须重构binddata方法进行手动绑定才行
binddata(name,value){
this.formData[name]=value
this.$refs.form.setValue(name,value)
},
否则如果你使用v-if=“itExistDimension”必然无效
当你form表单使用switch进行操作时,
<switch @change="binddata('itExistDimension', $event.detail.value)" :checked="formData.itExistDimension"></switch>
可以这样使用,但是无法更新formData的itExistDimension的值,必须重构binddata方法进行手动绑定才行
binddata(name,value){
this.formData[name]=value
this.$refs.form.setValue(name,value)
},
否则如果你使用v-if=“itExistDimension”必然无效