SpringBoot+Vue3项目跨域配置及Set-Cookie:SameSite=Lax 问题

SpringBoot+Vue3项目跨域配置及Set-Cookie:SameSite=Lax 问题 背景:项目采用SpringBoot2.x+Vue3。使用axios进行路由跳转访问后端接口时出现 跨域 和 未携带Cookie 问题。 解决跨域有很多方法,我使用配置后端注解@CrossOrigin来解决跨域问题(此时没有传入任何参数) 添加@CrossOrigin但是没有解决跨域问题 @CrossOrigin public class UserController { //你的controller内容 } 添加注解后发现跨域问题并没有被解决,发现前端myAxios.ts(axios配置文件)文件中之前配置了withCredentials为true,由于规定withCredentials为true表示允许前端携带凭证,后端origins不能为“ * ” ,而后端origins不配置默认为“ * ” 。故还是会报上面的错误。我这里的解决方法是之间把withCredentials注释掉了。跨域问题解决了。 前端axios发送请求未携带Cookie问题 这个问题就是我刚刚把withCredentials注释掉导致的。axios默认不携带Cookie,需要开启withCredentials: const myAxios: AxiosInstance = axios.create({ withCredentials: true, baseURL: 'http://localhost:8080/api', timeout: 5000000 }); 同时后端也要配置origins,来接收凭证: @CrossOrigin(origins = "http://127.0.0.1:5173/(这里写你的前端地址)", allowCredentials = "true") public class UserController { //你的controller内容 } Set-Cookie:SameSite=Lax 问题 解决方法:Set-Cookie:SameSite=Lax 问题 测试,前后端联调成功,数据请求正常 后端接口返回数据失败(未带Cookie导致),axios无限刷新闪屏 在未携带Cookie的情况下请求后端接口返回数据失败后,我的也面自动刷新,导致了页面无限刷新的情况。这里是我在myAxios.ts中写了如果请求错误,就进行Window Location href,导致页面刷新陷入循环。 最后 Set-Cookie:SameSite=Lax 问题好像只出现了一次,第一次测试成功后,我尝试删除了SessionConfig 配置类,发现也可以正常携带Cookie

深入理解java之网络编程

目录: 网络编程基本概念计算机网络网络通信协议数据封装与解封IP地址TCP协议和UDP协议 Java网络编程中的常用类InetAddress的使用InetSocketAddress的使用URL的使用TCP通信的实现和项目案例TCP通信入门案例UDP通信的实现和项目案例UDP通信入门案例 网络编程基本概念 计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 从其中我们可以提取到以下内容: 计算机网络的作用:资源共享和信息传递。计算机网络的组成: 计算机硬件:计算机(大中小型服务器,台式机、笔记本等)、外部设备(路由器、交换机 等)、通信线路(双绞线、光纤等)。计算机软件:网络操作系统(Windows 2000 Server/Advance Server、Unix、Linux等)、 网络管理软件(WorkWin、SugarNMS等)、网络通信协议(如TCP/IP协议栈等)。 网络通信协议 什么是网络通信协议 通过计算机网络可以实现不同计算机之间的连接与通信,但是计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。国际标准化组织(ISO,即International Organization forStandardization)定义了网络通信协议的基本框架,被称为OSI(Open System Interconnect,即开放系统互联)模型。要制定通讯规则,内容会很多,比如要考虑A电脑如何找到B电脑,A电脑在发送信息给B电脑时是否需要B电脑进行反馈,A电脑传送给B电脑的数据格式又是怎样的?内容太多太杂,所以OSI模型将这些通讯标准进行层次划分,每一层次解决一个类别的问题,这样就使得标准的制定没那么复杂。OSI模型制定的七层标准模型,分别是:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。 OSI七层协议模型: 网络协议的分层 虽然国际标准化组织制定了这样一个网络通信协议的模型,但是实际上互联网通讯使用最多的网络通信协议是TCP/IP网络通信协议。 TCP/IP 模型,也是按照层次划分,共四层:应用层,传输层,网络层,网络接口层(物理+数据链路层)。 OSI模型与TCP/IP模型的对应关系: 数据封装与解封 数据封装(Data Encapsulation)是指将协议数据单元(PDU)封装在一组协议头和协议尾中的过程。在OSI七层参考模型中,每层主要负责与其它机器上的对等层进行通信。该过程是在协议数据单元(PDU)中实现的,其中每层的PDU一般由本层的协议头、协议尾和数据封装构成。 数据发送处理过程 应用层将数据交给传输层,传输层添加上TCP的控制信息(称为TCP头部),这个数据单元称为段(Segment),加入控制信息的过程称为封装。然后,将段交给网络层。 网络层接收到段,再添加上IP头部,这个数据单元称为包(Packet)。然后,将包交给数据链路层。 数据链路层接收到包,再添加上MAC头部和尾部,这个数据单元称为帧(Frame)。然后,将帧交给物理层。 物理层将接收到的数据转化为比特流,然后在网线中传送。 数据接收处理过程 物理层接收到比特流,经过处理后将数据交给数据链路层。数据链路层将接收到的数据转化为数据帧,再除去MAC头部和尾部,这个除去控制信息的过程称为解封,然后将包交给网络层。网络层接收到包,再除去IP头部,然后将段交给传输层。传输层接收到段,再除去TCP头部,然后将数据交给应用层。 从以上传输过程中,可以总结出以下规则: 发送方数据处理的方式是从高层到底层,逐层进行数据封装。接收方数据处理的方式是从底层到高层,逐层进行数据解封。 接收方的每一层只把对该层有意义的数据拿走,或者说每一层只能 处理发送方同等层的数据,然后把其余的部分传递给上一层,这就 是对等层通信的概念。 数据封装与解封: 数据封装 数据解封 IP地址 IP是Internet Protocol Address,即"互联网协议地址"。 用来标识网络中的一个通信实体的地址。通信实体可以是计算机、路由器等。 比如互联网的每个服务器都要有自己的IP地址,而每个局域网的计算机要通信也要配置IP地址。 路由器是连接两个或多个网络的网络设备。 IP地址分类: 类别最大网络数IP地址范围单个网段最大主机数私有IP地址范围A126(2^7-2)1.0.0.1-127.255.255.2541677721410.0.0.0-10.255.255.255B16384(2^14)128.0.0.1-191.255.255.25465534172.16.0.0-172.31.255.255C2097152(2^21)192.0.0.1-223.255.255.254254192.168.0.0-192.168.255.255 目前主流使用的IP地址是IPV4,但是随着网络规模的不断扩大,IPV4面临着枯竭的危险,所以推出了IPV6。 IPV4采用32位地址长度,只有大约43亿个地址,它只有4段数字,每一段最大不超过255。随着互联网的发展,IP地址不够用了,在2019年11月25日IPv4位地址分配完毕。 IPv6采用128位地址长度,几乎可以不受限制地提供地址。按保守方法估算IPv6实际可分配的地址,整个地球的每平方米面积上仍可分配1000多个地址。 IP地址实际上是一个32位整数(称为IPv4),以字符串表示的IP地址如 192.168.0.1 实际上是把32位整数按8位分组后的数字表示,目的是便于阅读。 IPv6地址实际上是一个128位整数,它是目前使用的IPv4的升级版,以字符串表示类似于 2001:0db8:85a3:0042:1000:8a2e:0370:7334 公有地址 公有地址(Public address)由Inter NIC(Internet NetworkInformation Center互联网信息中心)负责。这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问互联网。

SpringBoot_NamedParameterJdbcTemplate介绍及使用

文章目录 1.背景2.需求分析3.技术分析3.1 JdbcTemplate3.2 NamedParameterJdbcTemplate3.3 JdbcTemplate与NamedParameterJdbcTemplate 对比总结 4. 实战:简易通用curd接口开发4.1 通用新增接口4.2 通用修改接口4.3 通用删除接口4.4 通用列表接口4.5 通用分页查询接口4.6 实战完整源码 5. 其他使用对比总结namedParameterJdbcTemplate_update操作示例namedParameterJdbcTemplate_sql生成工具 1.背景 最近开始研究一些低代码后端实现的功能,因为想采用不生成具体代码方式(对比代码生成器 + 持续构建是实际生成代码方式),来实现业务对象常规功能。因此不能用传统依赖实体类实现映射的orm框架,如mybatis。需要借助更底层的jdbc操作来实现通用的操作。但最原生jdbc写法在设置参数和处理数据结果操作又太过繁琐。在借用spring的JdbcTemplate工具时候,发现了NamedParameterJdbcTemplate可以实现这种特殊需求。本文在此做一个记录和总结。 2.需求分析 首先,具体技术需求分析如下: 如果不通过具体类来实现任意数据模型的curd,除了指定具体的modelId(可以是表名)必须使用类似Map<String,Object>的通用数据结构。key指定数据字段名称value代表值。引擎需要自动识别Map有多少key构造具体的sql模板 以上是初步设想的技术思路。 3.技术分析 在springboot项目实现以上的功能,优先使用spring-jdbc自带的模板工具。介绍NamedParameterJdbcTemplate 之前先回顾下JdbcTemplate 3.1 JdbcTemplate JdbcTemplate是Spring框架对JDBC的简化封装,用于执行SQL语句和处理SQL查询结果。它是Spring JDBC模块的核心类,提供了许多便捷的方法,减少了样板代码,简化了JDBC的使用。JdbcTemplate主要使用占位符(?)来表示参数,并通过索引进行参数的设置。它的方法签名通常包含SQL语句和一个Object[]数组,用于传递SQL语句中的参数值。 简单代码示例: JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; List<User> users = jdbcTemplate.query(sql, new Object[]{"john_doe", "secret"}, new BeanPropertyRowMapper<>(User.class)); 通过示例代码分析可以发现,jdbcTemplate对于实现,目标功能存在以下缺陷 使用占位符,通过位置索引传递参数,而对于Map来说,它key的是无序的,因此不适用。 3.2 NamedParameterJdbcTemplate 什么是NamedParameterJdbcTemplate? NamedParameterJdbcTemplate是JdbcTemplate的扩展,它使用命名参数而不是占位符,使得SQL语句更易读、更易维护 有如下特点: 使用命名参数时,SQL语句中的参数以冒号(:)开头,而且不再按顺序传递,而是通过SqlParameterSource对象来传递参数。NamedParameterJdbcTemplate支持命名参数的原因是,它提供了与具名参数相关的方法,例如query(String sql, SqlParameterSource paramSource, RowMapper rowMapper)。 代码示例:

解决vue项目,运行npm install安装报缺少c++库问题

项目是前后端分离架构,前端使用的是vue框架,在部署前端项目时,需要下载安装一些基础的镜像配置,包括一些预处理,但是在使用npm install和yarn install命令时出现了如下错误,查阅资料总结如下: 1、前端项目部署之前,需要先准备两个环境: 安装Node.js:https://nodejs.org/en/download安装Yarn:https://classic.yarnpkg.com/en/docs/install#windows-stable 2、报错问题 使用命令npm install安装插件,该命令会将package.json的devDependencies字段里的插件会被自动安装到node_modules下,但是报出了以下错误 使用命令yarn install --ignore-engines 3、错误原因 从上述可以看出报错是因为找不到Visual Studio编译环境,其实在此之前是找不到python编译环境。 找不到python编译环境 gyp ERR! stack Error: Could not find any Python installation to use 找不到Visual C++编译环境 gyp ERR! stack Error: Could not find any Visual Studio installation to use npm安装工具底层依赖于Python和Visio Studio编译环境,出现上述情况大多情况下就是没有安装这两个编译环境,或者是版本不匹配造成的。以下是一些博主的知道安装博文,也可以自行在官网下载安装: 在windows上安装visual studio python的安装 注意安装完成之后,需要将路径配置到环境变量中。如果你嫌麻烦也可以直接看下一步 解决方案 以管理员权限打开cmd,在项目目录下执行:npm install --global --production windows-build-tools 构建完成后,会在C:\Users\电脑用户名 目录下创建.windows-build-tools文件夹 npm install --global --production windows-build-tools此命令的作用就是全局安装所需要的默认编译环境,python和VS。 此命令完成后,也必须配置环境变量,将 C:\Users**.windows-build-tools\python27C:\Users**.windows-build-tools\Microsoft VS Code\bin 地址添加到path环境变量中。 如果经过上述操作还没有解决,其实我就是没有解决才总计到这一步的: 无奈之间我突然看到日志中的一个url: 我就点击去看了以下,顺便往下巴拉巴拉,突然看到了这个:

伪类选择器:hover,:active失效问题

今天在开发时,突然遇到伪类失效了,一开始检查是否被其他元素遮挡,但是发现并没有,后来才发现原来是开发模式调成移动端了,大家遇到:hover,:active失效记得看是不是移动端模式。

jeecgboot 开放页面权限,免登录访问

前端需要配置路由和添加白名单 1、配置路由 2、 在permission.js里,把刚才的路由添加到白名单 3、 后端需要把该页面涉及到的接口排除权限拦截 比如我这个页面涉及到两个接口: 那么就在后端的excludeUrls把这两个接口加进去。 前端后端都设置好了,就可以免登录了。

计算机网络规划与设计 -- 设计基础

文章目录 计算机网络规划与设计设计基础网络设计基本元素互联设备网关网络性能可用性、可靠性和可恢复性冗余度、适应性和可伸缩性效率与费用文档网络开发过程 计算机网络规划与设计 设计基础 网络设计基本元素 计算机网络是有多种基本元素组合而成,常见的网络基本元素包括计算机平台、应用软件、物理设备和拓扑结构、网络软件和实用软件、互联设备和广域网连接等 计算机平台:计算机平台是网络中的终端用户节点,是加载并运行操作系统和应用程序并且为用户提供功能和服务的设备,不同的计算机平台,其形状、尺寸、性能有所不同应用软件:应用软件运行在计算机平台上,是完成某种特定应用的软件系统,是网络系统中常用的软件之一物理设备和拓扑结构:物理设备是指连接网络端点之间的基础设施,如网卡、电缆、接插件、接插板、集线器等,而一个网络是由各种各样的物理设备连接而构成互联设备: 实现互联层次实现原理优点缺点物理层信号复制与放大错误分隔、互联方便简洁互联网络必须同构、互联范围狭小链路层数据帧存储转发数据帧过滤、安全性提高、异构网络互联无法屏蔽网络风暴、网络规模大时网络性能降低网络层分组存储转发防止网络风暴、自动寻径、中间节点差错控制、流量控制易成为网络瓶颈,网络资源共享程度降低传输层以上协议转换互联层次高,与用户信息直接接触服务专用性强,应用范围狭窄,效率低 互联设备 中继器:中继器时最简单的互联设备,它的作用是放大电信号,扩大网络的地理覆盖范围。中继器工作在ISO最底层–物理层,它可以使介质错误仅局限于一段网络内,而不会对其他段造成影响集线器:集线器是局域网内连接服务器与主机的设备,主要作用在OSI参考模型的物理层,有信号方法的作用网桥:网桥是一种在数据链路层实现互联的设备,在网桥之间进行数据帧的接收、存储与转发。数据联路层分为逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)两个部分,LLC用于子网之间的路径选择,MAC用于介质访问以及数据帧的成帧等处理以太网交换机:随着网络的不断发展,网络用户的不断增加,共享总线型局域网内用户数量激增,冲突发生频率增加,单个用户可用带宽减少,网络效率降低。随之产生的解决办法是网络微化路由器:路由器是工作在网络层的互联设备,是可以屏蔽网络广播风暴的有效网络设备,路由器功能较多。 网关 网关的互联是网络层以上,具体的说,大多数的网关是在应用层的实现互联。网关通常由软件实现,运行于服务器或者普通计算机上,以实现不同体系结构网络之间或LAN与主机之间的连接。由于网关是在较高的层次上互联,所以不可能有通用网关,只可能针对某一特定的应用而言,比如电子邮件网关,远程终端仿真网关等各种用途的网关。 网络性能 在进行网络设计时,对网络性能参数的考虑是设计工作的重点内容之一,需考虑的网络性能参数包括响应时间、吞吐量、延时、带宽、容量等 响应时间、延时和等待时间是网络的重要特性。每个特性都将对网络性能产生影响 响应时间是指以计算机或者终端资源发出请求为起始时间,以该设备接收到数据响应的时间为终点,两个时间的差值。 利用率描述设备使用时所能发挥的最大能力 CPU利用率链路利用率 网络数据传输率和吞吐量 网络数据传输率 :吞吐量:吞吐量是指在网络用户之间有效的传输数据的能力。 可用性、可靠性和可恢复性 可用性:可用性是指网络设备可用于执行预期任务时间所占用的百分比可靠性:指网络设备或者计算机持续执行预定功能的可能性可恢复性:指网络从故障中恢复的难易程度和时间 冗余度、适应性和可伸缩性 冗余度:冗余设备是指为了避免单台设备故障而导致的网络停止服务而增加的网络设备。冗余线路是指为了防止线路或者链路失效、而导致网络不连通而增加的多余线路。为了关键网络设备添加冗余处理引擎、冗余电源等方式,已经成为常见的技术手段。适应性:适应性是指在用户改变要求时网络的应变能力。优秀的网络设计应当能够适应新技术和新变化的要求可伸缩性:可伸缩性是指网络技术或者设备随着用户需求的增长而扩充的能力。对于许多企业网设计而言,可伸缩性是最基本的目标。 效率与费用 网络效率: 效率 = ( 帧长 − 帧头 − 帧尾 ) / 帧长 ∗ 100 % 效率=(帧长-帧头-帧尾)/帧长 * 100\% 效率=(帧长−帧头−帧尾)/帧长∗100% 费用:费用是建设网络时必须考虑的内容 文档 文档的作用 文档是网络设计工作中的重点环节,覆盖了需求规范、通信规范、逻辑设计、物理设计、网络实施、运营维护等各个阶段。通过对网络分析、设计实现等阶段的细节进行描述,说明开发一个网络的步骤。 文档的质量 文档的编制必须保证质量,以发挥文档的指导作用,有助于管理人员监督和管理系统开发,有助于用户了解系统开发的工作,有助于维护人员进行有效的修改和扩充 文档的管理与维护 在整个网络生存期中,各种文档需作为半成品或是最终成品不断地生成、修改或者补充。为了最终得到高质量的产品,达到所提出的质量要求,必须加强对文档的管理。 网络开发过程 需求分析:编制需求说明书 数据准备需求说明书组成: 综述需求分析阶段概述需求数据总结按优先级排队的需求清单申请批准部分 现有的网络体系分析: 通信规范分析通信模式分析 对等通信模式客户机–服务器通信模式浏览器–服务器通信模式分布式计算通信模式 通信边界分析 局域网通信边界 冲突域与广播域局域网通信流量边界 广域网通信边界虚拟专用网通信边界 确定网络逻辑结构:确定网络物理结构:安装和维护:

