踩坑与成长:WordPress、MyBatis-Plus 及前端依赖问题解决记录

踩坑与成长:WordPress、MyBatis-Plus 及前端依赖问题解决记录

目录

第一天,了解wordpress学习
wordpress 是一款非常流行且功能强大的内容管理系统(CMS)

WordPress中要点,域和托管

在 WordPress 中,域和托管是搭建网站的重要组成部分,下面为你分别介绍:

域名

域名是网站的名称,也是用户在浏览器中输入以访问网站的 URL 地址,它就像是网站在互联网上的门牌号,方便用户记住和访问你的网站。例如,“baidu.com”就是一个域名。对于 WordPress 网站来说,你需要拥有一个独特的域名来代表自己的网站。你可以通过域名注册商来注册域名,常见的域名注册商有 GoDaddy、Namecheap 等。在选择域名时,尽量选择简洁易记、与网站主题相关的名称,并且要注意域名的后缀,常见的后缀有.com、.cn、.net 等,不同后缀的价格和适用场景可能会有所不同。

托管

托管是指将网站的文件、数据等存储在网络服务器上,使得网站能够在互联网上被访问到的服务。如果没有托管服务,你的网站文件就没有地方存放,自然也就无法被其他人访问。

WordPress 托管服务通常具有一些特点和优势,比如提供一键式 WordPress 安装,让你可以轻松快速地将 WordPress 系统安装到服务器上,无需复杂的操作。同时,还会提供自动更新和备份功能,确保你的 WordPress 系统、插件和主题保持最新版本,提高安全性,并且定期备份网站数据,以防数据丢失。此外,很多托管服务还会配备高级安全功能,帮助防范常见的网络威胁,如黑客攻击、恶意软件入侵等,保障网站的安全运行。

WordPress 托管主要有以下两种类型:

  • 共享 WordPress 托管:这是一种比较经济实惠的选择,多个网站会共享同一台服务器的资源,如 CPU、内存、存储等。虽然资源是共享的,但对于一些小型网站或流量不大的网站来说,通常已经足够使用,能够满足基本的网站运行需求。
  • 监督 WordPress 托管:也叫托管型 WordPress hosting,这种托管方式提供了更全面的管理服务,包括技术支持、安全性保障、性能优化等,并且通常会为网站分配更多的服务器资源,能更好地应对高流量、高并发等情况,适合对网站性能和稳定性要求较高的企业网站或大型网站,但价格相对也会更高一些。

在WordPress中添加新页面和新文章的操作都比较简单,以下分别为你介绍具体步骤:

添加新页面

  1. 登录后台:打开浏览器,输入你的WordPress网站后台地址,通常是“你的域名/wp - admin”,然后输入用户名和密码进行登录。
  2. 进入新建页面界面:在后台左侧的导航菜单中,找到“页面”选项,将鼠标移上去,会弹出子菜单,点击“新建页面”。
  3. 编辑页面内容:在新页面的编辑界面,首先在“标题”框中输入页面的标题。然后使用编辑器添加页面的具体内容,你可以添加文字、图片、视频等多种元素,还能利用编辑器的工具对文本进行格式化,如加粗、斜体、添加链接等。
  4. 设置页面属性:在右侧边栏,可以设置页面的属性。例如,如果该页面是某个页面的子页面,可以在“父页面”选项中进行选择;如果主题提供了不同的页面模板,也可以在“模板”选项中选择合适的模板;此外,还可以设置特色图像等。
  5. 发布或保存草稿:编辑完成后,若确认内容无误,点击“发布”按钮,即可将页面发布到网站上;若还想继续修改,可以点击“保存草稿”,将页面保存为草稿状态,后续再进行编辑。
  6. 查看页面效果:发布成功后,点击“查看页面”按钮,就能查看页面在网站上的实际显示效果。

