跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaNode.js大前端java

WordPress 基础配置与 Spring Boot + MyBatis-Plus 实战

本文记录了从 WordPress 基础搭建到 Spring Boot 后端接口开发的完整流程,涵盖 MyBatis-Plus 实体映射、事务控制及统一返回结构设计。同时整理了 IDE 环境配置中的 JDK 版本兼容性问题、数据库索引优化策略以及前端 OpenAPI 工具链中 tslib 缺失的解决方案。重点在于通过实际案例展示 RESTful 接口设计规范与常见工程化问题的排查思路。

晚风叙旧发布于 2026/4/7更新于 2026/10/24105 浏览
WordPress 基础配置与 Spring Boot + MyBatis-Plus 实战

WordPress 基础配置与开发环境搭建

WordPress 核心概念与操作

在构建内容管理系统时,域名和托管是基础。域名作为网站的互联网门牌号,建议选择简洁易记且与主题相关的后缀(如 .com、.cn)。托管服务则负责存储网站文件并提供访问能力,常见的有共享托管(适合小型站点)和管理型托管(适合高并发场景),后者通常包含自动更新、备份及安全加固功能。

页面与文章管理

  1. 登录后台:访问 域名/wp-admin 输入凭证。
  2. 新建页面/文章:在左侧菜单选择对应入口,填写标题与内容。
  3. 属性设置:可配置父页面、模板及特色图像。
  4. 发布:确认无误后点击发布,即可查看前端效果。

IDE 与环境配置经验

在使用 IntelliJ IDEA 进行 Java 开发时,环境兼容性至关重要。

MyBatisX 插件与数据库连接

安装 MyBatisX 插件后,若连接数据库未显示表结构,可通过右键数据源 -> Tools -> Manage Shown Schemas 勾选目标数据库。生成代码时注意选择 MyBatis-Plus 3 模板,若版本不匹配需升级插件。

JDK 与 Maven 配置

旧版 IDEA(如 2019)搭配 JDK 17 可能出现兼容性问题,建议升级至 2023 及以上版本。Maven 本地仓库路径应统一规划,避免依赖下载缓慢。检查项目语言级别与系统 JDK 版本是否一致,防止编译报错。

Spring Boot + MyBatis-Plus 接口实现

以下是一套基于 RESTful 规范的好友关系接口设计,涵盖 Controller、Service、Mapper 层及统一返回结构。

1. 接口清单

功能方法路径参数
添加好友POST/friends{userId, friendId}
删除好友DELETE/friends{userId, friendId}
查询列表GET/friends/{userId}-
检查关系GET/friends/checkuserId, friendId

2. Controller 层

@RestController
@RequestMapping("/friends")
@RequiredArgsConstructor
public class FriendController {
    private final FriendService friendService;

    @PostMapping
    public Result<Boolean> addFriend(@RequestBody @Valid FriendRequest request) {
        return Result.success(friendService.addFriend(request.getUserId(), request.getFriendId()));
    }

    @DeleteMapping
    public Result<Boolean> deleteFriend(@RequestBody @Valid FriendRequest request) {
        return Result.success(friendService.deleteFriend(request.getUserId(), request.getFriendId()));
    }

    @GetMapping("/{userId}")
    public Result<List<FriendDTO>> getFriends(@PathVariable Integer userId) {
        return Result.success(friendService.getFriends(userId));
    }

    @GetMapping("/check")
    public Result<Boolean> isFriend(@RequestParam Integer userId, @RequestParam Integer friendId) {
        return Result.success(friendService.isFriend(userId, friendId));
    }

    @Data
    static class FriendRequest {
        @NotNull
        private Integer userId;
        @NotNull
        private Integer friendId;
    }
}

3. Service 层

@Service
@RequiredArgsConstructor
public class FriendServiceImpl implements FriendService {
    private final UserMapper userMapper;
    private final FriendRelationMapper relationMapper;

    @Override
    @Transactional
    public boolean addFriend(Integer userId, Integer friendId) {
        checkUserExists(userId);
        checkUserExists(friendId);
        if (relationMapper.existsRelation(userId, friendId)) {
            return false;
        }
        relationMapper.insert(new FriendRelation(userId, friendId));
        relationMapper.insert(new FriendRelation(friendId, userId));
        return true;
    }

    @Override
    @Transactional
    public boolean deleteFriend(Integer userId, Integer friendId) {
        relationMapper.deleteRelation(userId, friendId);
        relationMapper.deleteRelation(friendId, userId);
        return true;
    }

    @Override
    public List<FriendDTO> getFriends(Integer userId) {
        return relationMapper.selectFriendList(userId).stream()
                .map(user -> new FriendDTO(user.getId(), user.getNickname(), user.getAvatar()))
                .collect(Collectors.toList());
    }

    @Override
    public boolean isFriend(Integer userId, Integer friendId) {
        return relationMapper.existsRelation(userId, friendId);
    }