2024年华为HCIA-DATACOM新增题库(H12-811)

801、[单选题]178/832、在系统视图下键入什么命令可以切换到用户视图? A quit B souter C system-view D user-view 试题答案:A 试题解析:在系统视图下键入quit命令退出到用户视图。因此答案选A。 802、[单选题]“网络管理员在三层交换机上创建了VLAN 10,并在该VLAN的虚拟接口下配置了IP地址。当使用命令”display ip interface brief"查看接口状态时,发现VLANIF 10接口处于Down状态,则应该通过怎样的操作来使得VLANIF 10接口恢复正常? A将一个状态必须为Up的物理接口划进VLAN 10 B将一个状态必须为Up且必须为Trunk类型的接口划进VLAN 10 C将任意物理接口划进VLAN 10 D在VLANIF 10接口下使用命令“undo shutdown" 试题答案:A 试题解析:VLANIF 10接口处于Down状态,将一个状态为Up的物理接口划进VLAN 10就可以使接口恢复正常。因此答案选A。 803、[单选题]为保证同一条数据流在同一条物理链路上进行转发Eth Trunk采用哪种方式的负载分担? A基于数据包入接口的负载分担 B基于包的负载分担 C基于应用层信息的负载分担 D基于流的负载分担 试题答案:D 试题解析:对于负载分担,可以分为逐包的负载分担和逐流的负载分担,其中逐流的逐流的负载分担可以保证同一数据流的帧在同一数据流的帧在同一条物理链路转发,又实现了流量在聚合组内各物理链路上的负载分担。 大家可以直接点赞+关注后,加作者微信(备注“CSDN”)就可以获取,微信在文章最后! 804、[单选题]在AP上为区分不同的用户,提供不同的网络服务,可以在通过配置以下哪项内容 实现? A TAP B VAP C VAC D VT 试题答案:B 试题解析:虚拟接入点VAP(Virtual Access Point):是AP设备上虚拟出来的业务功能实体。用户可以在一个AP上创建不同的VAP来为不同的用户群体提供无线接入服务。因此答案选B。 805、[单选题]交换机发送的配置BPDU中,哪一个桥ID不可能会出现? A 0 00-01-02-03-04-CC B 8192 00-01-02-03-04-CC C 4096 00-01-02-03-04-CC D 2048 00-01-02-03-04-CC 试题答案:D 试题解析:在STP网络中,桥优先级是可以配置的,取值范围是0~65535,默认值为32768,可以修改但是修改值必须为4096的倍数。因此不会出现优先级为2048的桥id,答案为D选项。

