WordPress 基础配置
域名与托管
域名是网站的名称,用户在浏览器中输入以访问网站。对于 WordPress 网站,需通过域名注册商(如 GoDaddy、Namecheap)注册简洁易记的域名。
托管是指将网站文件存储在网络服务器上。WordPress 托管服务通常提供一键安装、自动更新备份及高级安全功能。主要分为共享托管(经济实惠)和托管型托管(资源独立,适合高流量)。
添加页面与文章
- 登录后台:访问
你的域名/wp-admin。 - 新建页面/文章:在左侧菜单选择'页面'或'文章',点击'新建'。
- 编辑内容:输入标题,使用编辑器添加文本、图片等元素。
- 设置属性:配置父页面、模板、特色图像、分类目录及标签。
- 发布:确认无误后点击'发布'按钮。
Spring Boot + MyBatis-Plus 接口实现
以下是一套基于 Spring Boot 和 MyBatis-Plus 的好友关系 RESTful 接口设计示例。
接口清单
| 功能 | 方法 | 路径 | 参数 | 返回 |
|---|---|---|---|---|
| 添加好友 | POST | /friends | {userId, friendId} | 操作结果 |
| 删除好友 | DELETE | /friends | {userId, friendId} | 操作结果 |
| 查询好友列表 | GET | /friends/{userId} | - | 好友列表 |
| 检查好友关系 | GET | /friends/check | userId, friendId | 是否好友 |
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;
}
}
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("用户不存在");
}
}
}
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);
}
统一返回结构
@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;
}
}
数据库索引优化
为什么需要为 email 字段建立索引
- 提高查询性能:将查找复杂度从 O(n) 降至 O(log n),加速登录、密码重置等操作。
- 保证数据唯一性:通过唯一索引避免重复注册。
- 支持高级查询:优化前缀查询和模糊查询。
注意事项
- 权衡写入性能:索引会略微降低增删改速度,但对读取频繁的应用利大于弊。
- 选择合适的类型:普通索引用于查询,唯一索引用于约束。
- 长度考虑:长字符串可考虑前缀索引。
实际应用示例
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)
);
前端依赖问题排查
OpenAPI 报错 tslib 缺失
在使用 OpenAPI 工具生成前端代码时,可能遇到 Cannot find module 'tslib' 错误。
解决方案
-
手动安装 tslib
npm install tslib --save # 或使用 Yarn yarn add tslib -
验证依赖结构 检查
node_modules目录中是否存在tslib。 -
验证 package.json 确保包含如下依赖项:
{ "dependencies": { "tslib": "^2.6.2" } } -
重新运行命令
npm run openapi

