HZCU 软件系统设计与体系结构

这是这门课的复习过程,实在找不到样卷和资料,只能自己摸索了。

10分选择40分简答50分设计。设计我就参考大作业好了。哎呀考试设计就是自己设计数据库表结构,还有jpa实现。

等我考完出个目录和考试题目。

目录:

  • 大作业项目
  • 课程资料
    • 测试
    • 作业
    • 课件
    • 书本
  • 简答题CSDN
  • 选择题
  • 设计题
  • 考试内容
  • 资料分享

我的大作业项目

开发工具

前端:webstorm

后端:idea

使用技术

前端

Vue3

Vue-CLI 脚手架

Pinia进行全局状态管理

Axios请求库

Arco Design组件库进行前端设计

ESLint Prettier TypeScript规范代码

umijs生成前端代码

后端

Java Spring Boot 开发框架

MySQL数据库 ID雪花算法

MyBatisX自动生成数据访问层的代码

业务的流程

主要的过程差不多是这样

image-20240620033435465

功能梳理

用户模块

  • 登录
  • 注册
  • 管理用户 - 增删改查(仅管理员可用)

测评活动模块

  • 创建测评活动
  • 修改测评活动
  • 删除测评活动
  • 查看测评活动列表
  • 查看测评活动详情
  • 查看自己创建的测评活动
  • 管理测评活动 - 增删改查(管理员)
  • 审核发布和下架测评活动(管理员)
  • 测评活动分享(这个还没弄出来)

题目模块

  • 创建题目(名称、选项)
  • 修改题目
  • 删除题目
  • 管理题目 - 增删改查(管理员)
  • AI 生成题目

评分模块

  • 创建评分结果
  • 修改评分结果
  • 删除评分结果
  • 根据回答计算评分结果
    • 自定义测评类打分
    • 自定义规则类打分
    • AI评分
  • 管理评分结果 - 增删改查(管理员)

回答模块

  • 提交回答
  • 查看回答的评分结果
  • 查看自己提交的回答列表
  • 管理回答 - 增删改查(管理员)

统计分析模块

  • 测评活动结果分析

数据库设计

用户表

-- 用户表
create table if not exists user
(
    id           bigint auto_increment comment 'id' primary key,
    userAccount  varchar(256)                           not null comment '账号',
    userPassword varchar(512)                           not null comment '密码',
    unionId      varchar(256)                           null comment ,
    mpOpenId     varchar(256)                           null comment ,
    userName     varchar(256)                           null comment '用户昵称',
    userAvatar   varchar(1024)                          null comment '用户头像',
    userProfile  varchar(512)                           null comment '用户简介',
    userRole     varchar(256) default 'user'            not null comment '用户角色:user/admin/ban',
    createTime   datetime     default CURRENT_TIMESTAMP not null comment '创建时间',
    updateTime   datetime     default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
    isDelete     tinyint      default 0                 not null comment '是否删除',
    index idx_unionId (unionId)
) comment '用户' collate = utf8mb4_unicode_ci;

测评活动表

主要做了两种测评活动的类型,测评类测出对应回答结果,得分类测出对应分值

-- 测评活动表
create table if not exists app
(
    id              bigint auto_increment comment 'id' primary key,
    appName         varchar(128)                       not null comment '测评活动名',
    appDesc         varchar(2048)                      null comment '测评活动描述',
    appIcon         varchar(1024)                      null comment '测评活动图标',
    appType         tinyint  default 0                 not null comment '测评活动类型(0-得分类,1-测评类)',
    scoringStrategy tinyint  default 0                 not null comment '评分策略(0-自定义,1-AI)',
    reviewStatus    int      default 0                 not null comment '审核状态:0-待审核, 1-通过, 2-拒绝',
    reviewMessage   varchar(512)                       null comment '审核信息',
    reviewerId      bigint                             null comment '审核人 id',
    reviewTime      datetime                           null comment '审核时间',
    userId          bigint                             not null comment '创建用户 id',
    createTime      datetime default CURRENT_TIMESTAMP not null comment '创建时间',
    updateTime      datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
    isDelete        tinyint  default 0                 not null comment '是否删除',
    index idx_appName (appName)
) comment '测评活动' collate = utf8mb4_unicode_ci;

题目表

questionContent是json格式的

-- 题目表
create table if not exists question
(
    id              bigint auto_increment comment 'id' primary key,
    questionContent text                               null comment '题目内容(json格式)',
    appId           bigint                             not null comment '测评活动 id',
    userId          bigint                             not null comment '创建用户 id',
    createTime      datetime default CURRENT_TIMESTAMP not null comment '创建时间',
    updateTime      datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
    isDelete        tinyint  default 0                 not null comment '是否删除',
    index idx_appId (appId)
) comment '题目' collate = utf8mb4_unicode_ci;

