HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

#需求# uniapp亟待优化

新需求
  • 2020年chromium 83之后不再兼容4.4,app端js engine一直停在基于83的版本。uniapp应该提供“现代”的js引擎,让开发者能按需选择

  • 更灵活的针对vue3 patch的方式,让开发者能按需使用,或者定期跟进vue 3 大版本

  • vite vue3分包下打包到app,依然还是将js合到一个大的app-service.js中,分包的css也不支持手动配置优化。应该能按照vite的打包配置,拆分(js/css)到各个chunk,应用启动时只加载首页资源,同时可以利用类似link prefetch/module preload的特性,让开发者能按需预载其它页面需要的(静态)资源。以达到最高的加载效率

  • uniapp目前还在用着老旧的vite/sass版本,但在cli项目中手动更新至vite 7/sass 1.100 其实是能正常运行的,只是组件库基本都因为过时方式导致过多sass警告信息

。。。

继续阅读 »
  • 2020年chromium 83之后不再兼容4.4,app端js engine一直停在基于83的版本。uniapp应该提供“现代”的js引擎,让开发者能按需选择

  • 更灵活的针对vue3 patch的方式,让开发者能按需使用,或者定期跟进vue 3 大版本

  • vite vue3分包下打包到app,依然还是将js合到一个大的app-service.js中,分包的css也不支持手动配置优化。应该能按照vite的打包配置,拆分(js/css)到各个chunk,应用启动时只加载首页资源,同时可以利用类似link prefetch/module preload的特性,让开发者能按需预载其它页面需要的(静态)资源。以达到最高的加载效率

  • uniapp目前还在用着老旧的vite/sass版本,但在cli项目中手动更新至vite 7/sass 1.100 其实是能正常运行的,只是组件库基本都因为过时方式导致过多sass警告信息

。。。

收起阅读 »

分享一下之前的版本

HBuilderX

分享一下之前的版本

分享一下之前的版本

uniappx 基础脚手架,拒绝重复造轮子

uniappx 基础脚手架,包含功能:

  1. 基础简单的登录示例代码
  2. request请求封装
  3. 跳转 + 登录白名单/拦截
  4. 版本更新(多渠道,应用市场, 蒲公英分发或第三方链接等平台)
  5. 文件的上传下载
  6. 图像裁剪上传封装
  7. 主题的切换,包括明暗主题与自定义主题等
继续阅读 »

uniappx 基础脚手架,包含功能:

  1. 基础简单的登录示例代码
  2. request请求封装
  3. 跳转 + 登录白名单/拦截
  4. 版本更新(多渠道,应用市场, 蒲公英分发或第三方链接等平台)
  5. 文件的上传下载
  6. 图像裁剪上传封装
  7. 主题的切换,包括明暗主题与自定义主题等
收起阅读 »

打包

打包

三点打包。提示还有一分钟开始打包,然后打到五点。 打包两小时。这是不让下班了

三点打包。提示还有一分钟开始打包,然后打到五点。 打包两小时。这是不让下班了

用CodeBuddy做了几个药店小程序的功能,电子处方,用药安全,药品追溯码

微信小程序

随着线上售药监管规则持续细化,线上药店小程序不再只是简单的下单工具,电子处方、用药安全确认、药品追溯码是满足药监核查的三大核心基础功能,也是线上经营必备合规模块。
元岳科技在原电子处方的基础上,新增了用药安全日志和本地药品追溯的功能。
一、电子处方闭环功能:规范处方药线上流转
根据《处方药网络零售合规指南》要求,线上售卖处方药必须形成完整审方流程,该模块核心作用是搭建标准化处方留存链路。
使用流程:用户选购处方药后,需完成实名登记,上传复诊处方;系统仅开放执业药师实名账号审核,全程记录操作人、操作时间,日志不可篡改。

//创建处方  
    public function createRxinfo($tmpId,$name,$phone,$age,$sex){  

        $url = $this->url."createRxinfo";  

        list($s1, $s2) = explode(' ', microtime());  
        $timestamp = (float)sprintf('%.0f',((float)$s1 + (float)$s2) * 1000);  

        $disease_json = $this->queryIcdPage();  
        $rx_item_json = $this->get_drug();  

        $data = [  
            "ywid" => "xz".$timestamp,//自定义的id  
            "status" => -1,  
            "patient_name" => $name,  
            "patient_age" => $age,  
            "patient_sex" => $sex,  
            "patient_phone" => $phone,  
            "rx_item_json" => $rx_item_json,  
            "disease_json" => $disease_json,  
            "timestamp" =>$timestamp,  
            "api_code"=>$this->api_code,  
            "temp_id"=>$tmpId  
        ];  

        $sign_str = $this->getSign($data);  
        $b_md5 = $sign_str . md5( $this->api_s);  
        $api_sign = strtolower( md5($b_md5) );  
        $data['api_sign'] = $api_sign;  

        $Data = $this->request($url,"POST",$data);  
        //var_dump($Data);die;  
        $Arr = json_decode($Data,1);  
        //var_dump($Arr);  

        return $Arr;  
    }  

