若依框架篇-若依框架搭建具体过程、后端源代码分析、功能详解(权限控制、数据字典、定时任务、代码生成、表单构建、接口测试)

news2024/12/22 23:29:18

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        1.0 若依框架概述

        1.1 若依构建

        1.2 后端项目搭建

        1.3 前端项目搭建

        2.0 利用若依框架生成前后端代码案例

        3.0 功能详解

        3.1 功能详解 - 权限控制

        3.1.1 使用权限控制功能

        3.2 功能详解 - 数据字典

        3.2.1 使用数据字典功能

        3.3 功能详解 - 其他功能

        3.4 功能详解 - 监控相关

        3.5 功能详解 - 定时任务

        3.5.1 使用定时任务

        3.6 功能详解 - 表单构建

        3.6.1 通过图形化界面实现一个表单构建

        3.7 功能详解 - 代码生成

        3.7.1 根据树表模板来生成前后端代码

        3.8 功能详解 - 系统接口

        3.8.1 使用测试接口

        4.0 若依项目结构

        4.1 后端项目结构

        4.2 后端项目配置信息

        4.3 前端项目结构

        5.0 若依生成的源代码

        5.1 后端源码分析


        1.0 若依框架概述

        若依(RuoYi)框架是一个基于 Java 的开源企业级快速开发框架,主要用于构建信息管理系统。它结合了多种前端和后端技术,提供了高效的开发工具。

用到的技术栈:

        1)后端:采用了 Spring Boot、MyBatis、Redis 等流行技术。

        2)前端:使用 Vue3 框架,结合 ElementPlus 组件库,提供了现代化的用户界面。

模块化设计:

        若依框架采用了模块化设计,支持多种功能模块的集成和扩展,如用户管理、角色管理、菜单管理等

        1.1 若依构建

        RuoYi-Vue 版本,采用了前后端分离的单体架构设计:

        1)软件环境:JDK、MySQL、Redis、Maven、Node

        2)技术选型:Spring Boot、Spring Security、MyBatis、Jwt、Vue3、Element-Plus 

        3)官方地址:

        后端代码:https://gitee.com/y_project/RuoYi-Vue

        前端代码:https://gitee.com/ys-gitee/ruoyi-vue3

        4)官方推荐软件环境版本:

                - JDK >= 1.8

                - MySQL >= 5.7.0

                - Redis >= 3.0

                - Maven >= 3.0

                - Node >= 12

        以上的软件下载安装在之前的博客都有讲解到,需要了解的,可以到我的主页搜索。

        1.2 后端项目搭建

        1)Git 克隆并初始化项目

        首先复制项目 URL:

        接着在 IDEA 克隆项目:

        在 IDEA 打开该项目:

        2)MySQL 导入与配置

        使用 SQL 脚本,执行 SQL 文件:

        使用 MySQL 可视化工具执行 SQL 脚本:

        在项目中选择 SQL 文件: 

        MySQL 导入完成之后,打开数据库可以看到生成了 30 张表:

        再接着,在项目中对 MySQL 进行配置:

         注意,选择了指定数据库执行 SQL 脚本,则就选择该数据库。一般来说,username 默认为 root 。

        3)启动 Redis

        直接在 Redis 目录下执行该命令即可。

        接着在项目中配置 Redis,如果 Redis 没有设置密码,这一步就可以忽略了。对于设置了 Redis 密码,还需要在项目中配置密码:

        4)运行后端项目

        以上操作完成之后,就可以正常启动项目了:

        正常运行状态:

        1.3 前端项目搭建

        1)Git 克隆并初始化项目

        首先复制前端 URL:

        接着克隆到本地:

        2)安装依赖

        先用 vs 工具打开前端项目:

         再接着,安装依赖:

        3)运行前端项目

        最后启动项目:

        运行结果:

        2.0 利用若依框架生成前后端代码案例

        先通过一个案例,来具体了解若依框架的强大之处。

        利用若依代码生成器,生成课程管理的前后端代码。

        1)准备 SQL 并导入数据库:

        2)配置代码生成信息:

        通过若依界面来配置代码:

        对课程管理的功能进行配置信息:

        基本信息:

        字段信息:

        根据具体的业务功能来进行选择配置。

        生成信息:

        3)下载代码并导入项目:

        选择生成代码:

        下载到本地之后,解压文件:

        先执行 SQL 脚本,来导入数据库信息:

        导入之后查看结果:

        再接着将 main 文件导入到后端项目中:

        最后将 vue 文件导入到前端项目:

        重启一下后端项目,就可以看到课程管理页面的生成结果:

        利用若依框架,根据配置信息,若依会自动生成前后端代码、数据库相关的表,从而得到一个增删改查的课程管理页面。

        以上简单介绍了若依是如何根据一张数据库表以及配置信息来自动生成前后端代码、数据库表。

        3.0 功能详解

        除了可以根据表来快速生成前后端代码的功能以外,还有若依框架其他的功能。这些功能使得若依框架不仅仅是一个代码生成工具,而是一个完整的企业级管理系统开发框架,适用于各种类型的项目。它能够极大地提高开发效率,降低开发成本。

        3.1 功能详解 - 权限控制

        简单来说,管理员和普通用户所允许访问的菜单是不一样的,比如说管理员可以对普通用户的信息进行增删改查,而普通用户则不能具备该功能。因此,利用 RBAC 来通过角色来分配和管理用户的菜单权限。

        RBAC 是基于角色的访问控制,是一种广泛使用的访问控制模型,通过角色来分配和管理用户的菜单权限。