评分结果表

resultProp是测评类型的测评活动

resultScoreRange是得分类型的测评活动

-- 评分结果表
create table if not exists scoring_result
(
    id               bigint auto_increment comment 'id' primary key,
    resultName       varchar(128)                       not null comment '结果名称',
    resultDesc       text                               null comment '结果描述',
    resultPicture    varchar(1024)                      null comment '结果图片',
    resultProp       varchar(128)                       null comment '结果属性集合 JSON',
    resultScoreRange int                                null comment '结果得分范围',
    appId            bigint                             not null comment '测评活动 id',
    userId           bigint                             not null comment '创建用户 id',
    createTime       datetime default CURRENT_TIMESTAMP not null comment '创建时间',
    updateTime       datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
    isDelete         tinyint  default 0                 not null comment '是否删除',
    index idx_appId (appId)
) comment '评分结果' collate = utf8mb4_unicode_ci;

用户答题记录表

choice是json格式的,所以多选题等类型应该也可以实现,但还没弄

-- 用户答题记录表
create table if not exists user_answer
(
    id              bigint auto_increment primary key,
    appId           bigint                             not null comment '测评活动 id',
    appType         tinyint  default 0                 not null comment '测评活动类型(0-得分类,1-角色测评类)',
    scoringStrategy tinyint  default 0                 not null comment '评分策略(0-自定义,1-AI)',
    choices         text                               null comment '用户答案(JSON 数组)',
    resultId        bigint                             null comment '评分结果 id',
    resultName      varchar(128)                       null comment '结果名称,如物流师',
    resultDesc      text                               null comment '结果描述',
    resultPicture   varchar(1024)                      null comment '结果图标',
    resultScore     int                                null comment '得分',
    userId          bigint                             not null comment '用户 id',
    createTime      datetime default CURRENT_TIMESTAMP not null comment '创建时间',
    updateTime      datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
    isDelete        tinyint  default 0                 not null comment '是否删除',
    index idx_appId (appId),
    index idx_userId (userId)
) comment '用户答题记录' collate = utf8mb4_unicode_ci;

后端开发

是在一个后端模板上进行修改进行开发的

1.数据访问层

通过MyBatisX生成mapper和数据库实体类,然后挪到相应位置并修改。

2.业务逻辑层

通过了一个开源项目CodeGenerator生成controller、service接口和实现类、数据模型包装类、枚举类。然后进行修改完善。

3.数据模型开发

编写数据模型包装类(请求类和视图类)、JSON结构对应的类、枚举类。

4.接口开发

controller接口开发。

5.服务开发

编写Service接口和实现类,完善数据校验之类的逻辑。

6.Swagger接口文档测试

这个后端模板可以直接通过swagger可视化测试,很方便。

7.业务开发

测评活动模块

  • 审核发布和下架测评活动(管理员)

评分模块

  • 根据回答计算评分结果
    • 自定义测评类打分
    • 自定义规则类打分

回答模块

  • 提交回答

前端开发

使用技术:

Vue3

Vue-CLI 脚手架

Pinia进行全局状态管理

Axios请求库

Arco Design组件库进行前端设计

ESLint Prettier TypeScript规范代码

umijs生成前端代码

Prettier可以代码美化,ESLint可以自动校验,TypeScript可以类型校验,这些vue脚手架都会配置好

引入arco design组件库进行开发,全局使用的是上中下布局

请求

请求使用axios请求库和umijs生成完成

请求配置request.ts中withCredentials设置成true才能携带cookie完成登录

执行openapi可以生成请求代码

状态管理

pinia

store导出,例如useLoginUserStore

权限管理

access权限管理相关的代码

accessEnum.ts权限枚举类

routes.ts中配置access

通用权限校验方法checkAccess.ts

全局权限校验index.ts,这个是校验页面的

AI智能使用

AiManager中封装ai模块

AI生成题目

AI生成题目请求类AiGenerateQuestionRequest

Question中定义prompt

AI生成接口@PostMapping(“/ai_generate”)

AI智能评分

题目答案封装类QuestionAnswerDTO

AiTestScoringStrategy中定义prompt

同时也在AiTestScoringStrategy中实现应用

课程资料

测试

上课做过3次测试,很可能是选择题,但是关闭了。不过我从犄角旮旯里翻出来了哈哈哈。

测试1 springboot

1.REST是什么的缩写?A
A.Representational State Transfer B.Resource State Transfer C.Resource Status Transfer D.Representational Status Transfer

2.RESTful web services使用哪种数据格式来传输数据?D
A.XML B.JSON C.HTML D.所有都可以

3.RESTful web services使用哪种HTTP方法来创建资源?B
A.GET B.POST C.PUT D.DELETE

4.Spring Boot是用于开发什么类型的应用的?A
A.Web应用 B.桌面应用 C.移动应用 D.都可以