虚拟环境的激活

(此博客仅用于我记录虚拟环境的激活方法) 虚拟环境的激活命令: venv/Scripts/activate 在F:\git repo\Database-Course-Design 这个文件夹中启动命令行 这个文件夹中含有虚拟环境venv 输入命令venv/Scripts/activate,就得到下面的结果: 此时就激活了虚拟环境,可以在虚拟环境中pip install东西 在你在vscode中需要运行数据库的程序的时候,用Ctrl+shift+P去选择虚拟环境作为解释器

jQuery中的事件

jQuery中的事件 jQuery事件是对JavaScript事件的封装,常用事件分类如下: 基础事件:window事件 鼠标事件 键盘事件 表单事件 复合事件(多个事件的组合):鼠标光标悬停 鼠标连续点击 1、鼠标事件 鼠标事件是当用户在文档上移动或单击鼠标时而产生的事件,常用鼠标事件有: 方法描述执行时机click( )触发或将函数绑定到指定元素的click事件单击鼠标时mouseover( )触发或将函数绑定到指定元素的mouse over事件鼠标移过时mouseout( )触发或将函数绑定到指定元素的mouse out事件鼠标移出时 以mouseover()为例,实现鼠标移过时特效 //当鼠标移过元素时 为事件添加响应方法 $("#nav li").mouseover(function() { //当鼠标移过#nav li元素时 $(this). addClass("heightlight"); //为鼠标所在li元素添加样式 }); $("#nav li").mouseout(function() { //当鼠标移出#nav li元素时 $(this).removeClass(); //移除鼠标所在li元素的全部样式 }); //this指鼠标所在事件的当前元素对象 2、键盘事件 用户每次按下或者释放键盘上的键时都会产生事件,常用键盘事件有: 方法描述执行时机keydown( )触发或将函数绑定到指定元素的keydown事件按下键盘时keyup( )触发或将函数绑定到指定元素的keyup事件释放按键时keypress( )触发或将函数绑定到指定元素的keypress事件产生可打印的字符时 3、表单事件 当元素获得焦点时,会触发focus事件,失去焦点时,会触发blur事件,详见下表: 方法描述执行时机focus( )触发或将函数绑定到指定元素的focus事件获得焦点blur( )触发或将函数绑定到指定元素的blur事件失去焦点 示例: <p> <label>用户名:</label> <input name="member" type="text" /> </p> <p> <label>密码:</label> <input name="password" type="text" /> </p> 获得焦点设置样式,失去焦点去除样式 $(document).ready(function () { $("[name=member]").focus(function(){ $(this).addClass("input_focus"); }); $("

