站长信息
jeffery.xu
jeffery.xu

软件工程师

欢迎访问我的个人笔记网站!我是一名热爱技术的开发者,专注于Web开发和技术分享。

811495111@qq.com
18521510875
筛选

个人笔记

Redis 设置密码
java学习
sudo nano /etc/redis/redis.conf

# requirepass foobared
requirepass your_password_here

sudo service redis-server restart

redis-cli -h localhost -p 6379 -a your_password_here ping

application.yml:
spring:
redis:
host: 127.0.0.1
port: 6379
password: your_password_here
timeout: 2000ms
修改设计
java学习

完整的表结构设计:

## 完整的表结构设计

```sql
-- 用户表(已有,稍作调整)
CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100) UNIQUE,
    nickname VARCHAR(50),
    avatar VARCHAR(255),
    phone VARCHAR(20),
    status TINYINT DEFAULT 1 COMMENT '1:正常 0:禁用',
    created_by BIGINT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_username (username),
    INDEX idx_status (status)
);

-- 角色表(已有,保持不变)
CREATE TABLE roles (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    role_name VARCHAR(50) UNIQUE NOT NULL,
    role_code VARCHAR(50) UNIQUE NOT NULL,
    description TEXT,
    status TINYINT DEFAULT 1 COMMENT '1:正常 0:禁用',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- 用户角色关联表(已有,保持不变)
CREATE TABLE user_roles (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,
    role_id BIGINT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
    UNIQUE KEY uk_user_role (user_id, role_id)
);

-- 菜单表(新增 - 核心)
CREATE TABLE menus (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    parent_id BIGINT DEFAULT 0 COMMENT '父菜单ID,0为顶级菜单',
    menu_name VARCHAR(50) NOT NULL,
    menu_code VARCHAR(50) UNIQUE NOT NULL COMMENT '菜单编码',
    path VARCHAR(200) COMMENT '路由地址',
    component VARCHAR(255) COMMENT '组件路径',
    redirect VARCHAR(200) COMMENT '重定向地址',
    menu_type TINYINT NOT NULL COMMENT '菜单类型:1目录 2菜单 3按钮',
    visible TINYINT DEFAULT 1 COMMENT '是否显示:1显示 0隐藏',
    status TINYINT DEFAULT 1 COMMENT '菜单状态:1正常 0停用',
    icon VARCHAR(100) COMMENT '菜单图标',
    sort_order INT DEFAULT 0 COMMENT '显示顺序',
    meta JSON COMMENT '路由元信息(标题、缓存等)',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_parent_id (parent_id),
    INDEX idx_status (status)
);

-- 角色菜单关联表(新增 - 核心)
CREATE TABLE role_menus (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    role_id BIGINT NOT NULL,
    menu_id BIGINT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
    FOREIGN KEY (menu_id) REFERENCES menus(id) ON DELETE CASCADE,
    UNIQUE KEY uk_role_menu (role_id, menu_id)
);

-- 权限表(可选 - 更细粒度控制)
CREATE TABLE permissions (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    permission_name VARCHAR(50) NOT NULL,
    permission_code VARCHAR(50) UNIQUE NOT NULL,
    description TEXT,
    resource VARCHAR(100) COMMENT '资源标识',
    action VARCHAR(50) COMMENT '操作类型',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 角色权限关联表(可选)
CREATE TABLE role_permissions (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    role_id BIGINT NOT NULL,
    permission_id BIGINT NOT NULL,
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
    FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE,
    UNIQUE KEY uk_role_permission (role_id, permission_id)
);

-- 操作日志表(推荐)
CREATE TABLE operation_logs (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT,
    operation VARCHAR(50) NOT NULL COMMENT '操作类型',
    method VARCHAR(10) COMMENT 'HTTP方法',
    url VARCHAR(500) COMMENT '请求URL',
    ip VARCHAR(50) COMMENT 'IP地址',
    user_agent TEXT COMMENT '用户代理',
    request_data JSON COMMENT '请求参数',
    response_data JSON COMMENT '响应数据',
    status TINYINT COMMENT '操作状态:1成功 0失败',
    error_msg TEXT COMMENT '错误信息',
    duration INT COMMENT '耗时(毫秒)',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
    INDEX idx_user_id (user_id),
    INDEX idx_created_at (created_at)
);
```

