HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

前端uniapp 后端php影视二开 要求有经验的来

外包

前端uniapp 后端php影视二开 要求有经验的来q1836666856

前端uniapp 后端php影视二开 要求有经验的来q1836666856

商城小程序开发

可基于uni-app 的开源商城案例基础上开发,只负责前端开发。不负责接口和后台开发。

地址在上海需要能线下见面。

有兴趣的同学添加微信:yetu_hare

可基于uni-app 的开源商城案例基础上开发,只负责前端开发。不负责接口和后台开发。

地址在上海需要能线下见面。

有兴趣的同学添加微信:yetu_hare

父组件向子组件里的props动态传值出现错误提示的解决办法

子组件定义了data,但在父组件里直接:val动态传值发现失败。
如果直接向props动态传值又出现下面的错误提示,虽然也能改变,但是比较烦人。
Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "value"

解决办法如下,APP测试通过:

第0种【推荐】
用watch监听prpos里的值,来改变data里的内容
可以向子组件派发事件来操作,通过父组件使用@setdd="setval(2)",改变vueval来改变自定义组件值

data:{  
return {  
 dd:1  
}  
},  
prpos:{  
  setdd:{  
                type: String,  
                default: 'center'  
            }  
},  
watch: {  

setdd: {  
              immediate: true,  
              handler: function(val) {  
                let that=this;  
                console.log("监听")  
                that.dd= val;  
              }  
            }  
}  

以下方法也能用,只是有些地方可能不能满足
第1种,V-BIND动态传值

子组件
<input :type="type" v-model="vals" @input="inputin" class="put" disabled/>
props: {
vals: {
type: [Number],
default: 0
}
}
父组件可以直接
v-bind:vals="item.num"

第2种,不直接更改,内部消化。
子组件
<input :type="type" v-model="val" @input="inputin" class="put" disabled/>
data(){
return{
val:1
}
},
props: {
vals: {
type: [Number],
default: 0
}
}
在生命周期里:
created() {
let that=this;
if(that.vals){
that.val=that.vals;
}
},

父组件:
<child @input="buynumin" :vals="item.num"></child>
通过间接更改val更改子组件data内的数值。

第3种:
有同学使用REFS,当然也可以,但是REFS缺点只能在初始化的时候获取,而且需要延迟,不是必须要用到内部方法,可以不考虑。
但若因为过多的派发事件导致卡顿,也可考虑REFS。

继续阅读 »

子组件定义了data,但在父组件里直接:val动态传值发现失败。
如果直接向props动态传值又出现下面的错误提示,虽然也能改变,但是比较烦人。
Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "value"

解决办法如下,APP测试通过:

第0种【推荐】
用watch监听prpos里的值,来改变data里的内容
可以向子组件派发事件来操作,通过父组件使用@setdd="setval(2)",改变vueval来改变自定义组件值

data:{  
return {  
 dd:1  
}  
},  
prpos:{  
  setdd:{  
                type: String,  
                default: 'center'  
            }  
},  
watch: {  

setdd: {  
              immediate: true,  
              handler: function(val) {  
                let that=this;  
                console.log("监听")  
                that.dd= val;  
              }  
            }  
}  

以下方法也能用,只是有些地方可能不能满足
第1种,V-BIND动态传值

子组件
<input :type="type" v-model="vals" @input="inputin" class="put" disabled/>
props: {
vals: {
type: [Number],
default: 0
}
}
父组件可以直接
v-bind:vals="item.num"

第2种,不直接更改,内部消化。
子组件
<input :type="type" v-model="val" @input="inputin" class="put" disabled/>
data(){
return{
val:1
}
},
props: {
vals: {
type: [Number],
default: 0
}
}
在生命周期里:
created() {
let that=this;
if(that.vals){
that.val=that.vals;
}
},

父组件:
<child @input="buynumin" :vals="item.num"></child>
通过间接更改val更改子组件data内的数值。

第3种:
有同学使用REFS,当然也可以,但是REFS缺点只能在初始化的时候获取,而且需要延迟,不是必须要用到内部方法,可以不考虑。
但若因为过多的派发事件导致卡顿,也可考虑REFS。

收起阅读 »

nvue list长列表loadmore事件 循环数据的第一页数据一直在最下层