风控机制:系统自动拦截重复复用处方、超剂量购药、禁忌药搭配等异常订单,杜绝先购药后补处方的违规行为。
留存规范:问诊记录、处方原件、审方记录自动加密存储,保存周期满足法规 5 年留存要求,监管抽查可一键导出审计台账。
市面上简易线上工具普遍缺少实名留痕、订单熔断机制,一旦核查无法提供完整凭证,极易产生处罚风险。
二、用药安全确认功能:完善线上药学服务凭证
《药品经营质量管理规范》明确,药品销售需留存用药风险告知记录,线上渠道必须设置标准化确认环节。
分层风险提示:系统自动识别药品类目,针对处方药、特殊人群用药,弹窗展示过敏禁忌、肝肾负担、孕期慎用等专业提示。
强制确认机制:用户必须勾选阅读知情同意、确认知晓用药风险,未完成确认无法提交订单,自动留存电子确认凭证。
配套咨询通道:订单页面内置药师咨询入口,购药前后用药沟通记录自动归档,若出现用药不良反应纠纷,可作为门店履行药学服务的有效依据。
传统线上商城仅设置付款流程,缺少该环节会存在民事赔偿与行政处罚双重隐患。

 /**  
     * 用药安全日志详情  
     * 通过 Service.getLogPage 获取数据(含 user/order 关联,含 nickname、phone)  
     * @param int $id  
     * @return mixed  
     */  
    public function info($id)  
    {  
        if (!$id) {  
            return app('json')->fail('参数错误');  
        }  

        try {  
            // 使用 Service 层 getLogPage + id 搜索器(利用新增 searchIdAttr)获取含关联数据的记录  
            $result = $this->service->getLogPage(['id' => (int)$id]);  
            $list   = $result['list'] ?? [];  
            if (empty($list)) {  
                return app('json')->fail('日志不存在');  
            }  
            $log = is_object($list[0]) ? $list[0]->toArray() : (array)$list[0];  
        } catch (\Throwable $e) {  
            Log::error('查看用药安全日志详情失败:' . $e->getMessage() . ',id=' . $id);  
            return app('json')->fail('查询失败');  
        }  

        // 格式化  
        $log['create_time_text'] = isset($log['create_time']) && $log['create_time']  
            ? date('Y-m-d H:i:s', (int)$log['create_time'])  
            : '—';  
        $log['pop_confirm_type_text'] = self::POP_CONFIRM_TYPE_MAP[$log['pop_confirm_type'] ?? 'none'] ?? '无弹窗';  
        $log['nickname'] = $log['nickname'] ?? '—';  
        $log['phone']    = $log['phone'] ?? '—';  
        $log['patient_name'] = $log['patient_name'] ?? '—';  
        if ($log['patient_name'] === '—' && !empty($log['patient_id'])) {  
            $p = UserInquiry::find((int)$log['patient_id']);  
            $log['patient_name'] = $p ? ($p['patient_name'] ?? '—') : '—';  
        }  
        if ($log['patient_name'] === '—') {  
            $log['patient_name'] = $log['order_real_name'] ?? '—';  
        }  

        // 4项安全字段中文标注  
        $log['safe_fields_text'] = [];  
        foreach (self::SAFE_FIELD_MAP as $field => $label) {  
            $log['safe_fields_text'][] = [  
                'field' => $field,  
                'label' => $label,  
                'value' => isset($log[$field]) ? ($log[$field] ? '是' : '否') : '—',  
            ];  
        }  

        return app('json')->success($log);  
    }

三、国标药品追溯码功能:实现药品一盒一码可查 依据《药品管理法》,药品经营主体需搭建全链路追溯体系,统一采用 Code128-C 20 位标准条码。

   // 按商品分组获取可用追溯码,只获取所需数量  
        Db::startTrans();  
        try {  
            $allBoundCodes = [];  

            foreach ($orderGoods as $product) {  
                $productId = $product['product_id'];  
                $cartId = $product['cart_id'];  
                $needNum = $product['cart_num'] ?? 1;  

                if ($needNum <= 0) {  
                    continue;  
                }  

                // 获取该商品的可用追溯码(在库且未删除),限制数量  
                $traceCodes = TraceStock::where('product_id', $productId)  
                    ->where('trace_status', TraceStock::TRACE_STATUS_IN_STOCK)  
                    ->where('is_deleted', 0)  
                    ->limit($needNum)  
                    ->select();  

                if ($traceCodes->isEmpty()) {  
                    Log::warning('订单' . $orderId . ' 商品' . $productId . '无可用追溯码库存');  
                    continue;  
                }  

                $boundCodes = [];  
                foreach ($traceCodes as $code) {  
                    $success = TraceStock::lockSale($code['id'], $orderId);  
                    if ($success) {  
                        $boundCodes[] = $code['id'];  
                    }  
                }  

                if (!empty($boundCodes)) {  
                    $allBoundCodes = array_merge($allBoundCodes, $boundCodes);  
                    $codeIdsStr = implode(',', $boundCodes);  

                    // 更新该订单明细的追溯码ID字段  
                    StoreOrderCartInfo::where('id', $cartId)  
                        ->update([  
                            'trace_code_ids' => Db::raw("CONCAT(trace_code_ids, '" . $codeIdsStr . "')")  
                        ]);  
                }  
            }  

            Db::commit();  

            Log::info('订单' . $orderId . ' 溯源绑定完成,绑定码数:' . count($allBoundCodes));  

        } catch (\Exception $e) {  
            Db::rollback();  
            Log::error('订单' . $orderId . ' 溯源绑定事务失败:' . $e->getMessage());  
            return false;  
        }  

    } catch (\Throwable $e) {  
        Log::error('订单' . $orderId . ' 溯源绑定异常:' . $e->getMessage());  
        // 仅记录日志,不阻断订单流程  
        return false;  
    }  
}

