day1-若依项目前后端分离的初步使用

news2024/12/28 4:41:17

响应式布局:

做好的产品能在pc端,手机,平板都能正常浏览

开发项目两种方式

1.自己从0开始写代码

2.在若依中下载拥有基础功能的源码

若依使用的mysql版本

mysql5.7

导入别人的项目如何操作

若依项目下载地址**:https://gitee.com/y_project/RuoYi-Vue.git**
可以使用揉一项目修改器修改项目的名字

1.下载前端依赖:在wolfcode-ui包中的控制台输入命令:npm install

2.里面修改redis的密码(没有密码),或者本机地址不是localhost,在启动的时候会出现创建不了bean的异常

3.修改配置文件中连接数据库的账号密码

pom.xml文件的内容解释

modules:

指定当前项目中有哪些子模块

dependencyManager:

管理子项目中的版本,里面的dependencies不能直接被继承

dependencies:

可以直接被继承

A子模块如何使用B子模块中的API?

将B模块打包,再在A项目中做依赖

在这里插入图片描述

caro2o-admin:后台管理项目,接口

caro2o-common:封装子项目中的公共代码工具类,常量,自定义异常

caro2o-framework:框架相关的代码(Spring AOP /Spring Security等)

caro2o-generator:代码生成器

caro2o-quertz:定时任务

caro2o-system:系统管理模块(service/mapper)

caro2o-ui:前端项目

idea中快速查找接口的名称:edit->find->find in files->输入请求的名称

recode:记录用户的信息

认证:验证码,账号密码

**前端拿token:**在sessionhistory中拿取

编写认证的流程

获取验证码:

1.前端发起请求:http://localhost/dev-api/captchaImage,使用代理去访问后端

2.生成验证码,并将验证码存储到redis中

3.可以给前端返回两种形式的的验证码,字符串和数字计算

登录时的login:

1.先进行验证码的比较,将验证码和用户名,uuid给validateCaptcha

​ 先通过传进来的uuid在redis中查这个code是否存在,若验证码存在则在比对两者是否匹配

​ 若不正确就抛出自定义异常"CaptchaExpireException"

2.若验证码通过,前端传进来用户名和密码传给loginPreCheck类,再进行登录前置校验(看账户密码是否在合理的范围之内,是否在黑名单里面),

3.若账户和密码前置校验成功,就正式校验账号密码,将验证后的用户生成为令牌返回给前端,并放在上下文域

登录时的getInfo

1.使用 **permissionService.getRolePermission(user);**根据前端传进来的user查询用户的角色

​ 若是管理员就有所有的权限,否则就通过userId查询用户具有的权限

2.使用**permissionService.getMenuPermission(user)**获取这个用户所有的菜单数据权限

​ 若是管理员就拥有所有的权限

​ 若不是管理员,就查询用户的权限,若权限不是空的,就根据权限id查询权限,menuService.selectMenuPermsByRoleId(role.getRoleId())