宏任务和微任务

栈(Stack)和队列(Queue) 栈(Stack)和队列(Queue)是两种基础的数据结构。 栈是后进先出(类似弹夹),后面来的却最先出去。队列是先进先出,这意味着最先进入队列的元素会被最先取出,类比生活中的排队。 调用栈 调用栈中,放的是要执行的代码 任务队列 任务队列里的是将要执行的代码1 JS中任务队列有两种 宏任务队列(大部分代码都去宏任务队列中去排队)微任务队列(Promise的回调函数(then、catch、finally))整个流程 (1)执行调用栈中的代码 (2)执行微任务队列中的所有任务(在调用栈中所有任务执行完毕之后) (3)执行宏任务队列中的所有任务(在微任务队列中所有任务执行完毕之后) 举例 console.log(1); setTimeout(() => console.log(2)); Promise.resolve().then(() => console.log(3)); Promise.resolve().then(() => setTimeout(() => console.log(4))) Promise.resolve().then(() => console.log(5)) setTimeout(() => console.log(6)) console.log(7); console.log(1);放入调用栈中(放入后立即执行输出1) setTimeout(() => console.log(2));放入宏任务队列 Promise.resolve().then(() => console.log(3));放入微任务队列 Promise.resolve().then(() => setTimeout(() => console.log(4)))放入微任务队列 Promise.resolve().then(() => console.log(5))放入微任务队列 setTimeout(() => console.log(6))放入宏任务队列 console.log(7);放入调用栈 除了调用栈中代码立即执行外,其他队列里面都是先压入队列中再进行具体的代码分析,根据情况进行细分。压入队列之后先进行微任务代码执行,微任务代码执行完毕之后再进行宏任务代码的执行。谨记要压入队列完毕之后再进行细分的压队。 当调用栈中的代码执行完毕后,队列中的代码才会按照顺序依次进入到栈中执行 ↩︎

XML常用介绍