商家后台使用逻辑
双录入模式:支持扫码枪批量录入、文本手动导入追溯码,自动匹配对应药品规格;
双重校验规则:录入码数量与订单库存比对,货码不符、库存不足时锁定发货按钮;
商品分类适配:药品强制绑定追溯码,保健品、器械等非药品可跳过录入,提升发货效率。
用户前端查询逻辑
订单详情内置追溯码查看入口,弹窗展示标准条码,支持微信、支付宝扫码,一键调取药品生产、流通、销售全链条信息,满足公众溯源查询法定要求。
四、三大功能整体行业价值

作者:元岳ossign

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

继续阅读 »

随着线上售药监管规则持续细化,线上药店小程序不再只是简单的下单工具,电子处方、用药安全确认、药品追溯码是满足药监核查的三大核心基础功能,也是线上经营必备合规模块。
元岳科技在原电子处方的基础上,新增了用药安全日志和本地药品追溯的功能。
一、电子处方闭环功能:规范处方药线上流转
根据《处方药网络零售合规指南》要求,线上售卖处方药必须形成完整审方流程,该模块核心作用是搭建标准化处方留存链路。
使用流程:用户选购处方药后,需完成实名登记,上传复诊处方;系统仅开放执业药师实名账号审核,全程记录操作人、操作时间,日志不可篡改。

//创建处方  
    public function createRxinfo($tmpId,$name,$phone,$age,$sex){  

        $url = $this->url."createRxinfo";  

        list($s1, $s2) = explode(' ', microtime());  
        $timestamp = (float)sprintf('%.0f',((float)$s1 + (float)$s2) * 1000);  

        $disease_json = $this->queryIcdPage();  
        $rx_item_json = $this->get_drug();  

        $data = [  
            "ywid" => "xz".$timestamp,//自定义的id  
            "status" => -1,  
            "patient_name" => $name,  
            "patient_age" => $age,  
            "patient_sex" => $sex,  
            "patient_phone" => $phone,  
            "rx_item_json" => $rx_item_json,  
            "disease_json" => $disease_json,  
            "timestamp" =>$timestamp,  
            "api_code"=>$this->api_code,  
            "temp_id"=>$tmpId  
        ];  

        $sign_str = $this->getSign($data);  
        $b_md5 = $sign_str . md5( $this->api_s);  
        $api_sign = strtolower( md5($b_md5) );  
        $data['api_sign'] = $api_sign;  

        $Data = $this->request($url,"POST",$data);  
        //var_dump($Data);die;  
        $Arr = json_decode($Data,1);  
        //var_dump($Arr);  

        return $Arr;  
    }  

风控机制:系统自动拦截重复复用处方、超剂量购药、禁忌药搭配等异常订单,杜绝先购药后补处方的违规行为。
留存规范:问诊记录、处方原件、审方记录自动加密存储,保存周期满足法规 5 年留存要求,监管抽查可一键导出审计台账。
市面上简易线上工具普遍缺少实名留痕、订单熔断机制,一旦核查无法提供完整凭证,极易产生处罚风险。
二、用药安全确认功能:完善线上药学服务凭证
《药品经营质量管理规范》明确,药品销售需留存用药风险告知记录,线上渠道必须设置标准化确认环节。
分层风险提示:系统自动识别药品类目,针对处方药、特殊人群用药,弹窗展示过敏禁忌、肝肾负担、孕期慎用等专业提示。
强制确认机制:用户必须勾选阅读知情同意、确认知晓用药风险,未完成确认无法提交订单,自动留存电子确认凭证。
配套咨询通道:订单页面内置药师咨询入口,购药前后用药沟通记录自动归档,若出现用药不良反应纠纷,可作为门店履行药学服务的有效依据。
传统线上商城仅设置付款流程,缺少该环节会存在民事赔偿与行政处罚双重隐患。

 /**  
     * 用药安全日志详情  
     * 通过 Service.getLogPage 获取数据(含 user/order 关联,含 nickname、phone)  
     * @param int $id  
     * @return mixed  
     */  
    public function info($id)  
    {  
        if (!$id) {  
            return app('json')->fail('参数错误');  
        }  

        try {  
            // 使用 Service 层 getLogPage + id 搜索器(利用新增 searchIdAttr)获取含关联数据的记录  
            $result = $this->service->getLogPage(['id' => (int)$id]);  
            $list   = $result['list'] ?? [];  
            if (empty($list)) {  
                return app('json')->fail('日志不存在');  
            }  
            $log = is_object($list[0]) ? $list[0]->toArray() : (array)$list[0];  
        } catch (\Throwable $e) {  
            Log::error('查看用药安全日志详情失败:' . $e->getMessage() . ',id=' . $id);  
            return app('json')->fail('查询失败');  
        }  

        // 格式化  
        $log['create_time_text'] = isset($log['create_time']) && $log['create_time']  
            ? date('Y-m-d H:i:s', (int)$log['create_time'])  
            : '—';  
        $log['pop_confirm_type_text'] = self::POP_CONFIRM_TYPE_MAP[$log['pop_confirm_type'] ?? 'none'] ?? '无弹窗';  
        $log['nickname'] = $log['nickname'] ?? '—';  
        $log['phone']    = $log['phone'] ?? '—';  
        $log['patient_name'] = $log['patient_name'] ?? '—';  
        if ($log['patient_name'] === '—' && !empty($log['patient_id'])) {  
            $p = UserInquiry::find((int)$log['patient_id']);  
            $log['patient_name'] = $p ? ($p['patient_name'] ?? '—') : '—';  
        }  
        if ($log['patient_name'] === '—') {  
            $log['patient_name'] = $log['order_real_name'] ?? '—';  
        }  

        // 4项安全字段中文标注  
        $log['safe_fields_text'] = [];  
        foreach (self::SAFE_FIELD_MAP as $field => $label) {  
            $log['safe_fields_text'][] = [  
                'field' => $field,  
                'label' => $label,  
                'value' => isset($log[$field]) ? ($log[$field] ? '是' : '否') : '—',  
            ];  
        }  

        return app('json')->success($log);  
    }