用nvue开发list长列表的时候下拉的时候发现
第一页加载的数据 在进行Loadmore加载的时候一直都是在列表的最下方出现
比如第一页加载了十条数据,然后第二页加载的时候第一页加载的数据会出现下第二页加载数据的下方,第三页加载后第一页数据会出现在第三页下方
排序就是第二页 第三页 第一页
对比了下list里的数据发现并没有什么问题,头疼了一个晚上加一个早上后
发现下其他页面的却不会出现这种情况

下面开始技术总结:
其他页面由于是用v-if延迟加载的 所以没有出现
在该页面使用v-if延迟加载后就没有出现这种情况了。
这问题太奇葩了。

继续阅读 »

用nvue开发list长列表的时候下拉的时候发现
第一页加载的数据 在进行Loadmore加载的时候一直都是在列表的最下方出现
比如第一页加载了十条数据,然后第二页加载的时候第一页加载的数据会出现下第二页加载数据的下方,第三页加载后第一页数据会出现在第三页下方
排序就是第二页 第三页 第一页
对比了下list里的数据发现并没有什么问题,头疼了一个晚上加一个早上后
发现下其他页面的却不会出现这种情况

下面开始技术总结:
其他页面由于是用v-if延迟加载的 所以没有出现
在该页面使用v-if延迟加载后就没有出现这种情况了。
这问题太奇葩了。

收起阅读 »

#uniapp/composition-api# 中使用 onShow、onLoad 这样的生命周期

Vue

我的思路是使用 mixin 得知 onShow 被触发后去回调 setup 中 onShow 设置的函数

setup 中的代码会是这样的

 setup(props, ctx) {  
    onLoad((...arg: any) => {  
      console.log("onLoad", arg);  
    });  
  },

在 app.vue 中 mixin

 export default Vue.extend({  
    mpType: "app",  
    mixins: [vueLifeCycleMixin],  
  });

vueLifeCycleMixin 的具体实现

import { defineComponent, getCurrentInstance } from "@vue/composition-api";  
import Vue from "vue";  
export const vueLifeCycleMixin = Vue.mixin(  
  defineComponent({  
    onLoad: optionsWarp("onLoad"),  
    onShow: optionsWarp("onShow"),  
  }),  
);  
export const onShow = onFunWarp("onShow");  
export const onLoad = onFunWarp("onLoad");  

function optionsWarp(name: string) {  
  return function (this: any, ...args: any[]) {  
    const field = generateFieldName(name);  
    if (Array.isArray(this[field])) {  
      (this[field] as any).forEach((el: any) => el(...args));  
    }  
  };  
}  
function generateFieldName(name: string) {  
  return `__${name}`;  
}  
function onFunWarp(name: string) {  
  name = generateFieldName(name);  
  return (cb: Function) => {  
    var vm = getCurrentInstance() as any;  
    if (!vm) {  
      return console.warn("读取vm实例失败,请确保在 setup 中执行");  
    }  
    if (!vm[name]) {  
      vm[name] = [];  
    }  
    vm[name].push(cb);  
  };  
}

by 崮生 from 崮生 • 一些随笔
本文欢迎分享与聚合,全文转载未经授权( 联系我)不许可 。

继续阅读 »

我的思路是使用 mixin 得知 onShow 被触发后去回调 setup 中 onShow 设置的函数

setup 中的代码会是这样的

 setup(props, ctx) {  
    onLoad((...arg: any) => {  
      console.log("onLoad", arg);  
    });  
  },

在 app.vue 中 mixin

 export default Vue.extend({  
    mpType: "app",  
    mixins: [vueLifeCycleMixin],  
  });

vueLifeCycleMixin 的具体实现

import { defineComponent, getCurrentInstance } from "@vue/composition-api";  
import Vue from "vue";  
export const vueLifeCycleMixin = Vue.mixin(  
  defineComponent({  
    onLoad: optionsWarp("onLoad"),  
    onShow: optionsWarp("onShow"),  
  }),  
);  
export const onShow = onFunWarp("onShow");  
export const onLoad = onFunWarp("onLoad");  