XML代表可扩展标记语言(eXtensible Markup Language),它是一种类似于HTML的标记语言。XML用于提供数据描述格式,适用于不同应用程序之间的数据交换,而这种交换不依赖于预定义的数据结构集合,从而增强了可扩展性。 XML和HTML区别 HTML主要用于在网络浏览器中显示数据,而XML用于传输和存储结构化数据。HTML标记不区分大小写,这意味着<tag>和<TAG>被视为相同,而XML标记严格区分大小写,因此<tag>和<TAG>被视为不同。HTML可以有多个根元素,但格式良好的**XML只能有一个根元素**,这意味着所有其他元素必须嵌套在这个单个根元素内。在HTML中,空白(如空格、制表符和换行符)会被自动过滤,而在XML中,空白不会被自动过滤,并且会作为数据的一部分保留,除非显式处理。HTML标记是预定义和标准化的,而XML允许用户根据需要定义自己的标记,使其更具可扩展性,适用于各种应用程序和数据结构。 XML语法 从XML 1.1版本开始,在完整的XML文档中,必须包含XML文档声明,并且该声明必须位于文档的第一行。XML文档声明的语法格式如下: <?xml version="1.1" encoding="UTF-8"?> version:用于指定符合XML规范的版本号。version属性必须包含在XML声明中,并且必须位于XML声明中的任何其他属性之前。 encoding:指定XML文档中使用的编码集。 <?xml version="1.1" encoding="UTF-8"?> <class> <classname>Web程序设计</classname> <description>Java Web</description> <date>2024-03-11</date> <time>10:00</time> <duration>2</duration> <location>C327</location> <instructor>Wang</instructor> </class> 上述XML代码描述了一个名为“Web程序设计”的课程相关信息。 DTD约束 DTD约束是一种早期的XML约束模式语言,根据其语法创建的文件称为DTD文件。在DTD文件中,可以包含元素的定义、元素之间关系的定义、元素属性的定义,以及实体和符号的定义。 <!ELEMENT class (classname+, description, date, time, duration, location, instructor)> <!ELEMENT classname (#PCDATA)> <!ELEMENT description (#PCDATA)> <!ELEMENT date (#PCDATA)> <!ELEMENT time (#PCDATA)> <!ELEMENT duration (#PCDATA)> <!ELEMENT location (#PCDATA)> <!ELEMENT instructor (#PCDATA)> #PCDATA:表示元素中嵌套的内容是纯文本字符串,其中关键字PCDATA是Parsed Character Data的缩写,表示解析过的字符数据。子元素:表示元素包含其他元素。通常用一对小括号()将要嵌套在元素内部的子元素集合括起来。混合内容:表示元素可以包含字符数据和子元素。混合内容必须定义为零个或多个。EMPTY:表示元素既不包含字符数据也不包含子元素,是一个空元素。如果元素本身在文档中有明确的含义,可以在DTD中使用关键字EMPTY来表示空元素。ANY:表示元素可以包含任何字符数据和子元素。 定义元素时,元素内容可以包含许多符号,不同的符号有不同的作用,下面介绍一些常用符号。 问号[?]:表示对象可以出现0次或1次。 星号[*]:表示对象可以出现0次或多次。 加号[+]:表示对象可以出现1次或多次。 竖线[|]:表示从列出的对象中选择1个。 逗号[,]:表示对象必须按指定顺序出现。 括号[()]:用于分组元素。

SQL: 触发器/存储过程/游标的操作

目录 触发器存储过程创建存储过程修改存储过程删除存储过程执行存储过程 游标待续、更新中 触发器 待更新 存储过程 定义 是一组TSQL语句的预编译集合,能实现特定的功能 是一种独立的数据库对象,在服务器上创建和运行 类似于编程语言中的过程或函数 分类 系统存储过程: 是指由SQL Server提供的存储过程,可以作为命令执行 它定义在系统数据库master中 前缀: sp_ 用户存储过程 是由用户在当前数据库中创建的存储过程 最好不要以sp 开头, 若用户定义的存储过程与系统存储过程同名,用户定义的存储过程永远不会执行 变量 局部变量:用户自己定义的变量,用于在语句之间传递数据 局部变量名以@符号开头 全局变量名以@@符号开头 注意:局部变量未被赋值之前,其值为u川 定义变量 一个整型变量和两个字符型变量 declare @name varchar(10) declare @age smallint, @msg varchar(50) 赋值 局部变量的赋值 set @变量=表达式 select @变量=表达式 注意: select语句不能同时完成赋值和查询两种操作 区别: set @变量=表达式 用于将表达式的值直接赋给变量 select @变量=表达式 用于从查询结果中选择某一列或表达式的值赋给变量 局部变量的显示 print 表达式 ( 注意: 必须是char、varchar;或可以隐式地 转化成字符型的常量或变量表达式) select 表达式 例子: 显示@age、@name的值 print @name print @age select @name as 姓名,@age 年龄 例

【嵌入式——QT】Splash与登录窗口

一般的大型应用程序在启动时会显示一个启动画面,即Splash窗口,Splash窗口是一个无边对话框,一般显示一个图片,展示软件信息,Splash窗口显示时,程序在后台做一些比较耗时的启动准备工作,Splash窗口显示一段时间后自动关闭,然后软件的主窗口显示出来,Qt有一个QSplashScreen类可以实现Splash窗口的功能,它提供了载入图片,自动设置窗口无边框效果等功能。 //设置为SplashScreen this->setWindowFlags(Qt::SplashScreen); 图示 代码示例 SplashDialog.h #ifndef SPLASHDIALOG_H #define SPLASHDIALOG_H #include <QDialog> #include <QMouseEvent> namespace Ui { class SplashDialog; } class SplashDialog : public QDialog { Q_OBJECT public: explicit SplashDialog(QWidget* parent = nullptr); ~SplashDialog(); //鼠标按压事件 void mousePressEvent(QMouseEvent* event) override; //鼠标移动事件 void mouseMoveEvent(QMouseEvent* event) override; //鼠标释放事件 void mouseReleaseEvent(QMouseEvent* event) override; private slots: void on_pushButtonOk_clicked(); void on_pushButtonCancel_clicked(); private: Ui::SplashDialog* ui; //窗口是否在鼠标操作下移动 bool m_moving= false; //上一次鼠标位置 QPoint m_lastPos; //用户名 QString m_user = "

Vue.js+SpringBoot开发超市账单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于JAVA+Vue+SpringBoot+MySQL的超市账单管理系统,包含供应商模块、商品管理模块、超市账单模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,超市账单管理系统基于角色的访问控制,给超市管理员、店长使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。 1.2 项目录屏 二、功能模块 本管理系统主要是适用于中小型超市账单的管理,既要能让用户能够快速上手,也要保证基本功能的齐全,还要易于系统的维护。所以一个比较成熟的超市账单管理系统应包含以下几个模块: 登录模块:用户通过账号密码可以登入不用权限的账号。用户管理模块:查看用户信息、修改用户信息、批量或单个删除用户、增加用户信息、禁用和启动用户账号功能可以在该模块实现。供应商管理模块:查看供应商信息、修改供应商信息、批量或单独删除供应商、增加供应商的功能在该模块实现。账单管理模块:查看账单信息、修改账单信息、批量或单独删除账单、增加账单的功能在该模块实现。部门管理模块:可以建立不同的部门,批量或单独删除某一个部门,修改部门信息以及可以给某个部门设立一个或者多个子部门。权限管理模块:不同账号所拥有的权限可以该模块进行分配。日志管理模块:系统操作人员登陆系统的时间会被记录在该管理模块下。退出登陆模块:退出当前账户到登陆页面。 三、系统设计 本系统主要分为前端和后端两个组成部分,在前端我将采用当下比较流行的技术VUE和Element UI搭建起简洁大方的前端页面,方便用户操作和用户的体验感。 在后端我将采用当下比较流行的技术SpringBoot来完成开发,因为SpringBoot兼容了许多框架,可以帮助我快速搭建起整个系统的框架,其中最核心的框架就是SSM框架,当一个用户在网站页面上发送请求,控制层接收到用户的请求,调用业务层去实现,业务管理层调用不同的执行方法去处理,然后业务层调用DAO层去数据库里进行增删改查的操作,最后将数据结果给用户反馈。 在数据库设计方面,如何设计一个合理安全的数据库,首先要考虑的就是对一个数据库中所有表的属性设置,包括属性的的长度、类型、主外键的设置、索引的设置等等。然后在实际设计开发系统的过程中可以参考一些成熟典型的系统的设计思想,可以帮助我们大大提高程序的可行性、完整性和安全性。 3.1 总体设计 . 根据本系统的业务功能需求分析,设计出该系统的简易功能设计图(如图3-1),首先在登陆界面输入账号密码,然后就可以进入主界面,根据不同的账号权限,能呈现出不同的系统界面。在登陆界面中包括了员工管理功能,商品管理功能,供应商管理功能,账单管理功能、部门管理功能、系统操作权限管理功能和系统日志输出功能。增删改查四种操作均可在员工管理界面,商品管理界面,供应商管理界面,账单管理、部门管理界面中使用。在权限管理界面,如果是管理员身份登陆可以给用户赋予权限,也可以撤销权限。当要查看一些操作记录和用户登陆系统时间的操作可以在系统监控功能模块中的日志输出查看。 3.2 前端设计 一个简单的前端页面构成三个基本要素:HTML、CSS、JavaScript。有了这三要素就可以完成一个前端页面的开发。Vue框架同样兼容这三个要素,并且如果真要自己写出一个美观的页面是十分麻烦的,但Vue支持使用其他的组件库,例如Element UI,是一款网站快速成型工具,上面有许多美观的页面组件。相比于传统的前端页面开发,是通过操作DOM,形成基本的视图结构,然后再通过CSS的修饰,让页面变得美观,最后在涉及交互部分,就需要用到JavaScript来接收用户请求,并通事件响应来进行交互操作,并且在事件的处理函数中涉及到各种数据的修改。我们知道一个网站包含的页面元素是非常多的,在结构和很庞大的页面中,如果视图和数据都混合在一起,要想操作其中的一个元素的难度就会很大,正所谓牵一发而动全身。而Vue的核心在于它主关注视图层,它将视图单独剥离出来,主要目的就是分离视图层和数据层,而实现分离是通过MVVM模式,MVVM的核心是ViewModel层,它能够随时观察到数据的变化,并对视图对应的内容实时进行更新,当视图发生改变的同时,数据也会随之发生变化,这就是双向绑定。 3.3 后端设计 在后端方面我将选择基于SpringBoot框架来进行开发。之所以选择用框架来开发是学过Javaweb的同学都知道,开发一个web应用,从最初开始接触Servlet结合Tomcat服务器,然后再通过手动连接JDBC来进行数据连接,在IDEA软件上写SQL查询语句。这样就会导致一个问题,会产生大量繁杂冗余的代码,并且代码出错率高,不容易排查,大大加长了开发时间。 所以我将运用框架来开发系统,利用SpringBoot框架进行系统开发,可以快速搭建出系统的框架,只需要我们把依赖和配置文件导入,剩下的就是编写业务逻辑功能。经过2个月我自己对Spring的学习研究,总结出SpringBoot框架 开发便捷的原因是从以下三个策略出发。 SpringBoot可以通过启动器来管理项目所需要的依赖,无需指定依赖的版本。SpringBoot利用几个核心注解做到了根据添加的依赖进行自动配置,不需要配置xml文件。SpringBoot内置了许多项目所需要的功能,例如数据监控、用户认证。 在还没有使用SpringBoot框架之前,我也早早听说了这个框架厉害的传闻,并且一直流传着一句话“约定大于配置”,在还没有深入学习之前,我还是对这句话一知半解,但随着深入学习,我开始慢慢理解这句话的含义,简单的理解来说就是在使用SpringBoot框架的项目中,在没有规定配置的地方,都是采用默认的配置,而开发人员仅仅需要做的就是当有特殊需求的时候,通过config模块中根据需求自定义配置就可以了,这样就帮助开发人员大大减少了配置工作,这就是所谓的“约定”。 并且SpringBoot集成了很多框架配置和应用模板,当需要什么框架和模板,直接开箱就能使用。但在SpringBoot项目开发中,本质最主要的还是SSM框架,SSM框架就是Spring、SpringMVC、Mybatis,在使用SpringBoot时,它就会默认配置好这个框架的使用方式。整个系统的执行流程(如图4-1),从客户端发送请求到服务器,控制层接收到用户的请求,调用业务层去实现,业务管理层调用不同的执行方法去处理,业务层调用DAO层去数据库里进行增删改查的操作,然后将数据结果反馈给用户。 四、系统展示 五、核心代码 5.1 查询供应商 @RequestMapping(value = "/getByPage", method = RequestMethod.GET) @ApiOperation(value = "分页获取供应商") public Result<IPage<Supplier>> getByPage(@ModelAttribute Supplier supplier, @ModelAttribute PageVo page){ QueryWrapper<Supplier> qw = new QueryWrapper<>(); if(StrUtil.

系统架构师论文基本框架搭建(2024版)

论文基本内容 摘要300字+项目背景介绍400字+论文总结400-600字=确保提前准备1200字 1200字是固定的,自己只需临场发挥1400字即可。 基本框架 建议 提前准备内容一定要熟练默写 最重要的是不要跑题、字数一定要够 即便写的烂也有可能过 最后一定要练习打字,最好是先测试一下自己的速度够不够 2小时2600字

使用xmlrpc连接操作odoo

使用xmlrpc.client库连接到Odoo是一种常用的方式,尤其是在需要从外部系统操作Odoo(例如,读取数据、创建记录等)时。以下是使用xmlrpc.client连接到Odoo的具体步骤,以及一些常用方法的示例。 步骤1:导入xmlrpc.client import xmlrpc.client 步骤2:设置连接信息 你需要提供Odoo服务器的URL、数据库名称、用户名和密码。 url = "http://localhost:8069" db = "odoo_db" username = "admin" password = "admin" 步骤3:获取通用登录接口(common)的代理对象 common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url)) 步骤4:认证 使用用户名和密码进行认证,获取用户的UID。这是后续操作的关键。 uid = common.authenticate(db, username, password, {}) 步骤5:获取对象(models)的代理对象 models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url)) 方法示例: 下面是一些使用xmlrpc.client操作Odoo的方法示例。 1. 检查版本 获取Odoo服务器的版本信息。 version = common.version() print(version) 2. 创建记录 向Odoo中添加一条新记录。 id = models.execute_kw(db, uid, password, 'res.partner', 'create', [{ 'name': "New Partner", }]) print(id) 3. 读取记录 读取特定ID的记录的信息。 records = models.execute_kw(db, uid, password, 'res.partner', 'read', [[id]], {'fields': ['name', 'country_id', 'comment']}) print(records) 4.

