WordPress 基础配置与开发环境搭建
WordPress 核心概念与操作
在构建内容管理系统时,域名和托管是基础。域名作为网站的互联网门牌号,建议选择简洁易记且与主题相关的后缀(如 .com、.cn)。托管服务则负责存储网站文件并提供访问能力,常见的有共享托管(适合小型站点)和管理型托管(适合高并发场景),后者通常包含自动更新、备份及安全加固功能。
页面与文章管理
- 登录后台:访问
域名/wp-admin输入凭证。 - 新建页面/文章:在左侧菜单选择对应入口,填写标题与内容。
- 属性设置:可配置父页面、模板及特色图像。
- 发布:确认无误后点击发布,即可查看前端效果。
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/check | userId, 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 字段建立索引是提升查询效率的关键手段。
- 提高查询性能:将查找复杂度从 O(n) 降至 O(log n),加速登录或密码重置流程。
- 保证唯一性:创建唯一索引可防止重复注册。
CREATE UNIQUE INDEX idx_email ON users(email); - 注意事项:索引会略微降低写入速度,但读取频繁的场景下利大于弊。对于长字符串,可考虑前缀索引以节省空间。
前端 OpenAPI 工具链问题排查
运行 npm run openapi 时报错 Cannot find module 'tslib',这是 TypeScript 运行时库缺失导致的。
解决方案
- 手动安装依赖:
npm install tslib --save # 或使用 Yarn yarn add tslib - 验证依赖结构:检查
node_modules/tslib目录是否存在。 - 检查 package.json:确保 dependencies 中包含 tslib 条目。
- 重新运行:修复后再次执行命令即可正常生成代码。
总结
通过实际项目演练,掌握 RESTful 接口设计规范与 MyBatis-Plus 核心用法。在工程实践中,注重环境配置的规范性与代码原理的理解,借助工具提升效率的同时保持对技术细节的把控。