function optionsWarp(name: string) {  
  return function (this: any, ...args: any[]) {  
    const field = generateFieldName(name);  
    if (Array.isArray(this[field])) {  
      (this[field] as any).forEach((el: any) => el(...args));  
    }  
  };  
}  
function generateFieldName(name: string) {  
  return `__${name}`;  
}  
function onFunWarp(name: string) {  
  name = generateFieldName(name);  
  return (cb: Function) => {  
    var vm = getCurrentInstance() as any;  
    if (!vm) {  
      return console.warn("读取vm实例失败,请确保在 setup 中执行");  
    }  
    if (!vm[name]) {  
      vm[name] = [];  
    }  
    vm[name].push(cb);  
  };  
}

by 崮生 from 崮生 • 一些随笔
本文欢迎分享与聚合,全文转载未经授权( 联系我)不许可 。

收起阅读 »

iOS未检测到手机或模拟器

问题:windows10下使用hbuilderx2.9.8,iTunes12.11.0,连接苹果手机,显示未检测到手机或模拟器
解决:回退hbuilderx版本到2.8.13,iTunes使用版本 12.10.8.5

问题:windows10下使用hbuilderx2.9.8,iTunes12.11.0,连接苹果手机,显示未检测到手机或模拟器
解决:回退hbuilderx版本到2.8.13,iTunes使用版本 12.10.8.5

关于upx单位,旋转为横屏,再返回,在进入新页面,这个页面样式错乱的问题

横屏

我是使用了setTimeout 延迟1500毫秒后,目前观测可以解决该问题

setTimeout(function() {  
    plus.screen.lockOrientation("landscape-primary");  
    dosomething.....  
}, 1500)

我看别人解决方法是横屏页返回后先跳转到一个空白页在立即返回,也可解决

监听从横屏页返回后, 我跳转到一个空白页D, 空白页D在返回, 类似一个中转, 手动制造一次重进的操作
即 A -> B(横屏) -> A -> D(横屏B返回A后立即跳转空白页D,在返回A) -> A -> C (此时页面正常), 跳转空白页从肉眼看无感知

继续阅读 »

我是使用了setTimeout 延迟1500毫秒后,目前观测可以解决该问题

setTimeout(function() {  
    plus.screen.lockOrientation("landscape-primary");  
    dosomething.....  
}, 1500)

我看别人解决方法是横屏页返回后先跳转到一个空白页在立即返回,也可解决

监听从横屏页返回后, 我跳转到一个空白页D, 空白页D在返回, 类似一个中转, 手动制造一次重进的操作
即 A -> B(横屏) -> A -> D(横屏B返回A后立即跳转空白页D,在返回A) -> A -> C (此时页面正常), 跳转空白页从肉眼看无感知

收起阅读 »

条件编译的一点小建议

自行扩展条件编译平台 条件编译

目前的条件编译语句有 #ifdef 、#ifndef ,以 #endif;总感觉不太舒服,虽然完全可以实现所有的目标,总感觉缺少了点什么,建议加入 #elseif、#else这样就完美了.
例如:
#ifdef H5
...
#endif
#ifdef APP
...
#endif
#ifndef H5 || APP
...
#endif
这样写起来总感觉有点繁琐.如果加入了#elseif 和 $else就方便多了.写起来比较简洁
#ifdef H5
...
#elseif APP
...
#else
...
#endif
这样立马减少了很多代码行.而看起来也比较舒服.

大概意思就是这么个.如有错误的地方请包涵. 望采纳.

继续阅读 »

目前的条件编译语句有 #ifdef 、#ifndef ,以 #endif;总感觉不太舒服,虽然完全可以实现所有的目标,总感觉缺少了点什么,建议加入 #elseif、#else这样就完美了.
例如:
#ifdef H5
...
#endif
#ifdef APP
...
#endif
#ifndef H5 || APP
...
#endif
这样写起来总感觉有点繁琐.如果加入了#elseif 和 $else就方便多了.写起来比较简洁
#ifdef H5
...
#elseif APP
...
#else
...
#endif
这样立马减少了很多代码行.而看起来也比较舒服.

大概意思就是这么个.如有错误的地方请包涵. 望采纳.

收起阅读 »

uni.requestPayment支付宝支付成功后的回调,返回的结果数据格式有问题

uniapp

