移动开发框架使用

js判断是否是钉钉打开的页面 阅读详情

1、spriteFrame.js

requirejs.onError = function (err) {
    console.log(err.requireType);
    console.log('modules: ' + err.requireModules);
};

(function(require) {
    //require路径配置
    var requireConfig = {
        paths: {
            jquery: SERVER_PATH + '/bower_components/jquery/dist/jquery.min',
            vue: SERVER_PATH + '/bower_components/vue2/vue.min',
            vueRouter: SERVER_PATH + '/bower_components/vue2/vue-router.min',
            text: SERVER_PATH + '/bower_components/text/text',
            util: 'public/util/util',
            MINT: SERVER_PATH + '/fe_components/mobile/MINT/index',
            axios: SERVER_PATH + '/bower_components/vue2/axios.min',
            'emap-mobile': SERVER_PATH + '/fe_components/mobile/emap-mobile.min',
            BH_MOBILE: SERVER_PATH + '/fe_components/mobile/BH_MIXIN_SDK',
            selectRoleIndex: '../../swpubapp/public/mob/component/selectrole/selectrole',
            home: '../../swpubapp/public/mob/component/home/home',
            spriteUtils: '../../swpubapp/public/mob/js/spriteUtil',
            publicVueComponent: '../../swpubapp/public/mob/component',
            'draggable': SERVER_PATH + "/bower_components/vuedraggable/vuedraggable",
            'sortable': SERVER_PATH + "/bower_components/sortable/1.5.1/Sortable.min",
            emapMin: '../../swpubapp/public/mob/js/emapMin',
            pagelog: SERVER_PATH + '/fe_components/sentry/sentry.min',
            cropper: SERVER_PATH + '/bower_components/cropper/cropper.min'
        },
        shim: {
            'emap-mobile': {
                deps: ['jquery'],
            },
            'emapMin': {
                deps: ['jquery'],
            },
            'pagelog': {
                deps: ['jquery']
            }
        },
        waitSeconds: 0

    };

    /**
     * appLoadAsync用于控制app页面的加载方式
     * true: app的所有页面为异步加载,只在使用到时加载
     * false: app的所有页面在应用初始化时一次性加载
     */
    window.appLoadAsync = false;

    //默认的组件库和公共方法以及公共页面
    var requir_default_arr = ['jquery', 'vue', 'vueRouter', 'MINT', 'emap-mobile', 'axios', 'spriteUtils', 'draggable', 'emapMin', 'pagelog', 'cropper'];

    //封装的公共vue组件
    var default_component_arr = [{
        name: 'auditProcess',
        jsPath: 'publicVueComponent/auditprocess/auditProcess'
    }, {
        name: 'noneDatas',
        jsPath: 'publicVueComponent/nonedatas/nonedatas'
    }];

    /**
     * 用于保存所有模块的全局对象:
     * defaultModules:默认的组件库和公共方法以及公共页面
     * pageModules:当前应用的所有页面模块
     * defaultComponents:封装的公共vue组件
     */
    window.REQUIRE_MODULES_ARR = {
        defaultModules: requir_default_arr,
        pageModules: [],
        defaultComponents: default_component_arr
    };

    //配置require
    require.config(requireConfig);

    //加载框架所需的库和公共页面
    require(requir_default_arr, function($, Vue, VueRouter, mintUI, EMAP_MOBILE, axios, sprite, draggable, emapMin) {
        /**
         * 用于解决ios 微信虚拟键盘弹出使得页面乱窜的问题
         */
        $(document).on("blur", "input,select,textarea", function() {
            setTimeout(function() {
                const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0;
                window.scrollTo(0, Math.max(scrollHeight - 1, 0));
            }, 100);
        });
        //设置拖拽组件
        Vue.component('draggable', draggable);

        //将各个组件库输出到全局作用域
        window.axios = axios;
        window.Vue = Vue;
        window.VueRouter = VueRouter;
        window.mintUI = mintUI;
        window.EMAP_MOBILE = EMAP_MOBILE;
        window.WIS_EMAP_SERV = emapMin;

        //vue路由组件
        Vue.use(VueRouter);
        //饿了么移动端组件mint-ui
        Vue.use(mintUI);
        //EMAP相关vue组件
        Vue.use(EMAP_MOBILE);

        //ids认证
        if (userId != null && userId != undefined) {
            //获取角色配置相关参数 --> 获取用户授权功能 --> 初始化应用
            sprite.getSelRoleConfig().then(sprite.getAuthConfig).then(sprite.initApp);
        }
        //游客
        else {
            // 初始化应用--游客模式
            sprite.initApp_visitor();
        }

    });

}(require));