ELF-DISCOVER:大型语言模型自我构建推理结构

论文地址:https://arxiv.org/pdf/2402.03620.pdf Abstract 我们引入了SELF-DISCOVER,这是一个通用框架,用于让LLMs自我发现任务内在的推理结构,以解决对典型提示方法具有挑战性的复杂推理问题。该框架的核心是一个自我发现过程,在这个过程中,LLMs选择多个原子推理模块,比如批判性思维和逐步思维,并将它们组合成一个明确的推理结构,供LLMs在解码过程中遵循。SELF-DISCOVER显著提高了GPT-4和PaLM 2在具有挑战性的推理基准测试(如BigBench-Hard、基于代理人的推理和数学推理)上的性能,相比于Chain of Thought(CoT)高达32%。此外,SELF-DISCOVER在需要推理密集型方法,如CoT-Self-Consistency,时的表现超过20%,同时推理计算量减少了10-40倍。最后,我们展示了自我发现的推理结构在模型家族之间具有普遍适用性:从PaLM 2-L到GPT-4,从GPT-4到Llama2,并与人类推理模式共享共同点。 引言 在人工智能领域,大模型(LLMs)如GPT-4和PaLM 2在文本生成方面展现了强大性能。然而,这些模型在处理复杂推理任务时仍面临挑战。传统的提示方法,如思维链(CoT),虽然在某些情况下有效,但它们通常依赖于预设的推理过程,这可能不适用于所有类型的任务。 为此,Google的研究人员提出了「SELF-DISCOVER框架,可实现自动发现和构建推理结构,以解决各种任务」。该方法显著提高了GPT-4和PaLM 2的性能,相比思维链(CoT),性能提升高达32%。 背景介绍 大型语言模型(LLM)的基础是由Transformer组成的,例如:GPT-4、PaLM 2,它们在连贯文本生成、指令遵循方面取得了令人印象深刻的突破。为了提升大模型解决复杂问题的能力,受到人类认知理论的启发,人们提出了各种提示(Prompt)方法。例如,Zero-Shot、Few-Shot思维链(CoT)模仿了人们分步解决问题的方式;基于分解的提示(decomposition-based prompting)技术,灵感来自于人们如何将一个复杂的问题分解为一系列较小的子问题,然后逐一解决这些子问题;回溯提示(step-back prompting)技术灵感来源于人类对相关任务的反思。 但是以上的这些技术作为一个原子推理模块,存在一定的局限性,因为当面对给定任务时都会存在隐含的先验假设。相反,本文作者认为每个任务都有独特的内在结构,这是有效解决推理问题的基础。 基于以上考虑,本文作者提出了一个名为自发现(SELF-DISCOVER)的框架,它允许LLMs自发现并组合原子推理模块,并形成一个明确的推理结构,以便在解码过程中遵循。这种方法的核心是一个自发现过程,其中LLMs从多个原子推理模块(如批判性思维和逐步思考)中选择,并将其组合成一个推理结构。 SELF-DISCOVER框架 SELF-DISCOVER框架的核心部分是自发现过程,它允许大型语言模型(LLMs)在没有明确标签的情况下,自主地为特定任务生成推理结构。SELF-DISCOVER框架包含两个主要阶段:自发现特定任务的推理结构、应用推理结构解决问题。如下图所示: 「阶段一:自发现特定任务的推理结构」主要包含三个主要动作:选择(SELECT)、适应(ADAPT)和实施(IMPLEMENT)。如下图所示: 其中: 「选择(SELECT)」在这个阶段,模型从一组原子推理模块(例如“批判性思维”和“逐步思考”)中「选择对于解决特定任务有用的模块」。模型通过一个元提示(meta-prompt)来引导选择过程,这个元提示结合了任务示例和原子模块描述。选择过程的目标是确定哪些推理模块对于解决任务是有助的。 「适应(ADAPT)」 一旦选定了相关的推理模块,下一步是调整这些模块的描述使其更适合当前任务。这个过程到将一般性的推理模块描述转化为更具体的任务相关描述。例如,对于算术问题,“分解问题”的模块可能被调整为“按顺序计算每个算术操作”。同样,这个过程使用元提示和模型来「生成适应任务的推理模块描述」。 「实施(IMPLEMENT)」 在适应了推理模块之后,SELF-DISCOVER框架将这些适应后的推理模块描述「转化为一个结构化的可执行计划」。这个计划以键值对的形式呈现,类似于JSON,以便于模型理解和执行。这个过程不仅包括元提示,还包括一个人类编写的推理结构示例,以帮助模型更好地将自然语言描述转化为结构化的推理计划。 「阶段二:应用发现推理结构」 完成阶段一之后,模型将拥有一个专门为当前任务定制的推理结构。在解决问题的实例时,模型只需遵循这个结构,逐步填充JSON中的值,直到得出最终答案。 这个过程的关键在于,它允许模型在没有人类干预的情况下,自主地生成适合特定任务的推理结构,这不仅提高了模型的推理能力,而且提高了推理过程的可解释性。通过这种方式,模型能够更有效地处理复杂和多样化的任务。 实验结果 在实验阶段,作者主要验证SELF-DISCOVER框架如何提升大型语言模型(LLMs)在处理复杂推理任务上的性能。实验选取了25个具有挑战性的任务,覆盖了算法推理、自然语言理解、世界知识和数学等多个领域。 在性能方面,如下图所示,在BigBench-Hard、Thinking for Doing和MATH等复杂推理基准测试中,SELF-DISCOVER显著提高了GPT-4和PaLM 2的性能,与Chain of Thought (CoT)相比,性能提升高达32%。 在计算效率方面,与其他推理密集型方法(如CoT+Self-Consistency)相比,SELF-DISCOVER在保持性能的同时,所需的推理计算量减少了10-40倍。 7. 结论 我们引入了SELF-DISCOVER,这是一个高效且性能优越的框架,用于模型从通用问题解决技能的种子集中自我发现任何任务的推理结构。我们观察到,在多个LLMs上,挑战性推理基准测试的性能显著提高了多达30%。SELF-DISCOVER的消融研究表明,组合的推理结构在LLMs之间具有普遍可转移性。展望未来,我们很兴奋地探索更多关于LLM结构化推理的内容,以推动问题解决的边界,并发现人机协作的潜力。

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统