​ 否则就根据用户id查询权限menuService.selectMenuPermsByUserId(user.getUserId()

​ 在将所有的权限放在HashSet中

基本增删改查的流程

前端api:

​ 前端封装的方法(增删改查)

​ 分页查询的请求应该在什么时候发送:在vue实例创建好之后,created

​ 前端使用vali进行表单的校验

​ 点击按钮出现模态框

​ 提交修改表单后就重新查询一遍

​ 并有提示信息

​ …的作用:解构,将数据遍历出来

​ param:

​ name:1,

​ age:2

​ …param:得到里面所有的数据

后端:

​ 分页相关的专门使用类进行封装,在TableDataInfo对象中

​ 其他的在Ajaxesult对象中

分页查询,参数是在startPage()方法中获取到(request.getparameter("pageNo"))
mapper中sql的编写有所不同,里面的**set**用于数据的更新

代码生成

若依可以为我们生成基本的crud功能,步骤如下

1.在数据库中创建一张需要的表

2.在代码生成页面导入这个 表,并进行提交

3.选中这个表并点击生成按钮

4.里面会生成三个文件:main,vue,sql文件

5.在数据库中运行sql文件,

6.前端文件:将vue中的内容拷贝到前端中的文件中,

7.将main文件中mapper.xml,domain,mapper,service文件拷贝到caro2o-system文件中,将controller文件拷贝到caro2o-admin

8.重新运行项目就能看到效果,但是表中没有数据

使用数据字典的数据

1.dicts: [‘sys_user_sex’],将其放在export default里面

2.在添加或者修改的地方添加下拉列表并遍历展示性别

<el-form-item label="学生性别">
  <el-select v-model="form.gender" placeholder="请选择性别">
    <el-option
      v-for="dict in dict.type.sys_user_sex"
      :key="dict.value"
      :label="dict.label"
      :value="dict.value"
    ></el-option>
  </el-select>
</el-form-item>

3.在表格中如何展示数据字典的lable,将表格中的1展示成为"男",使用插值语法

​ 使用的是标签,修改里面option和value的值

<el-table-column label="性别" align="center" prop="gender" >
  <template slot-scope="scope">
    <dict-tag :options="dict.type.sys_user_sex" :value="scope.row.gender"/>
  </template>
</el-table-column>

4.使用张三做测试来测试菜单和按钮的权限(zs,123456)

菜单:根据用户的id查到对应的菜单(sys_user_role,sys_role_menu,sys_menu)

​ 没有权限的功能前端使用使用**v-hasPermi=[“权限表达式”]**进行权限功能的隐藏

<el-button
  type="primary"
  plain
  icon="el-icon-plus"
  size="mini"
  @click="handleAdd"
  v-hasPermi="['system:student:add']"
>新增</el-button>

实体类中的BeaseEntity

封装了所有实体类相同的字段和方法

searchVale ,可以理解为关键字
creatBy
creatTIme
updateBy
uptateTime
params 

过滤查询的条件参数:普通的参数,后端使用 实体类对象进行封装,(以前使用xxxQueryObjiect)

​ 特殊的参数:如关键字等,可以使用searchValue或者params来接收

Controller的父类BaseController

前端传递发过来的日期,如何自动封装到实体对象中

@DateTimeFormate(pattern=“yyyy-MM-dd”)

将实体对象中的日期转换到json字符串中

@jsonFormat(pattern=“yyyy-MM-dd”)

@InitBinder
public void initBinder(WebDataBinder binder)
{
    // Date 类型转换
    binder.registerCustomEditor(Date.class, new PropertyEditorSupport()
    {
        @Override
        public void setAsText(String text)
        {
            setValue(DateUtils.parseDate(text));
        }
    });
}
会自动的匹配日期格式,如果匹配失败,400
    private static String[] parsePatterns = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};

统一异常处理

有全局的异常处理的包,可以直接调用,不用再自己去进行定义
在这里插入图片描述

ThreadLocal 的作用

线程的局部变量,不存在共享的问题,就不会存在多线程并发访问异常的情况出现

set方法:使用set方法往当前线程中添加局部变量,各个线程独享

get方法:获取当前线程的局部变量

remove:如果我们长时间将数据保存在内存中,会造成内存泄漏问题,应该手动删除,不要等GC回收,

国际化

**含义:**一套系统支持多个国家的语言

使用的是admin中的resource中的messages

会根据浏览器的语言环境自动切换配置文件适应不同的语言

线程池

创建线程和销毁线程非常耗时,所以提前创建好一批线程对象,放在内存中

一次创建重复利用的目的,更高效利用连接 对象

1.tomcat线程池

tomcat:
  # tomcat的URI编码
  uri-encoding: UTF-8
  # 连接数满后的排队数,默认为100
  accept-count: 1000
  threads:
    # tomcat最大线程数,默认为200
    max: 800.当前可以同时处理800条请求
    min-spare: 100  ,初始化创建的线程数
    
#如果超过上限,就需要排队等待线程的释放

2.JDK线程池

比tomcat更好,防止无限制排队,节约内存

当任务数量大于核心线程数,队列数量超过指定数量,则创建新的线程,若超过队列的最大数量,就执行拒绝策略

@Configuration
public class ThreadPoolConfig
{
    // 核心线程池大小,核心线程池:当前的线程,默认使用核心线程,不会自动销毁
    private int corePoolSize = 50;

    // 最大可创建的线程数,还能创建150个非核心线程
    private int maxPoolSize = 200;

    // 队列最大长度,若超过200个请求,则排队,排队数量若超过1000,则创建新的线程
    private int queueCapacity = 1000;