如题,在用 uniapp做APP的时候,需要用到支付,在用uni.requestPayment的时候,一切都很顺利,成功后,后端说要给他支付宝返回的订单号(trade_no),本以为正常可以拿到,结果,JSON.stringify把结果打印出来之后,放进json.cn里面根本没法正常转义,一层一层刨开发现对象里面多了一句话,如图。红框框起来的都是多余的,包括花括号,去掉就可以正常字符串转对象。真的拉胯,字符串太长了,不想看,一直以为返回结果没问题,弄了半天~~

希望官方看到后能处理一下!!!

附解决方案代码:
pullUpPay(provider, orderInfo) {
let that = this
uni.requestPayment({
provider: provider,
orderInfo: orderInfo, // 微信、支付宝订单数据
success: function (res) {
console.log('success:' + JSON.stringify(res))
console.log('缴费成功')
if(provider === 'alipay') {
console.log('rawdata:' + res.rawdata)

                    let rawData = JSON.parse(res.rawdata) // 取对象中的rawdata  

                    let resultStr = rawData.result // 取出result字符串  

                    let resultList = resultStr.split(';') // 分号分割,取第0个  

                    let finalRes = resultList[0].substring(0, resultList[0].length - 1) // 将取出来的第0个字符串的最后一位花括号去掉  

                    let finalObject = JSON.parse(finalRes) // 正常转义  

                    let trade_no = finalObject.alipay_trade_app_pay_response.trade_no // 取出订单号  

                    console.log(trade_no)  
                } else if(provider === 'wxpay') {  
                    // 微信支付申请还没通过,出了问题,估计也和支付宝一样  
                }  
            },  
            fail: function (err) {  
                console.log('fail:' + JSON.stringify(err))  
                console.log('缴费失败')  
            }  
        })  
    }
继续阅读 »

如题,在用 uniapp做APP的时候,需要用到支付,在用uni.requestPayment的时候,一切都很顺利,成功后,后端说要给他支付宝返回的订单号(trade_no),本以为正常可以拿到,结果,JSON.stringify把结果打印出来之后,放进json.cn里面根本没法正常转义,一层一层刨开发现对象里面多了一句话,如图。红框框起来的都是多余的,包括花括号,去掉就可以正常字符串转对象。真的拉胯,字符串太长了,不想看,一直以为返回结果没问题,弄了半天~~

希望官方看到后能处理一下!!!

附解决方案代码:
pullUpPay(provider, orderInfo) {
let that = this
uni.requestPayment({
provider: provider,
orderInfo: orderInfo, // 微信、支付宝订单数据
success: function (res) {
console.log('success:' + JSON.stringify(res))
console.log('缴费成功')
if(provider === 'alipay') {
console.log('rawdata:' + res.rawdata)

                    let rawData = JSON.parse(res.rawdata) // 取对象中的rawdata  

                    let resultStr = rawData.result // 取出result字符串  

                    let resultList = resultStr.split(';') // 分号分割,取第0个  

                    let finalRes = resultList[0].substring(0, resultList[0].length - 1) // 将取出来的第0个字符串的最后一位花括号去掉  

                    let finalObject = JSON.parse(finalRes) // 正常转义  

                    let trade_no = finalObject.alipay_trade_app_pay_response.trade_no // 取出订单号  

                    console.log(trade_no)  
                } else if(provider === 'wxpay') {  
                    // 微信支付申请还没通过,出了问题,估计也和支付宝一样  
                }  
            },  
            fail: function (err) {  
                console.log('fail:' + JSON.stringify(err))  
                console.log('缴费失败')  
            }  
        })  
    }
收起阅读 »

DCloud官方会优先处理哪些帖子?为什么我发的帖子总没人理?社群的规则是什么样的?

高效报Bug的姿势 社区bug处理优先级说明

DCloud旗下软件产品有900多万开发者;为了服务到更多的开发者,会把时间集中在更加精准的咨询上。