RBAC 的主要组成部分包括:

        1)角色:角色是权限的集合,定义了用户在系统中可以执行的操作。角色通常基于用户的工作职能、责任或其他相关标准。

        2)用户:用户是被分配到角色的个人。用户继承与其所分配角色相关的权限。

        3)权限:这是用户执行特定操作或访问特定资源所需的授权。权限通常分配给角色,而不是单独分配给用户。

        若依使用了五张表将角色、用户和权限进行了关联,从而实现对权限的控制。

若依实现权限控制的思路:

        用户登录之后,会根据用户信息查询角色,通过角色再来查询当前用户的权限。

        3.1.1 使用权限控制功能

        在若依页面来使用这个权限控制功能,比如说,之前完成的课程管理的功能,将其分配到对应的角色。

        1)菜单管理:

        将课程管理提升为主类目:

页面结果:

        2)角色管理

        创建角色来关联课程管理权限,简单来说,让该角色具备课程管理的权限。

        3)用户管理

        创建用户且分配角色。

        接着来登录小板用户:

        小板用户当前的课研人员的角色只有课程管理的权限,因此只能查看到课程管理功能。

        3.2 功能详解 - 数据字典

        若依内置的数据字典,用于维护系统中常见的静态数据。例如:性别、状态等等。功能包括了字典类型管理、字典数据管理。

        若依通过两张表来维护:字典类型表、字典数据表

        3.2.1 使用数据字典功能

        在课程管理的功能中,课程学科是静态数据,因此可以使用数据字典功能进行升级改造。

        1)添加字典类型

        添加完之后:

        2)添加字典数据

        在课程学科中添加数据:

        3)修改代码生成信息

        将查询课程学科改为下拉框的形式查询:

        下载代码之后,只需要将前端项目中的 course 进行替换即可:

        打开页面:

        成功修改了,将课程学科静态数据改为了字典数据。

        最后,还要修改数据库中的信息:

演示结果:

        3.3 功能详解 - 其他功能

        简单介绍参数设置、通知公告、日志管理功能。

        

        1)参数设置

        对系统中的参数进行动态维护。

        这些参数通过设置,不用修改代码,就可以执行。

        比如说开启验证码功能,设置 false,既可以关闭验证功能。

        再次登录看看:

        此时没有验证码登录了。

        同理,开启新用户注册功能:

        为了方便,修改以下参数,就可以通过登录界面来注册新用户: 

最终的结果:

        2)通知公告

        促进组织内部信息传递。这个功能属于半成品,实际上只实现了公告录入功能,没有实现发布、查看公告的功能。

        3)日志管理

        轻松追踪用户行为和系统运行状况。

        查看用户登录信息:

        查看用户操作信息:

        这些信息都存在数据库表中。可以通过定时任务去清理日志,否则一段时间之后,数据库中的日志信息会非常庞大。

        3.4 功能详解 - 监控相关

        若依提供了一些强大的监控工具,能够帮助开发者和运维快速了解应用程序的性能状态。

