07.LoT.UI 前后台通用框架分解系列之——轻巧的文本编辑器

简介:

LoT.UI汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui

上次说的是强大的百度编辑器 http://www.cnblogs.com/dunitian/p/5551701.html 这次说下简洁版而又不失功能的WangEditor

先看看效果

基本上常用功能都有了,下面说下完整的demo:

前端案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<! DOCTYPE  html>
< html >
< head >
     < meta  http-equiv="Content-Type" content="text/html; charset=utf-8" />
     < title >WangEditor</ title >
     < meta  charset="utf-8" />
     < link  href="Script/WangEditor/css/wangEditor.min.css" rel="stylesheet" />
</ head >
< body >
     < div  id="edit" style="min-height:20em"></ div >
     < br  />
     < input  id="btn1" type="button" value="获取HTML" />  
     < input  id="btn2" type="button" value="获取Text" />
     < div  id="msg"></ div >
     < script  src="//cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></ script >
     < script  src="Script/jquery-1.8.3.min.js"></ script >
     < script  src="Script/WangEditor/js/wangEditor.min.js"></ script >
     < script  type="text/javascript">       
         var editor = new wangEditor('edit');      
         // 上传图片路径
         editor.config.uploadImgUrl = '/Home/Upload';
         // 设置统一参数名
         editor.config.uploadImgFileName = 'file';      
         //编辑器创建
         editor.create();
 
         $('#btn1').click(function () {
             // 获取编辑器区域完整html代码
             var html = editor.$txt.html();
             $('#msg').html(html);
         });
 
         $('#btn2').click(function () {
             // 获取编辑器纯文本内容
             var text = editor.$txt.text();
             // 获取格式化后的纯文本
             //var formatText = editor.$txt.formatText();
             $('#msg').html(text);
         });
     </ script >
</ body >
</ html >

后端代码:(自己写的,如果有什么问题欢迎联系我)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/// <summary>
         /// 图片上传
         /// </summary>
         /// <returns></returns>
         public  ContentResult Upload(HttpPostedFileBase file)
         {
             if  (file ==  null ) {  return  Content( "error|文件不能为空" ); }
             if  (file.ContentLength > 10485760) {  return  Content( "error|文件10M以内" ); }
             //如果是上传文件,再添加其他格式即可
             string  filterStr =  ".gif,.jpg,.jpeg,.bmp,.png" ;
             string  fileExt = Path.GetExtension(file.FileName).ToLower();
             if  (!filterStr.Contains(fileExt)) {  return  Content( "error|文件后缀不对" ); }
             //防止黑客恶意绕过,从根本上判断下文件后缀
             if  (!file.InputStream.CheckingExt())
             {
                 //todo:一次危险记录
                 return  Content( "error|文件后缀不对" );
             }
 
             //todo: md5判断一下文件是否已经上传过,如果已经上传直接返回 return Content(缩略图地址#sqlPath);
 
             string  path =  string .Format( "{0}/{1}" "/lotFiles" , DateTime.Now.ToString( "yyyy-MM-dd" ));
             string  fileName =  string .Format( "{0}{1}" , Guid.NewGuid().ToString( "N" ), fileExt);
             string  sqlPath =  string .Format( "{0}/{1}" , path, fileName);
             string  dirPath = Request.MapPath(path);
             if  (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); }
             try
             {
                 //todo:未来写缩略图的代码
                 file.SaveAs(Path.Combine(dirPath, fileName));
                 //todo: 未来写存数据库的Code
             }
             catch  return  Content( "error|文件保存失败" ); }
             return  Content( string .Format( "{0}#{1}" , sqlPath, sqlPath)); //第一个sqlPath以后换成缩略图的地址
         }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/// <summary>
     /// 判断扩展名是否是指定类型---默认是判断图片格式,符合返回true(没有释放stream,请手动:file.InputStream.Dispose();)
     /// eg:图片+压缩+文档:"7173", "255216", "6677", "13780", "8297", "55122", "8075", "208207"
     /// eg:img,"7173", "255216", "6677", "13780" //gif  //jpg  //bmp //png
     /// eg:file,"8297", "55122", "8075", "208207" //rar //7z //zip + 文档系列
     /// </summary>
     /// <param name="stream">文件流</param>
     /// <param name="fileTypes">文件扩展名</param>
     /// <returns></returns>
     public  static  bool  CheckingExt( this  Stream stream,  params  string [] fileTypes)
     {
         if  (fileTypes ==  null  || fileTypes.Length == 0) { fileTypes =  new  string [] {  "7173" "255216" "6677" "13780"  }; }
         bool  result =  false ;
         string  fileclass =  "" ;
 
         #region 读取头两个字节
         var  reader =  new  BinaryReader(stream);
         byte [] buff =  new  byte [2];
         try
         {
             reader.Read(buff, 0, 2); //读取每个文件的头两个字节
             fileclass = buff[0].ToString() + buff[1].ToString();
         }
         catch  (System.Exception ex) { stream.Dispose(); reader.Dispose();  return  false ; }
         #endregion
 
         #region 校验
         for  ( int  i = 0; i < fileTypes.Length; i++)
         {
             if  (fileclass == fileTypes[i])
             {
                 result =  true ;
                 break ;
             }
         }
         #endregion
         return  result;
     }

 

完整demo:https://github.com/dunitian/LoTCodeBase/tree/master/NetCode/3.常用技能/03.Editor/03.WangEditor


本文转自毒逆天博客园博客,原文链接:http://www.cnblogs.com/dunitian/p/5640053.html,如需转载请自行联系原作者

相关文章
|
2月前
|
Rust JavaScript 前端开发
ES6 awaitRust UI 框架
ES6 awaitRust UI 框架
32 0
|
14天前
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
136 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
|
2月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
132 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
2月前
|
Rust 自然语言处理 API
|
2月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
3月前
|
开发框架 JavaScript 前端开发
鸿蒙NEXT开发声明式UI是咋回事?
【10月更文挑战第15天】鸿蒙NEXT的声明式UI基于ArkTS,提供高效简洁的开发体验。ArkTS扩展了TypeScript,支持声明式UI描述、自定义组件及状态管理。ArkUI框架则提供了丰富的组件、布局计算和动画能力。开发者仅需关注数据变化,UI将自动更新,简化了开发流程。此外,其前后端分层设计与编译时优化确保了高性能运行,利于生态发展。通过组件创建、状态管理和渲染控制等方式,开发者能快速构建高质量的鸿蒙应用。
164 3
|
16天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
1月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
2月前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
141 8
|
3月前
|
JavaScript API 开发者
掌握ArkTS,打造HarmonyOS应用新视界:从“Hello World”到状态管理,揭秘鸿蒙UI开发的高效秘诀
【10月更文挑战第19天】ArkTS(ArkUI TypeScript)是华为鸿蒙系统中用于开发用户界面的声明式编程语言,结合了TypeScript和HarmonyOS的UI框架。本文介绍ArkTS的基本语法,包括组件结构、模板和脚本部分,并通过“Hello World”和计数器示例展示其使用方法。
104 1