添加新文章

  1. 登录后台:同样通过“你的域名/wp - admin”访问后台,输入账号密码登录。
  2. 进入新建文章界面:在后台左侧菜单中,找到“文章”选项,点击它,然后在弹出的子菜单中选择“写文章”,即可进入新文章的编辑页面。
  3. 填写文章信息:在“标题”框中输入文章的标题,然后在下方的内容编辑区域撰写文章内容。你可以根据需要使用工具栏对文本进行格式设置,或者点击“+”按钮添加不同类型的区块,如图片、视频等。
  4. 设置特色图像:点击右侧的“设置特色图像”选项,选择你想要上传的图片,将其设置为文章的特色图像,这可以让文章在列表中更加醒目。
  5. 选择分类和标签:为了便于文章的管理和检索,需要为文章选择合适的分类和标签。点击右侧的“分类目录”区域,选择已有的分类,或者点击“添加新分类”来创建新的分类;在“标签”框中输入与文章相关的标签内容。
  6. 设置文章可见性:在右侧的“发布”框中,设置文章的可见性,通常选择“公开”即可,若有其他需求,也可以选择“私密”等其他选项。
  7. 发布文章:当所有内容都设置完成后,点击“发布”按钮,文章就会立即发布到网站上。发布后,你可以访问网站查看新文章的效果。

idea连接数据库成功后没有分支表,

No schemas selected 

可以根据以下操作执行

在这里插入图片描述


在这里插入图片描述


需要下载mybatisX,的插件。在file

在数据库中点击表单生成mybatisX-genertor->module path,basepackage,使用的是domain-》
annotation,Mybatis-Plus3,options comment
lombok.但是我在template,中没看到mybatis-plus3,我想要3

可以去升级插件

idea2019不要用jdk17。这是血的教训。尽量用2023版本以上,放在我用2023版本会好一点。
告诉大家换了一个idea后,查看自己的maven文件放在哪里,不然下的贼鸡儿慢,这是为什么,嘿嘿,不知道
点击file-》setting-》搜索maven,可以查看到自己maven,没有就自己创建maven的文件。

在这里插入图片描述


文件地址最好是一起的,我用的是同事给的maven
我个人建议就是小白入公司,自己多加班学习没问题,就比如说我,我现在还不学,我就有可能被炒鱿鱼。加油苦逼的打工人。
在搜索框中写一个javac,点击下面的查看语言水平,放在我不知道为什么17变成16.
现在我好像知道了,我在使用接口的时候需要,就变成现在16了。

在这里插入图片描述


但是我看到我的项目这里是17,系统能跑出来,我就不清楚了。

在这里插入图片描述

对于使用mybatisx的插件,我是真的服了,就是用不了plugins3

安装方式

idea
file-》settings-> Plugins
搜索MyBatisX安装。
下载,install,Apply安装,重启idea

在这里插入图片描述

数据库的连接,我真的哭死了。
从刚开始的一步一步看着教程连接idea的database,
到现在我可以自己初步使用database的连接mysql,

在这里插入图片描述


如果你说没看到database,不好意思我还没遇到,可以找下一家求助。
我就初步连接数据库而已,
点击Database的 + -》Data Source -> mysql。刚开始的时候mysql在下面,自己慢慢找。

在这里插入图片描述

为什么我会在Host这里打框吗?
因为我第一次知道这里可以访问别人云数据库的地址,我还不会云数据库地址,因为要花钱租一个服务器,主要一点我不会弄。没事等我工资发下来,有时间我回去尝试弄一弄。
user,password
自己数据库密码。点击测试连接,apply,ok。

在这里插入图片描述


测试成功都没问题,就是没看到数据库表在哪里,这个时候点击连接数据的右键,看到Tools-> Manage Shown Schemas~

在这里插入图片描述

自己在点击自己的想要的数据库。我是真的服气了。

在这里插入图片描述

好了,这些都出来,数据库使用右键出现mybatisX-Generator

在这里插入图片描述


我就不出下面步骤,为什么呢?因为我的mybatis没有3的应该是映射文件
反正大概就是这样的文件夹,我使用2是可以的,但我目前使用的项目需要3,没办法,直接拿同事的

src/
├── main/
│ ├── java/
│ │ └── com/example/
│ │ ├── service/
│ │ │ ├── OrderService.java # 接口
│ │ │ └── impl/
│ │ │ └── OrderServiceImpl.java # 实现类

其实我没生成出来,所以我就有了这一个疑问,Service接口文件是干啥的。
定义业务逻辑的抽象方法,提供业务逻辑的契约,便于实现多态和松耦合。不好意思作者不知道如何介绍什么松耦合。我就在这标记一下。我会在下面给出合理解释

还有ServiceImpl实现类文件
位于service/impl包下,实现Service接口的具体逻辑