在线用户:

缓存列表:

缓存监控:

服务监控:

数据监控:

        该功能主要监控数据库的情况。

        用户名和密码在配置文件中查看:

        是一个集成到项目中的功能,该功能的实现由 Druid(德鲁伊)实现:

        3.5 功能详解 - 定时任务

        若依为定时任务功能提供方便友好的 web 界面,实现动态管理任务。

        3.5.1 使用定时任务

        1)创建任务类:

        在 quartz 模块下的 task 类创建任务类:

        具体的代码逻辑: 每次查看 redis 中的缓存 keys 数量

        2)添加任务规则:

        该操作直接在若依 web 界面完成。

具体的配置信息:

        调用方法:使用了 Spring IOC 容器管理的 Bean 对象方式,通过类名开头小写.具体的方式名来调用。

        cron 表达式:每 5 秒执行一次。

        执行策略:放弃执行的意思当服务器宕机了,重新修复之后,放弃执行之前的定时任务,只执行当下的定时任务。

        是否并发:只是一个查看 Redis keys 的数量,可以选择并发,效率高。

        3)启动定时任务:

        3.6 功能详解 - 表单构建

        表单构建工具,只需要开发者通过图形界面和拖拽等操作,可以快速构建复杂的表单。

        3.6.1 通过图形化界面实现一个表单构建

        1)构建表单结构并导出:

        根据业务需求来设置表单结构,通过拉拽所需要的组件即可。

        构建完之后,就可以导入 vue 文件了。

        2)导入到前端项目:

        更名为 add.vue 文件,接着就导入到 views/course/course 目录下。

        3)创建菜单:

        组件路径需要根据当前视图文件来编写,当前的添加课程功能的组件位于 course/course/add 中。

        最后的结果:

        这就在项目中创建了表单结构。

        3.7 功能详解 - 代码生成

        代码生成器,根据数据库表结构自动生成前后端 CRUD 代码。

        在此之前介绍过根据课程表来自动生成 CRUD 代码。课程是单表,除了单表之外,还有多表。比如说树表、主子表(一对多)。

        3.7.1 根据树表模板来生成前后端代码

        树表是一种展示层级数据的表格,能展开折叠,清晰呈现父子关系,便于管理。比如部门管理结构:

        接下来,演示依据树表模板是如何自动生成前后端的 CRUD 代码:

        1)导入表结构:

        2)配置信息:

根据表结构来配置:

        生成模板:由于部门表是具备层级结构。

        树编码字段:主键 ID 。

        树父编码:外键 ID 。

        树名称字段:展示字段名。

        3)下载代码并导入项目中:

最后结果:

        3.8 功能详解 - 系统接口

        Swagger,是一个集成到项目中的工具,能够自动生成 API 的同步在线文档,并提供 web 界面进行接口调用和测试。

        在项目中,提供了一个测试类:

        该测试类上的类加上了 @Api 注解,在方法上加上了 @ApiOperation 注解,因此,才会自动生成对应的测试用例。

        3.8.1 使用测试接口

        先获取到 token 令牌:

        再粘贴到 Authorize 中:

        测试方法:

         再接着配置后端项目中 Swagger 路径前缀信息:

         测试结果:

        4.0 若依项目结构

        对于若依项目的结构进行分析,包含后端项目结构、前端项目结构。

        4.1 后端项目结构

        后端项目主要分成六个模块。

        1)ruoyi-admin:

        ruoyi-admin 是后台服务。

        web:通用功能的 controller 。

        RouYiApplication、RouYiServletInitializer:项目启动类。

        2)ruoyi-common:

        ruoyi-common 是通用工具。

        - annotation:自定义注解

        - config:全局配置

        - constant:通用常量

        - core:核心控制

        - enums:通用枚举

        - exception:通用异常

        - filter:过滤器处理

        - utils:通用工具类

        - xss:自定义 xss 校验

        3)ruoyi-framework:

        ruoyi-framework 是框架核心。

        - aspectj:自定义 AOP

        - config:系统配置

        - datasource:多数据源

        - interceptor:拦截器处理

        - manager:异步处理

        - security:权限控制

        - wed:前端控制

        4)ruoyi-system:

        ruoyi-system 是系统模块。

        5)ruoyi-generator、ruoyi-quartz:

        ruoyi-generator 为代码生成、ruoyi-quartz 为定时任务。

        4.2 后端项目配置信息

        - i18n:国际化处理

        - META-INF:项目元信息,无需修改

        - mybatis:mybatis 相关的配置

        - application.yml:项目中的核心配置

        - application-druid.yml:数据库连接配置

        - banner.txt:项目启动,控制台打印显图案信息

        - logback.xml:日志相关配置