2、对于非游客模式需要ids认证→获取角色配置相关参数 →获取用户授权功能→初始化应用

  • sprite.getSelRoleConfig():获取角色配置参数
  • sprite.getAuthConfig():自定义的模块加载路径在pageRegister.xml中配置,通过getAuthConfig中/sys/swpubapp/MobileCommon/getMenuInfo.do从后台获取配置文件信息,解析成json格式返回给browser
  • sprite.initApp():完成前两步,初始化app

       if (userId != null && userId != undefined) {
            //获取角色配置相关参数 --> 获取用户授权功能 --> 初始化应用
            sprite.getSelRoleConfig().then(sprite.getAuthConfig).then(sprite.initApp);
        }

  •         /**
             * 判断是否进入角色选择页
             * 如果用户有且只有一个角色,直接渲染该角色有权限的页面,否则进入角色选择页面
             */
            getSelRoleConfig: function() {
                var dfd = $.Deferred();
                MOB_UTIL.doPost({
                    url: WIS_CONFIG.ROOT_PATH + '/sys/swpubapp/MobileCommon/getSelRoleConfig.do',
                    params: {
                        APPID: WIS_CONFIG.APPID,
                        APPNAME: WIS_CONFIG.APPNAME
                    }
                }).done(function(result) {
                    window.IS_NEED_SELECTROLE = result.data.IS_NEED_SELECTROLE;
                    //无需选择角色
                    if (IS_NEED_SELECTROLE === "0") {
                        roleId = result.data.DEFAULT_ROLEID;
                    }
                    dfd.resolve();
                });
                return dfd;
            },
    /**
             * 获取用户授权的页面、按钮
             */
            getAuthConfig: function(fromSelectRole) {
               
                var dfd = $.Deferred();
                // IS_NEED_SELECTROLE为1,即需要先选择角色
                // 如果url中含有recallUrl参数,表示访问的是问卷调查,不需要进行角色选择
                if (!fromSelectRole && window.IS_NEED_SELECTROLE == "1" &&
                    (window.location.hash.indexOf('recallUrl') == '-1' && window.location.search.indexOf('recallUrl') == '-1')) {
                    window.REQUIRE_MODULES_ARR.pageModules = [{
                        vueJsPath: 'selectRoleIndex'
                    }];
                    dfd.resolve();
                } else {
                    //这里在后台去调用查询问卷调查的接口
                    MOB_UTIL.doPost({
                        url: WIS_CONFIG.ROOT_PATH + '/sys/swpubapp/MobileCommon/getMenuInfo.do',
                        params: {
                            APPID: WIS_CONFIG.APPID,
                            APPNAME: WIS_CONFIG.APPNAME
                        }
                    }).done(function(result) {
                        //如果发现有问卷需要答,则跳转问卷的地址
                        if (result.data.NEED_QUESTIONNAIRE) {
                            //这个参数用于标记即将跳转问卷调查地址,无需再做后续的路由解析工作
                            window.IS_QUESTIONNAIRE = true;
                            //这边替换新的地址
                            window.location.replace(window.WIS_CONFIG.HOST_PATH + result.data.REDIRECT_URL);
                            dfd.resolve();
                        }
                        //授权按钮列表
                        window.MOBILE_BUTTONAUTH_LIST = result.data.BUTTON;
                        //授权页面列表
                        window.REQUIRE_MODULES_ARR.pageModules = result.data.PAGES;
                        dfd.resolve();
                    });
                }
                return dfd;
            }

     

3、spriteUtil.js  -----→sprite.initApp 

 //初始化应用
