关于应用开发:小白学习应用构建分享参照用法

什么是参照?只看名词,不太好了解,咱们看下图,是不是一看就明确了,参照就是一份输出参考,当用户进行输出时,能够从已有数据中进行抉择。 怎么创立参照?假如业务场景是一张洽购单,其中一个字段是【物料品牌】,咱们须要为【物料品牌】创立一个参照。 2.1  在业务对象中新增【品牌】业务对象,勾选同时生成主实体。 2.2 鼠标挪动到实体上,点编辑新增一个【品牌名】字段 2.3 切换到页面建模,新建参照 抉择后,点确定。 怎么应用参照?3.1  创立洽购业务对象及其实体。留神新增字段【物料品牌】设置为单选援用类型,将援用值设置为品牌。保留并公布实体。 3.2 在页面建模中为洽购实体新建页面。 3.3  鼠标挪动到列表卡片上,点击图标进入单据设计模式选中品牌字段,点击右侧参照配置配置如下: 选中 【物料品牌】,点击右侧参照配置 配置如下,配置实现后点右上角保留。 3.4 鼠标挪动到详情卡片上,点击图标进入单据设计模式选中 【物料品牌】,点击右侧参照配置 设置如下,配置实现后点右上角保留。 3.5 关上预览,查看是否设置胜利

June 16, 2023 · 1 min · jiezi

关于应用开发:当开发同事辞职接手到垃圾项目怎么办

前言事实上,垃圾我的项目是与日俱增而成的,所谓冰冻三尺非一日之寒,豆腐渣工程相对不是一两块砖的问题。 首先,极有可能从需要剖析开始烂,因为用户是不晓得开发难度的,在软件开发的用户眼里,他们认为满汉全席和家常小炒难度一样。 同时更重要的问题是,用户不分明炒菜先放什么后放什么。因而软件我的项目从需要剖析开始就不能是用户方为主,用户方能够提出本人的需要,同时开发方要疏导用户去单方单干来实现,而不能仅是用户方说了算。 开发中的另一种抉择以上仅是传统开发模式0-1开发会出现的问题,而这些干燥的反复底层工作,齐全能够由低代平台来实现,从而解放出咱们的工夫,来做更有价值的工作,比方与用户方沟通更实用的业务设计。那么,当初咱们来探讨一下“低代码开发”这个概念,并阐释它在软件开发中的作用。 低代码概念所谓低代码,是一种软件开发办法,它能够更快地交付应用程序,并且只需起码的手工编码。低代码平台是通过建模和图形界面实现应用程序可视化开发的工具汇合。低代码使开发人员可能跳过手工编码,从而放慢将应用程序投入生产的过程。 通过低代码平台,业务人员也能更容易了解开发流程,结合实际业务操作角度提出合乎其工作习惯与开发逻辑的需要,从而升高两者的沟通老本,缩小常识壁垒,最终减速整体计划的落地。 低代码在开发中的劣势01、开发效率进步对于低代码的了解,集体认为能够通过配置化的低成本交互方式(支流是拖拽)加上大量的胶水代码,去满足一类利用的需要。 这就阐明,基于低代码,开发人员无需代码或说只需大量代码就能够开发出各类利用管理系统,如:OA协同办公、KM常识治理、CRM客户关系治理等,因为少数采纳组件和封装的接口进行开发,使得开发效率大幅晋升。 上图展现的是最近在试用的JNPF开发平台表单页面,具备较丰盛便捷的表单引擎,大量的可复用控件拖拽搭建即可,官网显示反对有50余种控件,倒是能够满足多种业务场景下的搭建需要。全源码交付的模式,开发人员也能在本地依据需要自在调整。 像后盾管理系统中频繁呈现列表,一般开发代码反复且干燥,而且可读性差稀稀拉拉的一个列表页写上小千行,咱们须要解决这个问题,以达到便捷且代码对立,保护不便。那么一款低代码平台的呈现就尤为重要了。 02、开发成本缩小作为一站式的利用开发平台,低代码会反对利用的残缺生命周期治理,即从设计开始,历经开发、构建、测试和部署,始终到上线后的各种运维(监控报警、利用高低线)和经营(数据报表、用户反馈)。 在该闭环中,还会波及到产品经理、需要分析师、架构师、开发人员、测试人员、运维人员、经营人员、技术支持人员等各种各样的角色本职工作。而低代码的呈现能无效防止这项高人力、高业余人员的需要,更好的为企业节省成本。 03、维护性更高对于传统应用程序,保护和降级须要很长时间。开发人员必须手动修复谬误并增加新性能。然而,通过低代码,无需放心应用程序应用过程中会呈现谬误。因为低代码平台上可用的模块曾经过无缝集成的预测试,因而能够增加任何新性能而不用放心兼容性。 这边举荐JNPF开发平台,采纳业内当先的SpringBoot微服务架构、反对SpringCloud模式,欠缺的平台扩增根底,满足零碎疾速开发、灵便拓展、无缝集成和高性能利用等综合能力;采纳前后端拆散模式,前端和后端的开发人员可分工合作负责不同板块,省事又便捷。只需大量代码或无需代码,即可应答个性化/简单业务场景需要。 体验官网:https://www.jnpfsoft.com/?sifou 有低代码后就不要开发了?这就像问先有鸡还是先有蛋一样,低代码平台确实会取代一些简略,场景固定化的工作,但不能做到齐全取代的境地。 开发人员通过低代码能够应用可视化拖拽的形式来创立利用,无需从头到尾手动编码,这也进步了开发效率。 开发者和低代码相辅相成,只有这样,能力真正实现降本增效,以前须要3个月的工作,当初可能一个星期就能搞定,腾出来的工夫思考更多创意和解决方案也很香。