    private void checkUserExists(Integer userId) {
        if (userMapper.selectById(userId) == null) {
            throw new BusinessException("用户不存在");
        }
    }
}

4. Mapper 层(MyBatis-Plus)

实体类定义:

@Data
@TableName("user_friend_relation")
public class FriendRelation {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Integer userId;
    private Integer friendId;
    private LocalDateTime createTime;
}

Mapper 接口:

public interface FriendRelationMapper extends BaseMapper<FriendRelation> {
    @Select("SELECT COUNT(1) FROM user_friend_relation " +
            "WHERE user_id = #{userId} AND friend_id = #{friendId}")
    boolean existsRelation(@Param("userId") Integer userId, @Param("friendId") Integer friendId);

    @Delete("DELETE FROM user_friend_relation " +
            "WHERE user_id = #{userId} AND friend_id = #{friendId}")
    int deleteRelation(@Param("userId") Integer userId, @Param("friendId") Integer friendId);

    @Select("SELECT u.* FROM user u " +
            "JOIN user_friend_relation r ON u.id = r.friend_id " +
            "WHERE r.user_id = #{userId}")
    List<User> selectFriendList(Integer userId);
}

5. 统一返回结构

@Data
public class Result<T> {
    private int code;
    private String msg;
    private T data;

    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMsg("success");
        result.setData(data);
        return result;
    }
}

6. 关键设计说明

  • 事务控制:增删操作必须加 @Transactional 保证数据一致性。
  • 参数校验:使用 @Valid 配合 @NotNull 注解拦截非法请求。
  • 性能优化:通过 JOIN 查询减少 N+1 问题,建议在 (user_id, friend_id) 上建立联合索引。

数据库索引优化实践

为 email 字段建立索引是提升查询效率的关键手段。

  1. 提高查询性能:将查找复杂度从 O(n) 降至 O(log n),加速登录或密码重置流程。
  2. 保证唯一性:创建唯一索引可防止重复注册。
    CREATE UNIQUE INDEX idx_email ON users(email);
    
  3. 注意事项:索引会略微降低写入速度,但读取频繁的场景下利大于弊。对于长字符串,可考虑前缀索引以节省空间。

前端 OpenAPI 工具链问题排查

运行 npm run openapi 时报错 Cannot find module 'tslib',这是 TypeScript 运行时库缺失导致的。

解决方案

  1. 手动安装依赖:
    npm install tslib --save
    # 或使用 Yarn
    yarn add tslib
    
  2. 验证依赖结构:检查 node_modules/tslib 目录是否存在。
  3. 检查 package.json:确保 dependencies 中包含 tslib 条目。
  4. 重新运行:修复后再次执行命令即可正常生成代码。

总结

通过实际项目演练,掌握 RESTful 接口设计规范与 MyBatis-Plus 核心用法。在工程实践中,注重环境配置的规范性与代码原理的理解,借助工具提升效率的同时保持对技术细节的把控。

目录

  1. WordPress 基础配置与开发环境搭建
  2. WordPress 核心概念与操作
  3. 页面与文章管理
  4. IDE 与环境配置经验
  5. MyBatisX 插件与数据库连接
  6. JDK 与 Maven 配置
  7. Spring Boot + MyBatis-Plus 接口实现
  8. 1. 接口清单
  9. 2. Controller 层
  10. 3. Service 层
  11. 4. Mapper 层(MyBatis-Plus)
  12. 5. 统一返回结构
  13. 6. 关键设计说明
  14. 数据库索引优化实践
  15. 前端 OpenAPI 工具链问题排查
  16. 解决方案
  17. 或使用 Yarn
  18. 总结

更多推荐文章

查看全部
  • 主成分分析(PCA)原理与实战应用
  • 2023 中国大模型落地应用案例集核心洞察
  • 基于 DeepFace 与 OpenCV 的实时情绪分析器实现
  • 无项目经验如何转行 AIGC 产品经理:职责、技能与成长路径
  • 人工智能大模型基础:历史演进与核心技术解析
  • 大模型显存占用详解:单卡训练与推理
  • 大模型技术入门:基础概念、训练与微调实战指南
  • OpenCode、OpenClaw 与 Ollama 本地 AI 智能体安装配置
  • 2026 年 3 月全球 AI 前沿动态:模型、智能体与产业融合
  • GLM-5 大模型代码生成实战评测与参数调优
  • Prism 工具简介、安装使用及案例应用详解
  • C++ ODB ORM 框架入门与实战
  • Stable Diffusion 3.5 云端教程:零基础快速上手
  • 基于 LlamaFactory 微调 Qwen3.5-4B 模型实战指南
  • JavaSE 封装详解
  • 数据结构:图的定义、存储与遍历应用
  • Python 经典编程示例及实际应用解析
  • MCP 协议详解:与 Function Call 的区别及实战使用
  • DeepSeek 深度使用指南:提示词工程与本地知识库搭建
  • 具身智能年度报告:RoboChallenge 4 万次真机评测显示最强模型成功率仅 51%

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online