Java版工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示1、项目进度图表 2、项目信息 施工地图:1、展示当前角色权限下能看到的施工地图(地图坐标)。2、点击坐标点出现项目基本信息。3、项目施工地图项目展示基本信息、进度项目地址等。 系统管理 数据字典:数据字典的新增、编辑、删除、查询、查看列表。 编码管理:编码的新增、编辑、删除、查询。 用户管理:用户的查询、授予。 菜单管理:菜单按钮的新增、编辑、删除、增加子菜单。 角色管理:查询、新增、编辑、分配用户、分配权限、删除。 系统消息:查询、查看消息状态、查看消息详情 系统设置 项目前期模板设置:新增、删除、编辑、添加行、添加子项等功能。 项目权限管理:查询项目信息、为用户分配项目数据权限。 资源管理:新增、删除、编辑、添加行、添加子项、资源类型配置等功能。 考核指标管理:查询、新增、修改、删除、配置考核指标权重。 预警指标管理:查询、新增、修改、删除、配置预警等级和阈值单位等信息。 模板管理:模板的新增、编辑、删除、计划模板的wbs和任务信息维护 项目管理 项目列表:项目的新增、编辑、删除、导出、终止、查询、项目指引的编辑删除、文件的存档、提审等功能。 项目计划管理:计划的查询、新增、编辑、删除、甘特图保存为基线、设置为模板、任务时间及顺序调整、全局资源配置、引用系统模板、导入project文件、导出XML文件等功能。 进度上报管理:单任务上报、批量上报、显示列表已更改数据、查看进度上报记录、任务查询等功能 合同管理 项目合同:合同的新增、编辑、删除、导出、查询。标记为问题合同、创建合同的付款节点并关联任务等功能。 问题合同:问题合同的查询、查看问题合同处理详情。 合同收付款:合同收付款记录新增、编辑、删除、查询。 资金计划:资金计划的新增、查询、编辑、删除、导出。 项目考核:考核的新增、进度考核单体权重的计算、考核人的分配(可分配多个考核人) 删除、考核的编辑、查看考核详情、考核分数计算。 奖惩管理:奖惩的新增、查看详情、编辑、删除等功能 预警管理 预警管理:项目查询、为项目设置预警指标、删除预警指标、设置预警指标的阈值、设置预警通知人。 预警记录:查询、列表展示、查看消息通知内容、取消预警、查看预警详情 竣工管理 工程竣工移交:工程竣工移交的新增、查看、查询、修改、删除。 工程竣工验收:工程竣工验收的查询、新增、编辑、查看、删除、附件上传、验收异常填写异常信息、选择整改部门和责任人等功能 质量管理 中间验收:中间验收的新增、查看、查询、修改、删除。 质量检查:质量检查的查询、新增、编辑、查看、删除、附件上传、验收异常填写异常信息、选择整改部门和责任人等功能。 隐患整改:隐患整改的查询、整改单查看、回复单查看、详情、单据打印 统计报表 项目汇总:项目查询、统计项目计划进度、实际进度、计算预计完成时间等信息。 进度报表:统计项目计划进度、实际进度、资源使用、并且已不同的时间范围计算项目的计划进度并与实际进度形成对比。 收支报表:以时间的维度统计所有项目的收支、以项目维度统计项目的收支。 利润报表:统计所有项目的利润信息、并且通过时间维度和项目维度区分利润情况。 差异报表:项目的查询、项目的实际进度和基线的对比、基线与基线的对比。 每周报表:项目查询、周边的新增、查看周报的详情等功能 工作台 我的待办:待办列表、待办的处理、待办的指派、已办的列表、已办详情。 我的消息:未读消息列表、已读消息列表、未读详情展示、已读消息详情展示