三、国标药品追溯码功能:实现药品一盒一码可查 依据《药品管理法》,药品经营主体需搭建全链路追溯体系,统一采用 Code128-C 20 位标准条码。

   // 按商品分组获取可用追溯码,只获取所需数量  
        Db::startTrans();  
        try {  
            $allBoundCodes = [];  

            foreach ($orderGoods as $product) {  
                $productId = $product['product_id'];  
                $cartId = $product['cart_id'];  
                $needNum = $product['cart_num'] ?? 1;  

                if ($needNum <= 0) {  
                    continue;  
                }  

                // 获取该商品的可用追溯码(在库且未删除),限制数量  
                $traceCodes = TraceStock::where('product_id', $productId)  
                    ->where('trace_status', TraceStock::TRACE_STATUS_IN_STOCK)  
                    ->where('is_deleted', 0)  
                    ->limit($needNum)  
                    ->select();  

                if ($traceCodes->isEmpty()) {  
                    Log::warning('订单' . $orderId . ' 商品' . $productId . '无可用追溯码库存');  
                    continue;  
                }  

                $boundCodes = [];  
                foreach ($traceCodes as $code) {  
                    $success = TraceStock::lockSale($code['id'], $orderId);  
                    if ($success) {  
                        $boundCodes[] = $code['id'];  
                    }  
                }  

                if (!empty($boundCodes)) {  
                    $allBoundCodes = array_merge($allBoundCodes, $boundCodes);  
                    $codeIdsStr = implode(',', $boundCodes);  

                    // 更新该订单明细的追溯码ID字段  
                    StoreOrderCartInfo::where('id', $cartId)  
                        ->update([  
                            'trace_code_ids' => Db::raw("CONCAT(trace_code_ids, '" . $codeIdsStr . "')")  
                        ]);  
                }  
            }  

            Db::commit();  

            Log::info('订单' . $orderId . ' 溯源绑定完成,绑定码数:' . count($allBoundCodes));  

        } catch (\Exception $e) {  
            Db::rollback();  
            Log::error('订单' . $orderId . ' 溯源绑定事务失败:' . $e->getMessage());  
            return false;  
        }  

    } catch (\Throwable $e) {  
        Log::error('订单' . $orderId . ' 溯源绑定异常:' . $e->getMessage());  
        // 仅记录日志,不阻断订单流程  
        return false;  
    }  
}

商家后台使用逻辑
双录入模式:支持扫码枪批量录入、文本手动导入追溯码,自动匹配对应药品规格;
双重校验规则:录入码数量与订单库存比对,货码不符、库存不足时锁定发货按钮;
商品分类适配:药品强制绑定追溯码,保健品、器械等非药品可跳过录入,提升发货效率。
用户前端查询逻辑
订单详情内置追溯码查看入口,弹窗展示标准条码,支持微信、支付宝扫码,一键调取药品生产、流通、销售全链条信息,满足公众溯源查询法定要求。
四、三大功能整体行业价值

作者:元岳ossign

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

收起阅读 »

java.lang.SecurityException: Shell does not have permission to access user 100 运行真机报错终于解决了

真机运行

报错原文