模块依赖关系:

        4.3 前端项目结构

        - node_modules:第三方依赖库

        - src:源代码存放目录(主要写代码的文件夹)

        - package.json:项目配置文件,包括项目名、版本号、依赖包等

        - vite.config.js:Vue 项目的配置信息,如:端口号等

src 具体内容:

        - api:所有请求(向后端发送的 api)

        - assets:静态资源,存放图片、字体

        - components:通用组件

        - router:路由,组件跳转

        - views:Vue 组件页面

        - App.vue:根组件

        - main.js:入口文件,加载组件,初始化等

        5.0 若依生成的源代码

        5.1 后端源码分析

        1)利用之前生成课程管理功能的源代码进行分析:

        2)首先进入三层架构中的 controller 层:

        接着对查询课程管理列表方法进行代码分析。

        3)注解 @PreAuthorize 权限分析

        对于注解 @PreAuthorize("@ss.hasPermi('course:course:list')") 起到一个权限控制。@PreAuthorize 注解是 Spring Security 框架中用来做权限检查的。它在运行方法之前先验证权限,权限够就放行,不够就拦截。

        而 'course:course:list' 提供权限标识,在之前的 RBAC 基于角色访问控制中,'course:course:list' 对一个功能进行唯一标识,不同角色有不同的访问功能的权限,将角色赋给不同的用户,则用户也就有了不同的访问功能的权限。

        在数据库中若依项目的 sys_menu 表:

        不同的权限标识对应着不同的功能:

        权限控制流程:

        首先,用户登录会立即获取到该用户的信息,包含基本信息,比如说用户名称、用户 ID等。还包含角色集合、权限集合。一个用户可以有多个角色,每一个角色都会有具体的权限集合,也就是可以访问的功能集合。每当用户去操作的时候,操作之前,通过 @PreAuthorize() 注解拦截,查看该用户是否有该权限访问。

        如果该用户权限列表中不存在该方法所对应的权限标识,则拒绝访问;如果该用户权限列表中存在该方法权限标识,则放行。

        4)BaseController 基础控制层

        web 层通用数据处理,项目中的 Controller 层都继承了 BaseController 类。

BaseController 类的变量和方法:

         当前方法就用到了 startPage() 方法:

        用到了父类 BaseController 类的 startPage() 方法。

        接下来,查看 startPage() 方法的具体实现:

        继续跟踪源码:

        拿到请求中的当前 pageNum 页码数、pageSize 页码总数、orderBy 排序方式,接着调用 PageHelper.startPage() 第三方实现的方法。

        当执行该行代码的时候,会被 PageHelper.startPage() 方法进行 "拦截",

        拦截之后,接着会做两件事:第一, "select count(*) from 目的表名" 先获取 total 总数;第二,"select 目标字段 from 目标表名 where 条件 limit 起始页,展示数量" 给查询语句加上 "limit" 语句,从而来实现分页目的。 

        再接着往下走,

        将查询的结果,交给了 getDataTable() 方法,该方法也是 BaseController 父类的方法:

        首先创建了一个 TableDataInfo 类,该类的变量有 code、msg、row、total:

        将分页的 total 总数、分页结果 list 封装到 TableDataInfo 类中,最后将类返回。

        这就是课程管理中,分页查询的源代码所涉及到类、方法等。

        5)对课程管理中获取课程管理详细信息进行分析:

        同理,通过 @PreAuthorize() 注解进行拦截,查看该用户是否有权限访问该功能,若通过之后,根据路径参数来获取 id 。

        接着调用 service 层中的 selectCourseById(id) 方法:

        进入到 service 层,再调用 mapper 层中的 selectCourseById(id) 方法:

        从数据库根据 id 获取到课程信息之后,将其一层一层返回出来。到 Controller 层,将结果交给 success(Object data) 父类的方法。

