站长信息
jeffery.xu
jeffery.xu

软件工程师

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

811495111@qq.com
18521510875
筛选

个人笔记

json和实体类关联
java学习
@JsonProperty("status")
在实体类字段加上该注解
@Bean注解详解
编程技巧

@Bean注解是Spring框架中的核心注解,用于将方法返回的对象注册为Spring容器管理的Bean。


@Bean的核心作用
1. Bean注册


将方法返回的对象注册到Spring的IoC容器中
成为Spring管理的组件,可以被依赖注入
2. 生命周期管理


Spring负责Bean的创建、初始化和销毁
默认为单例模式(Singleton)
3. 依赖注入
可以在任何Spring管理的类中通过@Autowired注入使用

@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

执行过程:
Spring启动时扫描到这个方法
调用方法创建BCryptPasswordEncoder实例
将实例注册到容器中,Bean名称为passwordEncoder
全应用共享这一个实例

常见的Bean作用域
singleton(默认):全局单例
prototype:每次注入创建新实例
request:每个HTTP请求一个实例
session:每个HTTP会话一个实例

@Bean本质上是告诉Spring:"这个方法返回的对象请帮我管理,其他地方需要时直接注入给它们"。
Mysql强行清空有外键的表
编程技巧
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE users;
初步pom配置
编程技巧
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.mobizone</groupId>
    <artifactId>kb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>kb</name>
    <description>kb</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>24</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencies>
    <!--    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>-->
<!--        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>com.mysql</groupId>-->
<!--            <artifactId>mysql-connector-j</artifactId>-->
<!--            <scope>runtime</scope>-->
<!--        </dependency>-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
        <!-- JWT -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.11.5</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.11.5</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.11.5</version>
            <scope>runtime</scope>
        </dependency>
        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.38</version>
            <optional>true</optional>
        </dependency>
        <!-- Swagger (springdoc-openapi) -->
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
            <version>2.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

总结几个问题
1. springboot 3.5.4  Lombok要版本高
2. mybatis 版本要新
3. 其他的暂时没碰到问题

明末第二章
游戏攻略
第二章-云顶城

望山村:谜题门正确答案:逆行因果→桥头对话望山村女眷→神龛旁见到老婆婆,给她蒸面兔→村里打怪物获得【贵重物品】珊湖手串→一间房子里的人说有个大侠被打了东西被抢了→在药商之墓使用“调查”姿势,获得【贵重物品】蜀绣丝帕→珊湖手串给望山村女眷,刷新后死亡→落雪小道

落雪小道:对话年大侠→对话李定国、孙可望→落雪小道神龛前,打弓箭手得到大西军令,附近捡到【贵重物品】破烂的包袱→破烂的包袱给年大侠,可以选择揭穿逗逗他→落雪小道神龛旁对话吴刚

云顶外城:(女道士清醒线)房子里遇到女道士,对话得到【贵重物品】真武观秘卷→神龛附近村里房子二楼对话老婆婆→神龛附近烽火台上对话白袍老者→点燃三个烽火台,放下吊桥

寄死窟:矿道入口附近桥头发现寄死窟→和墙里的老人对话,得到【贵重物品】长寿碗→外城矿道→大西军营地

大西军营地:神龛旁帐篷打艾能奇的亲信,得到大西军营地钥匙→对话年大侠→打艾能奇→对话年大侠→白玉丸子给老婆婆

映雪门:过桥到映雪门打刘公公→进屋对话何有哉→出门对话雪堡账房李万三,(女道士清醒线)给李万三真武观秘卷,得到赤汞晶石给女道士→云顶内城

云顶内城:来到云顶内城,有只怪物堵在方瑶门口,干掉怪物和方瑶对话,她就是药商之女,给她蜀绣丝帕→客栈街道旁对话雪堡管家沈彦平,答应帮他找凤冠霞帔→客栈里见到俩小孩,对话沈静安帮她找胖子,长寿碗给麻杆→在云顶集市帐篷找到胖子,劝他回去找老大→找回胖子后,对话沈静安得到凤冠霞帔→给雪堡管家沈彦平看凤冠霞帔→雪堡主堡

雪堡主堡:(女道士清醒线)如果你没有打艾能奇就来了雪堡,李账房会在这里拦截你,他恨你断了他的财路→上楼对话素衣侠女、雪堡夫人→凤冠霞帔给雪堡夫人,隐瞒管家消息→电梯下方有隐藏缺口,到地下宝库见到熊猫

