# RichTextEditor
**Repository Path**: zwtgit/rich-text-editor
## Basic Information
- **Project Name**: RichTextEditor
- **Description**: 富文本编辑器,我这里使用的就是Editor.md,Mardown必然是我们程序猿最喜欢的格式。
功能:文章编辑,文章展示,表情包等。详情请见:https://www.cnblogs.com/zwtblog/p/15211654.html
- **Primary Language**: Java
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2021-08-31
- **Last Updated**: 2022-06-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 简介
项目地址:https://gitee.com/zwtgit/rich-text-editor
思考:我们平时在博客园,或者CSDN等平台进行写作的时候,他们的编辑器是怎么实现的?
市面上有许多非常成熟的富文本编辑器,比如:
- **Editor.md**——功能非常丰富的编辑器,左端编辑,右端预览,非常方便,完全免费
- - 官网:https://pandao.github.io/editor.md/
- **wangEditor**——基于javascript和css开发的 Web富文本编辑器, 轻量、简洁、界面美观、易用、开源免费。
- - 官网:http://www.wangeditor.com/
- **TinyMCE**——TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成。它对IE6+和Firefox1.5+都有着非常良好的支持。功能齐全,界面美观,就是文档是英文的,对开发人员英文水平有一定要求。
- - 官网:https://www.tiny.cloud/docs/demo/full-featured/
- 博客园
- **百度ueditor**——UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,功能齐全,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码,缺点是已经没有更新了
- - 官网:https://ueditor.baidu.com/website/onlinedemo.html
- **kindeditor**——界面经典。
- - 官网:http://kindeditor.net/demo.php
- **Textbox**——Textbox是一款极简但功能强大的在线文本编辑器,支持桌面设备和移动设备。主要功能包含内置的图像处理和存储、文件拖放、拼写检查和自动更正。此外,该工具还实现了屏幕阅读器等辅助技术,并符合WAI-ARIA可访问性标准。
- - 官网:https://textbox.io/
- **CKEditor**——国外的,界面美观。
- - 官网:https://ckeditor.com/ckeditor-5/demo/
- **quill**——功能强大,还可以编辑公式等
- - 官网:https://quilljs.com/
- **simditor**——界面美观,功能较全。
- - 官网:https://simditor.tower.im/
- **summernote**——UI好看,精美
- - 官网:https://summernote.org/
- **jodit**——功能齐全
- - 官网:https://xdsoft.net/jodit/
- **froala Editor**——界面非常好看,功能非常强大,非常好用(非免费)
- - 官网:https://www.froala.com/wysiwyg-editor
总之,目前可用的富文本编辑器有很多......这只是其中的一部分
# Editor.md
我这里使用的就是Editor.md
我们可以在官网下载它:https://pandao.github.io/editor.md/ , 得到它的压缩包!
解压以后,在examples目录下面,可以看到他的很多案例使用!学习,其实就是看人家怎么写的,然后进行模仿就好了!
我们可以将整个解压的文件倒入我们的项目,将一些无用的测试和案例删掉即可!
# 基础工程搭建
## 数据库设计
article:文章表
| 字段 | | 备注 |
| ------- | -------- | ------------ |
| id | int | 文章的唯一ID |
| author | varchar | 作者 |
| title | varchar | 标题 |
| content | longtext | 文章的内容 |
建表SQL:
```sql
CREATE TABLE `article` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'int文章的唯一ID',
`author` varchar(50) NOT NULL COMMENT '作者',
`title` varchar(100) NOT NULL COMMENT '标题',
`content` longtext NOT NULL COMMENT '文章的内容',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```
## 基础项目搭建
1、建一个SpringBoot项目配置
```xml
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
runtime
org.projectlombok
lombok
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.0.0
```
```yml
spring:
datasource:
username: root
password: 240055
# 时区报错
url: jdbc:mysql://localhost:3306/richtexteditor?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
driver-class-name: com.mysql.jdbc.Driver
```
2、实体类:
```java
//文章类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Article implements Serializable {
private int id; //文章的唯一ID
private String author; //作者名
private String title; //标题
private String content; //文章的内容
}
```
3、mapper接口:
```java
@Mapper
@Repository
public interface ArticleMapper {
//查询所有的文章
List queryArticles();
//新增一个文章
int addArticle(Article article);
//根据文章id查询文章
Article getArticleById(int id);
//根据文章id删除文章
int deleteArticleById(int id);
}
```
```xml
insert into article (author,title,content) values (#{author},#{title},#{content});
delete from article where id = #{id}
```
**既然已经提供了 myBatis 的映射配置文件,自然要告诉 spring boot 这些文件的位置**
```yml
mybatis:
mapper-locations: classpath:com/zwt/mapper/*.xml
type-aliases-package: com.zwt.pojo
```
编写一个Controller测试下,是否ok;
写一个controller测试mybatis,并且注意 XXXmapper 的位置在 resources 下
注意这个地方对应的mapper配置
```yml
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.zwt.pojo
```
```java
@RestController
public class MyBatisController {
@Autowired
private ArticleMapper articleMapper;
@GetMapping("/queryArticles")
public List queryArticles(){
List articles = articleMapper.queryArticles();
for(Article article : articles) {
System.out.println(article);
}
return articles;
}
}
@Mapper
@Repository
public interface ArticleMapper {
//查询所有的文章
List queryArticles();
//新增一个文章
int addArticle(Article article);
//根据文章id查询文章
Article getArticleById(int id);
//根据文章id删除文章
int deleteArticleById(int id);
}
```
# 文章编辑整合(重点)
1、导入 editor.md 资源 ,删除多余文件
2、编辑文章页面 editor.html、需要引入 jQuery;
```html
zwt的Blog
```
3、编写Controller,进行跳转,以及保存文章
```java
@Controller
@RequestMapping("/article")
public class ArticleController {
@GetMapping("/toEditor")
public String toEditor(){
return "editor";
}
@PostMapping("/addArticle")
public String addArticle(Article article){
articleMapper.addArticle(article);
return "editor";
}
}
```
## 图片上传问题
1、前端js中添加配置
```java
//图片上传
imageUpload : true,
imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
imageUploadURL : "/article/file/upload", // //这个是上传图片时的访问地址
```
2、后端请求,接收保存这个图片, 需要导入 FastJson 的依赖!
```java
//博客图片上传问题
@RequestMapping("/file/upload")
@ResponseBody
public JSONObject fileUpload(@RequestParam(value = "editormd-image-file", required = true) MultipartFile file, HttpServletRequest request) throws IOException {
//上传路径保存设置
//获得SpringBoot当前项目的路径:System.getProperty("user.dir")
String path = System.getProperty("user.dir")+"/upload/";
//按照月份进行分类:
Calendar instance = Calendar.getInstance();
String month = (instance.get(Calendar.MONTH) + 1)+"月";
path = path+month;
File realPath = new File(path);
if (!realPath.exists()){
realPath.mkdir();
}
//上传文件地址
System.out.println("上传文件保存地址:"+realPath);
//解决文件名字问题:我们使用uuid;
String filename = "ks-"+UUID.randomUUID().toString().replaceAll("-", "");
//通过CommonsMultipartFile的方法直接写文件(注意这个时候)
file.transferTo(new File(realPath +"/"+ filename));
//给editormd进行回调
JSONObject res = new JSONObject();
res.put("url","/upload/"+month+"/"+ filename);
res.put("success", 1);
res.put("message", "upload success!");
return res;
}
```
3、解决文件回显显示的问题,设置虚拟目录映射!在我们自己拓展的MvcConfig中进行配置即可!
```java
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
// 文件保存在真实目录/upload/下,
// 访问的时候使用虚路径/upload,比如文件名为1.png,就直接/upload/1.png就ok了。
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/upload/**")
.addResourceLocations("file:"+System.getProperty("user.dir")+"/upload/");
}
}
```
## 表情包问题
自己手动下载,emoji 表情包,放到图片路径下:
修改editormd.js文件
```java
// Emoji graphics files url path
editormd.emoji = {
path : "../editormd/plugins/emoji-dialog/emoji/",
ext : ".png"
};
```
# 文章展示
1、Controller 中增加方法
```java
@GetMapping("/{id}")
public String show(@PathVariable("id") int id,Model model){
Article article = articleMapper.getArticleById(id);
model.addAttribute("article",article);
return "article";
}
```
2、编写页面 article.html
```java
```
重启项目,访问进行测试!大功告成!