success(Object data) 方法:

        再接着,又将 data 交给 AjaxResult.success() 方法:

         AjaxResult 类用于返回给前端所需要的字段,该类对结果进行了封装。

AjaxResult 类中的 success(data) 方法:

        以上的方法会调用以下 AjaxResult 类中的方法:

        这就是课程管理中根据 id 来查询课程的详细信息的完整方法。之后的功能方法,所用到的类、方法都十分类似。

        6)BaseEntity 基类:

        每一个实体类都会继承该 BaseEntity 基类。

BaseEntity 基类变量、方法:

        若依认为,每一个实体类都应该具备 searchValue、createBy、createtime、updateBy、updateTime、remark、params 字段。

        所以每一个实体类都应该继承 BaseEntity 类。

小结:

        1)BaseController:web 层通用数据处理。提供了丰富的方法,比如:分页所涉及到的方法。

        2)TableDataInfo:用于将分页结果进行了封装,将封装好的字段返回给前端。

        3)AjaxResult:操作消息提醒,用于将非分页结果进行封装,将封装好的字段返回给前端。

        4)BaseEntity:Entity 基类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux权限和开发工具(1)

文章目录 1.Linux根目录的相关文件夹2.Linux软件管理器yum3.Linux编辑器-vim的基础使用1.命令模式下一些命令:有关光标的操作:有关复制删除的操作:有关字符替换的相关操作:有关注释的相关操作: 2.插入模式3.底行模式下一些命令:实现双窗口 4.vim命令 4.vim配置5.Linux编译器-gc…