竖井:打雪堡夫人→回普元寺对话玄阳子→竖井入口神龛旁对话方瑶,答应帮忙→竖井里拿到【贵重物品】怪医研究手记→新娘闺阁神龛桥头对话何有哉,给他看怪医研究手记、实验手记·残页一→回普元寺对话玄阳子

新娘闺阁:沿着撒花瓣的路走,对话牢房里的红岚→打戴斗笠的红衣高级侍女,得到地牢钥匙给红岚→桥头对话说书人→过桥时掉下,在喜宴厅堂打完美新娘方灵→在神龛入梦刷新后,对话方瑶、说书人,说书人会把你传送到第三章入口→回普元寺对话瑜夏、玄阳子→去看望普元寺外的垂髫小童,没有对话,只听到痛苦的呻吟

如何使用 WSL(Windows Subsystem for Linux)
编程技巧

先决条件

必须运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11 才能使用以下命令。 如果使用的是早期版本,请参阅 手动安装页

安装 WSL 命令

现在,可以使用单个命令安装运行 WSL 所需的所有内容。 右键单击并选择“以管理员身份运行”,在 管理员 模式下打开 PowerShell 或 Windows 命令提示符,输入 wsl --install 命令,然后重新启动计算机。

PowerShell
wsl --install

此命令将启用运行 WSL 并安装 Linux 的 Ubuntu 分发所需的功能。 (可以更改此默认分布)。

如果运行的是较旧的版本,或者只是不想使用安装命令,并且想要分步说明,请参阅 适用于旧版本的 WSL 手动安装步骤

首次启动新安装的 Linux 分发版时,控制台窗口将打开,系统会要求你等待文件取消压缩并存储在计算机上。 所有未来的发射应该需要不到一秒钟的时间。