有些开发者在社区发帖,报bug后遇到没人理会的情况。
主要原因如下:
1.遇到较为直接的问题,应当先运行项目模板hello uni-app示例,看看是否也存在bug。如果不存在说明是你的其他代码逻辑或项目配置影响,先排查具体原因再发帖。如果一样存在,这极有可能是你的设备兼容问题。此时您只要通过报bug模板,说明清楚你的设备信息和bug描述我们就能快速定位你的问题原因。
2.发帖类型错误,不是【提交Bug】类型,从而提交的内容缺少了:设备和开发环境信息导致bug无法复现。同时还缺少了bug类型,导致未能将问题反馈到对应的组,更加高效专业地分析处理。
3.必要的情况下,没有提供能复现bug的demo。或者demo不完整无法直接运行代码的片段。
4.提供的示例,有过多与bug非相关复杂的业务逻辑代码。应当将该代码在一个空项目内复现后提交,避免无相关的逻辑导致冲突而去怀疑技术本身。
5.难以描述的复现过程。建议用手机录屏功能录制一个直观的视频压缩后提交。

社群规则

积分奖罚机制: 提交一个【报Bug】扣20分,但管理员确认Bug后会增加50分,即成功报一个Bug【奖励30分】,误报bug浪费技术资源【罚20分】
积分的作用 : 分数高的用户享有优先的bug处理权重。换句话说我们会去惩罚经常不经自己调试误报bug,浪费技术资源的开发者。同时鼓励开发者积极准确的报bug。并有计划为高分用户创建vip群,近距离高频对接问题和倾听大家对生态的发展方向建议。

综上所述:bug处理优先级 = (项目类型/平台环境/手机系统/问题描述...)等信息是否完整+是否有示例代码+是否有复现视频+用户等级

科学要的是数据而不是情绪,为了高效地社群服务。快速地定位你的问题。为了可以服务更多的开发者。请亲们仔细阅读本文。

继续阅读 »

DCloud旗下软件产品有900多万开发者;为了服务到更多的开发者,会把时间集中在更加精准的咨询上。

有些开发者在社区发帖,报bug后遇到没人理会的情况。
主要原因如下:
1.遇到较为直接的问题,应当先运行项目模板hello uni-app示例,看看是否也存在bug。如果不存在说明是你的其他代码逻辑或项目配置影响,先排查具体原因再发帖。如果一样存在,这极有可能是你的设备兼容问题。此时您只要通过报bug模板,说明清楚你的设备信息和bug描述我们就能快速定位你的问题原因。
2.发帖类型错误,不是【提交Bug】类型,从而提交的内容缺少了:设备和开发环境信息导致bug无法复现。同时还缺少了bug类型,导致未能将问题反馈到对应的组,更加高效专业地分析处理。
3.必要的情况下,没有提供能复现bug的demo。或者demo不完整无法直接运行代码的片段。
4.提供的示例,有过多与bug非相关复杂的业务逻辑代码。应当将该代码在一个空项目内复现后提交,避免无相关的逻辑导致冲突而去怀疑技术本身。
5.难以描述的复现过程。建议用手机录屏功能录制一个直观的视频压缩后提交。

社群规则

积分奖罚机制: 提交一个【报Bug】扣20分,但管理员确认Bug后会增加50分,即成功报一个Bug【奖励30分】,误报bug浪费技术资源【罚20分】
积分的作用 : 分数高的用户享有优先的bug处理权重。换句话说我们会去惩罚经常不经自己调试误报bug,浪费技术资源的开发者。同时鼓励开发者积极准确的报bug。并有计划为高分用户创建vip群,近距离高频对接问题和倾听大家对生态的发展方向建议。

综上所述:bug处理优先级 = (项目类型/平台环境/手机系统/问题描述...)等信息是否完整+是否有示例代码+是否有复现视频+用户等级

科学要的是数据而不是情绪,为了高效地社群服务。快速地定位你的问题。为了可以服务更多的开发者。请亲们仔细阅读本文。

收起阅读 »

uniapp 体积优化秘技

体积优化

uniapp 体积优化秘技

这个方法很简单很有效,只有一句话「不要在 main.js 中加任何一行代码」

下面是我的一个示例

示例

之前这个 main.ts 中还有很多其他杂七杂八的东西,预览的时候体积是 2321KB。都没有办法预览

全部移动到其他地方之后体积降到了 2138KB 虽然还是没有办法预览但体积确实减小了。

编译之后的体积也会有大幅缩小。

原理