华为OD机试 - 文本统计分析(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

在 Django 模板文件中出现错误:Could not parse the remainder: ‘!=0‘ from ‘!=0‘

问题在于我写了一条关于 {% if %} 标签中关于运算符 !0 的判断,出现 Could not parse the remainder: !0 from !0 错误 问题分析: 1、已确定 student 对象已经传递到模板中,并且 score 属性存在 2、确定 student.score 的值是可以与 0 进行…

前端开发设计模式——命令模式

目录 一、命令模式的定义和特点 1.定义: 2. 特点: 二、命令模式的结构与原理 1.结构: 2.原理: 三、命令模式的实现方式 1.定义接口命令: 2.创建具体的命令类: 3.定义接收者&…

blender分离含有多个动作的模型,并导出含有材质的fbx模型

问题背景 笔者是模型小白,需要将网络上下载的fbx模型中的动作,分离成单独的动作模型,经过3天摸爬滚打,先后使用了blender,3d max,unity,最终用blender完成,期间参考了众多网络上大佬…

编译器对连续构造的优化

一:优化的规则 在一行代码中连续进行:构造构造/构造拷贝构造/拷贝构造拷贝构造 都会合二为一 如下: a:构造构造->构造 b:构造拷贝构造->构造 c:拷贝构造拷贝构造->拷贝构造 注意&#xff…

KubeSphere v4 安装指南

日前,KubeSphere v4 发布,相较于之前的版本,新版本在架构上有了颠覆性的变化。为了让社区的各位小伙伴能够丝滑的从旧版本过渡到新版本,我们特别推出本篇安装指南文章,以供参考。 关于 KubeSphere v4 的介绍&#xff…

施磊C++ | 进阶学习笔记 | 5.设计模式

五、设计模式 文章目录 五、设计模式1.设计模式三大类型概述一、创建型设计模式二、结构型设计模式三、行为型设计模式 2.设计模式三大原则3.单例模式1.饿汉单例模式2.懒汉单例模式 4.线程安全的懒汉单例模式1.锁双重判断2.简洁的线程安全懒汉单例模式 5.简单工厂(Simple Facto…

MySQL 8.4修改user的host属性值

MySQL 8.4修改user的host属性值 update mysql.user set host localhost where user mysql用户名; MySQL 8.4修改初始化后的默认密码-CSDN博客文章浏览阅读804次,点赞6次,收藏11次。先下载mysql的zip压缩包:MySQL :: Download MySQL Communi…

(CWRU)轴承故障诊数据集和代码全家桶

包括 完整的CWRU轴承故障数据集, 以及已经生成制作好的一维故障信号数据集、时频图像数据集,对应代码均可以运行 点击下载:数据集和代码全家桶 环境:python 3.9 任何环境安装或者代码问题,请联系作者沟通交流&#xf…

操作符详解(C 语言)

目录 一、操作符的分类二、算数操作符1. 除法操作符2. 取余操作符 三、位移操作符1. 进制2. 原码、反码和补码3. 左移操作符&#xff08;<<&#xff09;和右移操作符&#xff08;>>&#xff09; 四、位操作符1. 按位与 &2. 按位或 |3. 按位异或 ^4. 按位取反 ~…

2018 年 NLP 的 10 个令人兴奋的想法

一、说明 这篇文章收集了有影响力的 10 个想法&#xff0c;我们将来可能会看到更多。 对于每个想法&#xff0c;我们将重点介绍 1-2 篇执行良好的论文。为了保持列表简洁&#xff0c;这里没有涵盖所有相关工作。该列表必然是主观的&#xff0c;涵盖主要与迁移学习和泛化相关的想…

老照片修复工作流教程:用 ComfyUI 轻松还原历史记忆

你是否有过这样的遗憾&#xff1f; 那些珍贵的老照片因为时间的流逝&#xff0c;早已失去了当年的色彩&#xff0c;变得模糊、褪色&#xff0c;甚至破损&#xff1f; 今天带你了解如何使用 ComfyUI 的老照片修复工作流&#xff0c;通过简单的几步操作&#xff0c;在短短十几秒…

三亚旅游微信小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

【深度学习代码调试1】环境配置篇(上) -- 安装PyTorch(安利方法:移除所有国内源,使用默认源)

【深度学习代码调试1】环境配置篇 -- 安装TensorFlow和PyTorch 写在最前面1. 创建新的Conda环境2. 安装PyTorch及相关库&#xff08;可以直接跳到2.3安装方法&#xff09;2.1 检查CUDA版本2.2 解决安装过程中常见问题2.2.1 超时问题&#xff08;这个不是最终解决方案&#xff0…

AUTOSAR_EXP_ARAComAPI的5章笔记(13)

☞返回总目录 5.4.7 事件&#xff08;Events&#xff09; 在骨架侧&#xff0c;服务实现负责通知事件的发生。如 5.4.2 RadarService Skeleton Class 所示&#xff0c;骨架为每个事件提供一个事件包装类的成员。骨架的事件包装类与代理的事件包装类看起来明显不同。 在骨架端…

论文阅读:On determining the hinterlands of China‘s foreign trade container ports

集装箱港口腹地的边界线&#xff0c;只要存在&#xff0c;就可以作为未来港口发展和基础设施规划的参考点。在早期划定中国港口腹地的努力中&#xff0c;要么考虑的港口数量有限&#xff0c;要么仅根据港口总吞吐量划定腹地。因此&#xff0c;这些研究都没有让我们清楚地了解共…

快速理解AUTOSAR CP的软件架构层次以及各层的作用

在 AUTOSAR CP 的架构中&#xff0c;软件分为 应用层 (App)、运行时环境 (RTE) 和 基础软件层 (BSW) 三个主要层级。下面是每一层的主要功能与简单的代码示例来展示它们之间的关系。 1. 概述 应用层 (App)&#xff1a;包含应用程序代码&#xff0c;主要实现业务逻辑。应用层通…

DeepFM模型代码详解

直到看到这篇文章&#xff0c;我才搞明白类别特征怎么做lookup的&#xff0c;也看明白了代码逻辑。如果你看完没懂&#xff0c;私信留下wx&#xff0c;给你讲懂。 1、Deepfm 的原理&#xff0c;DeepFM 是一个模型还是代表了一类模型&#xff0c;DeepFM 对 FM 做了什么样的改进…

【时时三省】(C语言基础)函数介绍strcat

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 strcat 字符串追加 示例&#xff1a; 比如我要把world加到hello后面去 就可以用这个 还有一种方法是这样 这两个代码的意思是一样的 只是写法不一样 写的时候要注意这些 •源字符串必须…