5.Spring Boot的主要优点是什么?D
A.简化了依赖管理 B.提供了自动配置和嵌入式服务器 C.支持了微服务架构和云部署 D.这些优点都是

6.Spring Boot使用哪个注解来标记一个类为主类?B
A.@SpringBootConfiguration B.@SpringBootApplication C.@EnableAutoConfiguration D.@ComponentScan

7.Spring Boot 如何简化基于 Spring 的应用程序的配置 A
A.自动配置必要的 bean 和依赖项 B.使用注释来配置 Bean 和依赖项 C.允许使用 XML 配置文件 D.提供用于配置应用程序的命令行界面

8.如何打包和分发 Spring 引导应用程序?A
A.作为 JAR 文件 B.作为WAR 文件 C.作为 ZIP 文件 D.以上所有内容

9.哪个 Spring 注解用于使用 Spring MVC 创建 RESTful Web 服务?A
A.@RestController B.@Controller C.@Component D.@Rest

10.@RestController是以下两个注解的组合 B
A.@Component和@ResponseBody B.@Controller和@ResponseBody C.@Service和@ResponseBody D.以上都不是

测试2 jpa

1.可用于为 Spring Boot 应用程序创建可执行 jar 文件的插件名称是什么?C
A.spring-boot-maven-plugin B.spring-boot-gradle-plugin C.A 或 B 取决于构建工具 D.以上都不是

2.Spring Boot默认使用的嵌入式web服务器是什么?B
A. Jetty B.Tomcat C.Undertow D.Netty

3.在 Spring Boot 应用程序中可用于注入依赖项的注解名称是什么?A
A.@Autowired B.@Bean C.@Override D.@Test

4.可用于在 Spring Boot 应用程序中公开 RESTful Web 服务端点的注释的名称是什么?A
A.@RestController B.@Controller C.@WebService D.@Endpoint

5.可用于将 Spring Boot 应用程序作为 JUnit 测试运行的注释的名称是什么?A
A.@SpringBootTest B.@SpringBootRunner C.@SpringBootTestRunner D.以上都不对

6.可用于使用 JPA 和 Hibernate 向 Spring Boot 应用程序添加数据访问功能的起始依赖项的名称是什么?A
A.spring-boot-starter-data-jpa B.spring-boot-starter-hibernate C.spring-boot-starter-jdbc D.以上都不对

7.Spring Boot JPA 中使用哪个注解启用事务管理?D
A.@Transactional B.@EnableTransactionManagement C.@Transaction D.@Transactional 和@EnableTransactionManagement

8.Spring Boot JPA 中哪个注解用于指定对存储库方法的自定义查询?C
A.@NativeQuery B.@NamedQuery C.@Query D.@Excute

9.可用于向 Spring Boot 应用程序添加测试功能的起始依赖项的名称是什么?A
A.spring-boot-starter-test B.spring-boot-starter-junit C.spring-boot-starter-mockito D.都不对

10.可用于向 Spring Boot 应用程序添加安全功能的起始依赖项的名称是什么?B
A.spring-boot-starter-oauth2 B.spring-boot-starter-security C.spring-boot-starter-auth D.都不对

测试3 redis

1.Redis 是一个 NoSQL 数据库,它以 ____ 格式存储值。B
A.文档格式 B.键值存储 C.Column-oriented D.Graph format

2.Redis 中使用以下哪个命令以字符串格式存储键名?C
A.Get B.Put C.Set D.Post

3.Redis 中的哪种数据类型是字符串字段和字符串值之间的映射?B
A.Strings B.Hashes C.Lists D.Sets

4.以下哪个命令用于将指定字段设置为存储在键处的哈希中的特定值?C
A.Set B.Get C.HMSET D.HMGET

5.以下哪种数据类型通常称为字符串的无序集合?D
A.Strings B.Hashes C.Lists D.Sets

6.以下哪个命令用于删除key A
A.Del B.Dump C.Expire D.Delete

7.如果要求您查找与指定模式匹配的所有键,您将使用以下哪个命令?B
A.Like pattern B.Keys pattern C.Like keys Pattern

8.以下哪个命令用于检查key是否存在?D
A.Is_there B.Is_key C.Exist key D.Key_exist

9.当您要检索键的值时,使用以下哪个命令?B
A.SET B.GET C.GETSET D.GETRANG

10.以下哪种数据类型是较好的表示 Redis 中对象的数据类型?B
A.Strings B.Hashes C.Lists D.Sets

作业

感觉没什么好考的吧,有很多还是复现书上的。不过好像听说会考书上的代码。最后没考哈哈。

课件

00 第一课

image-20240626212308825

JavaEE:Java Enterprise Edition就是基于Java语言构建的一些支持后台开发的技术规范,这些技术规范被称为JSR,Java EE由几十个JSR组成 Tomcat

