[STM32]从零开始的STM32标准库环境搭建(小白向)
一、我们为什么要搭建STM32标准库开发环境
如果你对STM32有一定的了解,相信你已经认识了STM32的几种开发方式。基于STM32寄存器开发,基于ST官方的标准库开发,基于ST官方的HAL库开发。我们现在来了解一下这些库的优缺点。首先就是基于寄存器开发,这种开发方式类似于51单片机,这种开发方式也最为底层,执行效率也最快,但是STM32的寄存器数量不是51单片机能比的,你很有可能记不住那么多寄存器,在开发时你需要反复查询手册。其次就是标准库开发,我们最常用的时ST官方提供的标准库。虽说库的本质也是在操作寄存器,但是库将那些抽象的寄存器定义成我们能够看懂的字串,极大的提高了代码的阅读性和开发速度。比起寄存器开发,标准库由于是上层的封装,所以,它的执行效率肯定没有寄存器开发那么高。最后就是HAL库开发,HAL库是一个很上层的封装库,可以搭配cube MX进行部分图形化开发。HAL库的出现极大的减小了STM32的上手难度。它提供的各种函数包括延时,中断回调,都是非常易用的,它可以让开发者完全处于上层开发。但是,因为它的多层封装,也导致了它的执行效率低于标准库。因为封装得太严重,使得用户很难接触底层,如果用户想修改底层函数需要在层层封装中一层一层往下找。我们可以发现,每一种开发方式都有它的优缺点。如果你作为一个STM32新手,我建议你从标准库开发起手,等你熟悉的标准库开发以后,你可以直接转战HAL库,它们的语法很相似,你可以直接上手HAL库开发。当你将标准库和HAL库都使用得很熟了以后,在你开发的过程中可能会遇到操作寄存器的时候,这时你再尝试去查手册然后再去操作寄存器,这是一个层层理解的过程。所以,本次教程,我会教大家如何搭建一个标准库的例程,以后我们的开发都会再这个库上进行。
二、需要准备什么?
在开始搭建环境之前,你需要有一个keil的开发软件,并且已经激活,如果你还不会安装keil可以参考我下面的文章:
keil的安装以及配置:[STM32]如何正确的安装和配置keil?(详细)-CSDN博客
我们这里会使用最常见的单片机作为演示,本文章演示的单片机是“STM32F103C8T6”,这是STM32初学者都会接触到的一款单片机,我也建议大家在初学阶段使用这款单片机,最小系统板的价格并不贵,如果你的经济条件允许,就请你在准备学习STM32时买一块最小系统吧。
当你安装好keil以后,我们就可以进行下一步了。
下面我也会进行尽量详细的讲解,包括芯片包的安装等。
在开始前,请将我提供的资料下载下来,如果你是小白,我建议你下载我提供的资料。资料中包含了可用的芯片包,库等。这些资料也可以去官网下载,但是官网需要登录以后才能下载,所以,如果你是小白,我建议你直接下载我提供的资料,不要把一开始的耐心浪费在找资料上。
本次会用到的资料:https://pan.baidu.com/s/1fyMFzbjIYYN5KMNms_xy8Q?pwd=clxm
提取码:clxm
下载好资料以后就可以进行下一步了。
三、芯片包的安装
芯片包是为了让keil能够识别到相关芯片。我们芯片包的安装有两种方式,一种是在线安装另一种是使用pack包安装。这两种安装方式都在keil安装的文章中讲解得非常清楚,如果你需要详细得芯片包安装教程可以去查看keil安装教程。下面我会为大家演示使用pack包安装stm32芯片包。我们将下载的资料解压得到以下文件夹:
进入这个文件夹下的芯片包文件夹,看到pack文件:
双击打开这个芯片包。打开安装引导界面。如果你打开安装引导界面以后,提示找不到keil你可以尝试重新安装keil或者使用在线安装的方式,这都可以参考下面的文章。我们可以看到这里芯片包的名字是带有“F1”的,这表示这是F1的芯片包,里面包含了所有F1系列的单片机。注意,不同系列STM32的芯片包也不通用,如果你想开发别的系列的单片机,你就需要安装别的系列芯片包:
参考文章:[STM32]如何正确的安装和配置keil?(详细)-CSDN博客
打开芯片包以后,看到以下安装引导界面:
这里显示了我们keil的路径,我们点击“Next”,点击了以后就开始安装了:
出现下面的界面就表示安装完成了,大家将这个窗口关掉即可:
这个时候我们可以打开keil查看安装是否成功。
打开keil后我们点击魔术棒:
随后点击“Device”:
在这里我们可以看到刚才我们安装的F1的芯片包,当我们有了这个芯片包以后,就可以进行下一步了。
这里需要注意,只有当你完成这一步以后,才能进行下一步。
四、创建STM32的keil工程
我们先在某个地方新建一个文件夹用于存放我们的keil工程,这里最好选择一个文件夹来专门存放工程。我这里就在桌面上新建一个文件夹作为我们存放keil工程的文件夹,并且命名为Project:
我们再次打开keil,然后点击左上角的“Project”,随后点击“New Project”:
这里选择我们刚才创建的文件夹:
我们在下面的文件名中,可以输入一个比较通用的名字,后面我们要将这个工程运用到别的地方我们只需要修改外面的文件夹名即可,内部创建好的初始工程我们直接复制即可:
在做完以上步骤以后,我们点击保存:
点击保存以后,这里会让我们选择单片机:
因为我们这里要创建“STM32F103C8T6”的工程,所有我们这里要依次选择到“STM32F103C8T6”,我们可以点击加号展开,按照以下进行选择“STMicroelectronics>STM32F1 Series>STM32F103>STM32F103C8”,如果你用的是STM32F103C6T6,这里选择C6即可:
在选择完单片机以后点击“OK”,弹出的窗口是STM32创建工程的一个助手能帮我们快速创建,我们这里关掉即可:
我们可以看到右边已经出现了一些文件夹,这就表示我们的STM32keil工程已经创建成功了:
大家一定要在完成了这一步以后再进行下一步。这一步是下一步的前提。
五、复制相关库文件到keil工程文件夹:
既然要使用库函数进行开发,那么我们就需要把相关库添加到我们的工程文件夹中。首先看到我给大家提供的资料,我们打开解压后的文件夹,进入文件夹下的“固件包”文件夹,看到以下文件:
这就是我们库函数的压缩包了,我们将其解压,得到以下文件夹:
我们后续会在这个文件夹中复制相关文件。
我们现在回到我们的keil工程文件夹中,我们可以看到它在创建工程时已经生成了很多文件和文件夹,这些文件和文件夹都是必须的,大家不要删了,更不要以为只有uvprojx是工程的本体:
我们在工程文件夹下新建一个文件夹名为“Start”,我们当然也可以直接把我们的库文件放在工程文件夹下,但是这样会显得比较乱,所以,我们要新建文件夹进行文件的整理和分类:
我们下面开始复制文件,目前文件比较多,大家不要复制丢了。
我们首先去固件库文件夹中找到启动文件,它被放在“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm”下:
来到这个文件夹中,我们可以看到非常多的.s的文件,当然,我们只需要选择一个就行了,我们STM32的启动文件也只能有一个,我们需要根据单片机的型号来选择相对应的启动文件,如果启动文件没选对,就算代码在编译时没有错误,代码也不会在单片机中跑起来。我们这里创建的是“STM32F103C8T6”的工程,这个单片机对应的启动文件是“startup_stm32f10x_md.s”,如果你想知道别的型号的单片机对应的是什么启动文件可以去网络上搜索相关资料。我们将这个启动文件复制到我们一开始在工程文件夹中创建的“Start”文件夹中:
复制完启动文件以后,接下来我们来复制STM32的寄存器描述文件和系统文件,它们被放在了“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”文件夹下:
这里的“stm32f10x.h”是我们STM32的外设寄存器描述文件,用以描述STM32有哪些寄存器和对应的地址,“system_stm32f10x.c”,“system_stm32f10x.h”文件主要用于配置系统时钟。我们将这三个文件复制,同样粘贴到工程文件夹的“Start”文件夹中:
下面我们来复制内核相关文件,内核文件被放在了“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport”下:
这里的两个文件就是STM32内核寄存器的描述文件。我们同样将其复制到我们工程目录下的“Start”文件夹中:
经过了以上步骤,我们的Start文件夹的文件就全部添加完成了,STM32的内核以及基本外设的寄存器就可以通过上面的文件基本运行起来了,为了我们编程方便,我们还需要使用函数库,下面我们来添加STM32的函数库。首先我们要在工程文件夹下创建一个文件夹名为“Library”:
我们下面所有的库函数文件都会放在这个“Library”文件夹中。
我们首先来复制库文件的头文件,它们被放在了“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc”文件夹下:
我们将这下面的.h文件全选,复制到我们刚才在工程目录下创建的“Library”文件夹下:
下面我们来复制库的源文件,它们被放在了“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src”文件夹下:
我们将这些.c的文件复制到“Library”文件夹下:
至此,我们所有的库函数就已经复制完成了。
下面我们来配置用户相关文件,我们在工程目录下新建一个“User”文件夹:
我们现在进入这个文件夹,在这个文件夹中新建一个“main.c”文件来放我们的main函数和一些用户函数。你可以先新建文本文件再将后缀改成.c:
在创建好这个文件以后,我们继续复制固件库中的文件,我们现在要复制固件库中.h包含关系的配置文件与中断函数相关文件。它们被存放在“STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template”下:
这里的“stm32f10x_conf.h”就是我们库中头文件包含关系的配置文件,“stm32f10x_it.c”,“stm32f10x_it.h”就是我们中断函数相关文件,我们将其复制到工程目录下的“User”文件夹中:
至此,我们所有的相关文件都已经复制完成,大家可以多检查几遍有没有少复制,少复制文件可能会导致报错。
六、在keil中添加文件
在上面,我们只是将所有的文件复制到了工程文件夹中,并没有添加到keil中,我们打开keil可以发现keil中还是空的一片,我们现在可以开始往keil中添加文件。
我们点击“Project.uvprojx”打开我们的工程:
打开keil后我们点击三个箱子的按钮:
出现以下窗口:
我们可以看到中间的框,我们将在中间的框和右边的框中进行操作。我们先把中间的框中原本的文件夹删了,你只需要选中这个文件夹在点击中间框上面的X即可:
我们在删除中间框中原本的文件夹以后,我们在中间的框中点击如下图中的图标添加文件夹:
我们在这里添加“Start”,“Library”,“User”文件夹,这三个文件夹与外面的三个文件夹对应,我们要将外面三个文件夹中的文件对应的添加到这里面的三个文件夹中:
我们选中文件夹,点击“Add Files”:
这里的文件类型,我们选择“All Files”:
我们再进入“Start”文件夹,将文件全选,点击“Add”:
我们可以看到这里的这里“Start”的文件已经被添加进来了:
我们按照上面的步骤,再将“Library”和“User”的文件添加进来,记得每次都要在文件类型中选择“All Files”:
在所有文件都添加进来以后,我们点击窗口下的“OK”,这里一定要点击“OK”,不能直接将窗口关掉或者点“Cancel”:
在点击了“OK”以后,我们窗口的左边出现了几个文件夹,这几个正是我们刚才添加的,大家可以点击加号展开看看里面的文件:
至此我们在keil中添加文件就已经完成了。
我们为了让编译器能够找到头文件,我们还需要将头文件的路径添加到环境变量中,我们这里点击魔术棒:
我们这里点击“C\C++”:
然后我们点击窗口下面的“Include Paths栏”右边的三个点:
我们点击图中框出的图标:
点击了以后,我们再点击三个点:
我们这里选择“Start”文件夹,最后点击“选择文件夹”:
我们可以看到这里的“Start”文件夹已经被添加进来了:
我们使用上面的方法,将“Library”和“User”文件夹都添加进来,添加好以后如下图,我们在添加好以后点击“OK”,回到下一个窗口中我们同样点击“OK”:
七、在keil中添加宏定义和编译器
我们现在需要在keil添加一个宏定义代码才能够正常被编译,在某些时候,我们还可能要自己添加编译器,这取决于你安装的keil有没有附带arm5的编译器。现在我们先来添加宏定义。
我们还是点击魔术棒:
我们再次点击“C\C++”:
我们在“Define”中写入以下字串:
USE_STDPERIPH_DRIVER
在添加字串以后,我们点击“OK”即可。
我们目前的路径和环境变量都已将添加完成,我们现在按道理说已经可以开始编译了,我们现在还需要检查一下自己的编译器,我们依然点击魔术棒来到以下界面:
我们检查上面有没有v5开头的编译器,可以看到,我这里就有一个“v5.06”的编译器。我们这里必须要使用v5的编译器,如果使用v6的编译器就会报错,如果你检查了这里没有v5的编译器的话,那你就需要继续看下面的教程,如果你这里有v5版本的编译器,那你可以直接跳到第八步。
好的,如果你还没有走开,那说明你这里没有v5的编译器,我们现在开始安装v5的编译器
我们继续打开我给的资料文件夹中的“编译器”文件夹,编译器的安装文件被放在了“ARMCompiler_506_Windows_x86_b960\Installer”下:
我们点击这个“setup.exe”开始安装编译器:
这里打上勾以后,点击“Next”:
下面我们选择安装路径,我们常常把安装路径定在keil安装目录下的ARM下的ARMCC文件夹中,如果你keil的安装路径下的ARM文件夹中没有ARMCC文件夹请自行创建一个:
这里我们点击安装:
随后便开始安装了:
这里已经提示我们安装完成了,将窗口关闭即可:
目前只是编译器安装完成了,我们还需要将编译器添加到keil中。下面我们继续回到keil中,我们这里再次点击三个箱子的按钮:
随后再点击“Folders/Extensions”:
随后再点击图中的三个点:
点击下面的“Add ..............”:
这里要选中我们刚才安装编译器的“ARMCC”文件夹,如果这里选择了不正确的文件夹会提示这个个文件夹中不存在编译器:
我们可以看到我们的v5编译器已经被添加进来了:
最后我们将这个窗口关闭,在外面的窗口中点击“OK”。
我们添加好编译器以后,再次点击魔术棒,我们应该就能看到编译器已经进来了:
至此,我们的编译器就已经添加完成了。
八、开始编译代码
在开始编译之前,我们还是需要点击魔术棒,点击以后,我们点击“Output”:
我们将“Create HEX File”打上勾,随后点击OK;
我们在main.c文件中写入一下字段,不写的话编译会报错:
#include "stm32f10x.h" int main(void)
{while(1){}
}
我们点击编译按钮开始编译:
按道理说,编译是没有错误也没有警告的。如果你出现“xxx头文件找不到”你可以考虑文件环境有没有正确安装,如果你出现了诸如446,31,4这种具有特征的报错数字,你可以尝试检查你的宏定义有没有输入正确,或者你的编译器是否设置正确。
当你编译没有错误以后,你可以去项目文件夹下的“Objects”文件夹查看有没有一个.hex文件:
当你看到这个hex文件以后,也就表示我们的环境已经配置完成,并且已经成功编译。
九、结语
当你创建好这个标准库工程时,在以后你想做别的实验,你都可以复制这个工程来修改。以上就是我们STM32F103C8T6标准库工程创建的全部内容了,感谢大家观看。
相关文章:

