tag 标签: 开发

相关博文
  • 热度 2
    2024-11-21 09:10
    80 次阅读|
    0 个评论
    科研新体验:刘同学深度试用ADTF软件反馈揭晓!
    一、前言 作为一名 高校的科研工作者 ,在高校的科研工作中,经常需要处理各种复杂的数据流,尤其是 视频采集和处理 的工作,对数据的实时性和精度要求非常高,我首次试用ADTF时,主要负责开发一个 集成FFmpeg的Filter组件 ,处理摄像头采集的raw数据,并对其进行H264编解和解码。在这个试用的过程中,我对ADTF的初步体验是它的设计 非常便捷 ,尤其是对于 图像和视频数据的处理。 通过这次开发,我对 ADTF的模块化设计、流数据传输机制以及其便捷的开发环境 有了更加深刻的认识。接下来,我将从多个角度详细分享我的试用体验,内容涵盖 ADTF的优势、工作流程中的亮点 ,以及 未来展望 等方面。 二、ADTF的用户界面与灵活性 在打开ADTF时,我觉得其 直观的GUI设计 非常的友好。作为一名高校科研工作者,我们通常需要频繁的调整实验配置、切换不同的开发场景,而ADTF的界面布局使得这些操作变得十分便捷。 其工具栏、Component、Sessions管理以及快捷命令栏 的存在,极大的 优化了工作的流程 。能够在搭建工作流时,迅速的找到所需要的工具和组件,并轻松的管理多个实验配置,这在需要进行多项实验的科研工作中尤其重要。 ADTF的模块化设计 使我能够快速自由的组合各种组件,构建适合 具体科研需求 的工作流。例如,我能够通过ADTF提供的Store模块,轻松地管理不同的数据流和实验配置。这种灵活性对于需要 快速迭代实验和算法验证 的科研工作来说非常有利。 三、便捷的组件开发 我在ADTF中开发的Filter组件,集成了FFmpeg进行H264图像数据编解码,这使得我能够处理摄像头采集的raw数据。ADTF提供了 标准的图像数据流定义 ,使我可以快速上手,并通过 自定义的数据流类型进行数据的高速传输。 让我印象深刻的是,ADTF允许我创建自定义的流类型,并将编码后的视频数据发送至下一个Filter进行解码。这种模块化的设计对于处理复杂的多步数据流非常有帮助,尤其是在 处理视频和音频等 连续数据时。 ADTF的流数据传输机制非常稳健 ,特别是在 高速数据吞吐 情况下,它依然能够保证数据的完整性和及时性。例如,当我处理大规模视频数据时,ADTF通过其文件的流数据传输体系很好地管理了数据流的传输,确保没有出现数据丢失的现象。这一点在要求 高精度 的场景下, ADTF的表现非常好 。 此外,ADTF的组件开发过程也充分展示了其 灵活性 。在开发Filter组件时,ADTF中可以自定义流类型,不仅能与标准化的数据流兼容,还能针对特定需求自己定义。通过这种方式,我可以轻松的将编码后的视频数据 传输至下一个 解码或者处理视频数据的组件,实现多步数据流处理。在整个开发过程中,我清晰地感受到了ADTF模块化设计所带来的便利,它允许我 根据不同的实验需求进行自由组合和扩展。 四、丰富的工具箱和组件 ADTF还有一个非常好的亮点是它 丰富的工具箱 。我在开发组件的过程中直接使用了ADTF自带的Windows摄像头驱动采集数据,避免了繁琐的硬件配置。此外,ADTF还提供了Qt以及foxglove等显示组件,使我能够实时监控摄像头捕获的视频流,很大程度上方便了我的开发和测试。这种 预制组件的存在大幅度缩短了开发时间 ,我可以把更多的精力集中在数据处理的核心逻辑上。 在科研项目中,快速的验证新算法和新想法是我们的日常工作。 ADTF通过大量现成的组件,帮助我们在短时间内可以搭建一个完整的测试环境 。例如:我可以迅速继承已有的摄像头采集组件,并通过简单的操作和配置就可以完成视频流的显示和存储。这种集成工具的便利性是在科研工作中快速迭代优化的重要支撑。 五、外部库与ADTF完美结合 在科研项目中,大部分的功能需要 依赖外部库 ,比如OpenCV、FFmpeg…,在这次的开发过程中,我通过FFmpeg对摄像头采集的raw数据进行H264编解码。 ADTF的开放性和模块化 使得FFmpeg的集成过程十分顺畅,通过Filer组件可以轻松调用FFmpeg的功能,将raw数据进行编码,并在解码阶段还原数据进行显示。 FFmpeg强大的视频处理能力与ADTF的稳定数据流传输机制相结合,使我能够达到项目中要求的实时数据处理。通过把FFmpeg集成到ADTF中,我能够以较低的系统资源消耗完成高效的视频编码和解码,还可以在我设计不同的试验方案时,快速的帮我搭建适合试验方案要求的工作流。 ADTF与FFmpeg的结合组件展现了非常出色的扩展性和稳定性。 六、未来展望 通过对ADTF的使用,我认为ADTF为高校的科研人员提供了一个强大的数据处理和开发平台,A DTF在处理大规模数据流、视频数据编解码等领域具有极大的潜力。 这种模块化设计使我们能够轻松定制复杂的工作流程,特别是在处理多个传感器数据和视频流时,ADTF提供了极高的灵活性。 在未来对ADTF的使用中,我将会进一步探索ADTF在 自动驾驶、智能交通系统等领域 的应用,并希望能够看到它在数据处理和算法开发中的更多突破。
  • 2024-9-26 09:23
    318 次阅读|
    0 个评论
    康谋分享 | 直面AD/ADAS快速开发挑战:IVEX自动驾驶场景管理及分析平台!
    过去十年, 自动驾驶和高级驾驶辅助系统 (AD/ADAS) 软件和硬件的开发 成为了各大汽车公司的主要投资目标之一。各大汽车公司对 AD/ADAS 持续不断的投资加快了 AD/ADAS 组件的开发周期,但也揭示了目前需要解决的 重大挑战——如何快速了解开发 AD/ADAS 组件中的车辆行为,以便进行改进! 一、方案背景 由于 AD/ADAS 的运行环境很复杂,从仿真到真实驾驶, 任何 AD/ADAS 组件的每次更改都需要根据大量场景进行验证。 然而,场景数量庞大且每天都在增长, 传统的机器人开发支持工具(如 RVIZ)无法满足我们的需求。 例如,RVIZ只允许我们实时检查车辆的行为, 很难快速跳转到任何特定事件。 为此, 康谋推出IVEX自动驾驶场景管理及分析平台 来克服这一难题。IVEX是一个基于云的平台,包含许多功能来支持 AD/ADAS 的验证和开发。 下文康谋将为您分享在AD/ADAS开发中使用IVEX的经验。 二、康谋方案——IVEX自动驾驶场景管理及分析平台 图1 IVEX页面 1、数据输入 我们通过将原始数据转换为所需的格式,然后将转换后的数据上传到基于云的服务器来与安全分析平台进行交互。平台的输入数据以 Protobuf 消息格式定义,包括执行期间有关环境和AD/ADAS 行为的信息,例如: a.自车状态变量, 例如位姿、速度、加速度和转向角; b. 自我车辆规划轨迹; c.障碍物信息, 如位姿、边界框、速度和类型; d. 上下文图像; e.标记事件, 其中每个事件由一个标签和相应的时间戳组成; 2、场景执行结果 (1)格式 IVEX清晰且 定 义良好的输入格式有助于无缝处理不同的数据格式。由于场景来自不同的来源,因此场景执行结果具有不同的格式,例如 Autoware ROS2 Bags、Apollo CyberRecords、Carla Simulator 日志格式和其他商业模拟器日志格式。 对于每种数据格式,我们都有一个适配器 (通常只是一个 Python 脚本),用于将数据转换为安全分析的 Protobuf 输入格式。Protobuf 是大多数工程师都熟悉的格式。通常只需几个小时即可开发一个适配器,将新的数据格式转换为安全分析的 Protobuf 输入格式。 (2)上传 图2 将数据上传到IVEX的命令行界面 通过命令行界面将场景执行结果上传到IVEX平台。数据转换和数据上传都集成到 CI/CD 流程中。同时每位工程师都可以执行任何特定场景并将结果上传到 IVEX平台。这种灵活性使我们能够快速试验AD/ADAS开发中的每项更改。 (3)检查 在 IVEX 的 Web 界面上检查场景执行结果。我们可以根据不同的元数据(例如执行日期、软件版本或场景名称)搜索、过滤和选择相关场景。 图3 IVEX的搜索功能示例 a.快速概览 由于场景验证通常是大量的,因此快速概览结果十分重要。 使用 IVEX的聚合视图可以实现快速概览 。在筛选和选择感兴趣的场景后,可以访问聚合视图,该视图可快速提供有关所有标记事件的信息,这些事件按不同的操作设计域进行分类。标记的事件可以包含在要上传到 IVEX 的输入数据中,从而能够标记与验证任务相关的任何类型的事件。IVEX 还会自动标记几个标准事件,例如紧急刹车、关键碰撞时间等。 例如,当在IVEX中开发一项新功能并想要比较自主车辆以不同速度行驶时的结果时,启用聚合视图来显示按不同速度范围分类的信息,如下图所示。 图4 IVEX的聚合视图 b.快速导航 除了概览场景执行结果中发生的事件之外,我们还需要能够快速导航到特定事件以检查车辆的行为。 从聚合视图可以直接跳转到任何感兴趣的事件。 例如,如果想检查当自车行驶速度超过 30 公里/小时时发生的紧急刹车事件,可以点击与该事件和速度相对应的框。事件的分布和特定时间戳的列表与上下文图像一起显示。点击任何一张卡片都会来到数据日志视图,该视图提供在特定时间戳发生的详细信息。 图5 在数据日志视图中检查急刹车事件 在数据日志视图中,可以详细检查事件。该视图具有详细的可视化功能,可显示当时的所有信息,包括自车的状态、地图、障碍物及其相关信息,例如速度、类型和与自车的距离。我们还可以从场景列表直接跳转到数据日志视图。 图6 数据日志视图的可视化 数据日志视图还帮助我们重播并查看场景中发生的情况。只需点击几下,我们就可以在每个时间戳之间来回切换。我们还可以看到所有标记的事件并导航到其中任何一个。使用此视图,可以快速评估和了解任何情况。 图7 快速导航至特定事件或时间戳 c. 团队共享 一旦发现需要进一步检查的事件,我们就可以与其他同事分享完全相同的视图,然后同事就可以随时检查该事件。在团队工作时,共享此类信息可以大大促进我们的沟通,并帮助我们专注于正确的方向。 三、结论 IVEX大大推动了AD/ADAS的开发工作: a.轻松集成驾驶数据到平台 b.快速了解车辆行为 c.快速导航感兴趣事件 d.访问所有有价值的可视化信息了解情况 e.团队共享信息 期待您继续关注康谋之后的文章,我们将分享有关AD/ADAS的基于场景的验证和数据分析的更多信息。
  • 热度 5
    2023-10-7 23:13
    1302 次阅读|
    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 谢谢!
  • 热度 7
    2023-9-28 15:20
    1057 次阅读|
    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系统架构,我深入理解了嵌入式系统的核心组件和其工作机制。我相信,这种深入的理解将对我未来的学习和职业发展产生积极的影响。我希望通过分享我的学习心得,能够激发其他读者对嵌入式系统的热情和好奇心,从而一起探索这个美妙的世界。 谢谢!
  • 热度 8
    2023-5-18 09:15
    1168 次阅读|
    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 )。