现在进入代码环节,关于接口的增删改查,RESTful 接口设计(含Controller、Service、Mapper实现),使用Spring Boot + MyBatis-Plus快速实现增删改查(CRUD)。
我第一次听别人说crud的时候一脸懵逼,那是什么玩意,我还在想我是不是又没学过。后来一查,我还真没写过。我当时就说我现在就去看看怎木学。嘿嘿,看完之后,ai代写,我又被解开双手了。我同事给我说,你可以用ai,但是你要会这个原理,看的懂代码,说真的,给我注解我都看不懂代码怎么写的。我一想,我就一个新人,那不得好好学习,不能拖同事进度。我先用ai写完接口。我就学习接口怎么写的。
我尽量解释清楚
以下是一套完整的用户好友关系 RESTful 接口设计(含Controller、Service、Mapper实现),使用Spring Boot + MyBatis-Plus快速实现增删改查(CRUD):


1. 接口清单(API Design)

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

2. Controller 层实现

@RestController@RequestMapping("/friends")@RequiredArgsConstructorpublicclassFriendController{privatefinalFriendService friendService;@PostMappingpublicResult<Boolean>addFriend(@RequestBody@ValidFriendRequest request){returnResult.success( friendService.addFriend(request.getUserId(), request.getFriendId()));}@DeleteMappingpublicResult<Boolean>deleteFriend(@RequestBody@ValidFriendRequest request){returnResult.success( friendService.deleteFriend(request.getUserId(), request.getFriendId()));}@GetMapping("/{userId}")publicResult<List<FriendDTO>>getFriends(@PathVariableInteger userId){returnResult.success(friendService.getFriends(userId));}@GetMapping("/check")publicResult<Boolean>isFriend(@RequestParamInteger userId,@RequestParamInteger friendId){returnResult.success(friendService.isFriend(userId, friendId));}// 参数封装类@DatastaticclassFriendRequest{@NotNullprivateInteger userId;@NotNullprivateInteger friendId;}}

3. Service 层实现

@Service@RequiredArgsConstructorpublicclassFriendServiceImplimplementsFriendService{privatefinalUserMapper userMapper;privatefinalFriendRelationMapper relationMapper;@Override@TransactionalpublicbooleanaddFriend(Integer userId,Integer friendId){// 1. 校验用户是否存在checkUserExists(userId);checkUserExists(friendId);// 2. 检查是否已是好友if(relationMapper.existsRelation(userId, friendId)){returnfalse;}// 3. 双向添加关系 relationMapper.insert(newFriendRelation(userId, friendId)); relationMapper.insert(newFriendRelation(friendId, userId));returntrue;}@Override@TransactionalpublicbooleandeleteFriend(Integer userId,Integer friendId){ relationMapper.deleteRelation(userId, friendId); relationMapper.deleteRelation(friendId, userId);returntrue;}@OverridepublicList<FriendDTO>getFriends(Integer userId){return relationMapper.selectFriendList(userId).stream().map(user ->newFriendDTO( user.getId(), user.getNickname(), user.getAvatar())).collect(Collectors.toList());}@OverridepublicbooleanisFriend(Integer userId,Integer friendId){return relationMapper.existsRelation(userId, friendId);}privatevoidcheckUserExists(Integer userId){if(userMapper.selectById(userId)==null){thrownewBusinessException("用户不存在");}}}

4. Mapper 层(MyBatis-Plus)

(1) 好友关系实体
@Data@TableName("user_friend_relation")publicclassFriendRelation{@TableId(type =IdType.AUTO)privateLong id;privateInteger userId;privateInteger friendId;privateLocalDateTime createTime;}
(2) Mapper接口
publicinterfaceFriendRelationMapperextendsBaseMapper<FriendRelation>{@Select("SELECT COUNT(1) FROM user_friend_relation "+"WHERE user_id = #{userId} AND friend_id = #{friendId}")booleanexistsRelation(@Param("userId")Integer userId,@Param("friendId")Integer friendId);@Delete("DELETE FROM user_friend_relation "+"WHERE user_id = #{userId} AND friend_id = #{friendId}")intdeleteRelation(@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. 统一返回结构

@DatapublicclassResult<T>{privateint code;privateString msg;privateT data;publicstatic<T>Result<T>success(T data){Result<T> result =newResult<>(); result.setCode(200); result.setMsg("success"); result.setData(data);return result;}}

6. 接口测试示例

(1) 添加好友
POST /friends Content-Type: application/json { "userId": 1, "friendId": 2 } 

响应:

{"code":200,"msg":"success","data":true}
(2) 查询好友列表
GET /friends/1 

响应:

{"code":200,"msg":"success","data":[{"id":2,"nickname":"张三","avatar":"https://xxx.jpg"}]}

关键设计说明

  1. 事务控制:增删操作添加 @Transactional
  2. 参数校验:使用 @Valid + @NotNull 注解
  3. RESTful规范
    • 创建用POST,删除用DELETE
    • 查询用GET,参数区分路径参数和查询参数
  4. 性能优化
    • 使用JOIN查询避免N+1问题
    • 数据库添加联合索引 (user_id, friend_id)

扩展建议

缓存优化

@Cacheable(value ="user:friends", key ="#userId")publicList<FriendDTO>getFriends(Integer userId){...}

分页查询

@GetMapping("/{userId}/page")publicPageResult<FriendDTO>getFriendsByPage(@PathVariableInteger userId,@RequestParam(defaultValue ="1")Integer page,@RequestParam(defaultValue ="10")Integer size){Page<User> pagedUsers = relationMapper.selectFriendPage(newPage<>(page, size), userId);returnPageResult.success(pagedUsers.convert(this::convertToDTO));}

这套接口提供了标准的CRUD模板,可根据实际需求调整字段和逻辑。

——————

为什么需要为数据库的 email 字段建立索引

为数据库中的 email 字段建立索引是数据库优化的重要实践,主要原因包括:

1. 提高查询性能

  • 快速用户查找:当系统需要通过 email 查找用户时(如登录、密码重置等操作),索引可以将查询复杂度从 O(n) 降到 O(log n)
  • 加速 JOIN 操作:如果 email 作为外键关联其他表,索引能显著提升关联查询速度

2. 保证数据唯一性(当需要时)

  • 避免重复注册或数据不一致问题

通过创建唯一索引(UNIQUE INDEX),可以确保:

CREATEUNIQUEINDEX idx_email ON users(email);

3. 支持高级查询特性

  • 前缀查询优化(如查找所有 ‘@gmail.com’ 结尾的邮箱)
  • 模糊查询优化(某些数据库可以优化 LIKE 查询)

注意事项

  1. 权衡写入性能
    • 索引会略微降低 INSERT/UPDATE/DELETE 速度
    • 但对于读取频繁的应用(大多数Web应用)利远大于弊
  2. 选择合适的索引类型
    • 普通索引:CREATE INDEX idx_email ON users(email);
    • 唯一索引:CREATE UNIQUE INDEX idx_email ON users(email);
    • 哈希索引 vs B-tree 索引(根据数据库类型选择)
  3. 长度考虑
    • 对于很长的 email 地址,某些数据库支持前缀索引
    • 例如 MySQL:CREATE INDEX idx_email ON users(email(50));

实际应用示例

-- 创建用户表示例CREATETABLE users ( id INTAUTO_INCREMENTPRIMARYKEY, email VARCHAR(255)NOTNULL, password_hash VARCHAR(255)NOTNULL,-- 其他字段...UNIQUEINDEX idx_email (email)-- 唯一索引);-- 登录查询将非常高效EXPLAINSELECT*FROM users WHERE email ='[email protected]';

为 email 建立索引是数据库设计的最佳实践,特别是对于用户系统这种 email 作为关键检索条件的场景。

关于前端使用openapi报错原因

“C:\Program Files\nodejs\npm.cmd” run [email protected] openapi
node openapi.config.js

node:internal/modules/cjs/loader:1212 const err = new
Error(message);
^

Error: Cannot find module ‘tslib’ Require stack:D:\bu1\xq\pipei\bushuo-picture-frontend\node_modules@umijs\openapi\dist\index.js
at Module._resolveFilename (node:internal/modules/cjs/loader:1212:15)
at Module._load (node:internal/modules/cjs/loader:1043:27)
at Module.require (node:internal/modules/cjs/loader:1298:19)
at require (node:internal/modules/helpers:182:18)
at Object. (D:\bu1\xq\pipei\bushuo-picture-frontend\node_modules@umijs\openapi\dist\index.js:4:17)
at Module._compile (node:internal/modules/cjs/loader:1529:14)
at Module._extensions…js (node:internal/modules/cjs/loader:1613:10)
at Module.load (node:internal/modules/cjs/loader:1275:32)
at Module._load (node:internal/modules/cjs/loader:1096:12)
at cjsLoader (node:internal/modules/esm/translators:298:15) { code: ‘MODULE_NOT_FOUND’, requireStack: [
‘D:\bu1\xq\pipei\bushuo-picture-frontend\node_modules\@umijs\openapi\dist\index.js’
] }

Node.js v20.19.3

我的后端使用的接口文档是knife

在这里插入图片描述


前端的js

在这里插入图片描述


问题仍然是 Node.js 找不到 tslib 模块,这是一个 TypeScript 运行时库,通常由使用 TypeScript 编写的包依赖。以下是针对该问题的详细解决方案:

解决方案

1. 手动安装 tslib

首先确保 tslib 已安装到项目中:

npminstall tslib --save 

或使用 Yarn:

yarnadd tslib 

2. 验证依赖结构

检查 node_modules 目录中是否存在 tslib

ls node_modules/tslib # Linux/macOSdir node_modules\tslib # Windows

如果不存在,说明安装过程有问题,需要重新安装。

3. 验证 package.json

确保 package.json 中包含 tslib 依赖:

{"dependencies":{"tslib":"^2.6.2"// 确保有此条目}}

验证修复

安装完成后,再次运行你的命令:

npm run openapi 
在这里插入图片描述

总结

学习,还是学习,我还是不会curd,不要急我会争取啃下来。

Read more

2026年 Java 面试八股文总结(完整版)

1、Java中有几种类型的流    难度系数:⭐ 2、请写出你最常见的5个RuntimeException    难度系数:⭐ 1. java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。 1. java.lang.ClassNotFoundException 指定的类找不到;出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发异常。 1. java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。 1. java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操作数组对象时发生。 1. java.lang.IllegalArgumentException 方法传递参数错误。 1. java.lang.ClassCastException 数据类型转换异常。 3、谈谈你对反射的理解    难度系数:⭐ 1. 反射

By Ne0inhk
JAVA 注解(Annotation):从原理到实战应用

JAVA 注解(Annotation):从原理到实战应用

JAVA 注解(Annotation):从原理到实战应用 1.1 本章学习目标与重点 💡 掌握注解的核心概念与分类,理解注解在Java开发中的核心价值。 💡 熟练使用JDK内置注解,掌握自定义注解的定义、解析与使用流程。 💡 掌握注解的元注解配置方式,理解不同元注解对自定义注解的约束作用。 💡 结合反射机制实现注解的实战应用,掌握注解在框架开发中的核心用法。 ⚠️ 本章重点是 自定义注解的开发流程 和 注解与反射结合的实战应用,这是Java高级开发与框架设计的必备技能。 1.2 注解的核心概念与价值 1.2.1 什么是注解 💡 注解(Annotation) 是Java 5引入的一种特殊标记,它可以在编译期、类加载期、运行时被读取,并执行相应的处理逻辑。注解本身不直接影响代码的执行逻辑,而是通过元数据的方式为程序提供额外信息,这些信息可以被编译器、虚拟机或自定义的注解处理器解析和使用。 注解的本质是一个继承了 java.lang.annotation.Annotation 接口的特殊接口,我们定义的每一个注解,最终都会被编译器生成对应的接口实现类,供程序在运行时

By Ne0inhk
Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用

Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用

Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用 * 引言: * 正文: * 一、智能医疗影像数据的「三重困境」 * 1.1 数据洪流:存储成本的指数级增长 * 1.2 实时枷锁:远程医疗的传输瓶颈 * 1.3 质量红线:压缩与保真的矛盾 * 二、Java 大数据:医疗影像压缩的「智能引擎」 * 2.1 算法精研:从传统到智能的跨越 * 2.2 动态优化:基于 AI 的智能压缩策略 * 三、Java 大数据:医疗影像传输的「加速引擎」 * 3.1 分布式架构:突破传输带宽限制 * 3.2 边缘计算:构建「

By Ne0inhk
Java 中间件:RocketMQ 顺序消息(全局/分区顺序)

Java 中间件:RocketMQ 顺序消息(全局/分区顺序)

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Java中间件这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Java 中间件:RocketMQ 顺序消息(全局 / 分区顺序) * 什么是顺序消息? * RocketMQ 顺序消息的工作原理 * 全局顺序 vs 分区顺序 * RocketMQ 顺序消息的核心机制 * 全局顺序消息的实现 * 全局顺序的配置要求 * Java 代码示例:全局顺序消息 * 全局顺序的局限性 * 分区顺序消息的实现 * 分区顺序的设计思路 * Java 代码示例:分区顺序消息 * 分区顺序的关键要点 * 顺序消息的消费机制详解 * ConsumeOrderlyStatus 枚举 * 消费失败的处理机制 * 并发消费 vs 顺序消费

By Ne0inhk