[STM32]从零开始的STM32标准库环境搭建(小白向)
一、我们为什么要搭建STM32标准库开发环境 如果你对STM32有一定的了解,相信你已经认识了STM32的几种开发方式。基于STM32寄存器开发,基于ST官方的标准库开发,基于ST官方的HAL库开发。我们现在来了解一下这些库的优缺点。首先就是基于寄存器开…...

解决 Android 上的 .NET MAUI/Xamarin.AndroidX 应用调用 ASP.NET Core API 端点时 SSL 连接被拒绝的问题
从虚拟机调用本地API报各种 SSL 连接不上的错误,这给本地调试造成了极大的不便,在被这个问题困扰了多日以后,终于在GitHub上找到答案 基于这个 帖子 ,有一个回复 他写了一个帮助类,专门用来调试本地的API,…...

助贷CRM系统:为金融中介行业打造全新营销管理模式
助贷CRM(客户关系管理)系统是针对金融中介行业,特别是从事贷款助贷业务的机构设计的一套综合管理系统。该系统旨在通过数字化、智能化的手段,优化金融中介机构的营销、销售、客户管理及服务流程,提升运营效率ÿ…...

HBase 部署及shell操作
HBase 数据库 一、HBase 概述1.1 HBase 是什么HBase 的特点 二、HBase 模型及架构2.1 HBase 逻辑模型2.2 HBase 数据模型2.3 HBase 物理模型2.3.1 列簇物理模型2.3.2 Rowkey 字段排序2.3.3 Region 存储到不同节点2.3.4 Region 结构 2.4 HBase 基本架构 三、搭建 HBase 分布式集…...
使用Fign进行客户端远程调用和SpringFormEncoder的使用
1、引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 2、启动类加上注解 EnableFeignClients SpringBootApplication public class FeignTe…...
golang 数据库使用注意事项
1.在使用 fmt.Sprintf 构建 SQL 插入语句时,参数包含特殊符号(如引号 、分号 ;、反斜杠 \ 等),可能会导致 SQL 注入或插入失败的问题。为了解决这个问题,推荐使用占位符(如 $1, $2, 等)和参数化…...