June 6, 2023 · 1 min · jiezi

关于应用开发:使用APICloud-AVM多端框架开发消防检查助手App项目实践分享

一、性能介绍把消防查看过程中,须要手写填报的文档,在App端以表单填写进行实现。同时能够增加手写签名,关联照片,而且App端表单填报很多我的项目进行下拉抉择,极大的进步了工作效率;表单填报实现之后可通过零碎后盾生成word模板文件,App端下载到手机,通过手机连贯打印机,可把纸质文件进行打印。 App开发采纳APICloud AVM框架,后盾采纳PHP。 性能要点: 1、场合注销,分为九小场合和合用场合注销 2、监督查看记录 3、责令整改通知书 4、根本状况拍照,查看过程记录拍照 5、后盾针对上述数据进行多维度剖析,导出Excel表格,Word模板文件 二、思维导图 三、用到的模块 四、我的项目目录 五、开发介绍1、首页导航零碎首页应用tabLayout,能够将相干参数配置在JSON文件中,再在config.xml中将content的值设置成该JSON文件的门路。如果底部导航没有非凡需要这里强烈建议大家应用tabLayout为APP进行布局,官网曾经将各类手机屏幕及不同的分辨率进行了适配,免去了很多对于适配方面的问题。 { "name": "root", "textOffset": 6, "color": "#999999", "selectedColor": "#004494", "scrollEnabled": false, "hideNavigationBar": false, "bgColor": "#fff", "navigationBar": { "background": "./images/navbk.png", "shadow": "rgba(0,0,0,0)", "color": "#fff", "fontSize": 18, "hideBackButton": true }, "tabBar": { "background": "#fff", "shadow": "#eee", "color": "#5E5E5E", "selectedColor": "#004494", "textOffset": 3, "fontSize": 11, "scrollEnabled": true, "index": 0, "preload": 1, "frames": [ { "title": "首页", "name": "home", "url": "./pages/index/home" }, { "title": "历史记录", "name": "course", "url": "./pages/history/records" }, { "title": "我的", "name": "user", "url": "./pages/user/wode" } ], "list": [ { "text": "首页", "iconPath": "./images/home.png", "selectedIconPath": "./images/home-o.png" }, { "text": "历史记录", "iconPath": "./images/his.png", "selectedIconPath": "./images/his-o.png" }, { "text": "我的", "iconPath": "./images/my.png", "selectedIconPath": "./images/my-o.png" } ] }}因为导航应用的tablayout,所有App初始化须要执行的操作,只须要在第一个加载的页面执行即可全局响应。可通过 tabBar中的"index"字段来确定第一个须要加载的页面,通过"preload"来确定须要预加载几个页面。 ...

June 14, 2022 · 16 min · jiezi

关于应用开发:云开发在教育应用开发运维全流程实践