    // 线程池维护线程所允许的空闲时间:若核心线程对象,若超过300,则销毁
    private int keepAliveSeconds = 300;

自己写一遍teacher的所有功能

前端

vue:

​ @keyup.enter.native:监听键盘事件,按下Enter是触发该事件

​ this.reset();重置表单中所有元素的值

​ this.resetForm(“form”);重置指定名称的表单元素

teacher.js:

​ 里面封装的都是访问后端的方式,在index.vue中会进行引用

后端

需要在菜单列表中添加教师管理这个

创建doman,service,controller,mapper.xml文件

实体类中的**@Excel(name = “性别”)**:导出时生成excel表的表头

mapper接口和mapper.xml文件字节码不在同一目录,在application配置文件中进行扫描的路径

@PreAuthorize(“@ss.hasPermi(‘system:student:list’)”)

该注解表示当前方法需要进行权限校验,只有当前用户具有"system:student:list"权限才能够执行该方法,如用户没有该权限会抛出拒绝异常,阻止用户执行该方法

@ss.hasPermi:用于判断当前用户是否拥有指定的权限,返回的布尔值

<trim prefix="(" suffix=")" suffixOverrides=",">
    <if test="name != null">name,</if>
    <if test="age != null">age,</if>
    <if test="gender != null">gender,</if>
 </trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
    <if test="name != null">#{name},</if>
    <if test="age != null">#{age},</if>
    <if test="gender != null">#{gender},</if>
 </trim>

这两段代码并不重复,使用者这两段代码可以用于区分列名和列值,后续的维护和修改操作会更加容易,里面的**suffixOverrides=“,”**删除最后一个",",没有满足的条件的数据就不加,以前会添加一个null

@Log(title = "教师管理", businessType = BusinessType.UPDATE)

这是一个自定义注解,记录日志,在执行update操作是,记录该操作的业务类型和标题,一般配合AOP使用

看代码应该看哪些东西

做的是什么,怎么做的,例如:抽取方法

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

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

相关文章

数学建模——曲线拟合

一、曲线拟合简介 1、曲线拟合问题的提法 已知一组数据&#xff08;二维&#xff09;&#xff0c;即平面上n个点 (xi,yi)(i1,2,…,n)&#xff0c; xi互不相同。寻求一个函数yf(x)&#xff0c;使得f(x)在某种准则下与所有的数据点最为接近&#xff0c;即拟合得最好。 2、…

LabVIEW仿真单频脉冲信号+线性调频信号+高斯白噪声信号

文章目录 前言一、单频脉冲信号1、信号参数2、仿真图①、前面板②、程序框图 二、线性调频信号1、信号参数2、仿真图①、前面板②、程序框图 三、高斯白噪声信号1、信号参数2、仿真图①、前面板②、程序框图 四、合成信号1、前面板2、程序框图 五、代码自取 前言 本文基于 Lab…

5.1.4.8 RDD 持久化

1) RDD Cache 缓存 RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存&#xff0c;默认情况下会把数据以缓存 在 JVM 的堆内存中。但是并不是这两个方法被调用时立即缓存&#xff0c;而是触发后面的 action 算 子时&#xff0c;该 RDD 将会被缓存在计算节点的内存中&…

应用案例 | 使用tManager ControlLogix模块优化食品生产研发流程

探索tManager在食品制造应用中如何创建实时时间戳的过程数据&#xff0c;从而改善产品的开发流程。 一 背景 为了在当今以数据驱动的制造环境中取得成功&#xff0c;车间控制系统必须能够与企业计算系统进行信息交换。对此&#xff0c;事务管理器&#xff0c;像Softing的tMana…

银河麒麟服务器v10 sp1 安装 nginx

首先查询是否安装&#xff1a; rootxxx-pc:~# ps -ef |grep nginx 或 rootxzx-pc:~# dpkg -list|grep nginx 如果安装请先卸载&#xff0c;或者直接使用&#xff0c;以下步骤你就可以忽略了&#xff0c;软件包的卸载方法&#xff1a; 1、APT方式 &#xff08;1&#xff09…

牛客网Verilog刷题——VL40

牛客网Verilog刷题——VL40 题目答案 题目 设计一个同时输出7分频的时钟分频器&#xff0c;占空比要求为50%。注意rst为低电平复位。   信号示意图如下&#xff1a; 波形示意图如下。 输入输出描述&#xff1a; 信号类型输入/输出位宽描述clk_inwireIntput1系统时钟信号rs…

node.js分词搜索

背景 最近有个需求是要实现类似【搜索引擎】的功能&#xff0c;用户输入关键字&#xff0c;后台实时推送相关数据。 思路 先仿Elasticsearch做一个简单的分词效果&#xff0c;然后根据分词逐一数据库查询&#xff0c;然后以结果【出现次数由多到少】的顺序展示数据。 实现…

C++多线程学习(三、线程处理函数【get_id、sleep_for、yield、sleep_until】)

目录 线程处理函数 1.获取线程id&#xff1a;get_id 2.延时函数&#xff1a;sleep_for 3.放弃执行函数&#xff0c;调用另一个线程&#xff1a;yield 4.让当前线程休眠直到指定的时间点&#xff1a;sleep_until 线程处理函数 1.获取线程id&#xff1a;get_id #include&l…

C#基础笔记