01 springboot基础

Maven 是一个项目管理和整合工具。为开发者提供了一套完整的构建生命周期框架。在有多个开发团队环境的情况下,Maven 能够在很短的时间内使得每项工作都按照标准进行。Maven最核心的能力包括:构建,文档生成,报告,依赖,发布,分发。Maven 简化了工程的构建过程,并对其标准化。它无缝衔接了编译、发布、文档生成、团队合作和其他任务。

Project Object Model (POM) 基本可以认为让Maven工作就是为自己的项目定义一个恰当的pom文件。

Spring Framework是Spring起始的项目,也是以Java EE为基础构建的开发框架,现在仍旧是Spring应用的核心。

POJO( Plain Ordinary Java Object ):POJO是一个简单的普通的Java对象,它不包含业务逻辑或持久逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。IoC(DI):反转控制(依赖注入)Aspect:切面;AOP:面向切面的程序设计;Context:上下文,可以理解为一个运行环境极其包含变量、定义等;Bean:被Spring容器管理的,用于注入的Java对象;MVC:Spring Web框架(Model-View-Controller设计模式)

Spring是为了解决JavaEE标准复杂性问题而诞生的一个开发框架。

02 springboot入门程序

maven/spring initializr。SpringBootConfiguration、EnableAutoConfiguration、ComponentScan,所以我们可以把SpringBootApplication看做上面三个标注的一个“包装”。1.Java Properties文件2.YAML格式配置文件

配置包含两个含义:提供配置文件加载功能和配置Spring如何创建Bean。最核心的配置标注包括:@ConfigurationProperties@Value@PropertySource@Configuration@EnableConfigurationProperties

03 分层开发web应用技术

应用程序分层开发模式–MVC。View可以简单的理解为用户交互界面。前端 MVC 框架前端View通过 Ajax 得到数据,自身也分为了MVC的层次。前端代码变得也需要保存数据、处理数据、生成视图,从而使得前端View演进为了前端App,后端退回到纯服务设计(RESTful)。

视图技术Thymeleaf。控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。@RequestMapping的作用是建立请求URL和处理方法之间的对应关系@RestController = @Controller + @ResponseBody组成

04 响应式编程

响应式编程是一种程序构造模式,不同于普通的程序设计,一般我们采用同步顺序的概念来组织代码调用,响应式采用异步的组织方式。观察者模式:主题(Subject)主题实现者(ConcreteSubject)观察者(Observer)观察实现者(Concrete Observer)

1)响应式编程是一种程序设计结构。2)响应式编程通过“事件源”“事件流”、“订阅者”,基于观察者模式来设计程序结构。3) 在编程实践上需要基于组合(数据、操作)流来完成一个实际工作,基于异步思想。4)响应式编程的目标:响应式系统更加灵活、松耦合和可伸缩。 这使得它们的开发和调整更加容易。 它们对系统的失败也更加的包容, 而当失败确实发生时, 它们的应对方案会是得体处理而非混乱无序。 响应式系统具有高度的即时响应性, 为用户提供了高效的互动反馈。

WebFlux是Spring基于响应式编程思想构建后端应用程序(包括前后端交互)的新框架,和SpringMVC相对应。核心是使用了Java的一个响应式编程的框架Reactor。一个是模仿SpringMVC模式一个是基于响应式开发的Reactive模式。

05 springboot进阶

AOP的全称是Aspect-Oriented Programming,即面向切面编程。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。

业务处理中,通常都会进行事务处理、日志记录等操作。虽然使用OOP可以通过组合或者继承的方式来达到代码的重用,但如果要实现某个功能(如日志记录),同样的代码仍然会分散到各个方法中。这样,如果想修改某个功能,就必须要修改所有的相关方法。这不但增加了开发人员的工作量,而且提高了代码的出错率。为了解决这一问题,AOP思想随之产生。AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。这种采用横向抽取机制的方式,采用传统的OOP思想显然是无法办到的。虽然AOP是一种新的编程思想,但却不是OOP的替代品,它只是OOP的延伸和补充。

AOP的使用,使开发人员在编写业务逻辑时可以专心于核心业务,而不用过多的关注于其他业务逻辑的实现,这不但提高了开发效率,而且增强了代码的可维护性。

Pointcut:切面与程序流程的交叉点,即那些需要处理的连接点。Aspect:封装的用于横向插入系统功能(如事务、日志等)的类。Joinpoint:在程序执行过程中的某个阶段点。Proxy(代理):将通知应用到目标对象之后,被动态创建的对象。Weaving(织入):将切面代码插入到目标对象上,从而生成代理对象的过程。

IoC(Inversion of Control),中文称之为控制反转。它与依赖注入Dependency Injection(DI)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。Ioc在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是控制反转。DI从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。