编者按:10月21日,2021云栖大会云效BizDevOps分论坛上,教育行业- E联智校的研发总监、高级架构师- 冯涛老师围绕在云的时代,如何实现云阅卷从传统技术框架到云开发生态的变迁进行了分享。 本文从3方面介绍了咱们依靠云效解决了产品和架构的问题,实现产品上云和我的项目转变的过程。 传统开发模式的痛点和应答;云开发助力企业新的开发模式落地;云开发在开发运维中的实际; 一、传统开发模式的痛点和应答 当初是VUCA的时代,什么是VUCA呢?V就是易变性,U不确定性,C复杂性,A模糊性。 什么是易变性? 围绕着当初商业模式和市场变动速度快、变动大的状况,咱们的产品我的项目就要面对这种问题并解决。 什么是不确定性? 在解决问题的很多方法中哪条门路是咱们的最优解呢?在以后环境下现阶段的最优解不可能做到一劳永逸。 什么是复杂性? 在企业和行业做数字化转型的过程中,面对的客户是跨行业、跨专业的状况,面对的需要越简单设计的零碎也越简单。 什么是模糊性? 各行各业的信息化程度不同,比方客户信息化程度特地低的状况下提出高需要,这要通过后期十分长阶段的需要调研能力达到最终的客户需要。 面以对这样的问题,咱们通过变更更快、危险更低、持续性更强的麻利形式实现企业自身的改革起初应答。 改革对企业来说,在技术门槛、人力老本和资源上都稍显有余,在咱们的实际中通过云效整套流程实现全云端统一化,实现了咱们的指标也解决了企业遇到的问题。 二、云开发助力企业新的开发模式落地 在后期的需要和研发阶段的生命周期中,提供了一套贯通需要工作到公布需要的生命治理,满足了企业后期研发阶段的计划。 云开发提供了零门槛,升高了研发门槛和技术门槛,通过一键部署的形式实现疾速响应客户需要,提供一系列的全方位监控,保证系统可能稳固的运行。 在我的项目中也用到了EDAS等云原生组件,为咱们晋升了研发效力和数据安全保障又升高了成本增加了效率。 上图是借助了云效的计划图,云效提供了对立的ID工具,解决了咱们开发环境新员工上手难的问题,通过CICD工具保障我的项目迭代疾速、继续的交付,容器组件通过云效能够简略疾速高效的实现需要。 1、云效:突破沟通壁垒 云效突破了沟通上的壁垒,因为在传统的研发流程上, EXCEL表格或者传统的工具,在需要调研阶段、需要设计阶段,比方开发、研发的设计阶段、运维、测试的各个阶段,市场上提供了十分多的工具,然而各个工具在整套流程上无奈保证数据的一致性,在我的项目的进度跟进上也是绝对是滞后的。 云效通过一站式的解决方案为咱们提供了一整套的流程,能够在云效平台上实现从需要的剖析设计,始终到开发生成测试报告,最终我的项目能够通过协同化办公实现整套的技术积淀,包含DevOps级别的积淀和我的项目教训级的积淀,帮忙中小企业更快的实现企业的高效DevOps的状况。 2、云效:买通数据割裂 云效帮忙咱们买通了数据割裂的状况,咱们在开发的各个阶段数据都是绝对繁多的,而且存在信息孤岛的状况。在每个阶段所有的数据都是拆散滞后的,云效提供钉钉接入,包含组织构造人员的同步和信息及时推送,保障了开发的及时性。咱们一站式计划是通过一个账号实现整套的治理流程。 升高了开发治理的老本;升高了新入职员工进入公司疾速染指开发的工夫;对于云开发,一个代码、一个仓库无缝对接,对接了阿里云的EDAS平台,让整个流程变得可控高效;3、云开发:一键部署、零运维 云开发提供的性能次要是一键部署、零运维。在咱们合作开发过程中传统的开发模式去做代码品质检测会更麻烦,在云效提供的流水线上能够做到一键的代码品质检测、代码的一键编译和一键公布等。云效还为咱们提供主动扩缩和日志治理,升高了耗费老本和运维老本晋升了效率。 4、云开发:全方位监控 零碎上云后,云组件提供的全方位监控、零碎全方位、全链路的监控变成了可能。在这个阶段波及到各个环节,比方开发环境到预发环境、测试环境到线上生产环境,各个环境存在不同的差异性,云效为咱们解决了环境差异性的问题。 5、云原生:保障数据安全 链路剖析各个链路存在的问题和更快、更精确的定位问题,开发人员用得比拟多的是开发接口调用和谬误异样剖析等,更快的解决咱们以后面临的问题。 数据安全的保障,除了零碎稳定性对咱们要求更高的就是系统安全、数据安全,云原生组件为咱们提供了精细化治理、权限管控和敏感信息的泄露检测、行为平安日志的审计等等,解决了咱们日常包含开发、运维和经营过程中的安全性问题。 数据库的自动化备份和环境的隔离,比如说各个环境造成脏数据的状况零碎有破绽查看。 云效提供的云开发和云原生组件给咱们带来了便利性,上图是咱们零碎落地施行的状况。E联智校次要是教育类产品,依靠于钉钉为基座为学校组织架构的老师、学生和家长提供服务。 通过这两年的实际过程发现,教育类行业周期性比拟长,比如说日周期的学生上学、放学,年周期的上学期的开学到放假,下学期的开学到放假,周期性比拟强,用户的并发性也比拟集中。应用阿里云的动静扩容、缩容的产品升高了资源的老本。 6、平台应用资源概览 上图是平台应用的资源概览。比方去年咱们须要运维人员运维的服务器数量在将近200台左右,过后的服务数量五六十个的样子。应用了云效后升高了咱们运维难度和服务器治理的数量,咱们只须要保障根底的运行,通过提供的动静扩容、缩容的问题,降低成本保证系统的高可用性。 云效提供的项目管理工具像大脑一样,为咱们提供项目管理生命周期和研发生命周期的治理,保障了效率和便捷性。 开发人员实现开发后,测试人员实现版本测试后,云效的流水线为咱们提供代码扫描,比方做代码品质监测、利用、构建、部署、测试等,疾速实现测试的迭代。 测试实现后,通过疾速的迹象构建部署,散发到各个服务器下面,最终公布到咱们的利用平台。在这个利用平台里应用了十分多的云原生组件,比如说ACR治理,ACK是对于K8S的集群、EDAS、Serverless等。EDAS云效就像大脑,EDAS更像综合性治理平台,为咱们解决运维上配置文件治理和服务治理等问题,通过EDAS疾速解决日志治理、开发人员疾速定位日志和运维人员疾速安稳回本等。 云原生数据库、PolarDB、Redis解决了开发和生产上的问题。 7、产品上云的过程及成绩 从去年9月份到往年9月份,通过5个版本迭代后实现了整体上云,版本迭代数量晋升了100%多。应用云效后升高了运维门槛、运维老本、应用云原生组件的技术门槛和开发成本,整体老本大略降落了25%到35%。 以上内容是E联智校在施行应用云效后的成果,依靠云效解决了产品和架构的问题,实现产品上云和我的项目转变的过程,感激E联智校冯涛老师对云效的信赖和必定,心愿云效能够陪伴他们不断进步。 欢送大家应用云效,云原生时代新DevOps平台,通过云原生新技术和研发新模式,大幅晋升研发效率。现云效公共云根底版不限人数0元应用。 立刻体验 对于咱们 理解更多对于云效DevOps的最新动静,可微信搜寻关注【云效】公众号; 彩蛋:公众号后盾回复【指南】,可取得《阿里巴巴DevOps实际指南》&《10倍研发效力晋升案例集》; 看完感觉对您有所帮忙别忘记点赞、珍藏和关注呦;

December 14, 2021 · 1 min · jiezi

关于应用开发:半天做完的数据报表YonBuilder只要十几分钟0代码开发

