一、富文本框
1.1 由于html中原生的textarea功能太弱,无法完成一些字体,颜色等功能,因此我们在开的时候经常会使用富文本框
UEditor, CKEditor,wangEditor 市面用得比较多的富文本框 使用是的wangEditor,要学习的话可以去看它的官网 -> http://www.wangeditor.com/ 主要是完成文本框的展示 ...1.2 修改的回填功能 ①.单选框的回填
需要保存的是被选中的那一个input加上checked属性 是否启用:②.富文本框数据的回显
var E = window.wangEditor var editor = new E(’#intro’); var $text1 = $(’#txtIntro’); editor.customConfig.onchange = function(html) { // 监控变化,同步更新到 textarea KaTeX parse error: Expected 'EOF', got '}' at position 18: …xt1.val(html); }̲ editor.create(…{img.intro}’) // 初始化对应的内容 $text1.val(editor.txt.html());
1.3 删除功能
删除数据的时候同时也要删除相应的文件(图片) file.delete()@RequestMapping("/delete") public String delete(Integer id,HttpServletRequest req){ //注意:在咱们删除功能前还要先把图片删除了 //1.拿到咱们的Image数据 Images images = imageService.findOne(id); if(images!=null){ //2.拿到真实的路径 String realPath = req.getServletContext().getRealPath(""); //3.拿到文件路径 String filePath = images.getStorepath(); //4.获取到文件 File file = new File(realPath+filePath); //5.删除文件 file.delete(); } imageService.delete(id); return “redirect:/images/query”; }
二.主页面的轮播图展示
会去从后台拿到所有图片 把图片在相应的轮播位置进行循环 注意: 咱们循环的时候要保证第一个图片有.active样式的<c:forEach items=" i m g s " v a r = " i m g " v a r S t a t u s = " s " > < d i v c l a s s = " i t e m < c : i f t e s t = " {imgs}" var="img" varStatus="s"> <div class="item <c:if test=" imgs"var="img"varStatus="s"><divclass="item<c:iftest="{s.index==0}"> active </c:if> ">
${img.intro} </c:forEach>三.分页
一个系统,由于数据量都会比较多,所以开发的时候都会做分页功能的 真分页(limit)与假分页(内存中) 真分页:匀速,用户体验还可以,用得多一点 假分页:每一次非常慢(后面就快),还会占内存3.1 创建分页对象 PageList
把分页的所有数据封装给传给前端 哪些属性(当前页,每页条数,首页,尾页,上一下,下一页,总页数,总条数,当前页数据) 当前页,每页条数 -> 前台传过来 总条数,当前页数据 -> 数据库中查出来 上一页,下一页,总页数 -> 计算出来的/**
分页对象@author Administrator*/ public class Page {
//当前页 -> 前台传过来 private int currentPage = 1; //每页条数 -> 前台传过来/自己定义 private int pageSize = 10; //首页(第一页) private int firstPage = 1; //上一页 计算出来 currentPage>1?currentPage-1:1 private int prevPage; //下一页 计算出来 currentPage<lastPage?currentPage+1:lastPage private int nextPage; //尾页 == 总页数 private int lastPage; //总页数 计算出来 totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1 private int totalPage; //总条数 -> 数据库中查询出来 private int totalCount; //当前页的数据 -> 数据库中查询出来 private List<T> data = new ArrayList<>(); public Page(){} /** * @param currentPage:前台传过来 * @param pageSize:前台传过来 * @param totalCount:数据库中查询 * @param data:数据库中查询 */ public Page(int currentPage, int pageSize, int totalCount, List<T> data) { this.currentPage = currentPage; this.pageSize = pageSize; this.totalCount = totalCount; this.data = data; //计算上一页 当前页>1 ? 当前页-1 : 1 this.prevPage = this.currentPage>1 ? this.currentPage-1 : 1; //计算总页数 总条数%每页条数==0? 总条数/每页条数:总条数/每页条数+1 this.totalPage = this.totalCount%this.pageSize==0?this.totalCount/this.pageSize:this.totalCount/this.pageSize+1; this.lastPage = this.totalPage; //最后一页就是总页数 //计算下一页 当前页<总页数?当前页+1:总页数; this.nextPage = this.currentPage<this.totalPage?this.currentPage+1:this.totalPage; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getFirstPage() { return firstPage; } public void setFirstPage(int firstPage) { this.firstPage = firstPage; } public int getPrevPage() { return prevPage; } public void setPrevPage(int prevPage) { this.prevPage = prevPage; } public int getNextPage() { return nextPage; } public void setNextPage(int nextPage) { this.nextPage = nextPage; } public int getLastPage() { return lastPage; } public void setLastPage(int lastPage) { this.lastPage = lastPage; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public List<T> getData() { return data; } public void setData(List<T> data) { this.data = data; }}
3.2 创建SQL条件对象 SqlCondition
接收前台传过来的分页条件(currentPage,pageSize)public class SqlCondition { //当前页 private int currentPage = 1; //每页条数 private int pageSize = 10;
public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } @Override public String toString() { return "SqlCondition [currentPage=" + currentPage + ", pageSize=" + pageSize + "]"; }}
3.3 在dao中添加了相应的方法
根据条件查询到数据,封装成Page对象 返回/**
最后返回的是Page对象,里面都要有值 Page(int currentPage, int pageSize, int totalCount, List<T> data)/ @Override public Page queryAll(SqlCondition condition) { //①.拿到当前页与每页条数 int currentPage = condition.getCurrentPage(); int pageSize = condition.getPageSize(); //一.查询总条数 //1.1 准备查询总条数的sql String sql = "select count() from t_image"; //1.2执行sql拿到总条数 Integer totalCount = jdbcTemplate.queryForObject(sql, Integer.class); //二.查询当前页的数据 //2.1 计算当前页是从第几条数据开始的 int beginIndex = (currentPage-1) * pageSize; //2.2 准备相应的SQL String dataSql = “select * from t_image limit “+beginIndex+”,”+pageSize; //2.3 执行查询功能 List data= jdbcTemplate.query(dataSql, new BeanPropertyRowMapper<>(Images.class));
//三.创建PageList对象并且返回 Page page = new Page(currentPage,pageSize,totalCount,data); return page;}
3.4 前端展示数据
controller中的修改@RequestMapping("/query") public String query(SqlCondition condition,Model model){ model.addAttribute(“page”,imageService.queryAll(condition)); return “main”; }
页面中的展示(循环的是page.data)<c:forEach items="${page.data}" var=“img”> … </c:forEash>
分页条把值加上 -> ?currentPage=1 当前第${page.currentPage}页 首页 上一页 </li> <li> <a href="/images/query?currentPage=${page.nextPage}" aria-label="下一页"> <span aria-hidden="true">下一页</span> </a> </li> <li> <a href="/images/query?currentPage=${page.lastPage}" aria-label="尾页"> <span aria-hidden="true">尾页</span> </a> </li> <li> <span>总页数:共${page.totalPage}页</span> <span>总数据:共${page.totalCount}条</span> </li> </ul>你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;全新的 KaTeX数学公式 语法;增加了支持甘特图的mermaid语法1 功能;增加了 多屏幕编辑 Markdown文章功能;增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;增加了 检查列表 功能。撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Command + B 斜体:Ctrl/Command + I 标题:Ctrl/Command + Shift + H 无序列表:Ctrl/Command + Shift + U 有序列表:Ctrl/Command + Shift + O 检查列表:Ctrl/Command + Shift + C 插入代码:Ctrl/Command + Shift + K 插入链接:Ctrl/Command + Shift + L 插入图片:Ctrl/Command + Shift + G
直接输入1次#,并按下space后,将生成1级标题。 输入2次#,并按下space后,将生成2级标题。 以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.
// An highlighted block var foo = 'bar';一个简单的表格是这么创建的:
项目Value电脑$1600手机$12导管$1使用:---------:居中 使用:----------居左 使用----------:居右
第一列第二列第三列第一列文本居中第二列文本居右第三列文本居左SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPEASCIIHTMLSingle backticks'Isn't this fun?'‘Isn’t this fun?’Quotes"Isn't this fun?"“Isn’t this fun?”Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash一个具有注脚的文本。2
Markdown将文本转换为 HTML。
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五这将产生一个流程图。:
链接 长方形 圆 圆角长方形 菱形 关于 Mermaid 语法,参考 这儿,我们依旧会支持flowchart的流程图:
Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no 关于 Flowchart流程图 语法,参考 这儿.如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入, 继续你的创作。
mermaid语法说明 ↩︎
注脚的解释 ↩︎