降低耦合度的核心方法是引入一个对象(这里称为IoC容器)来“组合”对象,不让对象之间直接发生 “关系”

过滤器(Filter)是一个可以对请求或响应的头和内容以及整个请求或响应进行转换的对象。过滤器的功能包括:分析Web请求,并执行相应的预处理。阻塞请求-响应关系,使请求不再传递。根据功能修改请求的头信息和数据体内容。根据功能修改响应的头信息和数据体内容。和其他Web资源进行交互。

在servlet生命周期中,可以通过定义一个监听对象来监听它的生命周期,当生命周期事件发生时,该监听对象就会被调用。要使用这些监听对象,必须定义并配置监听类。通过实现一个监听器接口来定义监听器类。监听器的三种类型:1、监听ServletContext、Request、Session作用域的创建和销毁2、监听ServletContext、Request、Session作用域中属性变化(增删改)3、监听HttpSession中对象状态的改变(被绑定、解除绑定、钝化、活化)

元注解在JDK中已被定义,元注解主要用于对自定义的注解进行描述,也可以理解为注解的注解。JDK定义了四种元注解,用来对注解的位置、作用范围、文档抽取、继承进行描述。这四种元注解分别是:@Target、@Retention、@Documented、@Inherited,下面分别对这四种元注解进行说明。@Target是:@Target({METHOD,TYPE}),表示他可以用在方法和类型上(类和接口),但是不能放在属性等其他位置。 @Retention 表示生命周期。@Inherited注解的作用是:使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。@Documented注解的作用是:描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。@interface该注解用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。

Java异常机制用到的几个关键字:try、catch、finally、throw、throws。基于@ControllerAdvice注解的Controller层的全局异常统一处理

JUnit 促进了“先测试后编码”的理念,强调建立测试数据的一段代码,可以先测试,然后再应用。

06 springdataJPA

JDBC:Java操作数据库(关系数据库)的接口。Hibernate和MyBatis:基于OR-Mapping思想开发的数据库操作框架。JPA:Java官方为OM-Mapping操作提供的对象存储规范。Spring Data JPA:是Spring Data项目的组成部分,为基于JPA快速方便的实现数据库访问提供支持(包括关系数据库,非关系数据库等)。

JDBC可以看做Java语言访问各种关系数据库(比如MySQL、Oracle、SQLServer等)的规范接口。

ORMapping的概念很简单,就是用一种方便的方法将关系数据库的表结构映射为面向对象语言中的对象,并且对数据库操作(CRUD)提供全面的支持。

Spring Data JPA是Spring Data的一个组成部分,专门用于支持Java JPA规范。并且Spring Data JPA的底层使用的是Hibernate框架。

07 mybatis操作数据库

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。@Insert@Select @Update@Delete @Param : 入参@Results : 设置结果集合@Result : 结果@ResultMap : 引用结果集合@SelectKey : 获取最新插入id

配置分页功能:1.依赖pagehelper提供分页的支持thymeleaf页面支持2.配置分页的风格和属性3.分页列表控制器4.创建分页视图5.增加mapper中返回page对象

MyBatis 真正的力量是在映射语句中。SQL 映射文件有很少的几个顶级元素(按照它们被定义的顺序):cache – 配置给定命名空间的缓存。cache-ref – 从其他命名空间引用缓存配置。resultMap – 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。sql – 可以重用的 SQL 块,也可以被其他语句引用。insert – 映射插入语句update – 映射更新语句delete – 映射删除语句select – 映射查询语句

JPA基于HibernateDAO层开发比MyBatis简单,MyBatis需要维护SQL和结果映射简单的增删改查比MyBatis简单不同的数据库一致性比较好更好的缓存机制

多表关联的复杂情况实现更灵活使用相对比较简单有SQL基础建议使用MyBatis,无SQL基础则建议使用JPA

08 接口架构风格restful

RESTful的方式就是前后端分离的方式,下,核心是Ajax + 后端接口设计模式。JavaScript ajax,返回json。

“资源”,就是网络上的一个实体,或者说是网络上的一个具体信息。网络上的所有事物都被抽象为资源。每个资源都有一个唯一的资源标识符。同一个资源具有多种表现形式(xml,json等)。对资源的各种操作不会改变资源标识符。所有的操作都是无状态的。符合 REST 原则的架构方式即可称为 RESTful。

RESTful设计风格统一后,可以很好的对各种前端提供一致的后台服务设计,通常需要处理的几个细节。

版本控制1)使用URI路径模式:比如http://a.b.c/api/user/v1、 http://a.b.c/api/user/v22)使用域名映射模式:比如http://v1.a.b.c/api/user/、 http://v2. a.b.c/api/user/3)自定义Http协议头的方法,比如加入Api-Version

定义统一的返回格式一般会统一返回报文,包括处理成功标志、错误code、错误消息和实际返回参数体。

swagger是一个完整的针对RESTful接口进行设计,测试,文档化的工具。

RestTemplate是Spring提供的可以快速访问RESTful接口的客户端库,可以简化对RESTful接口的访问,一般用于作为客户端时或者测试时使用。

2XX——表明请求被正常处理了

200 OK:请求已正常处理。

3XX——表明浏览器需要执行某些特殊的处理以正确处理请求

301 Moved Permanently:资源的uri已更新,你也更新下你的书签引用吧。永久性重定向,请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。

4XX——表明客户端是发生错误的原因所在。

400 Bad Request:服务器端无法理解客户端发送的请求,请求报文中可能存在语法错误。

401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。

403 Forbidden:不允许访问那个资源。该状态码表明对请求资源的访问被服务器拒绝了。(权限,未授权IP等)

404 Not Found:服务器上没有请求的资源。路径错误等。

5XX——服务器本身发生错误

500 Internal Server Error:貌似内部资源出故障了。该状态码表明服务器端在执行请求时发生了错误。也有可能是web应用存在bug或某些临时故障。

503 Service Unavailable:抱歉,我现在正在忙着。该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。

09 实现安全认证和授权

Spring Security:是一个提供身份验证,授权和保护以防止常见攻击的框架。 凭借对命令式和反应式应用程序的一流支持,它为Spring应用程序的安全提供实际标准。应用的安全性包括用户认证(Authentication) 和 用户授权(Authorization) 两个部分。①用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。② 用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

1.用户输入用户名和密码登录2.用户提交表单,进入UsernamePasswordAuthenticationFilter过滤器,通过调用attemptAuthentication方法将用户名、密码包装成UsernamePasswordAuthenticationToken对象,并传给AuthenticationManager3.AuthenticationManager认证token4.AuthenticationManager认证成功,返回5.Authentication对象Authentication对象赋值给当前SecurityContext,建立该用户的安全上下文用户进行一些授权访问控制机制保护操作

Spring Security支持在定义URL访问或者方法访问权限时使用Spring EL Expression Language表达式,根据表达式返回的值True False来确定是否授权Spring EL支持如下表达式:基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算、正则表达式、括号优先级表达式;类相关表达式:类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用;集合相关表达式:内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;其他表达式:模板表达式。

JSR-250注解  要使用JSR-250注解,首先我们需要通过设置global-method-security元素的jsr250-annotation=”enabled”来启用基于JSR-250注解的支持,默认为disabled。 @EnableGlobalMethodSecurity( jsr250Enabled = true)

支持表达式的注解  Spring Security中定义了四个支持使用表达式的注解,分别是@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter。其中前两者可以用来在方法调用前或者调用后进行权限检查,后两者可以用来对集合类型的参数或者返回值进行过滤。

RBAC是Role-BasedAccess Control的英文缩写,意思是基于角色的访问控制。RBAC认为权限授权实际上是Who、What、How的问题。在RBAC模型中,who、what、how构成了访问权限三元组,也就是“Who对What(Which)进行How的操作,也就是“主体”对“客体”的操作,其中who——是权限的拥有者或主体(如:User、Role),what——是资源或对象(Resource、Class)

在生产环境中,对发布的API增加授权保护是必须的,JWT作为无状态的授权校验技术,适合分布式系统架构。服务器端不需要保存用户状态,无需Redis等实现各服务节点之间共享Session数据。

Apache Shiro是一种功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理,可用于保护任何应用程序的安全-从命令行应用程序,移动应用程序到最大的Web和企业应用程序。Shiro提供了用于执行以下方面的应用程序安全性API:身份验证-证明用户身份,通常称为用户“登录”。授权-访问控制。密码术-保护或隐藏数据以防被撬。会话管理-每个用户的时间敏感状态

Shiro的体系结构具有三个主要概念:Subject(主体,即用户):表示“当前正在执行的用户”SecurityManager(安全管理器):主题代表当前用户的安全操作,而SecurityManager管理所有用户的安全操作。Realms:域充当Shiro与应用程序的安全数据之间的“桥梁”或“连接器”。

10 集成redis

命中率:命中率=返回正确结果数/请求缓存次数,命中率问题是缓存中的一个非常重要的问题,它是衡量缓存有效性的重要指标。命中率越高,表明缓存的使用率越高。

空间:缓存中可以存放的最大元素的数量,一旦缓存中元素数量超过这个值(或者缓存数据所占空间超过其最大支持空间),那么将会触发缓存启动

清空策略清空策略:FIFO(first in first out)、LFU(less frequently used)、LRU(least recently used)等

Spring Cache是Spring提供的一套缓存解决方案,它并不提供具体的缓存功能,提供统一的接口、代码规范、配置和标注等,用于集成各种可选的缓存框架。 在启用了Spring Cache之后,可以标注 “支持缓存”的方法,当调用一个“支持缓存”的方法时,Spring会将方法的返回值(key/value)存放到缓存中,下次当使用相同的参数调用该方法时,将直接返回缓存的结果。@EnableCaching:开启缓存、Spring配置缓存@Cacheable:标注一个类或者方法,说明“支持缓存”@CachePut:调用方法,结果进行缓存@CacheEvict:清除缓存内容@Caching:组合多个缓存注解用

Redis是一个远程内存数据库(非关系型数据库),性能强劲,可以存储键值对与5种不同类型的值之间的映射,可以将存储在内存的键值对数据持久化到硬盘。注意Redis是:1) in-memory data structure store2) used as a database, cache, and message broker3) 支持多种数据结构,不仅仅是Key/Value模式4)支持内置多种机制,包括事务、复制、Lua脚本、LRU清除策略等

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis支持数据的备份,即master-slave模式的数据备份。Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性。Redis还支持 publish/subscribe, 通知, key 过期特性。Redis具有非常高的性能

RedisTemplate是Spring提供的对Redis命令的封装,所以使用Spring时可以利用RedisTemplate来操作Redis。

Spring还提供了一个StringRedisTemplate类,这个类更多的是针对存储的key和value可以序列化为“字符串”的情况下使用。 StringRedisTemplate集成自前述的RedisTemplate,最大的不同就是序列化用的方法不同。

使用Spring框架我们之前实现了基于ORM框架(JPA或者MyBatis)的CURD操作,集成Spring Cache框架后,我们配置Redis即可实现在基本数据库操作上的缓存操作。基本步骤(示例L10RedisCURD):1)添加Redis、MySQL、MyBatis的依赖2)配置各个部件3)创建缓存管理器4)使用Spring Cache的各个标注设计缓存机制

11 集成rabbitMQ

消息队列已经逐渐成为分布式应用场景、内部通信、以及秒杀等高并发业务场景的核心手段,它具有低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。无论是 RabbitMQ、RocketMQ、ActiveMQ、Kafka还是其它等,都有的一些基本原理、术语、机制等。消息生产者Producer:发送消息到消息队列。消息消费者Consumer:从消息队列接收消息。Broker:概念来自与Apache ActiveMQ,指MQ的服务端,帮你把消息从发送端传送到接收端。消息队列Queue:一个先进先出的消息存储区域。消息按照顺序发送接收,一旦消息被消费处理,该消息将从队列中删除。

设计broker考虑。1)消息的转储:在更合适的时间点投递,或者通过一系列手段辅助消息最终能送达消费机。2)规范一种范式和通用的模式,以满足解耦、最终一致性、错峰等需求。3)其实简单理解就是一个消息转发器,把一次RPC做成两次RPC。发送者把消息投递到broker,broker再将消息转发一手到接收端。总结起来就是两次RPC加一次转储,如果要做消费确认,则是三次RPC。

应用场景:推送通知。异步任务。多平台应用通信。消息延迟。远程过程调用。RabbitMQ的6种工作模式:简单模式,工作队列模式,交换机模式,Routing转发模式,主题转发模式,RPC模式。

Erlang开发工具。哪些场景需要使用消息中间件,分别用什么模式?消息中间件在不同的业务场景下发挥着重要的作用,以下是一些常见的使用场景及其适用的模式:1.异步通信 当业务流程中某些操作不需要立即处理时,可以使用消息中间件进行异步处理,例如注册后发送邮件或短信通知。适用模式包括点对点(PTP)和发布/订阅(Pub/Sub)。2.系统解耦 在微服务架构中,消息中间件可以用于服务之间的解耦,比如订单服务和库存服务之间的通信,适用模式主要是点对点(PTP)。3.大数据处理 消息中间件可以作为大数据架构的一部分,用于数据的收集、传输和实时处理,适用模式可能是发布/订阅(Pub/Sub)或Partition模型。4.日志收集与分析 Kafka等消息中间件常用于日志数据的收集和传输,便于后续的日志分析和监控,通常使用发布/订阅(Pub/Sub)模式。5.事件驱动架构 在构建事件驱动的系统时,消息中间件可以作为事件总线,支持微服务间的通信,适用模式可能包括点对点(PTP)和发布/订阅(Pub/Sub)。6.流量削峰填谷 在高流量场景下,如电商大促,消息中间件可以缓冲瞬时高峰流量,适用模式可能是点对点(PTP)。7.数据同步与备份 用于不同系统间的数据同步或数据备份到远程存储,适用模式可能是点对点(PTP)。8.延时任务和定时任务 利用消息中间件的延迟队列特性,可以处理需要在特定时间点执行的任务,适用模式可能是点对点(PTP)。9.分布式事务 在需要确保跨多个系统操作的原子性时,可以使用支持分布式事务的消息中间件,如RocketMQ,适用模式可能包括点对点(PTP)和Partition模型。10.消息顺序保证 对于需要保证消息顺序的业务场景,如交易系统,可以使用支持消息顺序保证的消息中间件模式,如Partition模型。

书本

书本笔记我就记书本上了。主要是过一遍大致内容,要知道大概讲了什么。然后目录其实挺清晰的。

简答题CSDN

如何设计一个API接口?

1.定义功能和目标:首先确定API的功能和要达成的目标。考虑到需求和用户期望,明确API的用途和作用。2.设计合适的资源结构:根据业务需求,确定API暴露的资源结构。资源结构可以是一些实体、对象或者集合,每个资源都应该有一个独立的标识符和相应的属性。3.选择合适的HTTP方法:根据所需操作的类型,选择合适的HTTP方法。常用的HTTP方法有GET、POST、PUT、PATCH和DELETE等,它们分别对应获取数据、创建数据、更新数据、部分更新数据和删除数据的操作。4.设计清晰的URL路径:为每个资源提供一个唯一的、易于理解的URL路径,用于标识资源。URL路径应该使用名词而不是动词,并遵循一致的命名规则。5.定义请求和响应格式:明确定义API的请求和响应格式,包括参数类型、数据编码方式、响应状态码和错误处理机制等。6.身份验证和权限控制:根据业务需求,设计适当的身份验证和权限控制机制,以保护API免受未经授权的访问。7.错误处理和异常情况:定义清晰的错误处理机制和异常情况下的响应方式。提供可读性强的错误信息,帮助用户快速定位问题。8.API版本管理:根据业务需要,设计良好的API版本管理机制,以便为未来的更新和改进留出空间,并确保向后兼容性。9.文档编写和发布:编写详细的API文档,描述API的用途、参数、请求和响应格式、示例和使用方法等。将API文档发布在合适的平台上,方便开发者查阅和使用。10.安全性和性能考虑:在设计API时,要考虑安全性和性能因素。通过使用HTTPS协议进行安全传输、限制访问频率、进行输入校验等措施来增加安全性和提高性能。

什么是springboot

Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用Spring 的难度,简省了繁重的配置,提供了各种启动器,使开发者能快速上手。springboot是一个基于spring框架的快速开发脚手架,可以帮助开发者快速搭建spring应用程序。

为什么要用springboot,和springcloud的区别

快速开发,快速整合,配置简化、内嵌服务容器。SpringBoot是快速开发的Spring框架,SpringCloud是完整的微服务框架,SpringCloud依赖于SpringBoot。

springboot的优点

1.容易上手,提升开发效率,为 Spring 开发提供一个更快、更简单的开发框架。2.开箱即用,远离繁琐的配置。3.提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。4.SpringBoot总结就是使编码变简单、配置变简单、部署变简单、监控变简单等等

简化配置:springboot可以自动配置大部分的应用程序,开发者只需要少量的配置就可以快速搭建应用程序。微服务支持:可以轻松地构建微服务应用程序。内嵌服务器:可以内嵌tomcat、jetty等服务器,方便开发者进行开发和测试。

springboot的核心注解

启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项, 例如: java 如关闭数据源自动配置功能: SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。@ComponentScan:Spring组件扫描。

springboot starter工作原理

在sprinBoot启动时由@SpringBootApplication注解会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建spring容器中的bean,并且进行自动配置把bean注入SpringContext中 //SpringContext是Spring的配置文件)

springboot2.x新特性

配置变更。JDK 版本升级。第三方类库升级。响应式 Spring 编程支持。HTTP/2 支持。配置属性绑定。更多改进与加强。

springboot读取配置

Spring Boot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationPropertie注解来绑定变量。

springboot打包的jar包

Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在\BOOTINF\classes 目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。

选择题

看前面的测试和CSDN找到的题目做。

设计题

看书本的实例,也参考大作业、系统架构图等资料。唉,没复习到。

考试内容

选择题:5道选择10分,有4道测试里的,但还是错了这题…因为我一直以为是A,题目不需要考虑全局开关,结果是D,服了,题目出得不清楚。

7.Spring Boot JPA 中使用哪个注解启用事务管理?A×D√
A.@Transactional B.@EnableTransactionManagement C.@Transaction D.@Transactional 和@EnableTransactionManagement

简答题45分:

springboot优点和特点

自动配置如何实现和便捷性体现

什么是aoc,应用场景

设计题45分:

设计表结构,体现表关系,方便权限管理20分

jpa实现增删改查,模糊查询25分

资料分享

资料分享了:

  • 测试题目
  • 实验内容

链接:https://pan.baidu.com/s/1UJXXni-3HhBBQziRM_jV5Q?pwd=1234
提取码:1234
–来自百度网盘超级会员V3的分享

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值