若依

SQL

1、

drop table if exists sys_dept;
create table sys_dept (
  dept_id           bigint(20)      not null auto_increment    comment '部门id',
  parent_id         bigint(20)      default 0                  comment '父部门id',
  ancestors         varchar(50)     default ''                 comment '祖级列表',
  dept_name         varchar(30)     default ''                 comment '部门名称',
  order_num         int(4)          default 0                  comment '显示顺序',
  leader            varchar(20)     default null               comment '负责人',
  phone             varchar(11)     default null               comment '联系电话',
  email             varchar(50)     default null               comment '邮箱',
  status            char(1)         default '0'                comment '部门状态(0正常 1停用)',
  del_flag          char(1)         default '0'                comment '删除标志(0代表存在 2代表删除)',
  create_by         varchar(64)     default ''                 comment '创建者',
  create_time 	    datetime                                   comment '创建时间',
  update_by         varchar(64)     default ''                 comment '更新者',
  update_time       datetime                                   comment '更新时间',
  primary key (dept_id)
) engine=innodb auto_increment=200 comment = '部门表';

1、删除sys_dept如果存在

2、bight--大整数类型
varchar--可变长度字符串类型
char--固定字符串类型,为什么部门状态不用Int用char,char(1),这里的char是数字,只占1个字节,而Int占了4个字节,更浪费空间(实际占用:在 utf8 或 utf8mb4 字符集中数字也只占用 1 个字节,如果是中文的char,可能占1-3个字节,看是什么编码)

3、为什么auto_increment=200 ,要从200开始自增,防止易于维护:系统内置数据和用户数据分离明显、扩展性好:为未来可能的手动插入数据预留空间、避免冲突:防止自增ID与预设数据ID冲突

4、没什么要特别记,记住数据库常见这几种数据类型就行

5、SQL的char和Java的char是不一样的
-- SQL中的char是固定长度的字符串类型
char(1) -- 表示固定长度为1的字符串,可以存储'0', 'A', '中'等单个字符
char(10) -- 表示固定长度为10的字符串
-- Java中的char是基本数据类型,表示单个字符
char c = 'A'; // 只能存储单个字符
char c2 = '中'; // 可以存储Unicode字符

2、

-- 4、角色信息表
-- ----------------------------
drop table if exists sys_role;
create table sys_role (
  role_id              bigint(20)      not null auto_increment    comment '角色ID',
  role_name            varchar(30)     not null                   comment '角色名称',
  role_key             varchar(100)    not null                   comment '角色权限字符串',
  role_sort            int(4)          not null                   comment '显示顺序',
  data_scope           char(1)         default '1'                comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
  menu_check_strictly  tinyint(1)      default 1                  comment '菜单树选择项是否关联显示',
  dept_check_strictly  tinyint(1)      default 1                  comment '部门树选择项是否关联显示',
  status               char(1)         not null                   comment '角色状态(0正常 1停用)',
  del_flag             char(1)         default '0'                comment '删除标志(0代表存在 2代表删除)',
  create_by            varchar(64)     default ''                 comment '创建者',
  create_time          datetime                                   comment '创建时间',
  update_by            varchar(64)     default ''                 comment '更新者',
  update_time          datetime                                   comment '更新时间',
  remark               varchar(500)    default null               comment '备注',
  primary key (role_id)
) engine=innodb auto_increment=100 comment = '角色信息表';

前端

1、如果解决浏览器跨域问题,将请求指定到前端代码,然后前端的服务转化请求到后端的地址,请求后端的内容,服务和服务之间请求是没有跨域问题
具体流程是:

  1. 浏览器 → localhost:80/dev-api/system/user/info (GET)--前端代码请求用axios请求地址写dev-api/system/user/info。。。,浏览器会自动加上当前IPlocalhost:80
  2. Webpack Dev Server 接收请求--(自动识别拦下有dev-api的请求)
  3. Webpack Dev Server → localhost:8080/system/user/info (GET) --自动转化成后端的地址
  4. 后端Spring Boot应用处理请求
  5. Spring Boot → Webpack Dev Server 返回JSON响应
  6. Webpack Dev Server → 浏览器 返回响应
  7. 浏览器中的JavaScript处理响应数据
    在vue.js文件修改dev-api或prod-api对应后端的地址

2、
开发环境启动:npm run dev
生产环境构建:npm run build:prod
根据package.json的命令,来决定启动哪个环境,

// src/utils/request.js
import axios from 'axios'

// process.env.VUE_APP_BASE_API 会根据环境自动切换
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 自动识别 /dev-api 或 /prod-api,
  timeout: 5000
})

export default service

3、虽然前端也能用node,js的web服务启用,但是一般生产环境都是交给nginx启动
--Node.js服务:
需要持续运行Node.js进程
内存占用较高(V8引擎)
CPU消耗相对较大
--Nginx服务:
内存占用极低(通常几MB)
CPU消耗很少
进程管理简单
生产环境构建:npm run build:prod后发到nginx

后端模块

ruoyi-admin管理模块

启动类

1、

//启动类
//exclude = { DataSourceAutoConfiguration.class 是排除Spring Boot的默认数据源自动配置
// 如果不排除,默认会自动配置数据源,Spring Boot会自动寻找application.yml中的数据源配置,并创建默认的DataSource bean
//1、配置冲突:若依有自己的数据源配置(Druid)2、功能限制:默认数据源缺少监控、连接池管理等功能3、自定义需求:若依需要使用Druid的高级特性
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
{
    public static void main(String[] args)
    {
        // System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(RuoYiApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  若依启动成功   ლ(´ڡ`ლ)゙  \n" +

2、
druid监控
访问地址:http://localhost:8080/druid
用户名:ruoyi
密码:123456

3、如何配置druid
写了druid配置类文件,然后在application.yml中引入

# application.yml
spring:
  profiles:
    include: druid  # 包含application-druid.yml配置

4、RuoYiServletInitializer类
有这个类说明可以打包成war包,运行到tomcat这种servlet容器

登录与认证

@RestController
public class SysLoginController {
    // 通过Spring注入依赖
    
    @PostMapping("/login")
    public AjaxResult login(@RequestBody LoginBody loginBody) {
        // 生成并返回认证令牌
    }
    
    @GetMapping("getInfo")
    public AjaxResult getInfo() {
        // 返回用户详细信息、角色和权限
    }
    
    @GetMapping("getRouters")
    public AjaxResult getRouters() {
        // 返回菜单路由信息
    }
}

如何在请求后/login后也请求getinfo和getrouters

// src/store/modules/user.js 或类似文件
const actions = {
  // 登录
  login({ commit }, userInfo) {
    const { username, password, code, uuid } = userInfo
    return new Promise((resolve, reject) => {
      login(username, password, code, uuid).then(res => {
        // 1. 登录成功,获取token
        const token = res.token
        commit('SET_TOKEN', token)
        setToken(token)
        
        // 2. 登录成功后,立即获取用户信息和路由信息
        Promise.all([
          dispatch('getInfo'),
          dispatch('getRouters')
        ]).then(() => {
          resolve()
        })
        
      }).catch(error => {
        reject(error)
      })
    })
  },

  // 获取用户信息
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo().then(res => {
        const { user, roles, permissions } = res
        commit('SET_USER', user)
        commit('SET_ROLES', roles)
        commit('SET_PERMISSIONS', permissions)
        resolve(res)
      }).catch(error => {
        reject(error)
      })
    })
  },

  // 获取路由信息
  getRouters({ commit, state }) {
    return new Promise((resolve, reject) => {
      getRouters().then(res => {
        const { data } = res
        commit('SET_ROUTERS', data)
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  }
}

登陆页验证码

CaptchaController管理验证码的生成和验证

1. 用户访问登录页面 (/login)
   ↓
2. Vue组件创建,调用 getCaptcha()
   ↓
3. 发送 GET /captchaImage 请求
   ↓
4. 后端生成验证码图片和UUID
   ↓
5. 验证码存入Redis,图片Base64编码返回
   ↓
6. 前端显示验证码图片
   ↓
7. 用户输入用户名、密码、验证码
   ↓
8. 点击登录按钮,发送POST /login请求
   ↓
9. 后端验证验证码(从Redis获取对比)
   ↓
10. 验证通过则登录成功

认证流程

ruoyi-system 系统模块

用户管理系统

sysuser类--路径在common-core-domain-entity

public class SysUser extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** 用户ID */
    @Excel(name = "用户序号", type = Type.EXPORT, cellType = ColumnType.NUMERIC, prompt = "用户编号")
    private Long userId;
这串注解 `@Excel(name = "用户序号", type = Type.EXPORT, cellType = ColumnType.NUMERIC, prompt = "用户编号")` 的各个参数值如下:

## 1. 注解参数详解

### name = "用户序号"
- **值**: `"用户序号"`
- **作用**: 在Excel文件中该列的标题显示为"用户序号"

### type = Type.EXPORT
- **值**: `Type.EXPORT`
- **作用**: 指定该字段仅在导出Excel时使用
- **可选值**:
  - `Type.ALL`: 导入和导出都使用(默认)
  - `Type.EXPORT`: 仅导出时使用
  - `Type.IMPORT`: 仅导入时使用

### cellType = ColumnType.NUMERIC
- **值**: `ColumnType.NUMERIC`
- **作用**: 指定Excel单元格的数据类型为数字类型
- **可选值**:
  - `ColumnType.NUMERIC`: 数字类型
  - `ColumnType.TEXT`: 文本类型
  - `ColumnType.IMAGE`: 图片类型

### prompt = "用户编号"
- **值**: `"用户编号"`
- **作用**: 在Excel单元格中显示提示信息"用户编号"

## 2. 实际效果

### 导出Excel时的表现:

Excel文件:
┌────────┬────────┬────────┬────────┐
│ 用户序号 │ 用户名称 │ 用户邮箱 │ 手机号码 │
├────────┼────────┼────────┼────────┤
│ 1 │ 管理员 │admin@xx.com│138xxxxxxx│
│ 2 │ 张三 │zhang@xx.com│139xxxxxxx│
└────────┴────────┴────────┴────────┘



### 单元格特性:
- **数据格式**: 数字格式(可进行数值计算)
- **单元格提示**: 鼠标悬停时显示"用户编号"提示
- **仅导出**: 导入Excel时不会使用此字段

## 3. 完整的Excel注解配置示例

### 对比其他字段:
```java
/** 用户ID */
@Excel(name = "用户序号", type = Type.EXPORT, cellType = ColumnType.NUMERIC, prompt = "用户编号")
private Long userId;

/** 部门ID */
@Excel(name = "部门编号", type = Type.IMPORT)  // 仅导入时使用
private Long deptId;

/** 用户账号 */
@Excel(name = "登录名称")  // 默认为ALL,数字类型
private String userName;

/** 用户昵称 */
@Excel(name = "用户名称")
private String nickName;

/** 手机号码 */
@Excel(name = "手机号码", cellType = ColumnType.TEXT)  // 强制文本格式
private String phonenumber;
 4. 在若依系统中的使用

### 导出用户列表:
```java
// Controller中使用
@GetMapping("/export")
public AjaxResult export(SysUser user) {
    List<SysUser> list = userService.selectUserList(user);
    ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
    return util.exportExcel(list, "用户数据");
}

### 生成的Excel效果:
- **"用户序号"列**: 显示为数字格式,单元格有"用户编号"提示
- **仅在导出时显示**: 导入模板中不会包含此列

## 5. 总结

这个注解配置的具体值为:
- **name**: "用户序号" - Excel列标题
- **type**: Type.EXPORT - 仅导出使用
- **cellType**: ColumnType.NUMERIC - 数字格式
- **prompt**: "用户编号" - 单元格提示信息

这样的配置使得用户ID在导出Excel时以数字格式显示,并提供友好的用户界面提示。

不需要写 @Autowired 注入,因为这个类是实体类(Entity),不是Spring管理的Bean组件。只有像@service,@controllor这类组件才要autowired注入

框架设计

核心模块及职责

黑马程序员AI+若依框架项目

基础篇

1、入门案例,用代码生成器的功能时,记得vue模板选vue2,不然代码导入后,会一直加载不出页面
2、代码生成时,先导入sql文件,再配置代码生成信息,再下载代码导入项目
3、改完前前端代码记得重启下前端服务

Screenshot_20250812_225641_tv.danmaku

Screenshot_20250812_225356_tv.danmaku

二次开发

1、新建sky-merchant子模块(maven模块)
2、父工程版本锁定
3、sky-admin添加依赖

posted @ 2025-07-29 23:36  乘加法  阅读(13)  评论(0)    收藏  举报