1.1、数据类型 值类型 需得到一个类型或一个变量在特定平台上的准确尺寸&#xff0c;可以使用 sizeof 方法。表达式 sizeof(type) 产生以字节为单位存储对象或类型的存储尺寸。 using System;namespace DataTypeApplication {class Program{static void Main(string[] args){…

简单而高效的文件管理系统

随着数字化时代的不断发展&#xff0c;人们在日常生活和工作中处理的文件越来越多。如何有效地管理这些文件成为了一个亟待解决的问题。基于云的文件管理系统可以帮助用户更快地查找、组织和共享文件&#xff0c;提高工作效率。本文将介绍如何打造简单而高效的文件管理系统。 …

netty学习(2):多个客户端与服务器通信

1. 基于前面一节netty学习&#xff08;1&#xff09;:1个客户端与服务器通信 只需要把服务器的handler改造一下即可&#xff0c;通过ChannelGroup 找到所有的客户端channel&#xff0c;发送消息即可。 package server;import io.netty.channel.*; import io.netty.channel.gr…

群晖GitLab修改clone(克隆)地址

通过群晖的Docker(ContainerManager)配置好GitLab后&#xff0c;每次clone代码总要修改前面的地址&#xff0c;因此作者找到了修改的办法&#xff0c;实属不易&#xff0c;请给个关注&#xff01; 给出我的群晖配置gitlab的设置&#xff0c;如图1。 图1 Docker中GitLab的配置 按…

生成式AI筑建基石,亚马逊云科技以强大应用能力和辐射范围加快技术传播速度

众所周知&#xff0c;要把大模型转化为生产力&#xff0c;AI模型、算力和数据会是难以逾越的门槛。新的目标已经出现&#xff0c;我们是否有了足够强大的AI基础设施&#xff1f;在6月28日上海举行的峰会上&#xff0c;亚马逊云科技展示了这样的能力。 从掀起AI画图热潮的Stabil…

禁用USB接口的几个办法

本文为大家提供了四个禁用电脑USB接口的方法&#xff0c;如果企业用户建议使用方法三&#xff0c;方法三可以批量对公司内部所有电脑的usb接口进行禁用。 方法一&#xff1a;使用设备管理器禁用USB接口 步骤1&#xff1a;打开设备管理器 首先&#xff0c;我们需要打开设备管理…

玩转smardaten | 速来围观CSDN万粉博主如何零代码开发学生管理系统?

编者荐语&#xff1a; “开发软件必须写代码吗&#xff1f;有没有真正不写代码的快速开发工具&#xff1f;”这是CSDN测试开发领域的万粉博主曲鸟一直思考的问题。今年5月底接触到smardaten&#xff0c;仅用3天自学配置&#xff0c;开发出一款学生管理系统。不得不说&#xff…

python自动化测试 - 自动化框架及工具

1 概述 手续的关于测试的方法论&#xff0c;都是建立在之前的文章里面提到的观点&#xff1a; 功能测试不建议做自动化接口测试性价比最高接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 本文选择的测试语言是 python 脚本语言。由于其官…

CentOS8安装docker容器

一、yum包更新到最新 [rootnginx /]# sudo yum update 若是出现以下异常; 处理&#xff1a; 1.首先&#xff0c;进入到 yum 的 repos 目录 [rootnginx /]# cd /etc/yum.repos.d/2.更新一下源。修改 centos 文件内容 [rootnginx yum.repos.d]# sed -i s/mirrorlist/#mirrorlist/…

Vue2+3入门到实战

作为IT技术相关行业不可或缺的岗位之一&#xff0c;前端开发工程师就业前途广阔&#xff0c;一直是很多同学心中转行的首选行业。但很多人还没开始&#xff0c;便被一系列问题难倒了&#xff0c;比如&#xff1a;前端该如何入门&#xff1f;路线图是怎样的&#xff1f;想要找到…

网络编程—— IP地址 + 端口号 +TCP/IP协议 + 协议分层的封装与应用

文章目录 前言一、网络发展各阶段二、网络通信的三大要素1.IP地址2.端口号3.网络协议 三、TCP/IP五层网络模型各层级的用处网络设备所在分层 四、封装和分用封装分用网络传输的实际情况 总结 前言 本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各…

如何提升你的小程序开发流程:实用的建议和技巧

随着微信小程序开发的兴起&#xff0c;越来越多的人想要开发自己的微信小程序&#xff0c;那么&#xff0c;如何提升你的微信小程序开发流程呢&#xff1f; 如果你还没有自己的小程序&#xff0c;那你现在就应该开始着手准备了。如果你已经有了自己的小程序&#xff0c;那么&a…