进入数字化时代,拍脑袋的决策形式显然不靠谱,所有要靠数据谈话。与信息化时代相比,数字化时代的企业对数据的利用更宽泛、更深刻。为了应答强烈的市场竞争,企业经营决策者们对数据的依赖度越来越高,企业各个业务线离不开各式各样的数据报表撑持,比方客户经营剖析、销售数据分析、财务报表剖析、营销流动剖析、HR员工关心统计等场景,让身处职场中的“表哥”、“表妹”们应接不暇。 有没有更简略的数据报表开发方式,晋升数据统计工作的效率?本期YonBuilder直播课堂给大家带来0代码做数据报表的实际体验。以HR员工关心数据统计报表为例,整个演示过程仅用十几分钟,没有编写一行代码,就实现了过来须要破费半天工夫能力达成的数据统计成果,充分体现了YonBuilder低代码开发平台的高效率。 本次数据报表开发场景的抉择堪称是殚精竭虑,给HR们带来了福音。家喻户晓,人才是企业倒退的根基,为了激励员工为企业倒退多做奉献,也让员工感触到企业的关心和和煦,HR都会为员工发放各式各样的福利。然而,具备肯定员工规模且全国各地有分支机构的企业,HR通常会依据员工所在区域、年龄段、性别等各种信息设计不同的福利计划,发放不同类型的礼品。应答这种绝对简单的数据统计需要,通过YonBuilder搭建数据统计报表,HRBP的工作会轻松很多。 接下来,YonBuilder技术大咖王洪刚老师带大家领略本次直播课程的精髓。 直播开始前,王洪刚老师将提前准备好的数据录入到零碎中,通过一般数据列表的形式做了一个展现,给咱们留下一个悬念。 数据列表展现 整体来看,下面的数据列表的展示不直观,没有数据统计。如何将列表中的数据依照本人的要求自在展现?HR能够利用YonBuilder中的报表性能实现数据统计,而且不须要编写一行代码,齐全通过配置的形式实现。 第一步,创立数据源。做报表之前先建设一个数据源,HR能够找公司的技术共事创立数据源 抉择数据起源类型 以新建MySQL数据起源为例,配置数据源和数据连接池,而后点击测试连贯,测试连贯胜利后保留即可。 第二步,新建报表。有了数据源之后,接下来进行相干报表的设计,点击右上角的“新建报表”,开启你的数据报表开发设计之旅。 两头表格编辑区域和咱们罕用的Excel表格相似,操作上手很简略 增加数据模型 抉择数据起源 抉择刚刚配置好的数据模型,将提前准备好员工报表数据导入,窗口右侧选勾选的字段是本次数据报表中用到的字段。 第三步,筹备表格模板。将提前做好的数据表格模板复制到报表编辑页面,而后将左侧的字段拖拽到对应的表格中。 选中要填充的单元格,用员工编码拖到对应的地位进行填充。特地阐明:之所以抉择员工编码字段,是因为相比于姓名、性别等其余字段来说,员工编码能确保数据唯一性。而后在右侧数据设置中抉择聚合,在聚合类型上面抉择去重计数(精确统计到员工个数)。 第四步:增加过滤条件。选中男性这一列做数据过滤。 点击右侧的设置条件,点击增加,而后在下拉列表中抉择性别和操作符“等于”,点击确定。女性、汉族等字段的设置同样如此。 留神:少数民族的顾虑有一个技巧,因为少数民族十分多,挨个抉择设置的话十分繁琐,能够在列表设置时通过不等于汉族进行过滤。 设置完所有的字段之后选中所有的单元格 这是一个横向和纵向都有数据的穿插表,抉择一个交叉点,点击辨认为交叉点,这时候数据就曾经做好了。 保留并预览报表,看上去比数据列表直观很多,然而款式上略显枯燥,不够平面和直观。 第五步:批改报表款式。返回编辑窗口,点击窗口中的“表格款式”抉择喜爱的表格款式。 设置表格款式之后的预览成果,十分清晰 直播现场小挑战:将数据依照区域查问 这个小挑战对技术大咖王洪刚来说So easy,轻松应答。想要持续依照区域等细颗粒度进行查问,把须要过滤的字段拖到面板中。 保留并预览,点击查问面板中的查问按钮, 在区域下拉框中勾选多个想要查看的区域。 如上图所示,依照区域查问的数据报表就轻松实现了 结束语: 本次演示的HR员工福利统计报表仅仅是一个开胃小菜,YonBuilder还能够反对其余更丰盛的数据报表开发场景,比方,客户在全国各地都有销售数据,能够做一个依据省市对销售数量和金额的树形报表等等。学会应用YonBuilder低代码开发工具,业务部门都能够轻松做出任何想要的报表。各位“表哥”、“表妹”们Get到新技能了吗? 想要观看更多YonBuilder开发实际直播,欢送在微信搜寻公众号“YonBuilder”并关注,也能够增加小助理微信号,一键体验YonBuilder低代码开发的乐趣。

December 7, 2021 · 1 min · jiezi

关于应用开发:为什么使用云效应用交付AppStack平台-核心是什么

