tag 标签: 开发

相关博文
  • 热度 2
    2023-10-7 23:13
    946 次阅读|
    0 个评论
    谢谢兆易创新高工、芯片综合服务商映时科技。谢谢面包板论坛。 感谢 机械工业出版社。 感谢提供的这一次试读机会。 感谢 映时科技 董晓 任保宏 。 为感谢大家的帮助与支持我给大家表演一段: 接上八篇: 《GD32 MCU原理及固件库开发指南》+试读心得(1) 《GD32 MCU原理及固件库开发指南》+试读心得(2)第八章 《GD32 MCU原理及固件库开发指南》+试读心得第一章(1) 《GD32 MCU原理及固件库开发指南》+试读心得第一章(2) 《GD32 MCU原理及固件库开发指南》+试读心得第二章(1) 《GD32 MCU原理及固件库开发指南》+试读心得第二章(2) 《GD32 MCU原理及固件库开发指南》+第三章试读心得 《GD32 MCU原理及固件库开发指南》+第四章试读心得 电子发烧友jf_39110170 网名“还没吃饭”阅读《GD32 MCU原理及固件库开发指南》第五章MCU基础外设 的读后感: 最近我回顾了GD32MCU基础外设,包括GPIO、DMA、定时器、RTC、看门狗定时器等,这些是嵌入式系统中常用的接口。通过复习这些外设,我深刻体会到MCU作为控制器的强大之处,可以方便地控制各种硬件设备。首先,GPIO是最基础的外设,可以用于控制LED、LCD等输出设备,以及读取按钮、光敏等输入设备。通过学习GPIO,我了解到它的输出和输入操作是如此简单,可以轻松地实现流水灯和按键输入。此外,GPIO还可以配合DMA实现高速并行数据读取,可以用来模拟UART、I2C、SPI等通信协议。这使我更加深入地了解到嵌入式系统的多样性和灵活性。 其次,我回顾了使用中断方式来实现按键输入实例。EXTI的核心是20个相互独立的边沿检测电路,处理器使用EXTI可以从GPIO或者内部外设获取信息。通过这个实例,我复习了处理器如何感知外界的信息,并作出相应的处理。 此外,我还学习了DMA在SRAM中搬运数据和从Flash向SRAM搬运数据。DMA是一种不依赖于CPU的内存管理技术,可以快速地传输数据。通过这个实例,我了解到在实际工程中如何使用DMA来配合其他外设(如ADC、DAC、SPI、USART等)实现更高效的数据传输和控制。定时器也是我复习的重点之一。通过定时器可以实现软件延时测量事件,输出PWM和测量外部输入信号频率等功能。在定时器之间的同步操作中,我学到了如何实现多个定时器的协同工作,以便更好地控制和管理时间。 最后,我回顾了RTC和看门狗定时器。RTC可以获取日历时间和低功耗唤醒,是实际工程中非常重要的外设之一。而看门狗定时器则是一种可靠性更高的保护措施,可以确保系统在出现异常时能够及时复位并重新启动。通过复习GD32MCU基础外设,我不仅掌握了这些接口的基本使用方法,还深入了解了它们的工作原理和应用场景。这些知识将对我今后的学习和工作产生积极的影响,使我更加深入地了解嵌入式系统的设计和应用。 谢谢! 本人帖子: 米尔-STM32MP135开发板试用2-螺旋桨控制(原创)首发(开源) 米尔-STM32MP135开发板试用4-Linux控制螺旋桨升力大小(原创) 【飞凌AM6254开发板试用】+5内核编译串口芯片Linux驱动(原创) 【Milk-V Duo 开发板免费体验】4-Linux控制小车动作(原创)首发 【飞凌i.MX9352开发板试用】+机械臂游戏2游戏操纵杆控制四自由度机械臂(开源)原创首发 【米尔瑞萨RZ/G2L开发板-创新应用】4(原创)四自由度机械臂游戏开源的项目 【轩辕剑法 ---乾甲申式 】 https://www.bilibili.com/video/BV19w411a7mF/?share_source=copy_web&vd_source=b5b305bec6cbccdfdaee2cf57cf341bc 谢谢!
  • 热度 4
    2023-9-28 15:20
    868 次阅读|
    0 个评论
    谢谢兆易创新高工、芯片综合服务商映时科技。谢谢面包板论坛。 感谢 机械工业出版社。 感谢提供的这一次试读机会。 感谢 映时科技 董晓 任保宏 。 接上六篇: 《GD32 MCU原理及固件库开发指南》+试读心得(1) 《GD32 MCU原理及固件库开发指南》+试读心得(2)第八章 《GD32 MCU原理及固件库开发指南》+试读心得第一章(1) 《GD32 MCU原理及固件库开发指南》+试读心得第一章(2) 《GD32 MCU原理及固件库开发指南》+试读心得第二章(1) 《GD32 MCU原理及固件库开发指南》+试读心得第二章(2) 在嵌入式系统的学习中,理解MCU(微控制器)的系统架构是非常重要的。最近,我深入学习了GD32 MCU系统架构 收获颇丰。现在,我想分享一下我对GD32 MCU的理解和心得,希望对大家有所帮助。 GD32 MCU是一种常见的嵌入式系统组件,由于其高性价比和强大的性能,被广泛应用于各种领域。在了解GD32 MCU的系统架构前,我们首先需要理解它的框架结构。GD32 MCU的框架结构清楚明了,包括M内核、NVIC(中断向量控制器)以及存储器架构。 GD32 MCU采用了四种M内核(M4、M33、M23和M3),每种内核都有其独特的特性。特别是M4内核,其结构紧凑,运行速度快,可编程性强,被广泛应用于各种应用中。通过深入学习这四种M内核的特性和M4内核结构,我对MCU内部的处理能力和运行机制有了更深入的理解。 在GD32 MCU中,NVIC和中断系统是实现实时响应的重要部分。NVIC负责处理外部设备的信号输入,而中断系统则负责在有紧急事件发生时立即停止当前任务进行处理。中断响应序列和中断相关配置操作的学习让我对MCU的实时处理机制有了更深的认识。 最后,我对GD32 MCU的存储器架构和Flash相关操作进行了详细研究。存储器架构包括Flash、RAM和其他内部存储器。其中,主Flash可以进行擦除、写入和读取操作。同时,选项字节操作可以用来设置Flash的特定参数,进一步增强了Flash的灵活性。 通过对GD32 MCU系统架构的学习,我不仅从理论上了解了MCU的基本构成和工作原理,更重要的是,我能够将这些理论知识应用到实践中。我明白了如何根据实际需求选择合适的MCU型号以及如何配置MCU以满足特定的性能要求。此外,我也学会了如何针对特定的应用场景优化MCU的编程代码,从而提高系统的效率和稳定性。 总的来说,通过学习GD32 MCU系统架构,我深入理解了嵌入式系统的核心组件和其工作机制。我相信,这种深入的理解将对我未来的学习和职业发展产生积极的影响。我希望通过分享我的学习心得,能够激发其他读者对嵌入式系统的热情和好奇心,从而一起探索这个美妙的世界。 谢谢!
  • 热度 5
    2023-5-18 09:15
    708 次阅读|
    0 个评论
    IAR更新基于模型的设计解决方案,通过可视化掌握复杂设计
    IAR 的状态机设计解决方案 Visual State 最新增加一系列新功能,能实现更好的跨平台支持,使大型分布式团队能更有效地协作 嵌入式开发软件和服务的全球领导者 IAR 今天宣布推出其基于模型的设计解决方案 IAR Visual State 的最新版本。开发人员使用 IAR Visual State 通过可视化的方式来构建他们的高层设计,构造复杂的应用程序,可分步添加功能,并自动生成与设计 100% 一致的 C 、 C++ 、 C# 或 Java 代码。 IAR Visual State 的最新版本带有更好的跨平台支持,以及用于快速生成代码的全新可视化功能,持续支持低代码开发。 IAR Visual State 对于嵌入式应用中的大型设计项目具有特别的优势,如汽车仪表盘、自动驾驶汽车系统、先进的电动工具、自动售货机、 HVAC 系统、跟踪系统、电梯、 PLC 和控制系统等。该解决方案提供了形式验证、分析与功能验证,以确保应用程序可按预期运行。 IAR 首席技术官 Anders Holmberg 表示:“ IAR Visual State 能够迅速帮助公司生成高质量代码,并有效地管理复杂设计。此外,本次新版本增加的功能,例如变体管理、 C# 和 Java 代码生成、支持需求管理( ReqIF 格式)和现代化的分级编码器,可以让开发人员能够在具有从嵌入式到移动 /PC 应用程序的不同技能(包括低代码开发)的大型分布式团队中工作。 ” IAR Visual State 新版本能够更好的实现跨平台支持,以改善用户在 Windows 和 Linux 上的体验。状态图编辑器和导航器已经统一为一个应用,有着新的外观和体验以及标签式窗口。这让开发者在 Windows 和 Linux 上都能拥有相同的用户体验。在最新的版本中, IAR Visual State 已支持 Linux Ubuntu 18 和 Ubuntu 20 。 IAR Visual State 是一个独立的解决方案,与工具链和架构无关。开发人员可以以图表形式设计状态机,生成符合设计的源代码,并自动生成文档。当 Visual State 集成到 IAR Embedded Workbench 中时,这两个工具都能充分发挥各自独特的功能,例如可直接在 Embedded Workbench 的 C-SPY 调试器中进行实时状态机调试,以及在 IDE 中自动处理源代码。 2023 年 6 月 14-16 日, IAR 将参加 2023 上海国际嵌入式展( embedded world China ),并在同期举办的技术研讨会上探讨状态机设计工具在嵌入式系统中实现低代码开发的可能性。 您也可以前往 IAR 展位(展位号: A121 ),亲自体验 Visual State Demo 演示。 关于 IAR IAR 为嵌入式开发提供世界领先的软件和服务,帮助世界各地的公司创造满足当前需求和未来趋势的安全创新产品。自 1983 年以来, IAR 解决方案在确保质量、安全、可靠和效率的同时,帮助工业自动化、物联网、汽车和医疗等行业的公司开发了超过一百万个嵌入式应用。 IAR 为 200 多个半导体合作伙伴的 15000 个设备提供支持。公司总部位于瑞典乌普萨拉,并在世界各地设有销售和支持办事处。 IAR 为 I.A.R.Systems Group AB 所有,在纳斯达克 OMX 斯德哥尔摩交易所上市,属于中型股指数(股票代码: IAR B )。
  • 热度 5
    2023-4-27 11:45
    475 次阅读|
    0 个评论
    应用编码标准和自动化工具,提高代码质量
    作者: IAR 嵌入式系统在我们的日常生活中广泛存在,从消费类电子、医疗设备,到汽车,工业控制,航空航天等,它们的存在已经成为我们生活中不可分割的一部分。随着技术的不断进步和客户需求的增加,嵌入式系统和软件变得越来越复杂,同时产品的开发周期变得越来越短。如何在短时间内开发出高质量的软件对产品的成功起着决定性的作用。 本文 将 介绍如何应用编码标准和自动化工具,提高代码质量。 关于代码质量 代码质量总体上是指为软件编写的代码的整体优良水平,一般可以通过下面一些指标来评价代码质量: l 可读性:代码应该易于阅读和理解,即使是不熟悉项目的人也是如此。 l 可维护性:代码应该有条理和模块化,可以方便地修改和更新。 l 可移植性:代码应该被设计易于在不同的平台上使用。 l 可重用性:代码应该是可重用的,可以在应用程序的其他部分使用。 l 可测试性:代码应该是易于进行单元测试和集成测试的。 l 安全性:代码应该是安全的,保护敏感数据并防止恶意攻击。 l 性能:代码应该是高效的,专注于优化性能,以最大限度地减少资源使用。 对于嵌入式系统,代码质量更加的重要。嵌入式系统经常是处理执行关键任务功能的设备。 如果嵌入式软件存在代码质量问题,可能会导致硬件设备的故障或安全漏洞,严重影响系统的正常运行。 编码标准是提高代码质量的最佳实践 基于历史原因,目前在嵌入式开发中,主要还是使用 C/C++ 高级编程语言,而 C/C++ 是一种不安全的语言,包含大量未定义的行为,对于这些行为的不同解释,可能会导致未知或不确定的副作用,其中一部分将会转化为我们俗称的“ Bug ”。比如 C 语言标准库中的一些输入输出函数,字符串函数导致的缓冲区溢出的问题,指针未初始化风险,重复释放内存等等。 同时,软件开发执行和实施的核心是“人”,也就是开发人员,在实践过程中,开发人员可能会一次又一次无意地将相同类型的错误写入到他们的源代码中。这一结论来自各种权威机构,如 NASA 、贝尔实验室和 MITRE ,它们进行了多项调查和研究。这 些 研究的结果是给出了最佳编程实践或推荐的编程实践,它们可以有效识别有风险和不良的编码行为。 有许多指南和编码实践可用于检查常见错误以及如何避免这些错误来提高代码质量,其中一些技术和实践在实施过程中,成为众所周知的编码标准。编码标准是编码规则、指导方针和最佳实践的集合,它可以识别语言中容易引起 Bug 的行为,防止你在源代码中做可疑的事情,消除容易出现缺陷的代码结构,帮助 你 快速提高代码质量。 在嵌入式系统中, MISRA-C/C++ , CERT-C/C++ , CWE 等已经成为事实标准。特别是在汽车、医疗和铁路等安全关键型应用中,被 IEC 61508 、 EN 50128 和 ISO 26262 等功能安全标准 所 要求。 很多大公司都有相应的代码编程规范,尤其是针对 C 语言,但这些编程规范往往与业界的编程标准(比如 MISRA C )的侧重点不同。一般公司的编程规范更加注重代码风格,比如命名,缩进,括号的使用等,来提高可读性,而业界的编程标准更偏重 于 代码的可维护性,可移植性,可靠性和安全性。在具体实践中,往往是需要这二者结合使用。 MISRA MISRA C 由汽车工业软件可靠性协会开发。它的目的是提高嵌入式系统环境中的代码安全性、可移植性和可靠性,特别是那些用 ISO C 编程的系统。 MISRA C 标准的第一版“ Guidelines for the use of the C language in vehicle based software ”于 1998 年制定,正式名称为 MISRA-C:1998 。 2004 年进行了一次更新“ Guidelines for the use of the C language in critical systems ”,正式名称为 MISRA-C:2004 。从 1998 年的 vehicle based software 到 2004 年的 critical systems ,因为 MISRA 协会发现 MISRA C 不仅汽车行业需要,其他一些安全相关的行业也需要。最新的 MISAR C 标准是 MISRA-C:2012 。 关于 MISRA C ,很多开发者都有一个误解: MISRA C 只适用于汽车电子嵌入式软件开发。对此 , MISRA C 的轮值主席 Andrew Banks 特意做了解释说明:虽然 MISRA 最开始推出的时候主要是针对汽车行业的,但由于它本身其实是在 C/C++ 语言的基础上,加上了一些约束,去掉了一些让人容易出错的编程方法,保留了常用的写法,尽可能让开发者保持一致,提高可维护性和可移植性,从而提高安全性和可靠性 , 因此 MISRA 在飞机、机器人、无人机、医疗等其它的嵌入式行业也开始流行起来,成为了全球公认的嵌入式 C 编程标准。 CERT CERT C/C++ 由卡内基梅隆大学软件工程研究所 ( SEI ) 的计算机紧急响应小组 ( CERT ) 部门创建和发布,为 C/C++ 编程语言的安全编码提供规则和建议,这些规则和建议的目标是开发安全、稳定和可靠的系统。 CWE CWE 是基于社区开发的一组影响信息安全的软件和硬件缺陷列表。它用通用语言描述和讨论软件和硬件的缺陷,可以作为缺陷识别、缓解和预防工作的公共基线标准。因此, CWE 可以帮助开发人员和安全从业者检查现有软件和硬件产品的缺陷,评估针对这些缺陷的工具的覆盖率等。 编码标准的应用对提高代码质量有立竿见影的作用。在 Dr. Dobbs 所做的一项研究中( Code Quality Improvement | Dr Dobb's ),引入编码标准进行符合性检查后,缺陷注入率降低了 41% ,这节省了大量测试时间,既提高了代码质量,又缩短了工程时间,从而加速了产品上市。在这项研究中,每个月的缺陷注入率是相当稳定的,直到该组织引入编码标准,然后缺陷率急速下降 (见下图) 。 随着对标准遵从度的提高,质量也随之提高,偏差越来越少,缺陷率直线下降。 自动化工具是实施编码标准的最佳路径 有了编码标准后,应用标准意味着代码除了需要遵守语言本身的规则外,还需要遵守成百上千条编码标准所包含的规则和要求。理论上,我们可以通过人工来检查每条编码规则的实施情况,但对于日益复杂的软件显然是力不从心的。大量的实践表明,应用自动化工具是实施编码标准,提高代码质量的最佳路径。 自动化工具中我们最熟悉的就是编译器和链接器。高质量的编译器和链接器应支持现代编程语言,如最新的 C 和 C++ 规范,报告每个构建步骤中可能出现的问题,以便它生成怀疑的警告,例如易失性变量或内存访问,其评估顺序可能会影响应用程序的逻辑。警告是第一道静态分析检查,绝不能忽视,尤其是在功能安全设置中。最好的建议是通过更改编译器设置将所有警告都视为错误来将警告转化为错误。这将迫使开发人员修复代码中的所有歧义,因为所有的警告都将作为真正的问题处理。 专用的静态分析工具基于源代码分析,可以在不执行程序的情况下发现潜在的问题,比如 IAR 提供了与 IAR Embedded Workbench 无缝集成的静态分析工具 C-STAT 。这种类型的工具可以帮助你找到代码中最常见的缺陷来源,也可以帮助你找到开发人员在试图编写代码时往往不会考虑的问题,特别是当他们为了让某些功能运行而加入支撑代码时。静态分析工具确实能帮助你开发出更好的代码,因为它们强制执行编码标准。事实上,如果正在创建一个功能安全认证的应用,你 可能 会被建议,甚至强制要求使用静态分析工具。 此外,嵌入式软件在运行时仍然容易受到算术问题、缓冲区溢出、边界问题、堆完整性和内存泄漏的影响。一个可行的方法是在可能发生潜在错误的所有地方插入特定的检测代码或断言来检测此类错误。但是,手动添加指令来检测并以某种方式在运行时报告问题是一项非常耗时的任务。因此,使用动态或运行时分析工具来捕获和触发仅在运行时的缺陷和错误,是一个可以极大提高效率和生产力的方法。例如,在 IAR Embedded Workbench 中,开发人员可以使用运行时分析工具插件 C-RUN 。 综上所述,编译器和链接器可以报告在构建中可能 出现 的问题,静态分析工具擅长发现一些未定义行为的缺陷,检查编码标准的符合性,而运行时分析工具擅长发现只有在执行时才会触发的缺陷。这些缺陷有时会有重叠,但有时只能在一个域或另一个域中检测到。为了尽可能提高代码质量,以及发现问题的效率,需要将几者结合使用并尽可能与开发和构建工具集成。下图矩阵代表组合不同工具时的完整缺陷覆盖率。 总结 随着嵌入式系统的复杂性提高,对于嵌入式软件的要求也越来越高,其中最核心最根本的是代码质量,而编码标准是提高代码质量的最佳实践。遵循编码标准的最有效的方式是应用自动化工具,包括静态分析工具,运行时分析工具,这样可以有效 地 在开发过程中提高代码质量,既减少了项目的开发时间和成本,又提高了产品的质量和竞争力。 参考文献 1.https://www.misra.org.uk/ 2.https://ldra.com/ldra-blog/misra-myths-busted-1-is-misra-c-just-an-automotive-standard/ 3.http://www.cert.org/ 4.http://cwe.mitre.org/ 5.https://www.iar.com/knowledge/learn/code-quality/everything-starts-with-code-quality/ 6.https://www.iar.com/knowledge/learn/code-quality/everything-ends-with-code-quality/
  • 热度 2
    2023-4-13 22:15
    1931 次阅读|
    0 个评论
    学习目的: 前面文章有简要介绍硬件开发的基本过程,本文会细分硬件开发的流程,然后分作5个步骤,详细介绍开发全过程,包括立项-实施项目-软件开发-测试-验收 这几个过程,然后,再分解对每一个步骤进行详实的介绍。以期对整个过程有更深入的认识。 与硬件开发相关的流程主要有下列几个: a. 项目立项流程 b. 项目实施管理流程 c. 软件开发流程 d. 系统测试工作流程 e. 内部接收流程 1. 项目立项流程 是为了加强立项管理及立项的科学性而制定的。其中包括立项的论证、审核分析,以期做到合理进行开发,合理进行资源分配,并对该立项前的预研过程进行规范和管理。立项时,对硬件的开发方案的审查是重要内容。 2. 项目实施管理流程 主要定义和说明项目在立项后进行项目系统分析和总体设计以及软硬件开发和内部验收等的过程和接口,并指出了开发过程中需形成的各种文档。该流程包含着硬件开关、软件开发、结构和电源开发、物料申购并各分流程。 3. 软件开发流程 与硬件开发流程相对应的是软件开发流程,软件开发流程是对大型系统软件开发规范化管理文件,流程目的在对软件开发实施有效的计划和管理,从而进一步提高软件开发的工程化、系统化水平,提高 XXXX 公司软件产品质量和文档管理水平,以保证软件开发的规范性和继承性。软件开发与硬件结构密切联系在一起的。一个系统软件和硬件是相互关联着的。 4. 系统测试工作流程 该流程规定了在开发过程中系统测试过程,描述了系统测试所要执行的功能,输入、输出的文件以及有关的检查评审点。它规范了系统测试工作的行为,以提高系统测试的可控性,从而为系统质量保证提供一个重要手段。 项目立项完成,成立项目组的同时要成立对应的测试项目组。在整个开发过程中,测试可分为三个阶段,单元测试、集成测试、系统测试。测试的主要对象为软件系统。 5. 接收流程 制定的目的是加强内部验收的规范化管理,加强设计验证的控制,确保产品开发尽快进入中试和生产并顺利推向市场。 结束的话:由上可见,硬件开发过程中,必须提前准备好文档及各种技术资料,同时在产品设计时就必须考虑到测试。每个人的工作,可能只是其中的很小一部分,也可能包含好几项,这个主要是由项目的复杂程度,以及公司的大小规模决定的。 即使在大公司,硬件工程师也要尽量多去了解其他部门的内容,以及整个开发流程,要热爱开发,但不能沉迷于开发,到了一定的阶段,不管情不情愿都要开始转型,否则就可能像华为中兴,那些大公司对部分大龄的工程师进行“劝退”。
相关资源
  • 所需E币: 0
    时间: 2024-1-5 14:07
    大小: 3.13KB
    Django是一个由Python编写的一个开放源代码的Web应用框架。Django是一个高级的PythonWeb框架,用于快速开发可维护和可扩展的Web应用程序。使用Django,只要很少的代码,Python的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的Web服务。第一步,安装PythonWindows下安装Python非常简单,去Python官方网站找到Python3的下载地址,根据你的系统选择32位或者64位的安装包,下载好后双击安装即可。第二步,安装django强烈推荐在虚拟环境下进行django的开发。虚拟环境是一种Python工具,使用它可以创建一个独立的Python环境第三步,virtualenv创建和管理虚拟环境virtualenv的使用非常简单,首先安装virtualenv,打开命令行工具,输入下面的命令即可安装第四步,Django框架的View视图展示机制Django框架采用了MTV设计模式,在工作机制上自然也有些特别之处,其中最显著的就是V视图(View)部分。请读者再看一下图2中的描述,MTV模式中的V视图(View)是不负责处理用户输入的,这一点就是MTV模式特殊之处。第五步,Django框架的用户操作流程Django框架设计的MTV模式也是基于传统的MVC模式的,本质上也是为了各组件之间保持松耦合关系,只是定义上有些许不同。MVC模式之所以能够成为Web框架最流行的设计标准,也是因为其比较完美地契合了用户的操作流程。MVC模式是软件工程中的一种通用的软件架构模式,同样也适用于Web应用程序。MVC将Web框架分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),并以一种插件式的、松耦合的方式连接在一起。第六步,Django框架的主要特点这里给大家介绍Django框架的主要特点,其他一些小优点,读者在学习过程中会慢慢体会:基于Python语言及MVC模式,具有开发快捷、低耦合、部署方便、可重用性高和维护成本低等显著特点。通过一个URL分发器模块进行URL分派,分发器使用正则表达式来匹配URL,支持开发人员采用自定义URL方式,且没有框架的特定限定,使用起来非常灵活。可以方便地生成各种表单模型,实现表单的有效性检验,且支持从自定义的模型实例生成相应的表单。具有强大且可扩展的模板语言,支持分隔设计、内容和Python代码,并且具有可继承性。以Python类的形式定义数据模型,通过ORM(对象关系映射)将模型与关系数据库进行连接,开发人员将得到一个非常容易使用的数据库API,同时也支持在Django框架中直接使用原始SQL语句。内置国际化系统,支持开发多种语言的Web网站。缓存系统采用与memcached、Redis等缓存系统联用的方式,提高了页面的加载速度。内置了一个可视化的、自动化管理员界面(AdminSite),其类似于一个CMS系统(内容管理系统),开发人员可以方便快捷地通过该界面进行人员管理和内容更新等操作。第七步,创建Django项目安装了Django之后,我们就可以使用Django的管理工具------>django-admin了我们创建一个名称为loginweb的Django项目,命令如下:#1激活虚拟环境cdD:\djangotestdjangoenv\Scripts\activate#2创建一个loginweb的项目django-adminstartprojectloginweb或者python-mdjangostartprojectloginweb一般一个项目包含多个app应用程序(当然,通用的app也可以在多个项目中使用)下面我们为loginweb项目,创建login#1激活虚拟环境cdD:\djangotestdjangoenv\Scripts\activate#2切到django项目中cdloginweb#3创建一个叫login的应用django-adminstartapplogin在com.example.emos.wx.config.shiro中创建ThreadLocalToken类。packagecom.example.emos.wx.config.shiro;importorg.springframework.stereotype.Component;@ComponentpublicclassThreadLocalToken{  privateThreadLocallocal=newThreadLocal();  publicvoidsetToken(Stringtoken){    local.set(token);  }  publicStringgetToken(){    return(String)local.get();  }  publicvoidclear(){    local.remove();  }}之前我们测试sayHello()方法的时候,因为客户端提交的参数不正确,所以后端系统向客户端返回了大量的异常内容。这里我们要对返回的异常内容做一下精简。在com.example.emos.wx.config中,创建ExceptionAdvice类。packagecom.example.emos.wx.config;importcom.example.emos.wx.exception.EmosException;importlombok.extern.slf4j.Slf4j;importorg.springframework.http.HttpStatus;importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.web.bind.annotation.RestControllerAdvice;@Slf4j@RestControllerAdvicepublicclassExceptionAdvice{  @ResponseBody  @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  @ExceptionHandler(Exception.class)  publicStringvalidExceptionHandler(Exceptione){    log.error("执行异常",e);    if(einstanceofMethodArgumentNotValidException){      MethodArgumentNotValidExceptionexception=(MethodArgumentNotValidException)e;      //将错误信息返回给前台      returnexception.getBindingResult().getFieldError().getDefaultMessage();    }    elseif(einstanceofEmosException){      EmosExceptionexception=(EmosException)e;      returnexception.getMsg();    }    elseif(einstanceofUnauthorizedException){      return"你不具有相关权限";    }    else{      return"后端执行异常";    }  }}本文到处结束,感谢大家的阅读,有不足的地方大家多多指正!!
  • 所需E币: 0
    时间: 2024-1-3 19:29
    大小: 2.85KB
    1、什么是wpfWPF是微软新一代图形系统,运行在.NETFramework3.0及以上版本下,为用户界面、2D/3D图形、文档和媒体提供了统一的描述和操作方法。基于DirectX9/10技术的WPF不仅带来了前所未有的3D界面,而且其图形向量渲染引擎也大大改进了传统的2D界面,比如Vista中的半透明效果的窗体等都得益于WPF。2、WPF需要使用VisualStudio进行开发:RequiredWorkloads:.NETDesktopDevelopmentDesktopdevelopmentwithC++RequiredIndividualComponents:C++/CLIsupportWindows10SDK3、新建一个WPF工程:默认情况下会创建两个文件,一个是XAML文件(mainwindow.xaml),另一个是CS文件(mainwindow.cs)在mainwindow.xaml上,可以看到两个子窗口,一个是设计窗口,另一个是源(XAML)窗口。在WPF应用程序中,有两种方法可以为你的应用程序设计UI。一种是简单地将UI元素从工具箱拖放到设计窗口。第二种方法是通过为UI元素编写XAML标记来设计UI。当拖放功能用于UI设计时,VisualStudio会处理XAML标记。默认情况下,Grid设置为页面后的第一个元素。4、数据校验Binding的ValidationRules属性用于数据校验,ValidationRule是个抽象类,使用时需要创建其派生类并重写其Validate方法。Binding进行校验时默认只校验从Target到Source的数据,从Source到Target的数据部进行校验。如果想校验从Source到Target的数据,需将校验条件的ValidatesOnTargetUpdated设置为true.5、WPF的特点优点:MVVM模式,数据和视图分离类库多,上手快,可以快速开发灵活的控件组合,可以修改已经存在的控件的外观可以应用不同样式不同的控件,易于管理支持动画,高级图形,高级数据绑定,3D等功能绚丽的展示效果WPF除了可以使用传统的WindowsInstaller以及ClickOnce方式来发布我们的桌面应用程序之外,还可以将我们的应用程序稍加改动发布为基于浏览器的应用程序。缺点:对微软系统依赖性太强到了非微软的操作系统上,很多FrameWord里面的类库就不好使了。技术更新速度快移动和硬件领域的乏力,c/c++/java在移动领域和硬件领域的开发优势,是不用多说的----你见过几个公司,选择用c#来开发移动系统或者硬件驱动的?6、语法XAML语法这一部分基本内容都是摘抄微软官方的WPF中的XAML概述,只不过进行了小部分的词语修改以及增加Demo,降低理解难度。7、对象元素对象元素通常声明类型的实例,该类型在将XAML用作语言的技术所引用的程序集中定义。指定对象元素标记时,会创建一条指令,指示XAML解析器创建基础类型的新实例。每个实例都是在分析和加载XAML时通过调用基础类型的无参数构造函数来创建。8、基于属性的WPF动画在WPF中,动画使用了一个完全不同的模型。本质上,WPF动画只不过是在一段时间间隔内修改依赖性属性值的一种方式。优点:1.一套完整的动画封装,System.Windows.Media.Animation空间下已经提供了多数动画类。2.完成不同的特效,只需要微调部分属性即可。3.支持硬件加速。
  • 所需E币: 0
    时间: 2023-12-20 15:06
    大小: 4.4KB
    上传者: 开心就很好了
    大家都知道医疗行业是互联网发展前景极好的领域之一,对于初入职者、转行者来说都是很好的选择,今天我将给大家讲解一个关于健康+体检双系统的项目,项目以业务驱动技术栈,打造完整、全面的双系统项目,并采用前后端分离架构,业务功能完善,界面美观,可以高效积累大型医疗项目经验,快速提升医疗行业就业竞争力。项目开始前,我们先来安装JDK如果你本地有其他版本的JDK,一定要先卸载所有JDK,然后再安装JDK15.0.2,并且配置`PATH`和`JAVA_HOME`环境变量,否则JDK版本会出现错乱。第二步就是部署Maven工具配置的repository目录地址,你根据Maven解压缩的位置,修改这个文件夹地址即可。<localRepository>Maven解压缩路径\repository</localRepository>有时候可能由于Maven下载的依赖库丢包了,导致Java项目中没能识别某些Java类的时候。你可以把Maven的repository文件夹清空,然后重新启动IDEA工具,让Maven重新下载依赖库。第三步配置MySQL_1节点在Navicat上面,到MySQL_1节点上执行4条SQL语句。以MySQL_4为主节点,订阅日志同步数据。我们先在MyCat上面执行一个SQL语句,看看INSERT语句是否能转发给主节点,然后数据同步到其他5个节点。dockerrun-it-d--nameminio\-p9000:9000-p9001:9001\--netmynet--ip172.18.0.12-m400m\-v/root/minio/data:/data\-eTZ=Asia/Shanghai--privileged=true\--envMINIO_ROOT_USER="root"\--envMINIO_ROOT_PASSWORD="abc123456"\--envMINIO_SKIP_CLIENT="yes"\bitnami/minio:latest每次发出Ajax请求的时候,我们要写很多JQuery语句。特别是处理后端返回的状态码,我们要做不同的处理。如果每次发送Ajax请求都要写一大堆代码,是不是太繁琐了。不如我们把发送Ajax请求给封装起来,以后调用这个封装函数就可以了,那该多好啊。在main.ts文件中,创建全局函数封装Ajax代码。//导入JQuery库,因为Ajax用起来非常方便,支持同步和异步的Ajax请求import$from'jquery';//导入ElementUI的消息通知组件,下面封装全局Ajax的时候处理异常的时候需要弹出通知import{ElMessage}from'element-plus';//后端项目的URL根路径letbaseUrl='http://localhost:7700/his-api';app.config.globalProperties.$baseUrl=baseUrl;//设置全局变量$baseUrl//Minio服务器地址letminioUrl='http://localhost:9000/his';app.config.globalProperties.$minioUrl=minioUrl;//封装全局Ajax公共函数app.config.globalProperties.$http=function(url:string,method:string,data:JSON,async:boolean,fun:Function){  $.ajax({    url:baseUrl+url,    type:method,    dataType:'json',    contentType:'application/json',    //上传的数据被序列化(允许Ajax上传数组)    traditional:true,    xhrFields:{      //允许Ajax请求跨域      withCredentials:true    },    headers:{      token:localStorage.getItem('token')    },    async:async,    data:JSON.stringify(data),    success:function(resp:any){      if(resp.code==200){        fun(resp);      }else{        ElMessage.error({          message:resp.msg,          duration:1200        });      }    },    error:function(e:any){      //ajax有语法错误的时候      if(e.status==undefined){        ElMessage.error({          message:'前端页面错误',          duration:1200        });      }       else{        letstatus=e.status;        //没有登陆体检系统        if(status==401){          if(url.startsWith('/front/')){            router.push({              name:'FrontIndex'            });          }else{            router.push({              name:'MisLogin'            });          }        }         else{          //后端没有运行,提交的数据有误,或者没有连接上后端项目          if(!e.hasOwnProperty('responseText')){            ElMessage.error({              message:'后端项目没有启动,或者HTTP请求类型以及参数错误',              duration:1200            });          }           else{            ElMessage.error({              message:e.responseText,              duration:1200            });          }        }      }    }  });};我们先从前端验证函数开始做起。因为发送Ajax请求的时候,前端项目先做数据验证,这就离不开验证函数。在/src/utils目录中创建validate.ts文件,然后定义若干验证函数。/** *验证是否为空或者空字符串 */exportfunctionisBlank(s:string){returns==null||s.length==0;}/** *验证邮箱 */exportfunctionisEmail(s:string){return/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s);}/** *验证手机号码 */exportfunctionisMobile(s:string){return/^1[1-9]\d{9}$/.test(s);}/** *验证URL地址 */exportfunctionisURL(s:string){return/^http[s]?:\/\/.*/.test(s);}/** *验证用户名 */exportfunctionisUsername(s:string){return/^[a-zA-Z0-9]{5,50}$/.test(s);}/** *验证密码 */exportfunctionisPassword(s:string){return/^[a-zA-Z0-9]{6,20}$/.test(s);}/** *验证手机短信验证码 */exportfunctionisSmsCode(s:string){return/^\d{6}$/.test(s);}MIS端框架页面的视图层代码我们要加以修改,比如说<main>标签的:class属性要根据isTab切换不同的样式。还有就是给<el-tabs>设置上v-if判断,如果isTab为true就用Tab控件引用Vue压面;反之就用<el-card>控件引用Vue页面。<divclass="site-content__wrapper">  <mainclass="site-content"    :class="{'site-content--tabs':$route.meta.isTab}">    <el-tabsv-if="$route.meta.isTab"      v-model="siteContent.mainTabsActiveName":closable="true">      <el-tab-panev-for="iteminsiteContent.mainTabs"        :label="item.title":name="item.name">        <el-card>          <router-view:key="router.currentRoute.value.query.random"/>        </el-card>      </el-tab-pane>    </el-tabs>    <el-cardv-else>      <router-view:key="router.currentRoute.value.query.random"/>    </el-card>  </main></div>如果Home页面显示的时候,应该销毁所有的Tab控件。为了实现这个效果,我们可以清空mainTabs数组的元素,并且清理mainTabsActiveName属性值。functionrouteHandle(route){  //判断是否要创建Tab控件  if(route.meta.isTab){    /*创建Tab控件之前,先判断mainTabs[]数组中是否存在该Vue页面的Tab控件。     *比如我们要访问角色管理页面,程序先要判断是否存在角色管理页面的Tab控件。     *如果不存在就创建Tab控件;如果存在就不创建新的Tab控件,直接切换到现有的Tab控件     */    lettab=siteContent.mainTabs.filter(item=>item.name===route.name)[0];    if(tab==null){      tab={        title:route.meta.title,        name:route.name      };      siteContent.mainTabs.push(tab);    }    //选中某个Tab控件    siteContent.mainTabsActiveName=tab.name;    //选中某个菜单项    siteContent.menuActiveName=tab.name;  }  else{    siteContent.mainTabs=[]    //取消选中某个Tab控件    siteContent.mainTabsActiveName="";    //选中某个菜单项    siteContent.menuActiveName="Home";  }}编写src/views/mis/home.vue页面的视图层标签,并且创建home.less文件,让Home页面引用。<template>  <divclass="home">    <divclass="left">      <h2>神州大健康体检系统</h2>      <divclass="desc">        <p>医疗健康&nbsp;&nbsp;模式创新</p>        <p>汇集名医&nbsp;&nbsp;让诊疗更简单</p>      </div>      <divclass="bottom">        <divclass="remark-container">          <divclass="ballblue">1</div>          <divclass="remark">先进的技术</div>        </div>        <divclass="remark-container">          <divclass="ballred">2</div>          <divclass="remark">强大的团队</div>        </div>        <divclass="remark-container">          <divclass="ballgreen">3</div>          <divclass="remark">丰富的经验</div>        </div>      </div>    </div>    <divclass="right">      <imgsrc="../../assets/home/banner.png"class="banner"/>    </div>  </div></template><script></script><stylelang="less"scoped="scoped">  @importurl('home.less');</style>以下就是本项目的开发流程,希望我的文章对大家的学习有所帮助!感谢大家的阅读
  • 所需E币: 0
    时间: 2023-12-20 15:51
    大小: 8.21KB
    今天跟大家讲一个关于体检+健康双系统的项目,这个项目用到SpringBoot+Vue3+MySQL的技术,我会带着大家一步步去实现这样的项目,希望对大家的技术有所提升。本项目包含MIS系统、体检人系统在内的前后端分离式全栈双系统作品,主流框架+最新技术,界面美观、体系完整。首先,我们先来搭建环境:大家创建轻量云主机的时候,一定要选择CentOS7.X镜像,这个版本的Linux兼容性和安全性很好,很多企业级项目都是部署在这个版本的CentOS上面。因为CentOS8.0的兼容性极差,所以强烈反对同学们使用这个版本。另外,Ubuntu在安全性上没有CentOS做得好,所以不推荐在运营环境中使用。使用虚拟机的同学,我们要给虚拟机设置好端口转发,然后在Windows电脑上面才能通过这些端口访问到Linux上面的程序。接下来我们创建Minio容器,设定的访问帐户是root,密码为abc123456,一会儿我们可以用浏览器访问Web管理画面。注意密码必须是8位以上,否则Minio容器创建出来会闪退。以下是代码实战:dockerrun-it-d--nameminio\-p9000:9000-p9001:9001\--netmynet--ip172.18.0.12-m400m\-v/root/minio/data:/data\-eTZ=Asia/Shanghai--privileged=true\--envMINIO_ROOT_USER="root"\--envMINIO_ROOT_PASSWORD="abc123456"\--envMINIO_SKIP_CLIENT="yes"\bitnami/minio:latest在src/views/front/main.vue文件中,添加这个DIV和它的子元素。@importurl('../style.less');.container{  width:1200px;  margin-left:auto;  margin-right:auto;}header{  ……  .search-container{    float:left;    margin-top:5px;    margin-left:100px;    .keyword-input{      width:400px;      margin-bottom:10px;    }    .tag{      margin-right:10px;    }  }}ElementPlus组件库的菜单控件用起来并不复杂,我们看一个简单的例子。下面的菜单是可以左右折叠的,如果变量isCollapse为true,菜单就会向左折叠。<divclass="site-wrapper"  :class="{'site-sidebar--fold':sidebar.sidebarFold}"  v-loading.fullscreen.lock="loading"element-loading-text="拼命加载中">  <nav>    ……  </nav>  <asideclass="site-sidebarsite-sidebar--dark">    <divclass="site-sidebar__inner">      <el-menu:default-active="siteContent.menuActiveName||'Home'"        :collapse="sidebar.sidebarFold":collapseTransition="false"        class="site-sidebar__menu"background-color="#263238"        active-text-color="#fff"text-color="#8a979e">        <el-menu-itemindex="Home"          @click="$router.push({name:'MisHome'})">          <el-icon>            <SvgIconname="home"class="icon-svg"/>          </el-icon>          <spanslot="title">首页</span>        </el-menu-item>        <el-sub-menuindex="组织管理"          :popper-class="'site-sidebar--'+sidebar.sidebarLayoutSkin+'-popper'">          <template#title>            <el-icon>              <SvgIconname="users_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">组织管理</span>          </template>          <el-menu-itemindex="MisDept"            v-if="proxy.isAuth(['ROOT','DEPT:SELECT'])"            @click="$router.push({name:'MisDept'})">            <el-icon>              <SvgIconname="company_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">部门管理</span>          </el-menu-item>          <el-menu-itemindex="MisRole"            v-if="proxy.isAuth(['ROOT','ROLE:SELECT'])"            @click="$router.push({name:'MisRole'})">            <el-icon>              <SvgIconname="role_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">角色管理</span>          </el-menu-item>          <el-menu-itemindex="MisUser"            v-if="proxy.isAuth(['ROOT','USER:SELECT'])"            @click="$router.push({name:'MisUser'})">            <el-icon>              <SvgIconname="user_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">用户管理</span>          </el-menu-item>        </el-sub-menu>        <el-sub-menuindex="业务管理"          :popper-class="'site-sidebar--'+sidebar.sidebarLayoutSkin+'-popper'">          <template#title>            <el-icon>              <SvgIconname="trust_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">业务管理</span>          </template>          <el-menu-itemindex="MisGoods"            v-if="proxy.isAuth(['ROOT','GOODS:SELECT'])"            @click="$router.push({name:'MisGoods'})">            <el-icon>              <SvgIconname="goods_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">体检套餐</span>          </el-menu-item>          <el-menu-itemindex="MisRule"            v-if="proxy.isAuth(['ROOT','RULE:SELECT'])"            @click="$router.push({name:'MisRule'})">            <el-icon>              <SvgIconname="rule_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">促销规则</span>          </el-menu-item>          <el-menu-itemindex="MisCustomer"            v-if="proxy.isAuth(['ROOT','CUSTOMER:SELECT'])"            @click="$router.push({name:'MisCustomer'})">            <el-icon>              <SvgIconname="customer_fill"                class="icon-svg"/>            </el-icon>            <spanslot="title">客户档案</span>          </el-menu-item>          <el-menu-itemindex="MisOrder"            v-if="proxy.isAuth(['ROOT','ORDER:SELECT'])"            @click="$router.push({name:'MisOrder'})">            <el-icon>              <SvgIconname="order_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">订单管理</span>          </el-menu-item>          <el-menu-itemindex="MisCustomerIm"            v-if="proxy.isAuth(['ROOT','CUSTOMER_IM:SELECT'])"            @click="$router.push({name:'MisCustomerIm'})">            <el-icon>              <SvgIconname="im_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">客服IM</span>          </el-menu-item>        </el-sub-menu>        <el-sub-menuindex="体检管理"          :popper-class="'site-sidebar--'+sidebar.sidebarLayoutSkin+'-popper'">          <template#title>            <el-icon>              <SvgIconname="night_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">体检管理</span>          </template>          <el-menu-itemindex="MisAppointment"            v-if="proxy.isAuth(['ROOT','APPOINTMENT:SELECT'])"            @click="$router.push({name:'MisAppointment'})">            <el-icon>              <SvgIconname="appointment_fill"                class="icon-svg"/>            </el-icon>            <spanslot="title">体检预约</span>          </el-menu-item>          <el-menu-itemindex="MisCustomerCheckin"            v-if="proxy.isAuth(['ROOT','CUSTOMER_CHICKIN:SELECT'])"            @click="$router.push({name:'MisCustomerCheckin'})">            <el-icon>              <SvgIconname="checkin_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">体检签到</span>          </el-menu-item>          <el-menu-itemindex="MisAppointmentRestriction"            v-if="proxy.isAuth(['ROOT','APPOINTMENT_RESTRICTION:SELECT'])"            @click="$router.push({name:'MisAppointmentRestriction'})">            <el-icon>              <SvgIconname="setting_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">预约设置</span>          </el-menu-item>          <el-menu-itemindex="MisCheckup"            v-if="proxy.isAuth(['ROOT','CHECKUP:SELECT'])"            @click="$router.push({name:'MisCheckup'})">            <el-icon>              <SvgIconname="doctor_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">医生检查</span>          </el-menu-item>          <el-menu-itemindex="MisCheckupReport"            v-if="proxy.isAuth(['ROOT','CHECKUP_REPORT:SELECT'])"            @click="$router.push({name:'MisCheckupReport'})">            <el-icon>              <SvgIconname="file_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">体检报告</span>          </el-menu-item>        </el-sub-menu>        <el-sub-menuindex="系统设置"          :popper-class="'site-sidebar--'+sidebar.sidebarLayoutSkin+'-popper'"          v-if="proxy.isAuth(['ROOT','SYSTEM:SELECT'])">          <template#title>            <el-icon>              <SvgIconname="system_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">系统设置</span>          </template>          <el-menu-itemindex="MisFlowRegulation"            v-if="proxy.isAuth(['ROOT','FLOW_REGULATION:SELECT'])"            @click="$router.push({name:'MisFlowRegulation'})">            <el-icon>              <SvgIconname="people_fill"class="icon-svg"/>            </el-icon>            <spanslot="title">人员限流</span>          </el-menu-item>        </el-sub-menu>      </el-menu>    </div>  </aside>  <!--避免路由引用页面的时候浏览器不刷新内容,所以给URL添加随机数参数-->  <router-view:key="router.currentRoute.value.query.random"/></div>在application.yml文件中,配置MongoDB连接。因为MongoDB自带数据库连接池,所以我们不需要在Java项目中重复配置连接池。spring: …… redis:  database:0  host:localhost  port:6379  password:abc123456  jedis:   pool:    #连接超时的最大时间    max-active:1000    #等待空闲连接的最大等待时间(负数代表一直等待)    max-wait:-1ms    max-idle:16    min-idle:8因为SpringBootData中默认的RedisTemplate存在序列化机制的问题,向Redis里面保存Hash类型数据通常是乱码的,为了解决这个问题,我们需要自己定义配置类,修改RedisTemplate使用的序列化机制。在com.example.his.api.config包中,创建RedisTemplateConfig类。packagecom.example.his.api.config.sa_token;importjava.util.List;importorg.springframework.stereotype.Component;importcn.dev33.satoken.SaManager;importcn.dev33.satoken.fun.SaFunction;importcn.dev33.satoken.listener.SaTokenEventCenter;importcn.dev33.satoken.session.SaSession;importcn.dev33.satoken.stp.SaLoginModel;importcn.dev33.satoken.stp.SaTokenInfo;importcn.dev33.satoken.stp.StpLogic;/** *Sa-Token权限认证工具类(业务端使用) */@ComponentpublicclassStpCustomerUtil{  privateStpCustomerUtil(){  }  /**   *账号类型标识   */  publicstaticfinalStringTYPE="customer";  /**   *底层的StpLogic对象   */  publicstaticStpLogicstpLogic=newStpLogic(TYPE);  /**   *获取当前StpLogic的账号类型   *   *@returnSeeNote   */  publicstaticStringgetLoginType(){    returnstpLogic.getLoginType();  }  /**   *重置StpLogic对象   *<br>1、更改此账户的StpLogic对象   *<br>2、put到全局StpLogic集合中   *<br>3、发送日志   *   *@paramnewStpLogic/   */  publicstaticvoidsetStpLogic(StpLogicnewStpLogic){    //重置此账户的StpLogic对象    stpLogic=newStpLogic;    //添加到全局StpLogic集合中    //以便可以通过SaManager.getStpLogic(type)的方式来全局获取到这个StpLogic    SaManager.putStpLogic(newStpLogic);    //$$全局事件    SaTokenEventCenter.doSetStpLogic(stpLogic);  }  /**   *获取StpLogic对象   *   *@return/   */  publicstaticStpLogicgetStpLogic(){    returnstpLogic;  }关于这个项目我就讲到这里,感谢大家!
  • 所需E币: 0
    时间: 2023-11-22 15:26
    大小: 3.92KB
    如何使用SpringBoot开发一款关于双11商品服务的系统?今天就给大家说道说道,希望对大家的学习有所帮助!1.什么是SpringBoot?Spring的诞⽣是为了简化Java程序的开发的,⽽SpringBoot的诞⽣是为了简化Spring程序开发的。SpringBoot是由Pivotal团队提供的基于Spring的框架,该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。SpringBoot集成了绝大部分目前流行的开发框架,就像Maven集成了所有的JAR包一样,SpringBoot集成了几乎所有的框架,使得开发者能快速搭建Spring项目。2.SpringBoot的优点快速集成框架,SpringBoot提供了启动添加依赖的功能,⽤于秒级集成各种框架。内置运⾏容器,⽆需配置Tomcat等Web容器,直接运⾏和部署程序。快速部署项⽬,⽆需外部容器即可启动并运⾏项⽬。可以完全抛弃繁琐的XML,使⽤注解和配置的⽅式进⾏开发。⽀持更多的监控的指标,可以更好的了解项⽬的运⾏情况后端配置1.1创建Springboot工程打开idea->file->new->project选择springInitializer进行配置,java版本选择8,点击next-internal应用代码  -controllers控制器模块   -admin后端控制器   -front前端控制器  -listenredis监听器  -models模型模块  -service服务模块   -product_serive商品服务   -wechat_menu_serive微信公众号菜单服务   ......-conf公共配置 -config.ymlyml配置文件 -config.go配置解析,转化成对应的结构体  -middleware中间件  -AuthCheck.go jwt接口权限校验-cors.go跨域处理......-pkg程序应用包 -app -base -casbin -jwt -qrcode -wechat .....-routere路由-logs日志存放-runtime资源目录首先,我仔细分析了需求,并且根据业务逻辑设计了合适的接口。对于多表关联查询,我使用了MyBatis的注解来编写SQL语句,并通过@One和@Many等注解来实现结果集的映射。对于数据分页,我使用了MyBatis-Plus提供的Page对象,并结合相关方法来实现数据分页查询。2.上课中的优秀项目在课堂上,我完成了一个优秀的项目,主要是学生实体类的增删改查功能。通过这个项目,我巩固了对SpringBoot框架的理解和掌握。具体实现如下://初始化rediserr:=cache.InitRedis(cache.DefaultRedisClient,&redis.Options{Addr:    global.CONFIG.Redis.Host,Password:  global.CONFIG.Redis.Password,IdleTimeout:global.CONFIG.Redis.IdleTimeout,},nil)iferr!=nil{iferr!=nil{global.LOG.Error("InitRediserror",err,"client",cache.DefaultRedisClient)panic(err)}panic(err)}//初始化mysqlerr=db.InitMysqlClient(db.DefaultClient,global.CONFIG.Database.User,global.CONFIG.Database.Password,global.CONFIG.Database.Host,global.CONFIG.Database.Name)iferr!=nil{global.LOG.Error("InitMysqlClienterror",err,"client",db.DefaultClient)panic(err)}global.Db=db.GetMysqlClient(db.DefaultClient).DB开发步骤SpringBoot开发起来特别简单,分为如下几步:创建新模块,选择Spring初始化,并配置模块相关基础信息选择当前模块需要使用的技术集开发控制器类运行自动生成的Application类知道了SpringBoot的开发步骤后,接下来我们进行具体的操作shutdown.NewHook().Close(//关闭httpserverfunc(){ctx,cancel:=context.WithTimeout(context.Background(),time.Second*10)defercancel()iferr:=server.Shutdown(ctx);err!=nil{logging.Error("httpservershutdownerr",err)}},func(){//关闭kafkaproducer(特别是异步生产者,强制关闭会导致丢消息)iferr:=mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Close();err!=nil{logging.Error("kafkashutdownerr",err)}},func(){//关闭mysqliferr:=db.CloseMysqlClient(db.DefaultClient);err!=nil{logging.Error("mysqlshutdownerr",err)}},func(){//关闭redisiferr:=cache.GetRedisClient(cache.DefaultRedisClient).Close();err!=nil{logging.Error("redisshutdownerr",err)}},)//也可以自己实现优雅关闭//signals:=make(chanos.Signal,0)//signal.Notify(signals,syscall.SIGHUP,syscall.SIGINT,syscall.SIGTERM,syscall.SIGQUIT)//s:=<-signals//global.LOG.Warn("shopreceivesystemsignal:",s)//ctx,cancel:=context.WithTimeout(context.Background(),3*time.Second)//defercancel()//err:=server.Shutdown(ctx)//iferr!=nil{//global.LOG.Error("httpservererror",err)//}//mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Close()选择SpringInitializr,用来创建SpringBoot工程以前我们选择的是Maven,今天选择SpringInitializr来快速构建SpringBoot工程。而在ModuleSDK这一项选择我们安装的JDK版本。typeStoreProductstruct{Image    string     `json:"image"valid:"Required;"`SliderImage string     `json:"slider_image"valid:"Required;"`StoreName  string     `json:"store_name"valid:"Required;"`StoreInfo  string     `json:"store_info"valid:"Required;"`Keyword   string     `json:"keyword"valid:"Required;"`CateId    int      `json:"cate_id"valid:"Required;"`ProductCate *StoreCategory`json:"product_cate"gorm:"foreignKey:CateId;association_autoupdate:false;association_autocreate:false"`Price    float64    `json:"price"valid:"Required;"`VipPrice   float64    `json:"vip_price"valid:"Required;"`OtPrice   float64    `json:"ot_price"valid:"Required;"`Postage   float64    `json:"postage"valid:"Required;"`UnitName   string     `json:"unit_name"valid:"Required;"`Sort     int16     `json:"sort"valid:"Required;"`Sales    int      `json:"sales"valid:"Required;"`Stock    int      `json:"stock"valid:"Required;"`IsShow    *int8     `json:"is_show"valid:"Required;"`IsHot    *int8     `json:"is_hot"valid:"Required;"`IsBenefit  *int8     `json:"is_benefit"valid:"Required;"`IsBest    *int8     `json:"is_best"valid:"Required;"`IsNew    *int8     `json:"is_new"valid:"Required;"`Description string     `json:"description"valid:"Required;"`IsPostage  *int8     `json:"is_postage"valid:"Required;"`GiveIntegralint      `json:"give_integral"valid:"Required;"`Cost     float64    `json:"cost"valid:"Required;"`IsGood    *int8     `json:"is_good"valid:"Required;"`Ficti    int      `json:"ficti"valid:"Required;"`Browse    int      `json:"browse"valid:"Required;"`IsSub    *int8     `json:"is_sub"valid:"Required;"`TempId    int64     `json:"temp_id"valid:"Required;"`SpecType   int8      `json:"spec_type"valid:"Required;"`IsIntegral  *int8     `json:"isIntegral"valid:"Required;"`Integral   int32     `json:"integral"valid:"Required;"`BaseModel}//定义商品消息结构typeProductMsgstruct{Operationstring`json:"operation"`*StoreProduct}切换web服务器现在我们启动工程使用的是tomcat服务器,那能不能不使用tomcat而使用jetty服务器,jetty在我们maven高级时讲maven私服使用的服务器。而要切换web服务器就需要将默认的tomcat服务器给排除掉,怎么排除呢?使用exclusion标签func(e*StoreProductController)Post(c*gin.Context){var(dto dto2.StoreProductappG=app.Gin{C:c})httpCode,errCode:=app.BindAndValid(c,&dto)iferrCode!=constant.SUCCESS{appG.Response(httpCode,errCode,nil)return}productService:=product_service.Product{Dto:dto,}model,err:=productService.AddOrSaveProduct()iferr!=nil{appG.Response(http.StatusInternalServerError,constant.FAIL_ADD_DATA,nil)return}//发消息队列deferfunc(){operation:=product.OperationCreateifdto.Id>0{operation=product.OperationUpdate}productMsg:=models.ProductMsg{operation,&model,}msg,_:=json.Marshal(productMsg)p,o,e:=mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Send(&sarama.ProducerMessage{Topic:product.Topic,Key:  mq.KafkaMsgValueStrEncoder(strconv.FormatInt(dto.Id,10)),Value:mq.KafkaMsgValueEncoder(msg),},)ife!=nil{global.LOG.Error("sendproductmsgerror",e,"partition:",p,"offset:",o,"id:",dto.Id)}}()appG.Response(http.StatusOK,constant.SUCCESS,nil)}
  • 所需E币: 0
    时间: 2023-11-22 14:45
    大小: 3.21KB
    上传者: 开心就很好了
    今天给大家分享一下关于SpringBoot开发双11商品服务系统的整个流程,我将深度还原大厂实习期技术成长全流程,让你收获大厂项目开发全流程与实战经验,具备应对大流量场景问题的解决能力,全面助力提升实习/转正/跳槽表现力与成功率。SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发领域(rapidapplicationdevelopment)成为领导者。目的让大家更容易使用spring,更容易集成各种常用的中间件、开源软件。SpringBoot基于Spring开发,SpringBoot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。SpringBoot不是用来替代spring的解决方案,而是和spring框架紧密结合提升spring开发者体验的工具。准备测试数据我们先导入准备好的测试数据,这个测试数据是一份商品数据。字段包含商品id,name(商品名)last_month_sales(最近一个月的销量)favorites(收藏数)这几个字段,我们主要是通过商品名来搜索。首先我先先创建一个商品索引PUTgoods{ "settings":{  "number_of_shards":1,  "number_of_replicas":0 }, "mappings":{  "properties":{   "id":{    "type":"keyword",    "doc_values":false,    "norms":false,    "similarity":"boolean"   },   "name":{    "type":"text"   },    "price":{    "type":"double"   },   "last_month_sales":{    "type":"long"   },   "favorites":{    "type":"long"   },   "year":{    "type":"short"   }  } }}千里之行,始于足下。想要舒舒服服地使用Spring框架,就要把它的开发环境配置好,这对它好,也对我好。1.jdk的配置    使用IDEA进行开发,在IDEA中配置jdk的方式很简单,打开File->ProjectStructure选择SDKs。在JDKhomepath中选择本地jdk的安装目录。在Name中为jdk自定义名字通过以上三步骤,即可导入本地安装的jdk。如果是使用STS或者eclipse可以通过两步骤添加:window->preference->java->InstralledJRES来添加本地jdk。window-->preference-->java-->Compiler选择jre,和jdk保持一致。PUTtest_index/_doc/1{ "string_field":"imooc", "int_field":100, "float_field":3.14, "bool_field":true, "date_field":"2022/03/16", "obj_field":{"key1":"value1","key2":100}, "array_field1":[100,3.14], "array_field2":[100,"200"], "array_field3":["2022/03/16","100"], "array_field4":["100","2022/03/16"], "null_field":null } 创建SpringBoot项目后需要进行maven配置。打开File->settings,搜索maven,配置一下本地的maven信息。在Mavenhomedirectory中选择本地Maven的安装路径;在Usersettingsfile中选择本地Maven的配置文件所在路径。在配置文件中配置一下国内阿里的镜像,这样在下载maven依赖时,速度会变得很快。{ "test_index":{  "mappings":{   "properties":{    "array_field":{     "type":"text",     "fields":{      "keyword":{       "type":"keyword",       "ignore_above":256      }     }    },    "bool_field":{     "type":"boolean"    },    "date_field":{     "type":"date",     "format":"yyyy/MM/ddHH:mm:ss||yyyy/MM/dd||epoch_millis"    },    "float_field":{     "type":"float"    },    "int_field":{     "type":"long"    },    "obj_field":{     "properties":{      "key1":{       "type":"text",       "fields":{        "keyword":{         "type":"keyword",         "ignore_above":256        }       }      },      "key2":{       "type":"long"      }     }    },    "string_field":{     "type":"text",     "fields":{      "keyword":{       "type":"keyword",       "ignore_above":256      }     }    }   }  } }}从以上结果中,我们可以看到SpringBoot通过MVN方式自动为项目配置了对应的springframework、logging、jackson以及Tomcat等依赖,而这些正是我们在开发Web项目时所需要的。那么细心的同学可能会发现一个问题,即在以上pom.xml的配置中,引入依赖spring-boot-starter-web时,并没有指明其版本(version),但在依赖列表中,我们却看到所有的依赖都具有版本信息,那么这些版本信息是在哪里控制的呢? { "_index":"test_index", "_id":"1", "_version":1, "_seq_no":0, "_primary_term":1, "found":true, "_source":{  "string_field":"Chan",  "int_field":100,  "int_string_field":"100",  "float_field":3.14,  "bool_field":true,  "date_field":"2022/03/16",  "obj_field":{   "key1":"value1",   "key2":100  },  "array_field":[   "value1",   "100"  ],  "null_field":null }}spring-boot-starter-parent是所有SpringBoot项目的父级依赖,它被称为SpringBoot的版本管理中心,可以对项目内的部分常用依赖进行统一管理。<parent>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-parent</artifactId>       <version>2.5.6</version>       <relativePath/> </parent>SpringBoot项目可以通过继承spring-boot-starter-parent来获得一些缺省的配置内容,它主要提供了以下特性:默认JDK版本(Java8)默认字符集(UTF-8)依赖管理功能资源过滤默认插件配置识别 application.properties或application.yml类型的配置文件DELETEtest_indexPUTtest_index{ "mappings":{  "dynamic":false  }}GETtest_index/_search{ "query":{  "term":{   "field1.field2":{    "value":"imoocES"   }  } }}GETtest_index/_doc/4DELETEtest_indexPUTtest_index{ "mappings":{  "dynamic":"strict"  }}POSTtest_index/_doc/2{ "field1":{  "field2":"imoocES"  }}GETtest_index/_search{ "query":{  "term":{   "field1.field2":{    "value":"imoocES"   }  } }}GETtest_index/_doc/4以下就是本文的全部内容,感谢大家观看
  • 所需E币: 0
    时间: 2023-11-10 16:11
    大小: 1013KB
    上传者: Argent
    第9讲模仿STM32驱动开发实验
  • 所需E币: 0
    时间: 2023-11-10 16:17
    大小: 3.83KB
    SpringBoot+Vue3+MySQL集群开发健康体检双系统课程2023,视频+源码+电子书下载!14大业务模块设计,全流程双系统联动开发,全面掌握业务设计与核心技术。双系统联动+复杂功能设计+缜密业务开发,让你获得一个极具竞争力的面试作品医疗行业是互联网发展前景极好的领域之一,对于初入职者、转行者来说都是很好的选择。课程以业务驱动技术栈,打造完整、全面的双系统项目,并采用前后端分离架构,业务功能完善(健康体检与健康管理两大业务),界面美观,可以高效积累大型医疗项目经验,快速提升医疗行业就业竞争力。一、安装JDK本课程云盘上面附带了JDK15.0.2的安装包,大家下载安装即可。因为从JDK16开始,Oracle移除了JDK中JavaSE的很多类。导致我们用JDK15以后的版本做项目,Maven导入的一些第三方依赖会出现找不到Java工具类的情况,而且更有甚者异常信息也没说找不到哪些类,直接就报运行错误。这就让我们调试程序无从下手,JDK几十万个工具类,我们不可能逐一排查,所以为了保证我们的项目能最大化的兼容Maven下载的依赖库,我们应该安装使用不高于JDK16的版本。相信很多人依然坚持使用JDK1.8,其实1.8这个版本的JDK真的太老了,比方说Activiti7.0工作流框架就不支持这么老的JDK,很多其他框架也都不支持1.8了。所以挑来挑去,只有JDK15.0.2这个版本最合适了。二、为什么选用VirtualBox虚拟机?VirtualBox虚拟机是Oracle提供的免费虚拟机软件,虽然知名度赶不上VMware虚拟机,但是凭借出色的稳定性还是得到了很多程序员的肯定,包括我自己在内。这两年VMware虚拟机版本更新很快,但是BUG越来越多,数不胜数。比方说SSH连接上传文件的时候,会突然掉速到10KB以下。像这样的BUG太多太多了,所以我建议大家还是用VirtualBox虚拟机吧,BUG少,还稳定。三、关于数据库集群读写一致性的思考我们使用主从同步机制搭建出来的MySQL集群,属于弱一致性的集群。也就是说在非常特殊的场景下,我们写入的数据和读取出来的数据可能不一致。我把会出现读写不一致的场景归纳出来了,我们一起看一下。1.写入和查询间隔时间太短假设我们要执行的INSERT语句发送给了MySQL_1节点执行,但是紧接着马上执行了SELECT语句,这个查询语句被MyCat转发给MySQL_2执行。假设INSERT和SELECT语句之间的时间间隔短到1毫秒,导致MySQL_2还没有同步写入的数据,查询语句就来了,自然是查询不到刚刚插入的数据。2.主从同步失效当MySQL_1和MySQL_2的主从同步失效,MySQL_2节点依然能应答MyCat心跳检测,所以MyCat依然认为MySQL_2节点是正常的节点。还是刚才的例子,MySQL_1写入数据后,因为主从同步失效,导致MySQL_2节点上没有新写入的数据,我们也就查询不到刚写入的数据了。那么有没有解决办法呢?我们只能写监控程序,每隔1秒钟执行一次showslavestatus语句,查看结果是不是包含两个YES字样。如果数据同步失效,就立即发送告警邮件,由运维人员及时处理。也许有人好奇什么情况会导致主从同步失效?软硬件都有可能,比如说MyCat、MySQL_1和MySQL_2各自处在不同的机房中。MyCat与MySQL_1和MySQL_2的网络是通畅的,但是MySQL_1和MySQL_2机房之间网络却是不通的,可能是网线断了,也可能是交换机软件的故障。反正网络不通,主从同步自然也就失效了。安装ElementPlus库把EP组件库整合到前端项目的第一个步骤是安装依赖库。执行下面的命令,安装三个依赖库。npminstallelement-plus#安装图标库npminstall@element-plus/icons-vue#安装sass,可以自定义样式覆盖ElementPlus自带样式npminstallsassEP组件库的UI控件特别多,我们最好用哪个组件,就在页面里面引入该组件,而不是一次性把所有UI组件都引入到Vue页面中。一次性引入大量的UI组件会影响浏览器渲染页面的速度,所以我们一定要按需引入UI组件。为了能按需引入UI组件,我们需要安装两个依赖库。npminstallunplugin-vue-components-Dnpminstallunplugin-auto-import -D四、定义前端验证函数这节课我们先从前端验证函数开始做起。因为发送Ajax请求的时候,前端项目先做数据验证,这就离不开验证函数。在/src/utils目录中创建validate.ts文件,然后定义若干验证函数。/** *验证是否为空或者空字符串 */exportfunctionisBlank(s:string){returns==null||s.length==0;}/** *验证邮箱 */exportfunctionisEmail(s:string){return/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s);}/** *验证手机号码 */exportfunctionisMobile(s:string){return/^1[1-9]\d{9}$/.test(s);}/** *验证URL地址 */exportfunctionisURL(s:string){return/^http[s]?:\/\/.*/.test(s);}/** *验证用户名 */exportfunctionisUsername(s:string){return/^[a-zA-Z0-9]{5,50}$/.test(s);}/** *验证密码 */exportfunctionisPassword(s:string){return/^[a-zA-Z0-9]{6,20}$/.test(s);}/** *验证手机短信验证码 */exportfunctionisSmsCode(s:string){return/^\d{6}$/.test(s);}五、设计“关于我们”的样式编写main.less文件的内容,添加上“关于我们”区域的样式。有处细节大家必须注意,页脚的宽度是100%,但是其中主体信息的宽度是1200px,而且要居中显示,所以页脚区域里面两个DIV容器宽度是100%,而其中的列表宽度必须是1200px,还要水平居中显示。footer{  margin-top:50px;  .aboutus-container{    background-color:@bgc-1;    user-select:none;    .list{      width:1200px;      margin-left:auto;      margin-right:auto;      margin-top:0;      margin-bottom:0;      list-style:none;      padding:0;      display:flex;      justify-content:space-between;      .item{        display:flex;        padding:20px10px;        width:285px;        box-sizing:border-box;        img{          width:58px;          height:58px;          margin:10px;          display:block;        }        div{          h3{            font-size:20px;            color:@fc-1;            margin:10px05px0;          }          p{            font-size:12px;            color:@fc-3;            margin:0000;          }        }      }    }  }}
  • 所需E币: 0
    时间: 2023-11-10 16:32
    大小: 1018.5KB
    上传者: Argent
    第1讲开发电脑的选择
  • 所需E币: 0
    时间: 2023-11-10 12:34
    大小: 580.58KB
    上传者: 丙丁先生
    CW32开发常见问题一览20230619.pdf
  • 所需E币: 1
    时间: 2023-11-10 11:42
    大小: 23.45KB
    上传者: Argent
    第1讲Linux驱动开发与裸机开发区别_笔记
  • 所需E币: 1
    时间: 2023-11-10 11:42
    大小: 119.49KB
    上传者: Argent
    第2讲字符设备驱动开发基础实验_笔记
  • 所需E币: 1
    时间: 2023-10-20 15:18
    大小: 17.73MB
    上传者: 浩瀚星蓝
    这笔一本有关于嵌入式操作系统的书,主要是RTOS
  • 所需E币: 0
    时间: 2023-10-16 16:19
    大小: 2.13KB
    上传者: huangyasir1990
    Qt高级开发视频教程,QT视频教程下载Qt支持下述平台:MS/Windows-95、98、NT4.0、ME、2000、XP、Vista、Win7、win8、win2008、win10Unix/X11-Linux、SunSolaris、HP-UX、CompaqTru64UNIX、IBMAIX、SGIIRIX、FreeBSD、BSD/OS和其它很多X11平台Macintosh-MacOSXEmbedded-有帧缓冲(framebuffer)支持的嵌入式Linux平台,WindowsCE、Symbian、Symbian^3、SymbianAnna、SymbianBelle、MeeGo、haiku-os。前言:Qt是一个跨平台的C++图形界面应用程序框架。它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序。Qt很容易扩展,并且允许真正地组件编程。基本上,Qt同XWindow上的Motif,Openwin,GTK等图形界面库以及Windows平台上的MFC、OWL、VCL、ATL是同类型的东西。Qt和智能手机Qt目前支持主流的Android、iOS、WinPhone等智能机操作系统。MeeGo是基于Qt开发的操作系统,由于被诺基亚抛弃了,只剩一代绝版诺基亚N9手机。诺基亚手机部门出售给微软之后,大部分诺基亚手机系统开发人员都被遣散了。原来诺基亚的一部分人成立新的Jolla(卓蓝)公司,发布了MeeGo的衍生版智能手机系统Sailfish(旗鱼),相应的手机和平板也发布开卖了。另一拨人投靠了Tizen(泰泽),Tizen是英特尔和三星力推的智能手机系统,该系统整合了Limo和MeeGo,因为MeeGo系统被诺基亚抛弃,英特尔其实是被出卖了,所以只能联合三星重造智能手机系统Tizen。目前基于Tizen的首款手机三星Z1在印度上市了。在Tizen阵营,国内有中兴、百度涉及了。Qt开源项目里也有QtforTizen版本,有兴趣的可以去搜搜。Qt的优势(熟悉)Qt与各种竞品相比,主要的优势是跨平台特性。跨平台特性指的是:一次编程,到处编译。除此之外,Qt也拥有一些其它竞品的共同优势特点:面向对象开发丰富的API,并配以大量的开发文档易用且开源的开发环境
  • 所需E币: 0
    时间: 2023-10-9 11:55
    大小: 1.5KB
    手写React高质量源码,迈向高阶开发React18内核探秘:手写React高质量源码迈向高阶开发batching批处理,说的是,可以将回调函数中多个setState事件合并为一次渲染,因此是异步的。解决的问题是多次同值、不同值setState,期望最后显示的是最后一次setState的结果,减少渲染。 constIndex=()=>{  const[name,setName]=useState('')  const[age,setAge]=useState(0)     constchange=()=>{   setName('a')   setAge(1)    //仅触发一次渲染,批处理,2次setState合并为一次渲染   //需需要立即重渲染,需要手动调用   //ReactDOM.flushSync(()=>{   //  setName('a')//立即执行渲染   //  setAge(1)//立即执行渲染   //  //不会合并处理,即没有批处理,触发2次   //});  }  console.log(1)//只打印一次  return(   <div>    <p>name:{name}</p>    <p>age:{age}</p>    <buttononClick={change}>更改</button>   </div>  ) }1.React18是什么?在我们讨论“React18有什么新功能”之前,React18是什么意思?任何18.0.0以上但不包括19.0.0的React库的稳定版本都被称为React18。React18的创建在React应用程序中引入了并发渲染。React一直在关注DOM渲染,并为开发人员提供控制和跟踪组件生命周期的工具。有了一些新功能,React18现在可以调整渲染过程,以适应客户端设备。 <!--注意:部署时,将"development.js"替换为"production.min.js"--> <scriptsrc="https://unpkg.com/react@18/umd/react.development.js"crossorigin></script> <scriptsrc="https://unpkg.com/react-dom@18/umd/react-dom.development.js"crossorigin></script> <!--加载我们的React组件--> <scriptsrc="app.js"></script></body>现在终于等到了React18,所以我打算好好看看新版本的这些特性,到底香不香
  • 所需E币: 0
    时间: 2023-10-9 12:14
    大小: 1.88KB
    上传者: huangyasir1990
    手写React高质量源码,迈向高阶开发教程,16章,2023最新!1、什么是React?React是用于构建用户界面的JavaScript库,起源于Facebook的内部项目,该公司对市场上所有JavaScriptMVC框架都不满意,决定自行开发一套,用于架设Instagram的网站。于2013年5月开源。2、React三大颠覆性的特点React的一切都是基于组件的,组件有着良好的封装性,组件可以让代码的复用和测试变得更加简单。各个组件都有着各自的状态,当状态变更时,便会重新渲染整个组件,组件化开发不仅仅应用于React,这也是Web的发展的趋势。组件一般会涉及以下几个部分:props属性state状态组件的生命周期无状态函数式组件state设计原则DOM操作3、对ReactJS的认识及ReactJS的优点首先,对于React,有一些认识误区,这里先总结一下:React不是一个完整的MVC框架,最多可以认为是MVC中的V(View),甚至React并不非常认可MVC开发模式;React的服务器端Render能力只能算是一个锦上添花的功能,并不是其核心出发点,事实上React官方站点几乎没有提及其在服务器端的应用;有人拿React和WebComponent相提并论,但两者并不是完全的竞争关系,你完全可以用React去开发一个真正的WebComponent;React不是一个新的模板语言,JSX只是一个表象,没有JSX的React也能工作4、如何编写React组件?下面我们展示如何创建简单的React组件:importReactfrom'react';classGreetingextendsReact.Component{ constructor(props){   super(props);   this.state={name:props.name}; } render(){   return<h1>Hello,{this.state.name}!</h1>; }}exportdefaultGreeting;5、React有什么优缺点?优点1、React速度快、性能好它并不直接对DOM进行操作,引入了一个叫做虚拟DOM的概念,安插在javascript逻辑和实际的DOM之间,性能好2、跨浏览器兼容虚拟DOM的原因帮助我们解决了跨浏览器问题,它为我们提供了标准化的API3、单向数据流Flux随着React视图库的开发而被Facebook概念化,是一个用于在JavaScript应用中创建单向数据层的架构4、React兼容性好使用RequireJS来加载和打包,而Browserify和Webpack适用于构建大型应用。缺点1.并不是一个单独完整的框架React是目标是UI组件,通常可以和其它框架组合使用,目前并不适合单独做一个完整的框架
  • 所需E币: 0
    时间: 2023-9-18 16:20
    大小: 703B
    上传者: 蝴蝶结欧恩
    分享课程——Vue3+Vite+Vant-UI开发双端招聘APP,23年新课,完整版32章,附源码下载。课程以业务驱动技术栈,将真正的商用级项目复原在课程中,使用Vite、Vue3、Vant3UI、Pinia和VueUse等前沿技术,从构建、研发、测试,完成整个全流程的学习。让你在掌握技术的同时,也能提升作为开发者的综合素养。项目功能相对完善,界面美观,手把手带你做出亮眼的作品。
  • 所需E币: 0
    时间: 2023-8-17 11:11
    大小: 1.26KB
    全栈开发是指开发人员拥有前后端开发的能力,并且能够熟练地将前后端代码整合到一起。以下是全栈开发的完整攻略:1.学习前端基础知识全栈开发需要掌握前端基础知识,包括HTML、CSS、JavaScript等。HTML和CSS用于页面布局和样式,JavaScript用于网页交互和动态效果。2.掌握后端技术掌握后端技术是全栈开发的关键之一。后端主要使用框架和语言来开发API(应用程序接口),包括但不限于Node.js、RubyonRails、Django、Flask等。掌握后端技术可以使你能够开发API,处理数据和实现服务端今动态。3.学会使用数据库数据是应用程序中的核心,因此学会如何存储和检索数据是全栈开发的关键之一。数据库是一个可以定义,管理和访问数据的软件系统。MySQL,PostgreSQL,MongoDB和CouchDB等是一些常见的数据库可选项。全栈开发的工作职责是:能独立负责网站前台、后台开发和迭代,根据业务需要开发,制作和程序修改;参加制定网站研发及迭代方案制定;参与网站研发,按要求高质量完成编程开发;负责网站上线前的测试工作;负责跟进网站页面显示视觉效果。一个全栈开发人员是在应用程序或网站的前端和后端工作的软件程序员或Web开发人员。他们有能力处理Web开发项目,这些项目涉及构建面向用户的网站,管理数据库或在项目的规划阶段与客户合作。成为一名全栈开发人员并不一定意味着你需要掌握Web开发的前端或后端的所有内容。它只是意味着您有能力在两端工作,并了解应用程序开发中涉及的所有元素。
  • 所需E币: 0
    时间: 2023-8-17 10:37
    大小: 1.62KB
    上传者: 开心就很好了
    Next.js是一个用于构建现代化React应用程序的框架。它强调性能、开发体验和SEO优化,是许多React开发者的首选。Next.js提供了许多功能,包括:服务器渲染(SSR):Next.js允许在服务器端渲染React应用程序,从而提高了应用程序的性能和SEO。静态网站生成(SSG):你可以使用Next.js生成静态网站,以提供更快的加载速度和更好的用户体验。热模块替换(HMR):Next.js支持热模块替换,使开发者可以在不刷新页面的情况下实时预览更改。路由和数据预取:Next.js提供了简单易用的路由系统,并支持数据预取以优化页面加载。NestJS的一些优势包括:构建在现代JavaScript栈之上,因此使用了最新的JavaScript技术。基于Angular的架构和语法,提供了强大的模块化系统和依赖注入功能。基于TypeScript,提供了强类型和静态类型检查。提供了丰富的工具和模块,可用于构建各种类型的服务器端应用程序,包括RESTfulAPI、GraphQLAPI、WebSocket服务器等。提供了一组可扩展的构建块,可用于快速构建应用程序。提供了与主流数据库和身份验证系统的集成。准备工作首先我们要把Nest.js服务端跑起来,并且支持api接口、静态页面。Nest.js创建一个crud服务是非常快的,只需要这么几步:安装@nest/cli,使用nestnewxxx创建一个Nest.js的项目,在根目录执行nestgresourceperson快速生成person模块的crud代码npmrunstart启动Nest.js服务这样一个有person的crud接口的服务就跑起来了,是不是非常快在前面我们知道了,NestJs的项目结构是由Controller、Service、Module三个主要部分组成的,它们共同组成一个模块。Controller:控制器,通过@Controller()装饰器定义的类,目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。它的功能类似Spring,主要就是为前端提供api接口,以及一些简单的验证。Service:提供者,又称为Provider,通过@Injectable()装饰器定义的类,功能也类似Spring的服务层,主要负责处理具体的业务,逻辑代码一般都写在这里。
  • 所需E币: 0
    时间: 2023-8-4 16:02
    大小: 1KB
    上传者: 蝴蝶结欧恩
    分享课程——Pytorch框架CV开发-从入门到实战,附代码+PDF课件+数据集下载。课程简介:通过大量实战案例与模型实现为牵引,学会使用经典的网络结构设计自己的网络模型,实现各种常见应用场景下的识别与检测任务,同时通过大量的代码练习来巩固所学知识,理论联系实际,做Pytorch框架工业级的CV开发者。PyTorch是一个基于Python的科学计算库,它提供了两个高级功能:张量计算和深度学习。PyTorch的张量计算功能类似于NumPy,但可以在GPU上运行,这使得它非常适合于深度学习。PyTorch的深度学习功能包括自动求导、动态计算图和模型部署等功能。PyTorch的设计目标是提供一个灵活、快速和易于使用的深度学习框架。