相关资源
  • 所需E币: 1
    时间: 2024-10-23 13:38
    大小: 119.52MB
    上传者: 金鑫1231
  • 所需E币: 0
    时间: 2024-6-20 15:01
    大小: 21.02MB
    FPGA新手适用的开发例程教程,很实用
  • 所需E币: 0
    时间: 2024-5-24 17:08
    大小: 2.93KB
    一、PyQT的概念PyQt是一个创建PythonGUI应用程序的工具包,是Qt和Python结合的一个产物,可以说是为了将Qt的功能用于Python开发的一个Qt的Python包装器。它是Python编程语言和Qt库的成功融合。PyQt的整个程序开发框架,主要包括如下部分:图形界面编辑的工具:QtDesigner不同部分信息交换机制:信号和槽界面操作的事件及捕获机制一套控制界面显示和数据存储分离以及映射的机制:Model/View架构通过这些重要的工具和框架机制,开发人员可以设计对应的GUI图形化界面、定义不同部件的操作及响应、捕获部件或应用的消息以及实现界面显示组件和数据存储组件的联动,从而构造完整的应用程序框架。PyQt实现了一个Python模块集。它有超过300类,将近6000个函数和方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。PyQt采用双许可证,开发人员可以选择GPL和商业许可。在此之前,GPL的版本只能用在Unix上,从PyQt的版本4开始,GPL许可证可用于所有支持的平台。二、OpenCVOpenCV项目最初由Intel于1999年启动,当时的目标是提供一个免费的计算机视觉库,并开放其源代码,以促进计算机视觉研究的发展。随后,OpenCV在2000年发布了第一个公开版本,从那时起,OpenCV迅速成为了计算机视觉领域最受欢迎的库之一。后来,OpenCV的开发由WillowGarage公司继续,随后由Itseez公司接管,直到今天,OpenCV的开发由OpenCV开发团队维护。核心功能和模块:OpenCV库包含了众多的模块,每个模块都提供了不同的功能,以下是一些核心的模块:2.1核心功能模块(CoreModule)这个模块提供了基本的数据结构和功能,包括图像数据类型、矩阵操作、文件IO等。图像操作:读取和保存图像:可以使用imread()函数读取图像文件,使用imwrite()函数保存图像到文件。图像属性访问:可以通过Mat对象的属性访问功能获取图像的尺寸、通道数、数据类型等信息。像素操作:可以直接访问和修改图像的像素值,或者使用像素迭代器遍历图像。图像通道操作:可以将多通道图像拆分成单通道图像,或者将单通道图像合并成多通道图像。创建矩阵:可以使用Mat类的构造函数或create()函数创建矩阵。矩阵运算:支持常见的矩阵运算,如加法、减法、乘法等。矩阵转换:可以对矩阵进行转置、仿射变换、透视变换等操作。2.2图像处理模块(ImageProcessingModule)OpenCV的图像处理模块提供了各种图像处理算法,包括图像滤波、边缘检测、图像变换等。这些算法可以帮助用户对图像进行预处理、增强、分析和特征提取等操作。下面是图像处理模块中常用的功能和算法:图像滤波(ImageFiltering):平滑滤波(SmoothingFilters):如均值滤波、高斯滤波、中值滤波等,用于去除图像中的噪声。锐化滤波(SharpeningFilters):如拉普拉斯滤波器、Sobel滤波器等,用于增强图像的边缘和细节。图像变换(ImageTransformations):几何变换(GeometricTransformations):如平移、旋转、缩放、仿射变换等,用于调整图像的尺寸和位置。透视变换(PerspectiveTransformation):用于校正图像中的透视失真。边缘检测(EdgeDetection):Sobel算子:Sobel算子通常用于灰度图像的边缘检测,其基本思想是利用图像中像素灰度值的变化情况来识别边缘。Sobel算子在水平和垂直方向上分别定义了两个卷积核(通常为3x3的矩阵),用于计算图像中每个像素点的水平和垂直方向的梯度值。Canny边缘检测:首先,对输入图像进行高斯滤波,以减少图像中的噪声。高斯滤波可以平滑图像,并模糊图像中的细节,从而有助于检测到真实的边缘。在经过高斯滤波的图像上,利用Sobel算子或其他梯度算子计算图像的梯度幅值和梯度方向。梯度方向可以帮助确定边缘的方向。对图像中的梯度幅值进行非极大值抑制,保留局部梯度幅值最大的像素点,以使得边缘变得更细化。利用双阈值检测策略对梯度幅值进行阈值处理,将图像中的像素点分为强边缘、弱边缘和非边缘三类。通常设置两个阈值,一个是高阈值(highthreshold),用于确定强边缘像素;另一个是低阈值(lowthreshold),用于确定弱边缘像素。通过连接强边缘像素,利用弱边缘像素进行边缘跟踪,得到完整的边缘。三、人工智能应用人工智能在生活中的应用有:1、虚拟个人助理,使用者可通过声控、文字输入的方式,来完成一些日常生活的小事;2、语音评测,利用云计算技术,将自动口语评测服务放在云端,并开放api接口供客户远程使用;3、无人汽车,主要依靠车内的以计算机系统为主的智能驾驶仪来实现无人驾驶的目标;4、天气预测,通过手机gprs系统,定位到用户所处的位置,在利用算法,对覆盖全国的雷达图进行数据分析并预测。
  • 所需E币: 0
    时间: 2024-5-25 17:37
    大小: 2.62KB
    2024全新Langchain大模型AI应用与多智能体实战开发一、Langchain是什么LangChain是一个新一代的AI开发框架,旨在释放大语言模型的潜能,为开发者提供便捷的开发工具和接口。LangChain是一个帮助在应用程序中使用大型语言模型(LLM)的编程框架。与生成式AI中的所有东西一样,这个项目的发展也非常迅速。2022年10月,它先是作为一款Python工具,然后在今年2月增加了对TypeScript的支持。到今年4月,它支持多种JavaScript环境,包括Node.js、浏览器、CloudflareWorkers、Vercel/Next.js、Deno和SupabaseEdgeFunctions。二、什么是智能体?LLM智能体的定义非常宽泛:它们指的是所有将LLMs作为核心引擎,并能够根据观察对其环境施加影响的系统。这些系统能够通过多次迭代“感知⇒思考⇒行动”的循环来实现既定任务,并常常融入规划或知识管理系统以提升其表现效能。你可以在Xietal.,2023的研究中找到对智能体领域综述的精彩评述。 三、深入6大组件LangChain中的具体组件包括:模型(Models),包含各大语言模型的LangChain接口和调用细节,以及输出解析机制。提示模板(Prompts),使提示工程流线化,进一步激发大语言模型的潜力。数据检索(Indexes),构建并操作文档的方法,接受用户的查询并返回最相关的文档,轻松搭建本地知识库。记忆(Memory),通过短时记忆和长时记忆,在对话过程中存储和检索数据,让ChatBot记住你是谁。链(Chains),是LangChain中的核心机制,以特定方式封装各种功能,并通过一系列的组合,自动而灵活地完成常见用例。代理(Agents),是另一个LangChain中的核心机制,通过“代理”让大模型自主调用外部工具和内部工具,使强大的“智能化”自主Agent成为可能!你的App将产生自驱力!总体来讲,LangChain是AI智能时代基于LLM大模型的开发框架。第一、它是上下文相关的,为LLM应用程序开发的整体生命周期提供全流程的框架支持。第二、使用LLM大模型的推理能力为LangChain开发的LLM应用程序提供规划能力(Planning)。第三、LangChain围绕开发LLM应用程序的整体流程提供ModelI/O(Prompt输入、Embedding向量化、LLM大模型适配以及大模型回答适配等)、Retriieval(数据源加载、转换、向量化、存入向量数据库、检索以及向量相识度计算等)、Chains(用于完成特定更高级别任务的组件组装)、Memory(短期记忆、长期记忆)、Agents(LLMAPP)、Callbacks(提供向外部回调的功能)。LangChain是一个旨在帮助您轻松构建大语言模型应用的框架,它提供如下功能:为各种不同基础模型提供统一接口(参见Models)帮助管理提示的框架(参见Prompts)一套中心化接口,用于处理长期记忆(参见Memory)、外部数据(参见Indexes)、其他LLM(参见Chains)以及LLM无法处理的任务的其他代理(例如,计算或搜索)。因为LangChain有很多不同的功能,所以一开始可能很难理解它的作用。因此我将在本文中介绍LangChain的(当前)六个关键模块,以便您更好地了解其功能。四、LangChain在不同领域的应用案例金融行业:LangChain应用系统可以应用于金融领域,帮助银行和金融机构进行智能客服、风险管理、舆情监控等工作,提升金融服务的质量和效率。医疗健康:在医疗健康领域,LangChain可以用于患者健康管理、医疗咨询、疾病诊断等方面,为医疗机构和患者提供更好的医疗服务。教育培训:LangChain应用系统可以用于教育培训行业,支持在线教育、智能学习系统、智能答题系统等应用,提升教育教学的效果和效率。零售行业:在零售行业,LangChain可以应用于智能客服、商品推荐、用户评论分析等方面,帮助零售企业提升销售额和客户满意度。LangChain应用系统的出现,为各行各业带来了新的发展机遇和挑战。随着人工智能技术的不断进步和应用场景的不断拓展,我们有理由相信,LangChain将会在未来发挥越来越重要的作用,为社会进步和发展做出更大的贡献。
  • 所需E币: 0
    时间: 2024-5-7 14:49
    大小: 2.62KB
    1、WPF基础叙述:WPF(WindowsPresentationFoundation)是微软推出的基于Windows的用户界面框架,属于.NETFramework3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。2、WPF布局原则①一个窗口中只能包含一个元素②不应显示设置元素尺寸③不应使用坐标设置元素的位置④可以嵌套布局容器3、WPF布局容器①StackPanel:水平或垂直排列元素、Orientation属性分别:Horizontal/Vertical②WrapPanel:水平或垂直排列元素、针对剩余空间不足会进行换行或换列进行排列③DockPanel:根据容器的边界、元素进行Dock.Top、Left、Right、Bottom设置④Grid:类似table表格、可灵活设置行列并放置控件元素、比较常用⑤UniformGrid:指定行和列的数量,均分有限的容器空间⑥Canvas:使用固定的坐标设置元素的位置、不具备锚定停靠等功能。4、学习WPF的基础知识:1)  WPF是微软提供的一种用来开发“桌面应用”的技术(框架),这项技术本身和C#没有关系,必须会的是xaml语法。2)  对XML、HTML、XHTML、ASP.NET之类的“标准通用标记语言”,对于学习是有所帮助的。3)  有WinForm或ASP.NET经验,主要是对控件事件的处理要有所了解。4)  具备面向对象的思想:在WPF中,经常要灵活运用各种继承关系、多态、重载等。5)  DataBinding要有所了解:Binding是WPF的一大亮点。5、C++/CLI下创建WPF项目的方法由于WPF不仅仅支持C#/VB开发,还支持其他语言,比如:C++、F#等开发,于是大白我最近花了点时间摸索了一下,本文主要介绍C++/CLI下创建WPF项目的方法。我使用的开发环境是:Win10x64+VisualStudio2019(16.6.1版本)。今天我们需要使用C++/CLI,算是C++的一个子集吧。要能正常使用C++/CLI,首先需要确保你安装了C++/CLIbuild套件(见下图),同时还需要确保你安装好了VisualC++相应版本的运行库。进入控制面板,找到VisualStudio2019,右击"修改",然后切换到"独立组件"(Individualcomponents)这个选项卡。如果没安装,勾选后安装一下即可。接下来我们可以创建项目了,建议选用模板CLREmptyProject(.NETFramework),解决方案和项目名可以都用CppWpfDemo。这时一个空项目就创建完成了。此时查看Project的属性,ConfigrationProperties->"C/C++"->"AllOptions",输入"common"进行搜索,确保选中的是CommonLanguageRuntimeSuppor(/clr).6、创建应用程序项目第一步是创建包含应用程序定义、两个页面以及图像的应用程序基础结构。使用VisualBasic或VisualC#创建名为ExpenseIt的新WPF应用程序项目:打开VisualStudio,然后在“开始”菜单下选择“创建新项目”。“创建新项目”对话框随即打开。在“语言”下拉列表中,选择“C#”或“VisualBasic”。然后选择“WPF应用(.NETFramework)”模板,然后选择“下一步”。“配置新项目”对话框随即打开。输入项目名称ExpenseIt,然后选择“创建”。VisualStudio将创建该项目,并打开名为MainWindow.xaml的默认应用程序窗口的设计器。打开Application.xaml(VisualBasic)或App.xaml(C#)。此XAML文件定义WPF应用程序以及任意应用程序资源。还可以使用此文件指定在应用程序启动时自动显示的UI(在本例中是MainWindow.xaml)。XAML在VisualBasic中应如下所示:<Applicationx:Class="Application"  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  StartupUri="MainWindow.xaml">  <Application.Resources>       </Application.Resources></Application>在C#中如下所示:<Applicationx:Class="ExpenseIt.App"   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   StartupUri="MainWindow.xaml">  <Application.Resources>       </Application.Resources></Application>打开MainWindow.xaml。此XAML文件是应用程序的主窗口,显示在页面中创建的内容。Window类定义窗口属性(例如标题、大小或图标),并处理事件(例如关闭或隐藏)。
  • 所需E币: 0
    时间: 2024-5-9 09:32
    大小: 2.65KB
    上传者: 开心就很好了
    Solidity简介Solidity是一种静态类型、面向合约的高级编程语言,专门为编写智能合约而设计,它被用于eth和其他兼容区块链平台。Solidity语言受到了C++、Python和JavaScript等语言的影响,旨在提供一种安全、易于理解的方式来创建和管理智能合约。特点静态类型:Solidity是一种静态类型语言,这意味着所有变量的类型在编译时都必须明确指定。面向合约:Solidity中的主要构建块是合约(Contracts),它们类似于面向对象编程中的类。合约可以包含状态变量、函数、事件、修饰符等。继承:Solidity支持多重继承,允许合约继承其他合约的属性和行为。兼容EVM:Solidity编写的智能合约被编译成EVM(虚拟机)字节码,这使得它们可以在eth网络上部署和执行。什么是智能合约?智能合约(Smartcontract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由NickSzabo首次提出。智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。简单地说,智能合约可以理解为一个自执行的协议。智能合约可以自动处理协议的履行、管理、以及支付。例如,可以编写这样一个智能合约:本月底之前,老王转账给小张1个以太币,这个智能合约部署后,就会在月底之前,自动把老王的1个以太币转账给小张,无需人为干预。关键零件:1.逻辑:Solidity允许使用if-else语句、for和while循环以及其他逻辑运算符,如and、or、not。2.作用域:Solidity具有全局、契约和函数级别的作用域。每个变量或函数都有一个特定的范围,在该范围内可以访问或修改它。3.模式:Solidity具有可用于编写智能合约的通用设计模式,例如Open-ClosePrinciple和PullPayment模式。4.函数:Solidity支持内部和外部函数。内部函数只能被同一合约内的其他函数调用,而外部函数可以被任何合约或外部调用。5.结构:Solidity允许创建自定义数据结构,例如结构和数组。6.库:Solidity支持库的使用,库是可以被多个合约调用的可重用代码块。让我们亲自动手,使用代码示例和解释来解释这些关键组件中的每一个。以下是用Solidity编写的逻辑示例。functioncheckAge(uintage)publicpurereturns(bool){  if(age>=18){ //thislinechecksiftheinputageisgreaterthanorequalto18    returntrue;  //iftheaboveconditionismet,itreturnstrue  }else{    returnfalse; //iftheaboveconditionisnotmet,itreturnsfalse  }}该函数具有public和pure可见性,这意味着它不读取或修改状态变量,仅使用传递给它的参数或其中存在的局部变量返回值。它可以在编译期间从外部调用而不会产生任何副作用。如果年龄大于或等于18岁,则该函数还返回一个布尔值true,否则返回一个布尔值false。很简单,对吧?现在让我们在下面的示例中编写一些Solidity范围。contractEnitandev{  uintprivateage=25; //thislinedeclaresaprivatevariableoftypeuintcalledageandassignsitthevalue25  functiongetAge()publicviewreturns(uint){ //thisfunctionispublicandread-only    returnage; //thislinereturnsthevalueoftheprivatevariableage  }}Solidity值类型布尔(bool):可能的取值为字符常量值true或false整型(int/uint):分别表示有符号和无符号的不同位数的整型变量;支持关键字uint8到uint256(无符号,从8位到256位)以及int8到int256,以8位为步长递增定长浮点型(fixed/ufixed):表示各种大小的有符号和无符号的定长浮点型;在关键字ufixedMxN和fixedMxN中,M表示该类型占用的位数,N表示可用的小数位数地址(address):存储一个20字节的值(以太坊地址大小)定长字节数组:关键字有bytes1,bytes2,bytes3,…,bytes32枚举(enum):一种用户可以定义类型的方法,与C语言类似,默认从0开始递增,一般用来模拟合约的状态函数(function):一种表示函数的类型
  • 所需E币: 0
    时间: 2024-2-28 12:01
    大小: 3.42KB
    Kubernetes,简称K8s,是一个开源系统,用于自动化部署、扩展和管理容器化应用程序。它提供了基本机制来部署、维护和扩展应用程序,支持跨多个主机的容器应用。K8s是Go语言开发的,建立在Docker之上,可以看作是Docker的上层架构。它的主要功能包括应用部署、维护、扩展,集群管理、安全防护、准入机制、多应用支撑、服务注册与发现、智能负载均衡、故障发现与自我修复、服务滚动升级、在线扩容、资源配额管理等。K8s通过容器的方式来管理应用程序,使得容器集群能够运行在用户期望的状态,并解决容器跨机器通信的问题。DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。容器技术是k8s中最关键的技术,通过容器技术可以将一台实体服务器资源虚拟化为多个隔离的容器,容器之间有较高的隔离级别,可像一台独立的服务器般部署程序并对外提供服务。简单来说,可以把容器简单视为一个特殊的进程,该进程与其他进程相隔离,在自己的命名空间下使用网络接口和文件,并且该进程只能使用硬件的部分资源。容器技术的基础是linux命令空间和cgroups,其中:(1)容器的隔离是基于linux命令空间来实现的,命名空间提供了一种内核级别隔离系统资源的方法,通过将系统的全局资源放在不同的命名空间中,来实现资源隔离的目的。不同命名空间的进程,可以享有一份独立的系统资源。(2)硬件资源的限制是通过cgroups实现的,cgroups是一个linux内核功能,它被用来限制一个进程或者一组进程的资源(cpu、内存、带宽等)使用,被限制的进程不能过分使用为其他进程保留的资源。容器技术与微服务概念相得映彰,微服务概念强调将一个大的系统拆分为若干微服务,每个微服务实现系统的特定功能,通过这个方式来减少系统的耦合。一般而言,一个微服务所需的系统资源并不需要很多,使用一个容器来部署一个微服务便成了一件很合适的事情,毕竟容器创建简单、资源可控,隔离性好、扩容方便。Kubernetes中的CRD(CustomResourceDefinition,自定义资源定义)允许用户扩展API服务器以支持新的自定义资源。使用CRD,用户可以定义自己的KubernetesAPI资源类型,并在Kubernetes集群中创建、管理和操作这些自定义资源。CRD的创建和使用通常涉及以下几个步骤:创建CRD定义:创建一个CRD定义文件,例如customresource.yaml,其中包含自定义资源的结构和属性。CRD定义文件使用KubernetesAPI对象的规范来定义自定义资源的模式、版本和行为。apiVersion:apiextensions.k8s.io/v1kind:CustomResourceDefinitionmetadata: name:mycustomresources.samples.example.comspec: group:samples.example.com versions:  -name:v1   served:true   storage:true scope:Namespaced names:  plural:mycustomresources  singular:mycustomresource  shortNames:  -mcrkube-scheduler调度过程和原理kube-scheduler是Kubernetes集群中的一个核心组件,负责根据预定义的调度策略将Pod分配到集群中的合适节点上运行。下面是kube-scheduler的调度过程和原理的简要描述:获取未调度的Pod:kube-scheduler会定期从KubernetesAPI服务器获取所有未调度的Pod的列表。筛选:kube-scheduler会对未调度的Pod进行筛选,剔除不符合调度要求的Pod。这包括检查系统保留节点、Pod的亲和性和反亲和性要求(如NodeSelector、NodeAffinity等)、污点(Taints)等。只有符合筛选条件的Pod才会进入下一步的调度过程。评分:对于剩下的可调度Pod,kube-scheduler会对每个节点进行评分,根据一系列算法为每个节点计算出一个分数。评分算法可以根据用户自定义的策略进行配置,常见的因素包括节点资源利用率、节点的可用性、亲和性和反亲和性等。选择节点:根据评分结果,kube-scheduler会选择具有最高分数的节点来运行Pod。如果多个节点具有相同的最高分数,kube-scheduler会根据预定义的调度策略(如最少负载、随机选择等)来决定最终的调度结果。更新调度结果:获取到调度结果后,kube-scheduler将更新Pod的调度信息,并将其更新到KubernetesAPI服务器中。这样其他组件(如kubelet)就会根据调度结果来将Pod放置到相应的节点上运行。监控和重调度:kube-scheduler会定期监控已调度的Pod以确保其正常运行。如果发现某个节点不可用或Pod处于非运行状态,kube-scheduler将重新进行调度,将Pod迁移到其他合适的节点上。kubernetes内部需要5套证书,手动创建或者自动生成,分别为:1.etcd内部通信需要一套ca和对应证书。2.etcd与外部通信也要有一套ca和对应证书。3.APIserver间通信需要一套证书。4.apiserver与node间通信需要一套证书。5.node和pod间通信需要一套ca证书。目前来说还不能实现把所有的业务都迁到kubernetes上,如存储,因为这个是有状态应用,出现错误排查很麻烦,所以目前kubernetes主要是运行无状态应用。所以一般而言,负载均衡器运行在kubernetes之外,nginx或者tomcat这种无状态的应用运行于kubernetes集群内部,而数据库如mysql,zabbix,zoopkeeper等有状态的,一般运行于kubernetes外部,通过网络连接,实现kubernetes集群的pod调用这些外部的有状态应用。Kubernetes引入Pod主要基于下面两个目的:-可管理性有些容器天生就是需要紧密联系,一起工作。Pod提供了比容器更高层次的抽象,将它们封装到一个部署单元中。Kubernetes以Pod为最小单位进行调度、扩展、共享资源、管理生命周期。-通信和资源共享Pod中的所有容器使用同一个网络namespace,即相同的IP地址和Port空间。它们可以直接用localhost通信。同样的,这些容器可以共享存储,当Kubernetes挂载volume到Pod,本质上是将volume挂载到Pod中的每一个容器。
  • 所需E币: 0
    时间: 2024-3-19 13:59
    大小: 3.41KB
    AIAgent,它被设计为具有独立思考和行动能力的AI程序。你只需要提供一个目标,比如写一个游戏、开发一个网页,他就会根据环境的反应和独白的形式生成一个任务序列开始工作。就好像是人工智能可以自我提示反馈,不断发展和适应,以尽可能最好的方式来实现你给出的目标。AIAgent是一种超越简单文本生成的人工智能系统。它使用大型语言模型(LLM)作为其核心计算引擎,使其能够进行对话、执行任务、推理并展现一定程度的自主性。简而言之,Agent是一个具有复杂推理能力、记忆和执行任务手段的系统。AIAgent与软件开发AIAgent将使软件架构的范式从面向过程迁移到面向目标。现有的软件(包括APP)通过一系列预定义的指令、逻辑、规则和启发式算法将流程固定下来,以满足软件运行结果符合用户的预期,即用户按照指令逻辑一步一步操作达成目标。这样一种面向过程的软件架构具有高可靠性、确定性。但是,这种面向目标的架构只能应用于垂直领域,而无法普遍应用到所有领域,因此标准化和定制化之间如何平衡也成为SaaS行业面对的难题之一。AIAgent的技术演变史1、SymbolicAgents:在人工智能研究的早期阶段,最主要的方法是符号人工智能,其特点是依赖符号逻辑。这种方法采用逻辑规则和符号表示来封装知识和促进推理过程。它们主要关注两个问题:转换问题和表示/推理问题。这些Agent旨在模拟人类的思维模式。它们拥有明确的、可解释的推理框架,而且由于其符号性质,它们表现出高度的表达能力(这种方法的一个典型例子是基于知识的专家系统)。然而,SymbolicAgent在处理不确定性和大规模现实世界问题时面临着局限性。此外,由于符号推理算法错综复杂,要找到一种能在有限时间内产生有意义结果的高效算法也很有挑战性。2、ReactiveAgents:与SymbolicAgent不同,ReactiveAgent不使用复杂的符号推理。相反,它们主要关注Agent与其Environment之间的交互,强调快速和实时响应。这类Agent的设计优先考虑直接将输入输出进行映射,而不是复杂的推理和符号操作。ReactiveAgent通常需要较少的计算资源,从而能做出更快的反应,但可能缺乏复杂的高层决策和规划能力。3、RL-basedAgents:该领域的主要关注点是如何让Agent通过与环境的交互进行学习,使其在特定任务中获得最大的累积奖励。最初,RL-basedAgent主要基于强化学习算法,如策略搜索和价值函数优化,Q-learning和SARSA就是一个例子。随着深度学习的兴起,出现了深度神经网络与强化学习的整合,即深度强化学习。这使得Agent可以从高维输入中学习复杂的策略,从而取得了众多重大成就(如AlphaGo和DQN)。这种方法的优势在于它能让Agent在未知环境中自主学习,而在学习过程中无需明确的人工干预。这使得它能广泛应用于从游戏到机器人控制等一系列领域。然而,强化学习也面临着一些挑战,包括训练时间长、采样效率低以及稳定性问题,尤其是在复杂的真实世界环境中应用时。4、Agentwithtransferlearningandmetalearning:传统上,训练强化学习Agent需要大量样本和较长的训练时间,而且缺乏泛化能力。因此,研究人员引入了迁移学习来加速Agent对新任务的学习。迁移学习减轻了新任务培训的负担,促进了知识在不同任务间的共享和迁移,从而提高了学习效率、绩效和泛化能力。此外,AIAgent也引入了元学习。元学习的重点是学习如何学习,使Agent能从少量样本中迅速推断出新任务的最优策略。这样的Agent在面对新任务时,可以利用已获得的一般知识和策略迅速调整其学习方法,从而减少对大量样本的依赖。然而,当源任务和目标任务之间存在显著差异时,迁移学习的效果可能达不到预期,并可能出现负迁移。此外,元学习需要大量的预训练和大量样本,因此很难建立通用的学习策略。5、LLM-basedAgent:由于大型语言模型已经展示出令人印象深刻的新兴能力,并受到广泛欢迎,研究人员已经开始利用这些模型来构建AIAgent。具体来说,他们采用LLM作为这些Agent的大脑或控制器的主要组成部分,并通过多模态感知和工具利用等策略来扩展其感知和行动空间。通过思维链(CoT)和问题分解等技术,这些基于LLM的Agent可以表现出与SymbolicAgen相当的推理和规划能力。它们还可以通过从反馈中学习和执行新的行动,获得与环境互动的能力,类似于ReactiveAgent。同样,大型语言模型在大规模语料库中进行预训练,并显示出少量泛化的能力,从而实现任务间的无缝转移,而无需更新参数。LLM-basedAgent已被应用于各种现实世界场景、如软件开发和科学研究。由于具有自然语言理解和生成能力,它们可以无缝互动,从而促进多个Agent之间的协作和竞争。展望AIAgent是人工智能成为基础设施的重要推动力。回顾技术发展史,技术的尽头是成为基础设施,比如电力成为像空气一样不易被人们察觉,但是又必不可少的基础设施,还如云计算等。当然这个要经历以下三个阶段:创新与发展阶段–新技术被发明并开始应用;普及与应用阶段–随着技术成熟,它开始被广泛应用于各个领域,对社会和经济产生深远影响;基础设施阶段–当技术变得普及到几乎无处不在,它就转变成了一种基础设施,已经成为人们日常生活中不可或缺的一部分。几乎所有的人都认同,人工智能会成为未来社会的基础设施。而智能体正在促使人工智能基础设施化。这不仅得益于低成本的Agent软件生产优势,而且因为Agent能够适应不同的任务和环境,并能够学习和优化其性能,使得它可以被应用于广泛的领域,进而成为各个行业和社会活动的基础支撑。
  • 所需E币: 5
    时间: 2024-3-1 10:11
    大小: 1.91MB
    上传者: htwdb
    随着电力自动化程度的不断提高,对电站监控系统的功能要求也越来越高。为了实现电站监控系统的“无人值班”或“少人值守”,各种监控数据必须能够安全可靠地进行传输,这就使得上位机与现地控制单元之间的接口和软件编程都比较复杂。本课题探讨了一种具有多串口、多规约高集成的通讯协议转换器的实现方法,提出了软硬件的总体设计方案。采用ST公司最新推出的STM32F407微控制器做为通讯协议转换器的主控单元,并按照设计方案制作出通讯协议转换器系统。硬件电路设计部分主要包括:主控制器模块及外围电路、通讯接口模块和数据存储模块。其中,本系统在通讯接口模块中设计了6个RS-485、1个CAN、1个USB和1个以太网通讯接口,并在数据存储模块中设计了IIC和SPI总线接口电路。软件部分采用结构化和层次化的设计理念,该部分主要包括:系统主程序、数据处理模块和规约转换模块。其中,数据处理模块的主要功能是将接收的数据进行相应的规约转换,再按新的通讯协议立即发送出去,以确保数据的实时性;规约转换模块是本设计的核心,该部分的主要功能是将数据转换成统一的格式,并根据目的地址的不同再将其转换成需要的通讯协议。本系统已实现了RS-485与CAN接口之间的相互转换,并支持多种通讯协议,如MODBUS-RTU、DT/L645、CDT等
  • 所需E币: 1
    时间: 2024-2-27 21:10
    大小: 12.75MB
    上传者: zhusx123
    RT-Thread内核实现与应用开发实战—基于STM32
  • 所需E币: 0
    时间: 2024-2-27 15:17
    大小: 2.5KB
    一、为什么选择C#C#是一种新式、创新、开放源代码、跨平台,面向对象的编程语言,是GitHub上排在前列的5种编程语言之一。是否拥有JavaScript、Java或C++开发经验?你会立即发现C#用起来十分熟悉,并会乐于看到推出不断变化的功能,包括类型安全、泛型、模式匹配、异步、记录等。我们希望你从按下第一个按键起,便爱上C#。二、版本VisualStudio适用于Windows和Mac。VisualStudioforMac的许多功能与VisualStudioforWindows相同,并针对开发跨平台应用和移动应用进行了优化。本文重点介绍VisualStudio的Windows版本。VisualStudio有三个版本:社区版、专业版和企业版。请参阅比较VisualStudio版本,了解各个版本支持的功能。三、C#可以开发哪些类型的应用程序c#可以用于开发各种类型的应用程序,包括但不限于以下几种:桌面应用程序:使用C#和.NETFramework,你可以开发Windows桌面应用程序。这些应用程序可以提供丰富的用户界面和交互功能,适用于各种领域,如办公软件、图像处理工具、游戏等。Web应用程序:C#可以与ASP.NET和ASP.NETCore等Web开发框架结合使用,用于构建Web应用程序。你可以创建动态网站、电子商务平台、后台管理系统等,并通过浏览器访问。移动应用程序:通过使用Xamarin或Unity等跨平台开发工具,你可以使用C#开发移动应用程序,包括iOS、Android和WindowsPhone。这使得开发人员可以在多个平台上共享代码,加快开发速度。云和分布式应用程序:使用C#和相关技术,例如ASP.NETCore、Azure等,你可以构建云应用程序和分布式系统。这包括构建基于云平台的Web应用程序、微服务架构、消息队列和分布式数据库等。游戏开发:C#在游戏开发中非常受欢迎,特别是在使用Unity游戏引擎的情况下。你可以使用C#编写游戏逻辑、控制脚本和用户界面,开发各种类型的游戏,包括2D和3D游戏。数据库应用程序:C#与各种数据库系统(如SQLServer、MySQL)紧密集成,可以用于开发数据库应用程序。通过ADO.NET和EntityFramework等技术,你可以连接到数据库、执行查询、处理数据和构建数据驱动的应用程序。四、程序结构C#中的关键组织结构概念包括程序、命名空间、类型、成员和程序集。程序声明类型,而类型则包含成员,并被整理到命名空间中。类型示例包括类、结构和接口。成员示例包括字段、方法、属性和事件。编译完的C#程序实际上会打包到程序集中。程序集的文件扩展名通常为.exe或.dll,具体视其分别实现的是应用程序还是库_***而定。五、代码实战将以下代码粘贴到Main()方法主体中。//someWordsisastringarray.string[]someWords={  "the",  "quick",  "brown",  "fox",  "jumps"};string[]moreWords={  "over",  "the",  "lazy",  "dog"};//Alphabeticallysortthewords.IEnumerable<string>query=fromwordinsomeWords              orderbyword              selectword;若要使用IntelliSense文字自动完成插入单词query的剩余部分,请按Tab。完成后,代码块如以下代码所示。你可以通过输入cw,然后按Tab两次来生成Console.WriteLine语句,从而进一步练习代码片段。foreach(stringstrinquery){  Console.WriteLine(str);}六、总结: 抛开商业的角度,无论是简洁性,还是上手的容易程度来说,c#都是不错的一个愿意。大家没有必要带有成见去看待c#这样的语言,只要快速开发出软件,保质保量满足客户的需求,这就是好语言,没必要从底层到上层、事事亲力亲为,做好自己擅长的领域,掌握核心模块的开发竞争力其实就可以了。
  • 所需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 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-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-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讲开发电脑的选择