云效应用交付平台 AppStack是一款开发者敌对的、以利用为外围的云原生利用交付平台,提供利用编排、环境治理、部署运维、资源管理、利用公布等一站式能力,帮忙企业建设利用继续交付整体解决方案,减速企业云原生与 DevOps 转型,晋升团队研发效力。 为什么应用云效 AppStack?产品价值 开发者:反对开发者“高效自运维” 开发者敌对的环境察看与环境运维,不便问题排查和应急解决自助公布,公布过程可察看、可干涉,一键暂停、回滚清晰的版本记录可追溯,回滚残缺无脱漏运维:反对研发运维流程集中管控 企业级集中定义利用编排规定和部署策略,为研发自运维危险兜底辞别传统低效、繁琐的日常运维工作,为运维减负技术管理者:标准研发运维流程,晋升团队效力 研发运维流程通过工具固化积淀晋升公布运维流动可见性精细化的权限治理产品劣势人造云原生,无平台绑定 反对原生Kubernetes编排,以及凋谢利用模型OAM对利用部署架构无侵入反对以原生YAML格局和Helm Chart格局导出利用编排,跨云部署无顾虑开箱即用,免运维 收费应用,无需搭建,免运维简略易上手 内置经典的利用编排模版和继续交付流水线模版,十分钟从提交到部署阿里云产品买通 集成阿里云代码治理、CI/CD流水线、制品仓库、kubernetes集群等多产品,应用更便捷产品性能 应用限度 立刻体验:devops.aliyun.com/appstack云效AppStack外围概念 利用 一个可独立交付的对外提供服务的单元,在研发态,通常对应一个到多个功能模块,关联一个或多个代码库;在运行态,通常对应一组Kubernetes资源。 利用编排 是对利用部署架构的形容,通常蕴含工作负载、配置项、网络、存储申明等,是一组Kubernetes资源组合。 环境 环境是利用运行态的载体,是利用维度做部署和运维的操作界面。在AppStack中,一个利用能够创立多套环境,用于开发、测试、生产等不同场景,用户能够别离对这些环境进行更新、治理和运行状态监控。 变量组 变量是一个键值对。变量组是一组变量的汇合,即一组键值对的汇合。在AppStack中,变量组可用于利用治理的多个阶段,如利用编排阶段通过提取出多个环境中的不同局部,反对同一套利用编排在多个环境中差异化部署。 资源 资源能够是任意云产品实例。资源池是一组资源的汇合,能够蕴含多种类型的多个资源。在AppStack中,资源池用于企业资源管理,用户能够通过导入资源的形式,为不同利用、环境提供用于理论部署的根底云资源。 云效应用交付平台 AppStack是一款开发者敌对的、以利用为外围的云原生利用交付平台,提供利用编排、环境治理、部署运维、资源管理、利用公布等一站式能力,帮忙企业建设利用继续交付整体解决方案,减速企业云原生与 DevOps 转型,晋升团队研发效力。

November 9, 2021 · 1 min · jiezi

关于应用开发:阿里云云效发布云原生应用交付平台加速企业云原生DevOps规模化落地

编者按:阿里云云效公布云原生利用交付平台,减速企业云原生DevOps规模化落地10月21日,2021云栖大会云效BizDevOps分论坛上,阿里云云效技术负责人陈鑫正式公布云效云原生利用交付平台AppStack,旨在进一步减速企业云原生DevOps规模化落地。 为什么企业须要云原生利用交付平台?云效云原生利用交付平台有何特色?本文将为你具体道来。 云原生时代须要以利用为核心的DevOps平台 随着Docker、K8s、微服务架构等云原生技术的成熟与遍及,企业驳回云原生成为必然趋势。据Gartner预测,到2022年,将有75%的企业应用云原生技术。 然而,现状是大部分企业依然只是在测试环境或者小范畴中利用云原生。这是因为云原生在给企业带来了更低的老本和更高效的软件开发的同时,也带来了新的技术门槛——企业须要全新的运维形式和研发流程、以及大量一线开发人员的培训老本。 要想规模化落地云原生,离不开DevOps工具平台的反对。那么,什么是适宜云原生时代的DevOps平台呢?答案是以利用为核心。 所谓的利用是线上提供给用户的一个服务,一个利用能够关联代码库、多个环境如开发、测试、线上环境等,以及CICD流程和各种资源如容器、数据库等。 相比于K8s的资源视角,利用视角能够让开发者更不便地去设计部署架构、申请资源、标准上线流程、调配人员权限等。而企业要落地云原生,外围就是让泛滥开发人员能够自运维。 总结来看,以利用为核心对企业有3大益处: 1、不便组织资产和交付过程。企业能够以利用为核心来聚合代码、交付流程、制品、测试、环境资源等,在一个平台来对立治理。 2、多角色协同开发运维。落地DevOps的要害是丰盛的自动化工具和运维兜底策略能够让每个开发高效工作而无需放心线上危险,在以利用为核心的DevOps平台上,运维工程师能够围绕利用去配置流程和规定,将部署和运维过程自动化。而开发能够成为操作者,专一代码编写和性能验证。这才是真正的DevOps。 3、关注点拆散和平安合规。利用将研发视角和K8S资源视角做了拆散,运维工程师将利用的交付运维工作交给开发当前,能够专一于基础设施运维和高可用保障。企业管理者也能够通过对利用交付流程的对立管控来达到平安合规的目标,比方能够在重大节日禁止变更,或者对立设置上线审批流程等等。 云效AppStack——以利用为核心的云原生利用交付平台 本次阿里云云效公布的利用交付平台AppStack,就是这样一款以利用为核心的云原生利用交付平台。 如上图所示,云效应用交付平台AppStack的能力分为高低两层:上层提供的是利用交付运维的根本能力,如利用编排、构建、环境治理、测试、公布等。下层是将多环境串联起来的残缺CICD工作流,咱们称为利用变更工作流。软件需要从左侧一直输出,与代码变更进行连贯,而代码依照规定进入变更工作流,通过一一环境的验证最终实现线上公布。团队管理者能够通过一直地优化和欠缺这个流程,让开发效率越来越高。 相比传统软件交付运维工具,云效应用交付平台AppStack的外围劣势有4点: 1、人造云原生,无平台绑定 云效应用交付平台AppStack在设计之初就全面反对原生K8S、HelmChart、OAM等业界规范,对利用部署架构无绑定、无侵入,企业不必放心迁徙以及技术改造老本。 2、高效,反对开发者自运维 企业的开发人员能够在云效应用交付平台AppStack自助公布,整个的利用公布过程可察看、可干涉,反对一键暂停、回滚。同时,在云效AppStack内就能够间接进行环境察看与环境运维,问题的排查和应急解决也十分不便。 3、平安,不便研发运维策略集中管控 在云效应用交付平台AppStack内,运维和测试人员能够集中定义利用编排的规定和部署策略,达到危险集中兜底的目标。运维也能够从日常繁琐、低效的工作中解放出来,将精力聚焦运维规定的制订。 4、标准,标准化利用交付流程 通过模板化能力,和基于利用多角色权限治理能力,研发管理者能够借助云效AppStack将研发流程积淀到工具内,并在团队批量推广,升高管理负担。 目前,云效AppStack正在收费公测中,点击浏览原文即可体验。退出钉钉群32372670能够反馈产品倡议。 阿里云云效公布云原生利用交付平台,减速了企业云原生DevOps规模化落地,10月21日,2021云栖大会云效BizDevOps分论坛上,阿里云云效技术负责人陈鑫正式公布云效云原生利用交付平台AppStack,旨在进一步减速企业云原生DevOps规模化落地。为什么企业须要云原生利用交付平台?云效云原生利用交付平台有何特色?置信你在这篇文章中可能找到你的答案。 点击下方链接立刻体验 云效应用交付平台AppStack_云原生利用交付平台_利用继续交付_开发与运维-阿里云 (aliyun.com)

October 27, 2021 · 1 min · jiezi

原来这样就可以开发出一个百万量级的Android相机

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~本文由QQ空间开发团队发表于云+社区专栏最近我负责开发了一个跟Android相机有关的需求,新功能允许用户使用手机摄像头,快速拍摄特定尺寸(1:1或3:4)的照片,并支持在拍摄出的照片上做贴纸相关的操作。由于之前没有接触过Android相机开发,所以在整个开发过程中踩了不少坑,费了不少时间和精力。这篇文章总结了Android相机开发的相关知识、流程,以及容易遇到的坑,希望能帮助今后可能会接触Android相机开发的朋友快速上手,节省时间,少走弯路。一.Android中开发相机应用的两种方式Android系统提供了两种使用手机相机资源实现拍摄功能的方法,一种是直接通过Intent调用系统相机组件,这种方法快速方便,适用于直接获得照片的场景,如上传相册,微博、朋友圈发照片等。另一种是使用相机API来定制自定义相机,这种方法适用于需要定制相机界面或者开发特殊相机功能的场景,如需要对照片做裁剪、滤镜处理,添加贴纸,表情,地点标签等。这篇文章主要是从如何使用相机API来定制自定义相机这个方向展开的。二.相机API中关键类解析通过相机API实现拍摄功能涉及以下几个关键类和接口:Camera:最主要的类,用于管理和操作camera资源。它提供了完整的相机底层接口,支持相机资源切换,设置预览/拍摄尺寸,设定光圈、曝光、聚焦等相关参数,获取预览/拍摄帧数据等功能,主要方法有以下这些:open():获取camera实例。setPreviewDisplay(SurfaceHolder):绑定绘制预览图像的surface。surface是指向屏幕窗口原始图像缓冲区(raw buffer)的一个句柄,通过它可以获得这块屏幕上对应的canvas,进而完成在屏幕上绘制View的工作。通过surfaceHolder可以将Camera和surface连接起来,当camera和surface连接后,camera获得的预览帧数据就可以通过surface显示在屏幕上了。setPrameters设置相机参数,包括前后摄像头,闪光灯模式、聚焦模式、预览和拍照尺寸等。startPreview():开始预览,将camera底层硬件传来的预览帧数据显示在绑定的surface上。stopPreview():停止预览,关闭camra底层的帧数据传递以及surface上的绘制。release():释放Camera实例takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg):这个是实现相机拍照的主要方法,包含了三个回调参数。shutter是快门按下时的回调,raw是获取拍照原始数据的回调,jpeg是获取经过压缩成jpg格式的图像数据的回调。SurfaceView:用于绘制相机预览图像的类,提供给用户实时的预览图像。普通的view以及派生类都是共享同一个surface的,所有的绘制都必须在UI线程中进行。而surfaceview是一种比较特殊的view,它并不与其他普通view共享surface,而是在内部持有了一个独立的surface,surfaceview负责管理这个surface的格式、尺寸以及显示位置。由于UI线程还要同时处理其他交互逻辑,因此对view的更新速度和帧率无法保证,而surfaceview由于持有一个独立的surface,因而可以在独立的线程中进行绘制,因此可以提供更高的帧率。自定义相机的预览图像由于对更新速度和帧率要求比较高,所以比较适合用surfaceview来显示。SurfaceHolder:surfaceholder是控制surface的一个抽象接口,它能够控制surface的尺寸和格式,修改surface的像素,监视surface的变化等等,surfaceholder的典型应用就是用于surfaceview中。surfaceview通过getHolder()方法获得surfaceholder 实例,通过后者管理监听surface 的状态。SurfaceHolder.Callback接口:负责监听surface状态变化的接口,有三个方法:surfaceCreated(SurfaceHolder holder):在surface创建后立即被调用。在开发自定义相机时,可以通过重载这个函数调用camera.open()、camera.setPreviewDisplay(),来实现获取相机资源、连接camera和surface等操作。surfaceChanged(SurfaceHolder holder, int format, int width, int height):在surface发生format或size变化时调用。在开发自定义相机时,可以通过重载这个函数调用camera.startPreview来开启相机预览,使得camera预览帧数据可以传递给surface,从而实时显示相机预览图像。surfaceDestroyed(SurfaceHolder holder):在surface销毁之前被调用。在开发自定义相机时,可以通过重载这个函数调用camera.stopPreview(),camera.release()来实现停止相机预览及释放相机资源等操作。三.自定义相机的开发过程定制一个自定义相机应用,通常需要完成以下步骤,其流程图如图1所示:检测并访问相机资源 检查手机是否存在相机资源,如果存在,请求访问相机资源。创建预览类 创建继承自SurfaceView并实现SurfaceHolder接口的拍摄预览类。此类能够显示相机的实时预览图像。建立预览布局 有了拍摄预览类,即可创建一个布局文件,将预览画面与设计好的用户界面控件融合在一起。设置拍照监听器 给用户界面控件绑定监听器,使其能响应用户操作(如按下按钮), 开始拍照过程。拍照并保存文件 将拍摄获得的图像转换成位图文件,最终输出保存成各种常用格式的图片。释放相机资源 相机是一个共享资源,必须对其生命周期进行细心的管理。当相机使用完毕后,应用程序必须正确地将其释放,以免其它程序访问使用时,发生冲突。图1 定制自定义相机的过程对应到代码编写上可以分成三个步骤:第一步:在AndroidManifest.xml中添加Camera相关功能使用的权限,具体声明有以下这些:第二步:编写相机操作功能类CameraOperationHelper。采用单例模式来统一管理相机资源,封装相机API的直接调用,并提供用于跟自定义相机Activity做UI交互的回调接口,其功能函数如下,主要有创建释放相机,连接开始关闭预览界面,拍照,自动对焦,切换前后摄像头,切换闪光灯模式等,具体实现可以参考官方API文档。第三步:编写自定义相机Activity,主要是定制相机界面,实现UI交互逻辑,如按钮点击事件处理,icon资源切换,镜头尺寸切换动画等。这里需要声明一个SurfaceView对象来实时显示相机预览画面。通过SurfaceHolder及其Callback接口来一同管理屏幕surface和相机资源的连接,相机预览图像的显示/关闭。四. 开发过程遇到的一些坑下面再讲讲我在开发自定义相机时踩过的一些坑:1. Activity设为竖屏时,SurfaceView预览图像颠倒90度。说明这个问题之前,先介绍下Android手机上几个方向的概念:屏幕方向:在Android系统中,屏幕的左上角是坐标系统的原点(0,0)坐标。原点向右延伸是X轴正方向,原点向下延伸是Y轴正方向。相机传感器方向:手机相机的图像数据都是来自于摄像头硬件的图像传感器,这个传感器在被固定到手机上后有一个默认的取景方向,如下图2所示,坐标原点位于手机横放时的左上角,即与横屏应用的屏幕X方向一致。换句话说,与竖屏应用的屏幕X方向呈90度角。图2 相机传感器方向示意图 相机的预览方向:由于手机屏幕可以360度旋转,为了保证用户无论怎么旋转手机都能看到“正确”的预览画面(这个“正确”是指显示在UI预览界面的画面与人眼看到的眼前的画面是一致的),Android系统底层根据当前手机屏幕的方向对图像传感器采集到的数据进行了旋转处理,然后才送给显示系统,因此可以保证预览画面始终“正确”。在相机API中可以通过setDisplayOrientation()设置相机预览方向。在默认情况下,这个值为0,与图像传感器一致。因此对于横屏应用来说,由于屏幕方向和预览方向一致,预览图像不会颠倒90度。但是对于竖屏应用,屏幕方向和预览方向垂直,所以会出现颠倒90度现象。为了得到正确的预览画面,必须通过API将相机的预览方向旋转90,保持与屏幕方向一致,如图3所示。图3 相机预览方向示意图(红色箭头为预览方向,蓝色方向为屏幕方向)相机的拍照方向:当点击拍照按钮,拍摄的照片是由图像传感器采集到的数据直接存储到SDCard上产生的,因此,相机的拍照方向与传感器方向是一致的。2. SurfaceView预览图像、拍摄照片拉伸变形说明这个问题之前,同样先说一下几个跟相机有关的尺寸。SurfaceView尺寸:即自定义相机应用中用于显示相机预览图像的View的尺寸,当它铺满全屏时就是屏幕的大小。这里surfaceview显示的预览图像暂且称作手机预览图像。Previewsize:相机硬件提供的预览帧数据尺寸。预览帧数据传递给SurfaceView,实现预览图像的显示。这里预览帧数据对应的预览图像暂且称作相机预览图像。Picturesize:相机硬件提供的拍摄帧数据尺寸。拍摄帧数据可以生成位图文件,最终保存成.jpg或者.png等格式的图片。这里拍摄帧数据对应的图像称作相机拍摄图像。图4说明了以上几种图像及照片之间的关系。手机预览图像是直接提供给用户看的图像,它由相机预览图像生成,拍摄照片的数据则来自于相机拍摄图像。图4 几种图像之间的关系下面说下我在开发过程中遇到的三种拉伸变形现象: 1、手机预览画面中物体被拉伸变形。2、拍摄照片中物体被拉伸变形。3、点击拍照瞬间,手机预览画面会停顿下,此时的图像是拉伸变形的,然后预览画面恢复后图像又正常了。现象1的原因是SurfaceView和Previewsize的长宽比率不一致。因为手机预览视图的图像是由相机预览图像根据SurfaceView大小缩放得来的,当长宽比不一致时必然会导致图像变形。后两个现象的原因则是Previewsize和Picturesize的长宽比率不一致所致,查了相关的资料,发现其具体原因跟某些手机相机硬件的底层实现有关。总之为了避免以上几种变形现象的发生,在开发时最好将SurfaceView、PreviewSize、PictureSize三个尺寸保证长宽比例一致。具体实现可以先通过camera.getSupportedPreviewSizes()和camera.getSupportedPictureSizes()获得相机硬件支持的所有预览和拍摄尺寸,然后在里面筛选出和SurfaceView的长宽比一致并且大小合适的尺寸,通过camera.setPrameters来更新设置。注意:市场上手机相机硬件支持的尺寸一般都是主流的4:3或者16:9,所以SurfaceView尺寸不能太奇葩,最好也设置成这样的长宽比。3. 各种crash前两个Crash的原因是:相机硬件在聚焦和拍照前必须要保证已经连接到surface,并且开启相机预览,surface有收到预览数据。如果在还没有执行camera. setPreviewDisplay或者未调用camera. startPreview之前,就调用camera.autofocus或camera.takepicture,就会出现这个运行时异常。对应到自定义相机的代码中,要注意在拍照按钮事件响应中执行camera.autofocus或camera.takepicture前,一定要检验camera有没有设置预览Surfaceview并开启了相机预览。这里有个方法可以判断预览状态:Camera.setPreviewCallback是预览帧数据的回调函数,它会在SurfaceView收到相机的预览帧数据时被调用,因此在里面可以设置是否允许对焦和拍照的标志位。还有一点要注意,camera.takePicture()在执行过程中会执行camera.stopPreview来获取拍摄帧数据,表现为预览画面卡住,而如果此时用户点击了按钮的话,也就是调用camera.takepicture,也会出现上面的crash,因此在开发时,可能还需要屏蔽拍照按钮的连续点击。第三个crash则涉及图像的裁剪,由于要支持1:1或者4:3尺寸镜头,所以会需要对预览视图进行裁剪,由于是竖屏应用,所以裁剪区域的坐标系跟相机传感器方向是成90度角的,表现在裁剪里就是,屏幕上的x方向,对应在拍摄图像上是高度方向,而屏幕上的y方向,对应到拍摄图像上则是宽度方向。因此在计算时要一定注意坐标系的转换以及越界保护。4. 前置摄像头的镜像效果Android相机硬件有个特殊设定,就是对于前置摄像头,在展示预览视图时采用类似镜面的效果,显示的是摄像头成像的镜像。而拍摄出的照片则仍采用摄像头成像。看到这里,大家可能会有些怀疑,不妨现在就试试自己Android手机上的前置摄像头,对比下预览图像和拍摄出照片的区别。这是由于底层相机在传递前置摄像头预览数据时做了水平翻转变换,即将x方向镜像翻转180度。这个变化对之前竖屏预览的方向也会造成影响,本来对于后置摄像头旋转90度即可使预览视图正确,而对前置摄像头,如果也旋转90度的话,看到的预览图像则是上下颠倒的(因为x方向翻转了180度),因此必须再旋转180度,才能显示正确,如图5所示,大家可以结合之前相机预览方向的示意图一起理解。图5 前置摄像头的预览方向示意图 此外,由于拍摄图像并没有做水平翻转,所以对于前置摄像头拍出来的照片,用户会发现跟预览时所见的是左右翻转的。这个在一定程度上会影响用户体验。为了解决这个问题,可以对前置摄像头拍摄的图像在生成位图文件时增加一个水平翻转矩阵变换。5. 锁屏下相机资源的释放问题为了节省手机电量,不浪费相机资源,在开发的自定义相机里,如果预览图像已不需要显示,如按Home键盘切换后台或者锁屏后,此时就应该关闭预览并把相机资源释放掉。参考官方API文档,当surfaceView变成可见时,会创建surface并触发surfaceHolder.callback接口中surfaceCreated回调函数。而surfaceview变成不可见时,则会销毁surface,并触发surfacedestroyed回调函数。我们可以在对应的回调函数里,处理相机的相关操作,如连接surface、开启/关闭预览。 至于相机资源释放,则可以放在Acticity的onpause里执行。相应的,要重新恢复预览图像时,可以把相机资源申请和初始化放在Acticity的onResume里执行,然后通过创建surfaceview,将camera和surface相连并开启预览。但是在开发过程中发现,对于按HOME键切后台场景,程序可以正常运行。对于锁屏场景,则在重新申请相机资源时会发生crash,说相机资源访问失败。那么原因是什么呢?我在代码里增加了调试log, 检查了代码的执行顺序,结果如下: 在自定义相机页面按HOME键时的执行流程:程序运行->按HOME键Activity调用的顺序是onPause->onStopSurfaceView调用了surfaceDestroyed方法然后再切回程序Activity调用的顺序是onRestart->onStart->onResumeSurfaceView调用了surfaceCreated->surfaceChanged方法而对于锁屏,其执行流程则是:Activity只调用onPause方法解锁后Activity调用onResume方法SurfaceView中surfaceholder.callback的所有方法都没有执行问题找到了,由于锁屏时,callback的回调方法没有执行,导致相机和预览的连接还没有断开,相机资源就被释放了,所以导致在重新申请相机资源时,系统报crash。根据上面的文档,推测是锁屏下系统并没有改变surfaceview的可见性,于是我尝试在onPause和onResume时通过手动设置surfaceview的visibile属性,结果发现可以正常触发回调函数了。由于在切后台或者锁屏时,用户本来就应该看不到surfaceview,因此这种手动更改surfaceview的可见性的方法,并不会对用户的体验造成影响。问答Android - 如何修复权限异常?相关阅读深入理解Autorelease PoolComponentKit框架解析之一—初识CKAndroid 内存泄漏分析心得 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

September 20, 2018 · 1 min · jiezi