裸机编程的几种模式、架构与缺陷。

大多数嵌入式的初学者都是从单片机裸机编程开始的,对于初学者来说,裸机编程更加直观、简单,代码所见及所得,调试也非常方便,区别于使用操作系统需要先了解大量的操作系统基础知识,调度的基本常识,还需要注意各种资源的共享与竞争等概念,并且调试也没有那么直观等等。裸机编程在一些比较简单的项目上还是具有一定的优势的。 接下来我们来看看裸机编程的常见模式和架构。 1.主循环轮询模式 主循环轮询模式就是在主函数中使用一个永不退出的 while(1) 来承载所有的应用逻辑,如下: int main(void) { while(1){ do_a(); do_b(); do_c(); } } do_a、do_b、do_c 三个函数依次执行,全部执行完毕后再次从 do_a 逻辑开始,以此不断循环。 这种模式是最简单也是最初级的模式,但其也存在很多问题。由于上述三个逻辑会依次执行,那么就会相互影响,do_b 必须要等 do_a 执行完后再执行,do_c 必须要等 do_a 和 do_b 都执行完后才执行,一旦前置逻辑中存在大量的延时,后续逻辑就无法得到及时的运行。 比如后续逻辑中存在一些交互行为,do_b 会判断一个按键的按下状态并做出响应,而此时还在 do_a 中执行延时指令,那么整体运行就会显得非常卡顿,甚至还会因为错过用户按键的时机而导致即使按下了按键,也没有执行对应的反馈。 2.中断执行模式 针对于上面的问题,很多人就会使用中断来解决。对于一些需要立即响应的操作,将其放在中断中,从而避免其被主程序中的其他逻辑所影响,此时代码可能如下所示: //按键中断 void key_isr(void){ do_b(); //按键按下的操作 } int main(void) { while(1){ do_a(); do_c(); } } 主循环中还是正常执行非交互式的逻辑,而对于上例中按键交互的逻辑 do_b,则放到对应的按键信号捕获中断中(如 GPIO 外部中断)。此时即使在执行主循环中的其他逻辑,由于中断会打断主循环立即运行,所以按键信号会被立刻检测到并响应。 无法及时得到响应的问题解决了,对于一些非常简单的逻辑,这种模式就足够了,但如果主循环中的逻辑有一定的周期性要求,如 do_a 需要每隔 100 毫秒执行一次, do_c 需要 50 毫秒执行一次,于是 do_a 和 do_c 下就会存在 delay(100) 和 delay(50) 的代码: