WordPress 基础配置与 Spring Boot MyBatis-Plus 开发实战
记录了 WordPress 基础配置流程,重点介绍了基于 Spring Boot 和 MyBatis-Plus 实现好友关系 CRUD 接口的完整设计(含 Controller、Service、Mapper 层)。此外,阐述了为数据库 email 字段建立索引的性能优势,并提供了 Node.js 环境下 tslib 模块缺失导致 OpenAPI 报错的解决方案。

记录了 WordPress 基础配置流程,重点介绍了基于 Spring Boot 和 MyBatis-Plus 实现好友关系 CRUD 接口的完整设计(含 Controller、Service、Mapper 层)。此外,阐述了为数据库 email 字段建立索引的性能优势,并提供了 Node.js 环境下 tslib 模块缺失导致 OpenAPI 报错的解决方案。

在 WordPress 中,域和托管是搭建网站的重要组成部分。
域名是网站的名称,也是用户在浏览器中输入以访问网站的 URL 地址。对于 WordPress 网站来说,你需要拥有一个独特的域名来代表自己的网站。常见的域名注册商有 GoDaddy、Namecheap 等。在选择域名时,尽量选择简洁易记、与网站主题相关的名称,并且要注意域名的后缀,常见的后缀有.com、.cn、.net 等。
托管是指将网站的文件、数据等存储在网络服务器上,使得网站能够在互联网上被访问到的服务。WordPress 托管服务通常具有一些特点和优势,比如提供一键式 WordPress 安装,让你可以轻松快速地将 WordPress 系统安装到服务器上。同时,还会提供自动更新和备份功能,确保你的 WordPress 系统、插件和主题保持最新版本,提高安全性。
WordPress 托管主要有以下两种类型:
以下是一套完整的用户好友关系 RESTful 接口设计(含 Controller、Service、Mapper 实现),使用 Spring Boot + MyBatis-Plus 快速实现增删改查(CRUD)。
| 功能 | 方法 | 路径 | 参数 | 返回 |
|---|---|---|---|---|
| 添加好友 | POST | /friends | {userId, friendId} | 操作结果 |
| 删除好友 | DELETE | /friends | {userId, friendId} | 操作结果 |
| 查询好友列表 | GET | /friends/{userId} | - | 好友列表 |
| 检查好友关系 | GET | /friends/check | userId, friendId | 是否好友 |
@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;
}
}
@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 {
relationMapper.existsRelation(userId, friendId);
}
{
(userMapper.selectById(userId) == ) {
();
}
}
}
@Data
@TableName("user_friend_relation")
public class FriendRelation {
@TableId(type = IdType.AUTO)
private Long id;
private Integer userId;
private Integer friendId;
private LocalDateTime createTime;
}
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);
}
@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;
}
}
@Transactional。@Valid + @NotNull 注解。(user_id, friend_id)。为数据库中的 email 字段建立索引是数据库优化的重要实践,主要原因包括:
CREATE UNIQUE INDEX idx_email ON users(email);
CREATE INDEX idx_email ON users(email(50));-- 创建用户表示例
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password_hash VARCHAR(255) NOT NULL,
-- 其他字段...
UNIQUE INDEX idx_email (email) -- 唯一索引
);
-- 登录查询将非常高效
EXPLAIN SELECT * FROM users WHERE email = '[email protected]';
在使用 Node.js 运行 OpenAPI 生成命令时,可能会遇到缺少 tslib 模块的错误。
Error: Cannot find module 'tslib'
Require stack:
<project_path>/node_modules/@umijs/openapi/dist/index.js
首先确保 tslib 已安装到项目中:
npm install tslib --save
# 或使用 Yarn
yarn add tslib
检查 node_modules 目录中是否存在 tslib:
ls node_modules/tslib # Linux/macOS
dir node_modules\tslib # Windows
如果不存在,说明安装过程有问题,需要重新安装。
确保 package.json 中包含 tslib 依赖:
{
"dependencies": {
"tslib": "^2.6.2"
}
}
安装完成后,再次运行命令:
npm run openapi

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online