知识库数据库设计
编程技巧
-- 用户表
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),
    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 roles (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    role_name VARCHAR(50) UNIQUE NOT NULL,
    role_code VARCHAR(50) UNIQUE NOT NULL,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 用户角色关联表
CREATE TABLE user_roles (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,
    role_id BIGINT NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (role_id) REFERENCES roles(id),
    UNIQUE KEY uk_user_role (user_id, role_id)
);

-- 知识分类/目录表
CREATE TABLE categories (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    parent_id BIGINT DEFAULT 0 COMMENT '父分类ID,0为顶级分类',
    sort_order INT DEFAULT 0,
    description TEXT,
    icon VARCHAR(100),
    status TINYINT DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- 知识文章表
CREATE TABLE articles (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    content LONGTEXT,
    summary TEXT,
    category_id BIGINT,
    author_id BIGINT NOT NULL,
    view_count INT DEFAULT 0,
    like_count INT DEFAULT 0,
    status TINYINT DEFAULT 1 COMMENT '1:发布 0:草稿 -1:删除',
    is_top TINYINT DEFAULT 0 COMMENT '是否置顶',
    tags VARCHAR(500),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (category_id) REFERENCES categories(id),
    FOREIGN KEY (author_id) REFERENCES users(id)
);

-- 附件表
CREATE TABLE attachments (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    article_id BIGINT,
    file_name VARCHAR(255) NOT NULL,
    file_path VARCHAR(500) NOT NULL,
    file_size BIGINT,
    file_type VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (article_id) REFERENCES articles(id)
);
java知识库网站初步设想
编程技巧

前后端分离 + Spring Boot + MyBatis + MySQL 暂定的项目架构:

## 后端技术栈

```xml
<!-- 主要依赖 -->
Spring Boot 3.x
├── Spring Security (认证授权)
├── MyBatis Plus (数据访问层)
├── MySQL 8.0 (数据库)
├── Redis (缓存)
├── JWT (Token认证)
└── Swagger (API文档)
```

## 项目结构

```
knowledge-base-backend/
├── src/main/java/com/example/kb/
│   ├── config/          # 配置类
│   ├── controller/      # 控制器
│   ├── service/         # 业务层
│   ├── mapper/          # MyBatis映射接口
│   ├── entity/          # 实体类
│   ├── dto/             # 数据传输对象
│   ├── vo/              # 视图对象
│   ├── common/          # 公共类
│   └── utils/           # 工具类
├── src/main/resources/
│   ├── mapper/          # MyBatis XML映射文件
│   ├── application.yml  # 配置文件
│   └── static/          # 静态资源
└── pom.xml
```

## Maven依赖配置

```xml
<dependencies>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Spring Security -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
    <!-- MyBatis Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.4</version>
    </dependency>
    
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    
    <!-- Redis -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    <!-- JWT -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-api</artifactId>
        <version>0.11.5</version>
    </dependency>
    
    <!-- Swagger -->
    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
        <version>2.2.0</version>
    </dependency>
</dependencies>
```

## 核心实体类设计

### User实体类
```java
@Data
@TableName("users")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    
    private String username;
    private String password;
    private String email;
    private String nickname;
    private String avatar;
    private Integer status;
    
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
}
```

### Article实体类
```java
@Data
@TableName("articles")
public class Article {
    @TableId(type = IdType.AUTO)
    private Long id;
    
    private String title;
    private String content;
    private String summary;
    private Long categoryId;
    private Long authorId;
    private Integer viewCount;
    private Integer likeCount;
    private Integer status;
    private Integer isTop;
    private String tags;
    
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
}
```

## MyBatis配置

### application.yml
```yaml
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/knowledge_base?useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: your_password
    
  redis:
    host: localhost
    port: 6379
    database: 0

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.kb.entity
```

## 前端技术栈

### 前台用户端
```json
{
  "技术栈": {
    "框架": "Vue 3 + Vite",
    "UI库": "Element Plus",
    "路由": "Vue Router 4", 
    "状态管理": "Pinia",
    "HTTP客户端": "Axios",
    "编辑器": "Vditor/TinyMCE"
  }
}
```

### 后台管理端
```json
{
  "技术栈": {
    "框架": "Vue 3 + Vite",
    "UI库": "Element Plus",
    "模板": "vue-element-plus-admin",
    "图表": "ECharts",
    "表格": "Element Plus Table"
  }
}
```

## API接口设计示例

### 文章相关接口
```java
@RestController
@RequestMapping("/api/articles")
public class ArticleController {
    
    @GetMapping("/list")
    public R<IPage<ArticleVO>> getArticleList(@RequestParam Map<String, Object> params) {
        // 分页查询文章列表
    }
    
    @GetMapping("/{id}")
    public R<ArticleVO> getArticleById(@PathVariable Long id) {
        // 获取文章详情
    }
    
    @PostMapping
    public R<Void> saveArticle(@RequestBody ArticleDTO articleDTO) {
        // 新增文章
    }
    
    @PutMapping("/{id}")
    public R<Void> updateArticle(@PathVariable Long id, @RequestBody ArticleDTO articleDTO) {
        // 更新文章
    }
}
```

## 开发建议

1. **数据库设计**:先创建数据库表结构
2. **后端开发**:从Entity → Mapper → Service → Controller的顺序开发
3. **前端开发**:先搭建基础框架,再开发具体页面
4. **接口联调**:使用Swagger进行接口测试

需要我提供具体的某个模块的详细代码吗?比如用户认证、文章管理等。

WSL上安装java
编程技巧

# 下载Oracle JDK 24
wget https://download.oracle.com/java/24/latest/jdk-24_linux-x64_bin.tar.gz

# 解压到/opt目录
sudo tar -xzf jdk-24_linux-x64_bin.tar.gz -C /opt/

nano ~/.bashrc

export JAVA_HOME=/opt/jdk-24.0.2/
export JAVA_BIN=$JAVA_HOME/bin
export JAVA_LIB=$JAVA_HOME/lib
export CLASSPATH=.:$JAVA_LIB/tools.jar:$JAVA_LIB/dt.jar
export PATH=$JAVA_BIN:$PATH

source ~/.bashrc

source:Shell内置命令,用于执行脚本文件中的命令
.bashrc:Bash配置文件,包含用户的Shell环境设置
作用
重新加载当前用户的Bash配置文件,使新的环境变量和设置立即生效,而无需重新登录或重启终端。

# 检查环境变量
echo $JAVA_HOME
echo $PATH

# 检查Java是否可用
java -version

sudo apt update && sudo apt upgrade -y 解释
编程技巧

sudo:以管理员权限执行
apt:Ubuntu/Debian的包管理器
update:更新软件包列表(不安装软件,只更新可用软件的信息)
&&:逻辑与,前面命令成功后才执行后面的命令
upgrade -y:升级所有已安装的软件包到最新版本,-y表示自动确认所有提示
为什么更新了很多东西
WSL的Ubuntu系统预装了很多基础软件包:


Python:系统自带Python,很多Linux工具依赖它
系统库:各种系统级别的库文件
开发工具:编译器、构建工具等
网络工具:curl、wget等
这是正常的吗?
是的,这是完全正常的。首次运行时通常会更新:


100-300个软件包
包括Python、系统库、安全补丁等
确保系统处于最新和安全的状态
对你的Java开发影响
更新这些包是好事:


确保系统安全性
获得最新的开发工具
为安装Java环境提供更好的基础