initApp: function(callBack) {
     addCallback(callBack);
     requireAndInit();
},        

3、requireAndInit

     // 加载组件与页面进行初始化
    function requireAndInit() {
        //这个参数用于标记即将跳转问卷调查地址,无需再做后续的路由解析工作
        if (window.IS_QUESTIONNAIRE) {
            //更改状态,避免重复操作
            window.IS_QUESTIONNAIRE = false;
            return;
        }
        var require_page_path = []; //页面模块js路径
        var require_component_path = []; //公共组件js路径
        //设置公共组件路径和页面模块路径
        setJsPath(require_page_path, require_component_path);

        //需要选择角色
        var needSelectRole = window.IS_NEED_SELECTROLE == "1" && require_page_path[0] == "selectRoleIndex";
        //如果hash中有recallUrl参数,表示访问的是问卷调查,则不做角色选择
        if (window.location.hash.indexOf('recallUrl') != '-1' || window.location.search.indexOf('recallUrl') != '-1') {
            needSelectRole = false;
        }
        //不需要选择角色时,删除selectRole的dom
        if (!needSelectRole) {
            $('#selectrole').remove();
        }

        //加载公共组件
        require(require_component_path, function() {
            //注册公共组件
            window.REQUIRE_MODULES_ARR.defaultComponents.forEach(function(defaultComponent) {
                Vue.component(defaultComponent.name, spriteUtils.loadComponent(defaultComponent.jsPath));
            });
            var needSDK = true;
            //异步按需加载
            if (window.appLoadAsync) {
                init(needSDK, needSelectRole);
            }
            //全部加载
            else {
                require(require_page_path, function() {
                    init(needSDK, needSelectRole);
                });
            }
        });
    }

4、setJsPath:window.REQUIRE_MODULES_ARR中的页面路径在getAuthConfig中初始化完成

自定义的模块加载路径在pageRegister.xml中配置,通过getAuthConfig中/sys/swpubapp/MobileCommon/getMenuInfo.do从后台获取配置文件信息,解析成json格式返回给browser

     /**
     * 设置页面与组件的js文件路径
     */
    function setJsPath(require_page_path, require_component_path) {
        if (window.REQUIRE_MODULES_ARR.pageModules instanceof Array) {
            //页面模块js路径
            window.REQUIRE_MODULES_ARR.pageModules.forEach(function(pageModule) {
                require_page_path.push(pageModule.vueJsPath);
            });
        }
        if (window.REQUIRE_MODULES_ARR.defaultComponents instanceof Array) {
            //公共组件js路径
            window.REQUIRE_MODULES_ARR.defaultComponents.forEach(function(defaultComponent) {
                require_component_path.push(defaultComponent.jsPath);
            });
        }
    }

