Springboot项目问题记录

注解

1、mybatis.mapper-locations在SpringBoot配置文件中使用,作用是扫描Mapper接口对应的XML文件,如果全程使用@Mapper注解,可以不使用该配置。
2、@MapperScan会扫描Mapper接口类,并生成对应的实现类。

注意: 如果Mapper.xml文件和Dao接口在同一级包下,则
mapper.locations不需要在application.yml中配置。

@MapperScan是替代@Mapper的便捷写法,二者可以相互替换。

案例: 前提:mapper映射文件和dao接口文件在同一级目录下且映射文件名和接口文件名对应相同时,仅仅使用@Mapper注解或者@MapperScan注解即可。否则需要在application.yml 文件中配置mybatis.mapper-locations参数。

注意!!! yml每一个配置语句开头内容必须顶格,否则编译失败!!!!
MySQL驱动

com.mysql.jdbc.Driver 是 mysql-connector-java 5中的;
com.mysql.cj.jdbc.Driver 是 mysql-connector-java 8中的。

@Requestbody @RequestBody注解的使用(下)

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);
GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。

在后端的同一个接收方法里,@RequestBody
与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam

原因:

@requestbody的含义是在当前对象获取整个http请求的body里面的所有数据,因此spring就不可能将这个数据强制包装成Course或者List类型,并且从@requestbody设计上来说,只获取一次就可以拿到请求body里面的所有数据,就没必要出现有多个@requestbody出现在controller的函数的形参列表当中

如果想解决这种问题:
1.新建一个包装上面两种entity的entity类:
2…用Map<String, Object>接受request body,自己反序列化到各个entity中。

java基础

构造方法是特殊的方法,是类的初始化入口,是规定有的,就像我们建房子来住必须造门一样。
静态方法为什么不能调用非静态方法,因为非静态方法必须要实例对象才能调用,但构造方法不需要,相反,实例对象还需要经过构造方法之后才能创建。
如果一个门必须要从里面才能用,那这个门就没意义了。(当然门的举例,是无论多少个门只能使用一个门,这样才符合类的特性,毕竟类有多个构造方法,但每次只能用一个初始化)

SpringMVC

在SpringMVC重要注解(一)@ExceptionHandler和@ResponseStatus我们提到,如果单使用@ExceptionHandler,只能在当前Controller中处理异常。但当配合@ControllerAdvice一起使用的时候,就可以摆脱那个限制了。

PageHelper应用

springboot集成pagehelper完成分页功能。其中一种方式

  1. pom.xml 文件中引入依赖(官网上有案例)
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>x.x.x</version>
</dependency>`
  1. 配置文件中
    pagehelper: helper-dialect: mysql
  2. service中使用
    在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。
PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页
List<User> list = userMapper.selectIf(1);
assertEquals(2, list.get(0).getId());
assertEquals(10, list.size());
//分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>
assertEquals(182, ((Page) list).getTotal());`
@RestController

@RestController是@ResponseBody和@Controller的组合注解。

Vue基础知识

slot-scope=“scope” 来取得作用域插槽:data绑定的数据,scope可以随便替换其他名称,只是定义对象来代表取得的data数据,便于使用。
:abc=“a” ,父组件中可以用scope.abc来获取数据
即父组件获得子组件的初始预定的数据,然后按照自己的需要重新处理,并替换初始设置的插槽内容。

  • 子组件里设置插槽slot标签,父组件中设置最终数据设置。父组件的设置插入替换到子组件的插槽中。
  • 具名插槽–> 在子组件中给插槽赋一个name属性。在父组件中可以用name来确定使用哪个插槽。对应的插槽被父组件内容插入替换。
elementui 中slot-scope = scope

scope就相当于是tableData的一行,与el-table-column唯一对应
还有重要的一点,scope又并非是整个table,我们只是能通过scope.row获得当前的行数据

Vue 父子组件之间的通信