2026-08-06 15:22:08.448 [WARNING:] [PluginHost] Error: Command failed: E:\HBuilderX\plugins\launcher-tools\tools\adbs\adb.exe -s adb-AN2FVB1731016322-t2CsiT._adb-tls-connect._tcp shell pm list packages io.dcloud.HBuilder  
Exception occurred while executing 'list':  
java.lang.SecurityException: Shell does not have permission to access user 100  
com.android.server.am.ActivityManagerService.handleIncomingUser:14620 android.app.ActivityManager.handleIncomingUser:4753 com.android.server.pm.PackageManagerShellCommand.translateUserId:3853  
at com.android.server.am.UserController.handleIncomingUser(UserController.java:2745)  
at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:14620)  
at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:4753)  
at com.android.server.pm.PackageManagerShellCommand.translateUserId(PackageManagerShellCommand.java:3853)  
at com.android.server.pm.PackageManagerShellCommand.runListPackages(PackageManagerShellCommand.java:1060)  
at com.android.server.pm.PackageManagerShellCommand.runListPackages(PackageManagerShellCommand.java:956)  
at com.android.server.pm.PackageManagerShellCommand.runList(PackageManagerShellCommand.java:792)  
at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:230)  
at com.android.modules.utils.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:97)  
at android.os.ShellCommand.exec(ShellCommand.java:38)  
at com.android.server.pm.PackageManagerService$IPackageManagerImpl.onShellCommand(PackageManagerService.java:7086)  
at android.os.Binder.shellCommand(Binder.java:1087)  
at android.os.Binder.onTransact(Binder.java:904)  
at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:4368)  
at com.android.server.pm.PackageManagerService$IPackageManagerImpl.onTransact(PackageManagerService.java:7062)  
at android.os.Binder.execTransactInternal(Binder.java:1371)  
at android.os.Binder.execTransact(Binder.java:1310)  
at genericNodeError (node:internal/errors:983:15)  
at wrappedFn (node:internal/errors:537:14)  
at ChildProcess.exithandler (node:child_process:417:12)  
at ChildProcess.emit (node:events:519:28)  
at maybeClose (node:internal/child_process:1101:16)  
at ChildProcess._handle.onexit (node:internal/child_process:304:5) {  
code: 255,  
killed: false,  
signal: null,  
cmd: 'E:\HBuilderX\plugins\launcher-tools\tools\adbs\adb.exe -s adb-AN2FVB1731016322-t2CsiT._adb-tls-connect._tcp shell pm list packages io.dcloud.HBuilder'  
}

解决方法

在 adb 安卓目录 E:\HBuilderX\plugins\launcher-tools\tools\adbs 输入 cmd 打开命令行 输入 adb devices

确保手机已经成功链接
然后输入 adb shell pm list users 查看系统底层真实用户

如果有 这个 UserInfo{100:平行空间:20000410} 说明你手机开启了平行空间 可以在手机设置里搜索 平行空间 直接销毁就行了

继续阅读 »

报错原文

2026-08-06 15:22:08.448 [WARNING:] [PluginHost] Error: Command failed: E:\HBuilderX\plugins\launcher-tools\tools\adbs\adb.exe -s adb-AN2FVB1731016322-t2CsiT._adb-tls-connect._tcp shell pm list packages io.dcloud.HBuilder  
Exception occurred while executing 'list':  
java.lang.SecurityException: Shell does not have permission to access user 100  
com.android.server.am.ActivityManagerService.handleIncomingUser:14620 android.app.ActivityManager.handleIncomingUser:4753 com.android.server.pm.PackageManagerShellCommand.translateUserId:3853  
at com.android.server.am.UserController.handleIncomingUser(UserController.java:2745)  
at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:14620)  
at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:4753)  
at com.android.server.pm.PackageManagerShellCommand.translateUserId(PackageManagerShellCommand.java:3853)  
at com.android.server.pm.PackageManagerShellCommand.runListPackages(PackageManagerShellCommand.java:1060)  
at com.android.server.pm.PackageManagerShellCommand.runListPackages(PackageManagerShellCommand.java:956)  
at com.android.server.pm.PackageManagerShellCommand.runList(PackageManagerShellCommand.java:792)  
at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:230)  
at com.android.modules.utils.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:97)  
at android.os.ShellCommand.exec(ShellCommand.java:38)  
at com.android.server.pm.PackageManagerService$IPackageManagerImpl.onShellCommand(PackageManagerService.java:7086)  
at android.os.Binder.shellCommand(Binder.java:1087)  
at android.os.Binder.onTransact(Binder.java:904)  
at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:4368)  
at com.android.server.pm.PackageManagerService$IPackageManagerImpl.onTransact(PackageManagerService.java:7062)  
at android.os.Binder.execTransactInternal(Binder.java:1371)  
at android.os.Binder.execTransact(Binder.java:1310)  
at genericNodeError (node:internal/errors:983:15)  
at wrappedFn (node:internal/errors:537:14)  
at ChildProcess.exithandler (node:child_process:417:12)  
at ChildProcess.emit (node:events:519:28)  
at maybeClose (node:internal/child_process:1101:16)  
at ChildProcess._handle.onexit (node:internal/child_process:304:5) {  
code: 255,  
killed: false,  
signal: null,  
cmd: 'E:\HBuilderX\plugins\launcher-tools\tools\adbs\adb.exe -s adb-AN2FVB1731016322-t2CsiT._adb-tls-connect._tcp shell pm list packages io.dcloud.HBuilder'  
}

解决方法

在 adb 安卓目录 E:\HBuilderX\plugins\launcher-tools\tools\adbs 输入 cmd 打开命令行 输入 adb devices

确保手机已经成功链接
然后输入 adb shell pm list users 查看系统底层真实用户

如果有 这个 UserInfo{100:平行空间:20000410} 说明你手机开启了平行空间 可以在手机设置里搜索 平行空间 直接销毁就行了

收起阅读 »

DCloud 内置引擎库libnative-imagetranscoder.so、libweexcore.so、libweexjss.so 中的检测报警

安全检测 安全漏洞

libjpeg,mbed_tls,zlib这三个组件分别依赖于:
xxxx.apk.extracted/lib/armeabi-v7a/libnative-imagetranscoder.so
xxxx.apk.extracted/lib/armeabi-v7a/libweexcore.so
xxxx.apk.extracted/lib/armeabi-v7a/libweexjss.so
xxxx.apk.extracted/lib/arm64-v8a/libnative-imagetranscoder.so
xxxx.apk.extracted/lib/arm64-v8a/libweexcore.so
xxxx.apk.extracted/lib/arm64-v8a/libweexjss.so
我们程序做第三方漏洞审计,这些组件版本均被检测出有漏洞修复更新

具体审计问题见附件详情,官方重视一下尽快给出解决方案并修复问题漏洞

继续阅读 »

libjpeg,mbed_tls,zlib这三个组件分别依赖于:
xxxx.apk.extracted/lib/armeabi-v7a/libnative-imagetranscoder.so
xxxx.apk.extracted/lib/armeabi-v7a/libweexcore.so
xxxx.apk.extracted/lib/armeabi-v7a/libweexjss.so
xxxx.apk.extracted/lib/arm64-v8a/libnative-imagetranscoder.so
xxxx.apk.extracted/lib/arm64-v8a/libweexcore.so
xxxx.apk.extracted/lib/arm64-v8a/libweexjss.so
我们程序做第三方漏洞审计,这些组件版本均被检测出有漏洞修复更新

具体审计问题见附件详情,官方重视一下尽快给出解决方案并修复问题漏洞

收起阅读 »

【Alpha 体验邀请】luch-request v4:面向 uni-app 重新设计的 TypeScript 请求库

request

大家好,我是 luch-request 的维护者。

luch-request v4 Alpha 现已发布到 npm,想邀请正在使用 uni-app 的开发者参与体验,帮助验证不同平台下的请求、上传下载、取消和原生 Task 行为。

npm install luch-request@alpha

v4 不是对 v3 的内部重构,而是一个 breaking version。它围绕 uni API、原生 Task、TypeScript 类型边界和多平台行为重新设计,希望在保留 uni 原生能力的同时,让请求配置、错误处理和取消行为更加明确。

当前版本为 4.0.0-alpha.1,公共 API 在稳定版前仍可能调整。建议先在测试项目或非核心业务中体验,并在自己的目标平台完成验证。

为什么重新设计 v4

uni-app 可以运行在 H5、App 和不同小程序平台,但各平台支持的请求参数、原生 Task、错误对象和取消能力并不完全一致。

如果直接套用浏览器 HTTP client 的设计,会遇到一些实际问题:

  • 浏览器的 API 和类型不能代表所有 uni-app 平台;
  • request、uploadFile、downloadFile 拥有不同的原生参数和 Task;
  • 平台新增参数的速度可能快于请求库和类型声明的更新;
  • 网络失败、HTTP 状态码失败、取消和 JSON 解析失败需要不同的判断依据;
  • TypeScript 类型过于宽松会失去约束,过于严格又可能阻碍平台新增能力。

因此,v4 没有把 v3 的内部结构继续扩展,而是重新确定了公共 API、配置合并、Interceptor、错误、取消和跨平台边界。

v4 带来了什么

1. TypeScript-first

请求响应、请求体和查询参数可以分别建模,常见调用保持直接:

import { createLuchRequest } from 'luch-request'  

const http = createLuchRequest({  
  baseURL: 'https://api.example.com',  
  timeout: 10_000  
})  

interface User {  
  id: number  
  name: string  
}  

interface UserListParams {  
  page: number  
  keyword?: string  
}  

const response = await http.get<User[], UserListParams>('/users', {  
  params: {  
    page: 1  
  }  
})  

console.log(response.data)

JavaScript 项目仍然可以使用 v4;TypeScript 项目则能获得更完整的配置、响应、错误和公共导出类型。

2. 保留 uni 原生能力

v4 分别支持:

  • request
  • upload
  • download

三类操作共用实例配置、Interceptor 和错误契约,但在派发边界保留各自的原生参数,不使用 UPLOAD、DOWNLOAD 这样的伪 HTTP method。

3. 可以访问原生 Task

请求 Promise 提供 abort()、task 和 onTask(),单次请求配置也可以使用 onTask:

const request = http.get('/users', {  
  onTask(task) {  
    console.log('原生 Task:', task)  
  }  
})  

// 需要取消时  
request.abort()

如果取消能力需要跨 service 层传递,可以使用 createCancelSource(),不必把请求 Promise 暴露给每一层调用方。