Leetcode面试经典150题-221.最大正方形
解法都在代码里,不懂就留言或者私信 class Solution {/**本题一看就是典型的动态规划,要找以每个点为右下角的正方形的面积,然后取最大的这个题要注意找规律,我找到的规律如下:1.以第一行为右下角的,因为正…...
51单片机-DS1302,操作简述
DS1302的命令字(Command Byte)是由控制DS1302芯片的主机(通常是单片机,如51单片机)来生成和发送的。DS1302是一款实时时钟(RTC)芯片,它通过串行通讯接口与单片机进行数据交换。 DS1…...
Vue3+Vite+Echarts 出现Missing semicolon错误
使用的echarts代码如下: import * as echarts from echarts;type EChartsOption echarts.EChartsOption;var chartDom document.getElementById(main)!; var myChart echarts.init(chartDom); var option: EChartsOption;option {series: [{type: gauge,center: [50%, 6…...
iOS——frame和bounds的区别
把frame理解为占用区域,把bounds理解为边界。View在旋转过程中,其实自己的坐标系统并没有发生改变,bounds中的origin只能通过setBounds方法修改。 frame 定义了视图在其父视图坐标系统中的位置和大小。其坐标系是相对于俯视图的坐标系。 bou…...

Trm理论 3(注意力机制)
注意力机制(attention) 在使用LSTM,CNN等模型的时候,很难决定对于一个信息什么是重要的,什么是不重要的。因此注意力机制就是为了优化这一问题 怎么做注意力机制 注意力机制包含,查询对象(Q&…...
Vue2和Vue3项目创建的区别和 element ui 和element plus的导入方式
文章目录 创建项目Vue2Vue3 Vue2项目机构Vue 2 Element UI VUE3项目结构Vue 3 Element Plus 创建项目 Vue2 Vue CLI 3 及之前版本: 使用 vue-cli 创建项目: npm install -g vue/cli vue create my-project-vue2 cd my-project-vue2Vue3 Vue CLI 4…...
基于STM32的猫狗宠物喂养系统设计(微信小程序)(215)
文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】选题背景【6】国内外技术发展现状【7】研究的目…...

spark读取csv文件
测试spark读取本地和hdfs文件 from pyspark.sql import SparkSessionspark SparkSession.builder \.appName("Example PySpark Script") \.getOrCreate()# 读取本地csv文件 df spark.read.csv("/Users/xiaokkk/Desktop/local_projects/spark/intents.csv&quo…...

钢铁百科:Q420DR力学性能、Q420DR执行标准、Q420DR低温容器钢板
Q420DR钢板是一种专为低温压力容器设计的优质钢材,其材质特性、执行标准、化学成分、力学性能、交货状态、应用范围以及常用规格等方面都具有显著的特点。 一、Q420DR钢板材质 Q420DR钢板的命名方式体现了其材质特性。其中,“Q”代表屈服强度ÿ…...

三菱机器人手柄维修示教器维修手操器面板等
机器人手柄维修(示教器维修)故障现象包括:黑屏、指示灯无任何显示, 上电蓝屏、白屏,通电几分钟后屏幕变为蓝屏,主板故障,通讯时有时无, 触摸失灵,有时白屏,触…...
中间件的学习理解总结
目录 一、定义与作用 二、主要类型 数据库中间件 远程过程调用中间件 面向消息的中间件 事务处理中间件 三、特点与优势 独立性 高效性 可扩展性 可靠性 四、应用场景 企业应用集成 分布式系统 电子商务 移动应用开发 五、数据库中间件 功能细节:…...
编程秘密武器:提升工作效率的关键工具
在编程的世界里,选择合适的工具可以极大地提升工作效率。无论是智能的代码编辑器、强大的版本控制工具,还是自动化脚本,这些“秘密武器”都能帮助开发者在繁忙的工作环境中事半功倍。本文将探讨一些能显著提升工作效率的编程工具,…...

Git+word记笔记
程序员记笔记主要同步很重要,我这个方法只支持个人笔记,如果团队还是用企业微信开个企业会员比较方便。为什么用word,因为可以镶嵌代码和文档,不仅仅是文字,兼容性强 语雀,云笔记这些对于上传的word都是有…...
java-antrl手敲命令的hello world
java-antrl手敲命令的hello world 环境步骤1. 下载ANTLR的jar包2. 新建一个g4文件3. 生成语法对应的java文件4. 编译语法对应的java文件5. 测试语法5.1 打印测试信息5.2 查看语法分析树 6. 注意事项6.1 每一个antlr4版本的jar包都对应java的相应版本,要对应。6.2 [1…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...