父传子组件: 子组件对象中设置props的属性,用来接收父组件的数据;同时父组件中必须在子组件标签中自定义一个v-bind 绑定的属性,名称随意。例如父组件中在子组件标签中添加属性 v-bind:movie=“xxx”, 子组件对象中有属性 props:[‘movie’]

.syn 和v-if

sync分析之为啥el-dialog中的visible需要使用.sync
在VUE中,子组件向父组件通信是通过事件完成的,this.$emit

我们点击子组件关闭按钮时,调用一下父组件的更新事件,让父组件在这个更新事件中改变visible这个变量,就可以实现子组件关闭了

.sync这个指令实际上是一个语法糖,在visible属性变化时会调用父组件的update:visible事件

关于vue修饰符.sync引自他人博客
也就是说在子组件通过事件更改了父组件属性值时还要同步更新该值。起到一个刷新作用。类似于v-modal触发的是父组件的input事件,.sync触发的是父组件的update事件

ElementUI 中 command使用

搭配 trigger=‘click’ @command=‘function()’ 和 command指令使用
在这里插入图片描述

文件访问拦截
@Configuration
public class MyWebmvcConfigurer implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(tokenInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "static/**", "/upload/**");
                // 这里设置了Token拦截器排除的路径
    }
 @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/upload/**").addResourceLocations("file:F:/blog_sys/upload/");
        // 这里addResourceLocations里的路径一定要对,并且末端文件夹位置一定要有 ’/‘
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }
    // addResourceLocation参数不管是 windows 还是 linux,路径前一定要加 "file:" 
Vue 细节处理

设置路由跳转的方法时,想给路由带过去一个参数,但是不想参数出现在路径中。

 edit(row) {
      this.$router.push({
        path: '/channel_edit',
        query: {
          id: row.id
        },
      })
    }
    
// 或者下面这种方式
 edit(row) {
      this.$router.push({
        name: '/channel_edit',
        paramrs: {
          id: row.id
        },
      })
   }
ElementUI中的使用细节
  • 多选框组:

el-checkbox 的 label属性是该 checkbox 对应的值,若该标签中无内容,则该属性也充当 checkbox 按钮后的介绍。label与数组中的元素值相对应,如果存在指定的值则为选中状态,否则为不选中。

 <el-form-item label="标签" prop="selectedTagList">
        <el-checkbox-group v-model="defForm.selectedTagList">
          <el-checkbox v-for="(item, index) in tagList" :key="index" :label='item.id' >{{item.tagName}}</el-checkbox>
        </el-checkbox-group>
      </el-form-item>
Vue中的常用方法
  • Some()

.some()
some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
some() 方法会依次执行数组的每个元素:
如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。 如果没有满足条件的元素,则返回false。
注意:some() 不会对空数组进行检测。 注意: some() 不会改变原始数组。

Vue $route.matched 属性

$route.matched
类型: Array < RouteRecord> 一个数组,包含当前路由的所有嵌套路径片段的路由记录 。路由记录就是 routes 配置数组中的对象副本 (还有在 children 数组)。

Vue $route.meta 属性

定义路由的时候配置的meta字段
首先,我们称呼 routes 配置中的每个路由对象为 路由记录。路由记录可以是嵌套的,因此,当一个路由匹配成功后,他可能匹配多个路由记录

例如,根据上面的路由配置,/foo/bar 这个 URL 将会匹配父路由记录以及子路由记录。
一个路由匹配到的所有路由记录会暴露为 $route 对象 (还有在导航守卫中的路由对象) 的 $route.matched 数组。因此,我们需要遍历 $route.matched 来检查路由记录中的 meta 字段。

Vue 中使用markdown展示文本内容
markdown展示文本
  • main.js中引入markdown预览的插件
import VMdPreview from '@kangc/v-md-editor/lib/preview';
import '@kangc/v-md-editor/lib/style/preview.css';
# 使用GitHub代码主题风格
import githubTheme from '@kangc/v-md-editor/lib/theme/github.js';
import '@kangc/v-md-editor/lib/theme/style/github.css';
VMdPreview.use(githubTheme)
Vue.use(VMdPreview);
  • 在组件中使用标签将文本用markdown显示
   <v-md-preview  :text="channel.content"></v-md-preview>
使用markown文本编辑

本例使用kangcGitHub代码
npm i @kangc/v-md-editor -S

import VueMarkdownEditor from '@kangc/v-md-editor';
import '@kangc/v-md-editor/lib/style/base-editor.css';
# 使用 vuepress的主题风格
import vuepressTheme from '@kangc/v-md-editor/lib/theme/vuepress.js';
import '@kangc/v-md-editor/lib/theme/style/vuepress.css';

VueMarkdownEditor.use(vuepressTheme);
Vue.use(VueMarkdownEditor);

页面在引入插件之后,可以使用标签

<template>
  <v-md-editor v-model="text" height="400px"></v-md-editor>
</template>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot项目人事系统是为公司或组织人力资源管理部门设计的自动化人事管理平台。它利用Spring Boot的快速开发特性,结合了员工信息管理、招聘流程、薪酬福利、考勤跟踪、绩效评估以及培训发展等功能,旨在提供一个高效、精准且用户友好的工具,以帮助人力资源部门简化人事流程和提升管理效率。 以下是该人事系统的主要功能: 1. **员工信息管理**:存储和管理所有员工的个人信息、职位历史和其他关键数据。 2. **招聘与录用**:管理招聘流程,包括职位发布、简历筛选、面试安排和录用通知。 3. **薪资和福利管理**:自动计算工资、奖金、福利和扣款,生成电子工资单。 4. **考勤和假期管理**:跟踪员工的出勤情况,包括迟到、早退、加班和请假记录。 5. **绩效评价系统**:定期进行员工绩效评估,设定目标并跟踪结果,支持反馈和发展计划。 6. **培训与发展模块**:规划和管理员工培训活动,记录培训进度和效果反馈。 7. **移动设备优先设计**:采用响应式布局,使平台在不同大小的屏幕上均有良好展现,尤其适应移动设备。 8. **数据安全与隐私保护**:采取加密技术和访问控制策略,确保员工数据的安全性和隐私性。 9. **友好的用户操作界面**:界面直观易用,降低工作人员的学习成本,并提供多语言支持。 10. **易于维护和扩展**:前后端分离架构和模块化设计,方便未来根据人事管理需求的变化进行系统升级或功能拓展。 通过这些功能,基于Spring Boot的人事系统不仅优化了人事管理的工作流程,还提高了数据处理的准确性和决策支持的效率。系统的架构设计注重性能、可用性和可维护性,以支持高并发的数据访问和动态的数据更新。其模块化的设计也便于未来根据人力资源业务的发展增加新功能或升级现有功能,确保软件的长期适用性和技术前瞻性。
Spring Boot 项目记录日志可以使用 Logback 或者 Log4j2。这里以 Logback 为例,步骤如下: 1. 在 pom.xml 文件添加 logback 依赖: ``` <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> ``` 2. 在 src/main/resources 目录下创建 logback.xml 文件,配置日志输出格式和输出位置等信息。以下是一个简单的示例配置文件: ``` <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/app.log</file> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender> <logger name="com.example" level="DEBUG" additivity="false"> <appender-ref ref="FILE" /> </logger> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </configuration> ``` 这个配置文件定义了两个 appender,一个是 CONSOLE,表示将日志输出到控制台;另一个是 FILE,表示将日志输出到文件。其,fileNamePattern 配置了日志文件的命名格式,maxHistory 配置了最多保存多少个历史日志文件。 3. 在代码使用 LoggerFactory 获取 Logger 对象,然后即可进行日志记录。例如: ``` import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DemoController { private static final Logger logger = LoggerFactory.getLogger(DemoController.class); public void doSomething() { logger.debug("Debug log message"); logger.info("Info log message"); logger.warn("Warn log message"); logger.error("Error log message"); } } ``` 运行程序后,日志将会输出到控制台和指定的日志文件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值