## 初始化数据

```sql
-- 插入默认角色
INSERT INTO roles (role_name, role_code, description) VALUES
('超级管理员', 'SUPER_ADMIN', '系统超级管理员'),
('管理员', 'ADMIN', '普通管理员'),
('用户', 'USER', '普通用户');

-- 插入菜单数据
INSERT INTO menus (parent_id, menu_name, menu_code, path, component, menu_type, icon, sort_order, meta) VALUES
-- 系统管理
(0, '系统管理', 'SYSTEM', '/system', 'Layout', 1, 'system', 1, '{"title": "系统管理"}'),
(1, '用户管理', 'USER_MANAGE', '/system/user', 'system/user/index', 2, 'user', 1, '{"title": "用户管理"}'),
(1, '角色管理', 'ROLE_MANAGE', '/system/role', 'system/role/index', 2, 'role', 2, '{"title": "角色管理"}'),
(1, '菜单管理', 'MENU_MANAGE', '/system/menu', 'system/menu/index', 2, 'menu', 3, '{"title": "菜单管理"}'),
-- 用户管理按钮权限
(2, '新增用户', 'USER_ADD', '', '', 3, '', 1, '{}'),
(2, '编辑用户', 'USER_EDIT', '', '', 3, '', 2, '{}'),
(2, '删除用户', 'USER_DELETE', '', '', 3, '', 3, '{}'),
-- 角色管理按钮权限  
(3, '新增角色', 'ROLE_ADD', '', '', 3, '', 1, '{}'),
(3, '编辑角色', 'ROLE_EDIT', '', '', 3, '', 2, '{}'),
(3, '删除角色', 'ROLE_DELETE', '', '', 3, '', 3, '{}'),
(3, '分配权限', 'ROLE_ASSIGN', '', '', 3, '', 4, '{}');

-- 给超级管理员分配所有菜单权限
INSERT INTO role_menus (role_id, menu_id) 
SELECT 1, id FROM menus;
```

## 主要改进点

1. **新增菜单表** - 支持多级菜单结构
2. **角色菜单关联** - 实现 RBAC 权限控制  
3. **菜单类型区分** - 目录/菜单/按钮三种类型
4. **路由元信息** - 使用 JSON 字段存储 Vue Router meta
5. **操作日志** - 记录用户操作行为
6. **索引优化** - 添加必要的数据库索引

这个结构可以满足你的所有需求:用户管理、角色管理、多级菜单配置、权限关联等。

ARM64架构说明
java学习

Windows ARM64是指适用于ARM64架构处理器的Windows操作系统版本。


ARM64架构说明
ARM64 - 64位ARM处理器架构
与x64区别 - x64是Intel/AMD处理器,ARM64是ARM处理器
性能特点 - ARM处理器通常更省电,适合移动设备
常见ARM64设备
Apple M系列芯片 - MacBook Air/Pro(M1/M2/M3)
Surface Pro X - 微软ARM版本平板
部分轻薄本 - 搭载高通骁龙处理器
软件兼容性
下载软件时需要注意:


WebStorm - 选择对应ARM64版本
Node.js - 下载Windows ARM64版本
其他工具 - 确认是否有ARM64原生支持
检查您的系统
在Windows中按 Win + R,输入 msinfo32,查看"系统类型":


显示"ARM64"表示是ARM架构
显示"x64"表示是Intel/AMD架构

配置swagger
java学习
package com.mobizone.kb.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.Components;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SwaggerConfig {

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("Knowledge Base API")
                        .version("1.0.0")
                        .description("知识库管理系统API文档")
                        .contact(new Contact()
                                .name("Your Name")
                                .email("your-email@example.com")))
                .addSecurityItem(new SecurityRequirement().addList("bearerAuth"))
                .components(new Components()
                        .addSecuritySchemes("bearerAuth",
                                new SecurityScheme()
                                        .type(SecurityScheme.Type.HTTP)
                                        .scheme("bearer")
                                        .bearerFormat("JWT")));
    }
}
application.yml
java学习
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
- org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
datasource:
url: jdbc:mysql://localhost:3306/knowledge_base?useSSL=false&serverTimezone=UTC
username: jeffery
password: Password01!
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 20 # 最大连接数
minimum-idle: 5 # 最小空闲连接数
idle-timeout: 600000 # 空闲连接超时时间(毫秒)
max-lifetime: 1800000 # 连接最大存活时间(毫秒)
connection-timeout: 30000 # 获取连接超时时间(毫秒)
data:
redis:
url: redis://127.0.0.1:6379
timeout: 2000ms
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: -1ms
main:
allow-bean-definition-overriding: true
mybatis:
mapper-locations: classpath*:com/mobizone/kb/mapper/*.xml
type-aliases-package: com.mobizone.kb.entity
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
cache-enabled: true
lazy-loading-enabled: true
aggressive-lazy-loading: false
local-cache-scope: STATEMENT
logging:
level:
org.apache.ibatis: WARN
com.mobizone.kb.mapper: DEBUG
io.netty: ERROR
io.netty.util.internal: ERROR
安装redis
java学习

sudo apt update &&sudo apt upgrade -y
sudo apt install redis-server

sudo systemctl start redis-server

sudo systemctl status redis-server

转发接口,使得WSL中的redis也能被访问

netsh interface portproxy add v4tov4 listenport=6379 listenaddress=127.0.0.1 connectport=6379 connectaddress=<WSL2_IP>
验证:
netsh interface portproxy show v4tov4
初始化数据写入
java学习
package com.mobizone.kb.config;

import com.mobizone.kb.entity.Users;
import com.mobizone.kb.service.IUsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class DataInitializerConfig implements CommandLineRunner {

    @Autowired
    private IUsersService usersService;
    @Override
    public void run(String... args) throws Exception {
        // 检查是否存在admin用户
        if (usersService.userExists("admin") == false) {
            Users admin = new Users();
            admin.setUsername("admin");
            // 加密密码
            admin.setPassword("123456");
            usersService.addUser(admin);
            System.out.println("管理员账号创建成功");
        }
    }
}

CommandLineRunner是Spring Boot提供的一个接口,用于在应用程序完全启动后执行特定的代码逻辑。


CommandLineRunner的作用
1. 启动后执行


在Spring Boot应用完全启动后自动执行
所有Bean都已初始化完成
可以安全地访问数据库和其他服务
2. 初始化数据
常用于项目启动时的数据初始化
创建默认用户、角色等基础数据
数据库预填充

执行时机
启动顺序:
Spring容器启动
所有Bean创建和初始化
应用上下文完全准备就绪
CommandLineRunner.run()方法执行 ← 这里
应用可以接收请求

Mybatis 查询替换字段
java学习
<resultMap id="userMap" type="com.mobizone.kb.entity.Users">
<result property="passwordHash" column="password"/>
<!-- 其他字段映射 -->
</resultMap>
<select id="selectByUserName" parameterType="string" resultMap="userMap">
select * from users where username=#{username}
</select>
Mybatis Exists判断
java学习
<select id="existsByUserName" parameterType="string" resultType="boolean">
select count(1) > 0 from users where username = #{username}
</select>
IDEA禁用拼写检查
java学习

打开设置 (Ctrl+Alt+S)
导航到 Editor -> Inspections
找到 Spelling 检查项
取消勾选即可禁用拼写检查