4. 明确的配置边界与 nativeOptions

v4 将配置分成不同职责:

  • 常用 uni 请求参数可以直接配置;
  • luch-request 自身行为放在 luchOptions;
  • 平台新增参数或插件尚未声明的参数通过 nativeOptions 透传。

nativeOptions 是面向平台新能力的逃生窗口。当比较新的 uni API、某个平台参数或第三方插件参数还没有进入请求库类型时,使用方仍然可以显式透传,而不需要等待库发布新版本。

5. Interceptor 区分操作类型

v4 提供 request/response interceptor,支持同步和异步处理。Interceptor 上下文可以使用 LuchOperation 判断当前执行的是 request、upload 还是 download,避免依赖字符串或伪 method。

6. 统一错误与 JSON 解析策略

请求失败时统一抛出 LuchRequestError,并保留可用于判断的上下文,例如:

  • code
  • config
  • response
  • task
  • cause
  • raw
  • cancelMode

网络失败、HTTP 状态码失败、取消和 JSON 解析失败可以分别判断。对于 JSON 解析失败,还可以通过 JSONParsingMode 选择抛出错误、保留文本等处理方式。

Alpha 阶段暂不包含什么

为了先稳定核心请求契约,首个版本不会内置以下能力:

  • 自动重试
  • 请求缓存
  • 请求去重
  • 并发控制
  • Token 自动刷新
  • WebSocket
  • uni_modules
  • uni-app x

这些能力并不是简单地全部塞进核心库。后续会根据真实使用场景,判断应该由 Interceptor、独立扩展还是核心能力提供。

v3 用户需要立即升级吗

不需要。

v3 稳定项目可以继续使用现有版本。v4 是 breaking version,适合以下开发者优先体验:

  • 正在开发新项目;
  • 希望获得更完整的 TypeScript 类型;
  • 需要统一错误和取消行为;
  • 需要访问原生 Task 或进度事件;
  • 希望分别处理 request、upload 和 download;
  • 愿意在自己的目标平台验证 Alpha 行为。

正式迁移前,请先阅读 v3 到 v4 的迁移文档,并在实际运行平台完成 smoke test。

希望大家重点帮助验证

自动化测试能够验证请求库逻辑,但不能代替所有真实设备、运行平台和 uni-app 版本。特别希望大家帮助验证:

  1. H5、App、微信小程序及其他小程序中的基础请求;
  2. upload、download 及进度事件;
  3. abort() 是否触发平台原生中断;
  4. onTask() 是否能取得预期的原生 Task;
  5. 不同平台返回的错误结构是否存在差异;
  6. nativeOptions 是否能正确传递平台新增参数;
  7. TypeScript 类型是否存在过严、过松或无法表达的场景;
  8. JavaScript 项目中的配置和错误行为是否足够清晰。

如何反馈

提交问题时,如果方便,请尽量提供以下信息:

运行平台:  
HBuilderX / uni-app 版本:  
luch-request 版本:  
使用 TypeScript 还是 JavaScript:  
最小复现代码:  
预期结果:  
实际结果:  
错误对象或控制台日志:

如果问题与取消、上传下载或原生 Task 有关,也请说明实际运行平台,以及是否能取得对应 Task。

相关链接

写在最后

v4 的核心设计和自动化测试已经完成,但 uni-app 请求库真正困难的部分始终是多平台运行差异。

希望正在使用 uni-app 的开发者帮助验证 request、upload、download、取消和原生 Task 等能力。无论是兼容性问题、类型设计建议,还是某个平台特有的行为差异,都欢迎在 GitHub Issue 或本帖中反馈。

感谢每一位愿意安装、运行和提供反馈的开发者。

继续阅读 »

大家好,我是 luch-request 的维护者。

luch-request v4 Alpha 现已发布到 npm,想邀请正在使用 uni-app 的开发者参与体验,帮助验证不同平台下的请求、上传下载、取消和原生 Task 行为。

npm install luch-request@alpha

v4 不是对 v3 的内部重构,而是一个 breaking version。它围绕 uni API、原生 Task、TypeScript 类型边界和多平台行为重新设计,希望在保留 uni 原生能力的同时,让请求配置、错误处理和取消行为更加明确。

当前版本为 4.0.0-alpha.1,公共 API 在稳定版前仍可能调整。建议先在测试项目或非核心业务中体验,并在自己的目标平台完成验证。

为什么重新设计 v4

uni-app 可以运行在 H5、App 和不同小程序平台,但各平台支持的请求参数、原生 Task、错误对象和取消能力并不完全一致。

如果直接套用浏览器 HTTP client 的设计,会遇到一些实际问题:

  • 浏览器的 API 和类型不能代表所有 uni-app 平台;
  • request、uploadFile、downloadFile 拥有不同的原生参数和 Task;
  • 平台新增参数的速度可能快于请求库和类型声明的更新;
  • 网络失败、HTTP 状态码失败、取消和 JSON 解析失败需要不同的判断依据;
  • TypeScript 类型过于宽松会失去约束,过于严格又可能阻碍平台新增能力。