5、注册公共组件:Vue.component(defaultComponent.name, spriteUtils.loadComponent(defaultComponent.jsPath));

  • spriteUtils.loadComponent
  •          /**
             * 加载组件
             */
            loadComponent: function(path) {
                return function() {
                    var dfd = $.Deferred();
                    require([path], function(componentInit) {
                        var component = componentInit();
                        component.template = compileTpl(component.template);
                        dfd.resolve(component);
                    });
                    return dfd;
                };
            },
  • 使用require加载路径为path的自定义模块,每个自定义模块的格式如下,自定义模块返回一个匿名函数,
  • define(function(require, exports, module) {
        var tpl = require('text!publicVueComponent/selectrole/selectrole.html');
        var spriteUtils = require('spriteUtils');
        return 
              function() {
                var page = {
                    template: tpl,
                    data: function() {
                        return {
                        };
                    },
                    created: function() {
                       
                    },
                    updated: function() {
                    },
                    methods: {    
                   };
                return page;
        };
    
    });
  • 该匿名函数在app初始化时,通过require加载,得到函数componentInit,然后执行该函数,即执行return后面的function
  • 执行该函数,返回一个page对象,代表当前组件实例,此时数据并未进行初始化,仅得到了一个page对象,该page对象有vue的html模板template和一些列方法
  • var component = componentInit();
  •  component.template = compileTpl(component.template); 正则扫描模板文件,实现按钮权限,删除所有无权限的dom
  •     /**
         * 正则扫描模板文件,实现按钮权限
         */
        function compileTpl(tpl) {
            if (!window.MOBILE_BUTTONAUTH_LIST) {
                window.MOBILE_BUTTONAUTH_LIST = [];
            }
            //获取tpl中所有权限id
            var tplIds = [];
            var result;
            var pattern = new RegExp('auth-id=[\'|\"]{1}[^\'^\"]+[\'|\"]{1}', 'gm');
            while ((result = pattern.exec(tpl)) != null) {
                tplIds.push(result[0].substring(9, result[0].length - 1));
            };
            if (tplIds.length == 0) {
                return tpl;
            }
    
            //删除所有无权限的dom
            tplIds.forEach(function(id, index) {
                if (window.MOBILE_BUTTONAUTH_LIST.indexOf(id) < 0) {
                    var regExp = new RegExp('<[^/].*(auth.*?auth-id=[\'|\"]{1}' + id + '[\'|\"]{1}).*>[\\s\\S]*?</.*auth.*>', 'gm');
                    tpl = tpl.replace(regExp, "");
                }
            });
    
            return tpl;
        }

6、应用初始化

            //异步按需加载
            if (window.appLoadAsync) {
                init(needSDK, needSelectRole);
            }
            //全部加载
            else {
                require(require_page_path, function() {
                    init(needSDK, needSelectRole);
                });
            }
  •  function init(needSDK, needSelectRole) {}
  • 初始化路由

    if (needSelectRole) {
                rootDiv = '#selectrole';
                routes = [{
                    path: '/',
                    name: 'selectrole',
                    component: spriteUtils.loadComponent('selectRoleIndex')
                }];
            }
            //初始化当前用户有权限访问的页面
            else {
                routes = getVueRoute();
            }
    
            //生成VueRouter对象
            var router = new VueRouter({
                routes: routes
            });

     

  • 路由切换完成后执行的操作
  • router.afterEach(function(to, from, next) {
    	//页面离开时,关闭messagebox
    	mintUI.MessageBox.close();
    
    	/**
    	 * 当前端组件页面弹出遮罩层,为了控制遮罩层下的文本不滚动,
    	 * 在<body></body>与<div id="app"></div>上设置了样式:overflow:hidden;height:100%,锁死了页面。
    	 * 这边手动去除这个样式
    	 */
    	if (document.body.style.overflow == 'hidden' && document.body.style.height == '100%') {
    	    document.body.style.overflow = null;
    	    document.body.style.height = null;
    	    document.body.firstElementChild.style.overflow = null;
    	    document.body.firstElementChild.style.height = null;
    	}
    
    	/**
    	 * 在切换路由后自动执行一个轻微滑动
    	 * 这样写的原因:ios在页面的高度比较高时,从其他页面返回该页面将会出现页面空白的现象
    	 * 需要轻触屏幕进行滑动才能恢复原页面
    	 */
    	if (!to.meta.keepAlive && !from.meta.keepAlive) {
    	    var top = document.body.scrollTop;
    	    document.body.scrollTop = top + 1;
    	    setTimeout(function() {
    	        document.body.scrollTop = top - 1;
    	    }, 0);
    	}
    });
  • 路由切换操作1、切换为当前设置的自定义的router和router挂载的自定义div  2、切换为默认路由,挂载为默认的#app上
  • if (needSDK) {
        initSDKandApp(rootDiv, router);
    } else {
        //挂载主vue对象
        app = new Vue({
            el: '#app',
            router: router
        });
        finishedCallback()
    }
  • initSDKandApp初始化SDK与应用
  •  /**
     * 初始化SDK与应用
     */
    function initSDKandApp(rootDiv, router) {
    	if(/dingtalk/.test(navigator.userAgent.toLowerCase())){
    		getDDSign().then(function(signData) {
                var config = {                    
                    //钉钉jdk初始化参数
                    dd: {
                    	corp:signData.corpId,
                    	uploadImgsToEmapUrl: WIS_CONFIG.ROOT_PATH + '/sys/swpubapp/MobileCommon/saveFileFromDingding.do'
                    }
                };
                //如果获取到了微信签名,则用该签名对象初始化微信jssdk
                if ('{}' !== JSON.stringify(signData)) {
                    config.dd.signData = signData;
                }
    
                /**
                 * 判断父窗口中是否加载了SDK,如果加载了则直接使用父窗口的SDK
                 * 这样写的原因:微信SDK在同一页面初始化两次会造成第二次初始化失败
                 *               即使是iframe嵌套的页面也不行
                 */
                if (window.parent && window.parent.SDK) {
                    window.SDK = window.parent.SDK;
                    //挂载主vue对象
                    app = new Vue({
                        el: rootDiv,
                        router: router
                    });
                    finishedCallback();
                    return;
                }
    
                //使用BH_MOBILE提供的方法进行SDK的注册
                require(['BH_MOBILE'], function(BH_MOBILE) {
                    window.BH_MOBILE = BH_MOBILE;
                    //初始化sdk
                    BH_MOBILE.default(function(res) {
                        window.SDK = res.sdk;
                        //挂载主vue对象
                        app = new Vue({
                            el: rootDiv,
                            router: router
                        });
                        finishedCallback();
                    }, config);
                });
    
            });
    	}else{
    		getWechatSign().then(function(signData) {
                var config = {
                    //微信jdk初始化参数
                    wx: {
                        uploadImgsToEmapUrl: WIS_CONFIG.ROOT_PATH + '/sys/swpubapp/MobileCommon/saveFileFromWechat.do'
                    },
                    //钉钉jdk初始化参数
                    dd: {}
                };
                //如果获取到了微信签名,则用该签名对象初始化微信jssdk
                if ('{}' !== JSON.stringify(signData)) {
                    config.wx.signData = signData;
                }
    
                /**
                 * 判断父窗口中是否加载了SDK,如果加载了则直接使用父窗口的SDK
                 * 这样写的原因:微信SDK在同一页面初始化两次会造成第二次初始化失败
                 *               即使是iframe嵌套的页面也不行
                 */
                if (window.parent && window.parent.SDK) {
                    window.SDK = window.parent.SDK;
                    //挂载主vue对象
                    app = new Vue({
                        el: rootDiv,
                        router: router
                    });
                    finishedCallback();
                    return;
                }
    
                //使用BH_MOBILE提供的方法进行SDK的注册
                require(['BH_MOBILE'], function(BH_MOBILE) {
                    window.BH_MOBILE = BH_MOBILE;
                    //初始化sdk
                    BH_MOBILE.default(function(res) {
                        window.SDK = res.sdk;
                        //挂载主vue对象
                        app = new Vue({
                            el: rootDiv,
                            router: router
                        });
                        finishedCallback();
                    }, config);
                });
    
            });
    	}
        
    }

依据routes生成VueRouter对象:
        var router = new VueRouter({routes: routes });

router中有标识为index的页面,默认进入该页面,为展示的第一个页面,只有依据用户交互来切换页面和路由

 

 

 

【前端框架篇】使用dumi移动端主题框架对antd design mobile进行二次封装的组件库开发 由于公司项目需要,最近使用dumi移动端主题框架对antd design mobile进行二次封装的组件库开发,在框架的搭建过程中,组件库和组建文档的打包发布遇到了很多问题,经过近半个月的慢慢摸索,项目逐渐完善,现将遇到的问题整理记录下来~... 阅读详情

相关推荐

使用什么框架开发Vue移动端应用?

以上是几个常用的框架,它们都能够帮助你快速开发Vue移动端应用。选择合适的框架取决于你的项目需求、团队熟悉度以及个人偏好。根据你的项目需要选择其中一个框架,并按照相应的示例代码进行开发,即可快速构建出符合移动端要求的Vue应用。希望这些信息对你有所帮助!如果你有任何其他问题,我将很乐意继续帮助你。在开发Vue移动端应用时,有多种框架可供选择。下面将介绍几种常用的框架,帮助你选择适合你项目的最佳框架。

CodeNexus的博客 573

vue对接钉钉总结

登录钉钉管理后台,点击应用开发菜单,找到对应的h5应用,进入应用详情,左侧菜单找到监控中心菜单,将下面图片粘贴进入标签中即可。

qq_37004501的博客 1664

移动开发领域中Flutter的动画框架使用

本文旨在为移动开发者提供Flutter动画框架的全面指南,涵盖从基础概念到高级用法的所有内容。我们将重点讨论Flutter动画系统的架构设计、核心组件以及实际应用场景。文章首先介绍Flutter动画的基本概念,然后深入分析其实现原理,接着通过实际案例展示具体用法,最后讨论性能优化和未来发展趋势。隐式动画(Implicit Animation):通过简单属性变化自动触发的动画显式动画(Explicit Animation):需要开发者手动控制的动画Tween:定义动画值范围的插值器。

移动开发前沿的博客 1230

【window下配置Maxim SDK环境】

MAX78000FTHR为快速开发平台,帮助工程师利用MAX78000 Arm® Cortex® M4F处理器快速实施超低功耗、人工智能(AI)方案,器件集成卷积神经网络加速器。本文为MAX78000羽毛板搭建window开发环境。下图为板载资源具体硬件介绍见。

vor234的博客 2814

E5071C 网络分析仪使用指南

E5071C 网络分析仪是 Keysight(原 Agilent)推出的一款高性能矢量网络分析仪,广泛应用于射频(RF)和微波(MW)电路设计、天线测试、滤波器优化等领域。它以高精度、宽频率范围(9 kHz–20 GHz)、出色的动态范围和灵活的测量功能著称。本文将详细介绍 E5071C 的基本操作方法,帮助用户快速上手并高效使用该设备。

2501_90901792的博客 4181

DataWorks数据安全治理最佳实践

DataWorks基于数据安全治理的常见思路,针对资产梳理、技术体系建设和运营体系建设,提供了一系列数据安全产品能力,您可通过“基础防护建设、数据安全防护措施及策略增强建设、数据安全持续运营”三个阶段在DataWorks上落地数据安全治理项目。参考本文启动数据安全治理项目前,建议您先了解DataWorks数据安全产品相关能力了解DataWorks数据安全产品能力后,您可参考如下三个阶段在DataWorks上落地数据安全治理项目。

soso1968的博客 1437

FE_Vue框架的重要属性讲解【ref props mixin】

对于传统的HTML而言,id 和 ref确实没有什么差别,但是对于组件来说就不一样了。给组件加id,打印出获取的结果为组件所对应的完整DOM结构。给组件加ref,打印出获取的结果就是VueComponent实例。

一个搬砖工人 512

CH340驱动安装全攻略:从Windows到MacOS的避坑指南(2025最新版)

本文提供2025年最新版CH340驱动安装全攻略,涵盖Windows、MacOS和Linux三大操作系统。详细解析了驱动安装的核心原理、标准流程,并针对Windows设备管理器报错、MacOS系统安全限制等常见“坑点”提供了深度排错与解决方案,旨在帮助开发者快速稳定地完成USB转串口通信配置。

earth的博客 425

比较几种热门Hybrid App前端框架

以上框架都具有其优缺点,开发者需要根据自己的项目需求和技术水平来选择最适合自己的框架,如果要求性能和跨平台支持,React Native 、flutter、小程序都是比较好的选择;如果需要大量的 UI 组件和易学易用,Ionic 可能是更好的选择。当然还有类似于Framework7、WeeX等框架可作为大家的备选项,越来越多的技术能够根据自身的项目需求和技术水平来进行选择。

Lydiasq的博客 2080

mapbox 从入门到精通 - 目录

欢迎大家来到gis分享者的《mapbox 从入门到精通》专栏。博主列出学习大纲,如果有什么问题,欢迎留言。

我哎GIS博客 5833

第81篇:Vibe Coding时代:LangGraph + Eval评估体系实战,解决 Agent 优化全靠感觉的问题

本文介绍了一个为LangGraph Coding Agent设计的评估体系解决方案。文章首先指出了当前AI Coding Agent开发中的常见问题:优化过程缺乏客观评估标准,导致改进效果难以量化。随后提出了一个完整的评估框架,包括评估指标(任务成功率、质量指标、安全指标、成本指标和流程指标)、项目结构设计和评估案例集。 核心内容包括: 设计了JSON格式的评估案例集,覆盖正常任务、边界任务和高风险场景 实现了模拟Agent输出的演示代码 构建了多维度评分系统,包括关键词匹配、禁用词检测和成本评估 提供了评

sundong_81的博客 47

如何使用Vue框架开发移动端应用?

总之,使用 Vue 框架开发移动端应用需要掌握 Vue 的基本语法和开发模式,同时了解移动端开发的特点和需求。同时,也可以使用一些移动端调试工具,如微信开发者工具、VConsole 等,来调试在手机上运行的应用。- 将打包后的代码部署到服务器上,可以使用静态文件服务器(如 Nginx)或者云服务提供商(如阿里云、腾讯云等)进行部署。- 对于移动端应用,还需要考虑触摸事件的处理,如滑动、缩放等。- 例如,可以创建一个头部组件、一个底部导航组件、一个内容组件等,然后在页面中组合这些组件。

alankuo的专栏 2686

【自适应滤波】自适应UKF,基于新息自适应调节Q和R,场景为雷达跟踪与滤波、MATLAB实现

本文提出了一种基于新息协方差匹配的自适应UKF(CM-AUKF)算法,用于解决噪声统计未知或时变场景下的目标跟踪问题。通过实时调整过程噪声协方差Q和观测噪声协方差R,CM-AUKF显著提升了跟踪精度和稳定性。仿真结果表明,相比传统UKF,CM-AUKF在位置和速度估计误差上分别降低了约50%和30%,且无需人工调参。该算法适用于无人机导航、雷达跟踪等动态环境,MATLAB代码可直接运行复现结果。自适应曲线显示算法能有效收敛到真实噪声参数,验证了其自适应能力。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 329

使用Thinkphp框架开发移动端接口

本文给大家分享的是使用thinkphp框架开发移动端接口的2种方法,一种是开发API,另外一种是实现移动端访问自动切换移动主题模板,从而实现伪app访问,下面我们就来详细看下如何实现吧。 方案一:给原生APP提供api接口 使用TP框架时 放在common文件夹下文件名就叫function.php <?php /** * Created by zhangkx * E...

weixin_30414155的博客 167

【006】深入了解C++中的进制转换:二进制、八进制、十进制、十六进制

二进制:0~1,以0b开头,bitset< 8 >输出。八进制:0~7,以0开头,oct输出。十进制:0~9,以数字开头,cout默认输出十进制。十六进制:0 ~ 9和A ~ F,以0x开头,hex输出,不区分正负。n进制:0~n-1。C++ 中常见的数字进制有十进制、二进制、八进制、十六进制。从十进制转换到其他进制:二进制:使用除以 2 取余数的方法,将得到的余数倒序排列即为二进制。八进制:使用除以 8 取余数的方法,将得到的余数倒序排列即为八进制。

Lion_Long的博客 2611

在RStudio中使用GitHub Copilot:代码自动生成,从此告别手敲!

可以通过自定义提示词来引导Copilot生成符合自己需求的代码。再看一个做统计分析的。

Codewar的博客 330

移动开发框架的使用心得

我做移动应用开发有将近一年时间了,最初主要是使用Titanium开发移动应用,后来尝试过PhoneGap,现在则主要是用XCode写Objective-C和C代码。下面总结一下开发的心得体会。   使用Titanium开发的优点 1.      官方宣称是native的,即会把js代码编译成本地代码,并运行。运行起来会比较快。 2.      支持比较多的移动平台,例如android,ip

midfar的专栏 2017

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android开发:使用EasyPay打造全能移动支付框架

EasyPay是一个开源的聚合支付可定制化框架,目前已集成微信APP支付,支付宝APP支付SDK。银联支付(开发中)。 Android开发者只需要简单调用EasyPay的几行代码,即可调起支付客户端,完成支付流程,得到支付结果。 EasyPay宗旨:简单,易用,可扩展。

MichaelX的专栏 9292

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

vue开发移动端,mui框架的各种使用方法

前面提到使用 vue 开发 APP,自己不太熟悉,后来了解到有这个 mui 框架,然后改变状态栏颜色和监听返回键也是使用的这个框架,后来又遇到了一些问题,但是官网没有写操作方法(也许是没找到),后来在网上找到了解决办法,现在稍微总结一下,个人认为这个框架很强大。

sywdebug的博客 3805

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

使用HTML5和JavaScript的移动应用开发框架和SDK

Onsen UI-跨平台HTML5混合应用程序框架 (Onsen UI - Cross-Platform HTML5 Hybrid App Framework) Mobile app development framework and SDK using HTML5 and JavaScript. Create beautiful and performant cross-platform ...

cuk5340的博客 295

终极指南:使用Junior框架开发HTML5移动应用的完整流程

Junior是一个专注于构建具有原生外观和感觉的HTML5移动应用的前端框架。本指南将带你快速掌握使用Junior框架开发移动应用的核心流程,从环境搭建到应用部署,让你轻松创建出媲美原生体验的移动应用。 ## 为什么选择Junior框架开发移动应用? 在移动应用开发领域,HTML5技术凭借跨平台优势占据重要地位。Junior框架作为轻量级前端解决方案,通过结合Backbone.js和Zepto

gitblog_00809的博客 665

使用Python进行手机平板移动开发:Kivy与BeeWare框架

过去,Android和iOS上的移动应用程序开发不是Python的强项,但情况可能会发生变化…… 使用Python进行移动应用开发怎么样?从历史上看,在编写移动GUI应用程序时,Python并没有很强的故事。 实际上,仅使用纯Python时,Android和iOS开发几乎是不可能的。真可惜 值得庆幸的是,近年来出现了许多进展,极大地改善了使用Python编写移动应用程序的前景。 在本文中,...

Eastyell的专栏 9549

如何使用Weex实现跨平台移动应用开发:阿里开源框架完整指南

在当今移动互联网时代,开发人员面临着iOS和Android双平台开发的巨大挑战。Weex作为阿里巴巴推出的跨平台移动开发解决方案,为开发者提供了一种全新的开发模式。Weex框架允许开发者使用Vue.js语法编写代码,然后通过渲染引擎将代码转换为原生组件,实现真正的跨平台开发体验。😊 ## 什么是Weex跨平台框架? Weex是阿里巴巴开源的一款跨平台移动开发框架,它基于Vue.js语法规范,

gitblog_00070的博客 619

使用简单的轻量级移动web应用开发框架 - Sidetap

日期:2012-7-13  来源:GBin1.com 我们曾经介绍过5个轻量级的移动web应用开发框架,在今天的文章中,我们将介绍另外一个使用简单的轻量级移动web应用开发框架 - sidetap。Sidetap是一个使用简单的框架能够帮助你快速的开发平台无关的移动web应用界面。 为什么需要另外一个移动开发框架呢? 开发Sidetap的原因在于快速方便的开发类似facebook和s...

weixin_34194359的博客 87

移动开发,mui框架选择器的使用

pc开发了一段时间,新上手了移动开发,用了mui框架,新手总是会遇到各种各样的问题,百度吧,回答的又不是很详细,总是在简单的问题上费劲。今天解决了picker和DtPicker选择器使用的问题,发个帖子,希望对小白开发有用处。 使用picker 和DtPicker时,要引入对应js和css文件,这些文件我在hbuilder新建mui项目时,也没有找到,找到公司的开发代码才拿到资源。 而且发现m

wulalala_lm的博客 2632

使用ionic框架开发移动hybrid应用

赞助我以写出更好的文章 如果您觉得文章对您有帮助,可以逐个点击以下链接,类似于Google ads,不需要您付出任何费用,每天都可以来点一次噢,费用将由广告商承担,give me a cup of coffee? https://app.codesponsor.io/li... https://app.codesponsor.io/li....

weixin_34255793的博客 209
上一篇: 金智ubase 应用快速开发框架
下一篇: bh组件之日期选择器
flybone7
博客等级 码龄9年 58粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值