uni-app 会将 main.js 中的代码 copy 一份到所有的 生成后的 js 文件中,这是没有必要的,我们将这些代码移动到其他文件然后被打包到 vendor.js 就可以避免这个问题。

即便你 main.js 中之前只有 30 行其他代码,但使用这个方法之后也会得到可观的体积优化。

这个方法我在两个项目中使用到了,即使编译后体积也有 100KB 以上的优化,当然这个优化的大小取决于你 main.js 中的代码数。如果你的项目中 main.js 中有很多代码的话这个方法值得一试!

by 崮生 from 崮生 • 一些随笔
本文欢迎分享与聚合,全文转载未经授权( 联系我)不许可 。

继续阅读 »

uniapp 体积优化秘技

这个方法很简单很有效,只有一句话「不要在 main.js 中加任何一行代码」

下面是我的一个示例

示例

之前这个 main.ts 中还有很多其他杂七杂八的东西,预览的时候体积是 2321KB。都没有办法预览

全部移动到其他地方之后体积降到了 2138KB 虽然还是没有办法预览但体积确实减小了。

编译之后的体积也会有大幅缩小。

原理

uni-app 会将 main.js 中的代码 copy 一份到所有的 生成后的 js 文件中,这是没有必要的,我们将这些代码移动到其他文件然后被打包到 vendor.js 就可以避免这个问题。

即便你 main.js 中之前只有 30 行其他代码,但使用这个方法之后也会得到可观的体积优化。

这个方法我在两个项目中使用到了,即使编译后体积也有 100KB 以上的优化,当然这个优化的大小取决于你 main.js 中的代码数。如果你的项目中 main.js 中有很多代码的话这个方法值得一试!

by 崮生 from 崮生 • 一些随笔
本文欢迎分享与聚合,全文转载未经授权( 联系我)不许可 。

收起阅读 »

uniapp运行到微信开发者工具出现 [ WXSS 文件编译错误] 的解决办法

问题描述:

uniapp运行到微信开发者工具,在控制台出现:[ WXSS 文件编译错误]提示,如图:

控制台点击main.wxss文件发现在uniapp中定义的uni.scss变量保持原样,没有经过编译,如图:

问题出现的原因:

经过查找发现,是由于我在app.vue中手动引入了uni.scss,并未在style标签上声明scss模式,所以uni.scss内定义的css变量就未经编译,被当做普通css进行引入,编译到小程序后,wxss不识别所以报错,如图:

解决办法:

1.不要在app.vue或其它文件内手动引用uni.scss,默认无需引用,就可以直接在其它文件的<style lang="scss">内调用里面的css变量
2.如果手动引用了,记得在style标签上声明为scss模式,如:

<style lang="scss">  
      /*但凡用到scss方式设置css的地方都要在标签上显示声明*/  
      ...  
</style>

uni.scss官方说明文档:https://uniapp.dcloud.io/collocation/uni-scss?id=collocation

另补充:奇怪的是编译到APP平台不报错,按道理官方应该也需要处理一下遇到这种引用scss,未声明style模式的时候,给一个报错提示

继续阅读 »

问题描述:

uniapp运行到微信开发者工具,在控制台出现:[ WXSS 文件编译错误]提示,如图:

控制台点击main.wxss文件发现在uniapp中定义的uni.scss变量保持原样,没有经过编译,如图:

问题出现的原因:

经过查找发现,是由于我在app.vue中手动引入了uni.scss,并未在style标签上声明scss模式,所以uni.scss内定义的css变量就未经编译,被当做普通css进行引入,编译到小程序后,wxss不识别所以报错,如图:

解决办法:

1.不要在app.vue或其它文件内手动引用uni.scss,默认无需引用,就可以直接在其它文件的<style lang="scss">内调用里面的css变量
2.如果手动引用了,记得在style标签上声明为scss模式,如:

<style lang="scss">  
      /*但凡用到scss方式设置css的地方都要在标签上显示声明*/  
      ...  
</style>

uni.scss官方说明文档:https://uniapp.dcloud.io/collocation/uni-scss?id=collocation

另补充:奇怪的是编译到APP平台不报错,按道理官方应该也需要处理一下遇到这种引用scss,未声明style模式的时候,给一个报错提示

收起阅读 »