因此,v4 没有把 v3 的内部结构继续扩展,而是重新确定了公共 API、配置合并、Interceptor、错误、取消和跨平台边界。

v4 带来了什么

1. TypeScript-first

请求响应、请求体和查询参数可以分别建模,常见调用保持直接:

import { createLuchRequest } from 'luch-request'  

const http = createLuchRequest({  
  baseURL: 'https://api.example.com',  
  timeout: 10_000  
})  

interface User {  
  id: number  
  name: string  
}  

interface UserListParams {  
  page: number  
  keyword?: string  
}  

const response = await http.get<User[], UserListParams>('/users', {  
  params: {  
    page: 1  
  }  
})  

console.log(response.data)

JavaScript 项目仍然可以使用 v4;TypeScript 项目则能获得更完整的配置、响应、错误和公共导出类型。

2. 保留 uni 原生能力

v4 分别支持:

  • request
  • upload
  • download

三类操作共用实例配置、Interceptor 和错误契约,但在派发边界保留各自的原生参数,不使用 UPLOAD、DOWNLOAD 这样的伪 HTTP method。

3. 可以访问原生 Task

请求 Promise 提供 abort()、task 和 onTask(),单次请求配置也可以使用 onTask:

const request = http.get('/users', {  
  onTask(task) {  
    console.log('原生 Task:', task)  
  }  
})  

// 需要取消时  
request.abort()

如果取消能力需要跨 service 层传递,可以使用 createCancelSource(),不必把请求 Promise 暴露给每一层调用方。

4. 明确的配置边界与 nativeOptions

v4 将配置分成不同职责:

  • 常用 uni 请求参数可以直接配置;
  • luch-request 自身行为放在 luchOptions;
  • 平台新增参数或插件尚未声明的参数通过 nativeOptions 透传。

nativeOptions 是面向平台新能力的逃生窗口。当比较新的 uni API、某个平台参数或第三方插件参数还没有进入请求库类型时,使用方仍然可以显式透传,而不需要等待库发布新版本。

5. Interceptor 区分操作类型

v4 提供 request/response interceptor,支持同步和异步处理。Interceptor 上下文可以使用 LuchOperation 判断当前执行的是 request、upload 还是 download,避免依赖字符串或伪 method。

6. 统一错误与 JSON 解析策略

请求失败时统一抛出 LuchRequestError,并保留可用于判断的上下文,例如:

  • code
  • config
  • response
  • task
  • cause
  • raw
  • cancelMode

网络失败、HTTP 状态码失败、取消和 JSON 解析失败可以分别判断。对于 JSON 解析失败,还可以通过 JSONParsingMode 选择抛出错误、保留文本等处理方式。

Alpha 阶段暂不包含什么

为了先稳定核心请求契约,首个版本不会内置以下能力:

  • 自动重试
  • 请求缓存
  • 请求去重
  • 并发控制
  • Token 自动刷新
  • WebSocket
  • uni_modules
  • uni-app x

这些能力并不是简单地全部塞进核心库。后续会根据真实使用场景,判断应该由 Interceptor、独立扩展还是核心能力提供。

v3 用户需要立即升级吗

不需要。

v3 稳定项目可以继续使用现有版本。v4 是 breaking version,适合以下开发者优先体验:

  • 正在开发新项目;
  • 希望获得更完整的 TypeScript 类型;
  • 需要统一错误和取消行为;
  • 需要访问原生 Task 或进度事件;
  • 希望分别处理 request、upload 和 download;
  • 愿意在自己的目标平台验证 Alpha 行为。

正式迁移前,请先阅读 v3 到 v4 的迁移文档,并在实际运行平台完成 smoke test。

希望大家重点帮助验证

自动化测试能够验证请求库逻辑,但不能代替所有真实设备、运行平台和 uni-app 版本。特别希望大家帮助验证:

  1. H5、App、微信小程序及其他小程序中的基础请求;
  2. upload、download 及进度事件;
  3. abort() 是否触发平台原生中断;
  4. onTask() 是否能取得预期的原生 Task;
  5. 不同平台返回的错误结构是否存在差异;
  6. nativeOptions 是否能正确传递平台新增参数;
  7. TypeScript 类型是否存在过严、过松或无法表达的场景;
  8. JavaScript 项目中的配置和错误行为是否足够清晰。

如何反馈

提交问题时,如果方便,请尽量提供以下信息:

运行平台:  
HBuilderX / uni-app 版本:  
luch-request 版本:  
使用 TypeScript 还是 JavaScript:  
最小复现代码:  
预期结果:  
实际结果:  
错误对象或控制台日志:

如果问题与取消、上传下载或原生 Task 有关,也请说明实际运行平台,以及是否能取得对应 Task。

相关链接

写在最后

v4 的核心设计和自动化测试已经完成,但 uni-app 请求库真正困难的部分始终是多平台运行差异。

希望正在使用 uni-app 的开发者帮助验证 request、upload、download、取消和原生 Task 等能力。无论是兼容性问题、类型设计建议,还是某个平台特有的行为差异,都欢迎在 GitHub Issue 或本帖中反馈。

感谢每一位愿意安装、运行和提供反馈的开发者。

收起阅读 »