精华内容
下载资源
问答
  • 富文本编辑器上传图片一、导入kindeditor的js二、将kindeditor与一个文本域textarea进行关联,即用textarea初始化一个kindeditor对象itemaddeditor = taotao.createeditor("#itemaddform [name=desc]");//初始化类目...

    富文本编辑器上传图片

    一、导入kindeditor的js

    二、将kindeditor与一个文本域textarea进行关联,即用textarea初始化一个kindeditor对象

    itemaddeditor = taotao.createeditor("#itemaddform [name=desc]");

    //初始化类目选择和图片上传器

    taotao.init({fun:function(node){

    taotao.changeitemparam(node, "itemaddform");

    }});

    三、设置要上传的参数

    var tt = taotao = {

    // 编辑器参数

    kingeditorparams : {

    //指定上传文件参数名称

    filepostname : "uploadfile",

    //指定上传文件请求的url。

    uploadjson : '/pic/upload',

    //上传类型,分别为image、flash、media、file

    dir : "image"

    },

    init : function(data){

    // 初始化图片上传组件

    this.initpicupload(data);

    // 初始化选择类目组件

    this.inititemcat(data);

    },

    // 初始化图片上传组件

    initpicupload : function(data){

    $(".picfileupload").each(function(i,e){

    var _ele = $(e);

    _ele.siblings("div.pics").remove();

    _ele.after('\

    \
    ');

    // 回显图片

    if(data && data.pics){

    var imgs = data.pics.split(",");

    for(var i in imgs){

    if($.trim(imgs[i]).length > 0){

    _ele.siblings(".pics").find("ul").append("

    %22+imgs%5Bi%5D+%22");

    }

    }

    }

    //给“上传图片按钮”绑定click事件

    $(e).click(function(){

    var form = $(this).parentsuntil("form").parent("form");

    //打开图片上传窗口

    kindeditor.editor(tt.kingeditorparams).loadplugin('multiimage',function(){

    var editor = this;

    editor.plugin.multiimagedialog({

    clickfn : function(urllist) {

    var imgarray = [];

    kindeditor.each(urllist, function(i, data) {

    imgarray.push(data.url);

    form.find(".pics ul").append("

    %22+data.url+%22");

    });

    form.find("[name=image]").val(imgarray.join(","));

    editor.hidedialog();

    }

    });

    });

    });

    });

    服务端代码

    public map uploadpicture(multipartfile uploadfile) {

    map resultmap=new hashmap<>();

    try {

    //生成一个新的文件名

    //去原始文件名

    string oldname=uploadfile.getoriginalfilename();

    //生成新的文件名

    //uuid.randomuuid();

    string newname=idutils.genimagename();

    newname=newname+oldname.substring(oldname.lastindexof("."));

    string imagepath=new datetime().tostring("/yyyy/mm/dd");

    //上传图片

    boolean result=ftputil.uploadfile(ftp_address,ftp_port, ftp_username, ftp_password, ftp_base_path,

    imagepath, newname, uploadfile.getinputstream());

    system.out.println("result="+result);

    if(!result){

    resultmap.put("error", 1);

    resultmap.put("message", "文件上传失败");

    system.out.println("hh");

    return resultmap;

    }

    resultmap.put("error", 0);

    resultmap.put("url", image_base_path + imagepath + "/" + newname);

    return resultmap;

    } catch (ioexception e) {

    resultmap.put("error", 1);

    resultmap.put("message", "文件上传异常");

    return resultmap;

    }

    }

    注意:服务端返回的json串的格式{error: 0|1,message|url} 其中error为整型不为字符串,如果写成字符串图片能够正常上传至服务器,但是不能在浏览器中回显。

    感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

    如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

    展开全文
  • 美丽乡村#country{overflow-y:auto;overflow-x:hidden;}.countryItem{margin-bottom:10px;color:#333;}.countryTexeCon{padding:10px 15px;background-color:#ffffff;}.countryName{padding-bottom:5px;...
    美丽乡村

    #country{overflow-y:auto;overflow-x:hidden;

    }.countryItem{margin-bottom:10px;color:#333;

    }.countryTexeCon{padding:10px 15px;background-color:#ffffff;

    }.countryName{padding-bottom:5px;color:#333;

    }.countryPro{color:#929292;font-size:14px;height:auto;word-break:break-all;

    }.countryItem>img{width:calc(100% - 6px);height:100%;border:3px solid #f1f1f1;

    }.countryText{position:relative;

    }.countryTextTitle{padding:15px 0px;position:absolute;top:0px;left:0px;border-bottom:1px solid #cccccc;color:#333;width:100%;text-align:center;font-size:21px;background-color:#fbfbfb;

    }.countryTextTitle>img{position:absolute;top:9px;left:12px;width:21px;padding:10px;

    }.countryText{padding-top:60px;background-color:#fff;

    }.countryTextBody{padding:15px;

    }.countryTextBody .text{text-indent:28px;

    }.countryTextBody2 img{max-width:95%;margin:5px auto;display:inherit;

    }.goArea{margin-top:5px;padding:5px 0;background-color:aliceblue;position:relative;height:25px;

    }.goArea>img{position:absolute;left:10px;top:5px;width:23px;

    }.goArea>div{position:absolute;right:10px;top:6px;

    }.goWay{background-color:#0DBEF5;color:white;border-radius:5px;font-size:14px;padding:2px 10px;padding-left:22px;margin-left:10px;cursor:pointer;position:relative;

    }.goWayImg{position:absolute;top:2px;left:5px;width:16px;

    }.countryTextBody img{max-width:100%;

    }[v-cloak]{display:none;

    }

    {{item.name}}

    展开全文
  • 富文本框和普通的文本框定位有较大的区别,富文本框常见的实现用到Frame标签,并且Frame里面实现了一个完整的HTML网页结构,所以使用普通的定位模式无法直接定位到富文本框对象。 以http://mail.sohu.com为例,介绍...

            富文本框和普通的文本框定位有较大的区别,富文本框常见的实现用到Frame标签,并且Frame里面实现了一个完整的HTML网页结构,所以使用普通的定位模式无法直接定位到富文本框对象。

            以http://mail.sohu.com为例,介绍两种方法读取富文本框。

            方法一:

    package cn.om.webdriverapi;
    
    
    import org.testng.annotations.Test;
    import org.testng.annotations.BeforeMethod;
    import java.awt.AWTException;
    import java.awt.Robot;
    import java.awt.event.KeyEvent;
    import java.util.concurrent.TimeUnit;
    import org.openqa.selenium.By;
    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    import org.testng.annotations.AfterMethod;
    
    public class TestRichTextBox1 {
    
    	WebDriver driver;
    	String url;
    
    	@Test
    	public void testSohuMailWriteEMail() {
    		driver.get(url);
    		//设置获取元素的超时时间为5秒
    		driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    		WebElement username = driver.findElement(By.xpath(".//*[@id='theme']/form/div[1]/div[1]/input"));
    		WebElement password = driver.findElement(By.xpath(".//*[@id='theme']/form/div[2]/div[1]/input"));
    		WebElement sub = driver.findElement(By.xpath(".//*[@id='theme']/form/div[5]/input"));
    		
    		//输入账号,密码,点击登录。由于有验证码,会跳转到输入验证码的页面
    		username.sendKeys("fosterwu");
    		password.sendKeys("1111");
    		sub.click();
    		
    		//等待10秒,手工输入验证码
    		try {
    			Thread.sleep(10000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		//输入验证码后,再次点击登录。
    		sub.click();
    		//手机安全认证,点击【下次再说】按钮
    		WebElement notdo=driver.findElement(By.xpath(".//*[@id='theme']/div[1]/div[1]/div[4]/span[2]"));
    		notdo.click();
    		
    		
    		WebDriverWait wait=new WebDriverWait(driver, 15);
    		//显示等待15秒,通过查找【写邮件】按钮,判断是否已经成登录到邮箱中
    	    wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(".//*[@id='addSkinClass']/div[4]/div/ul/li[1]")));
    
    	    //定位【写邮件】的按钮,点击后进入写信页面
    	    WebElement writeMailButton=driver.findElement(By.xpath(".//*[@id='addSkinClass']/div[4]/div/ul/li[1]"));
    	    writeMailButton.click();
    	    
    	    //定位发件人输入框,输入要测试的数据
    	    WebElement recipients=driver.findElement(By.xpath(".//*[@id='mailContent']/div/div[1]/div[1]/div[1]/div[1]/div/span/input"));
    	    recipients.sendKeys("fosterwu@sohu.com");
    
    	    //由于发件人输入进去后,要回车或者点击下才能编辑下一个。因此加上点击回车的操作
    	    Robot robot=null;
    	    try {
    			robot=new Robot();
    		} catch (AWTException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	    robot.keyPress(KeyEvent.VK_ENTER);
    		robot.keyRelease(KeyEvent.VK_ENTER);
    	    
    		//定位主题输入框,输入要测试的数据
    	    WebElement topic=driver.findElement(By.xpath(".//*[@id='mailContent']/div/div[1]/div[1]/div[4]/input"));
    	    topic.sendKeys("给自己的信");
    	    
    	    //通过tabname找到iframe元素,切换到iframe中
    	    WebElement iframe=driver.findElement(By.tagName("iframe"));
    	    driver.switchTo().frame(iframe);
    	    //声明JavaScriptExecutor对象来执行JavaScript脚本
    	    JavascriptExecutor js=(JavascriptExecutor)driver;
    	    
    	    //在iframe中,查找到编辑区域对象p,设定html格式的文字内容,即正文内容
    	    js.executeScript("document.getElementsByTagName('p')[0].innerHTML='<b>邮件要发送的内容<b>'");
    	    
    	    //切换到默认页面。(主页面)
    	    driver.switchTo().defaultContent();
    	    
    	    //点击发送
    	    WebElement send=driver.findElement(By.xpath(".//*[@id='mailContent']/div/div[2]/span[1]"));
    	    send.click();
    	    
    	}
    
    	@BeforeMethod
    	public void beforeMethod() {
    		url = "http://mail.sohu.com";
    		System.setProperty("webdriver.firefox.bin", "D:/Mozilla Firefox/firefox.exe");
    		driver = new FirefoxDriver();
    	}
    
    	@AfterMethod
    	public void afterMethod() {
    		driver.quit();
    	}
    
    }
    

            这种方法的优点是,可以支持HTML格式的文字作为富文本框的文字输入内容。

            缺点是,因为不同网页的富文本框的实现机制都不同,定位到富文本框的文本编辑区域对象比较难,需要熟练了解HTML代码含义和frame的进出方法,对于脚本定位实现的能力要求较高。


            方法二:

    package cn.om.webdriverapi;
    
    
    import org.testng.annotations.Test;
    import org.testng.annotations.BeforeMethod;
    import java.awt.AWTException;
    import java.awt.Robot;
    import java.awt.Toolkit;
    import java.awt.datatransfer.StringSelection;
    import java.awt.event.KeyEvent;
    import java.util.concurrent.TimeUnit;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    import org.testng.annotations.AfterMethod;
    
    public class TestRichTextBox2 {
    
    	WebDriver driver;
    	String url;
    
    	@Test
    	public void testRichTextBox2() {
    		driver.get(url);
    		// 设置获取元素的超时时间为5秒
    		driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    		WebElement username = driver.findElement(By.xpath(".//*[@id='theme']/form/div[1]/div[1]/input"));
    		WebElement password = driver.findElement(By.xpath(".//*[@id='theme']/form/div[2]/div[1]/input"));
    		WebElement sub = driver.findElement(By.xpath(".//*[@id='theme']/form/div[5]/input"));
    
    		// 输入账号,密码,点击登录。由于有验证码,会跳转到输入验证码的页面
    		username.sendKeys("fosterwu");
    		password.sendKeys("1111");
    		sub.click();
    
    		// 等待10秒,手工输入验证码
    		try {
    			Thread.sleep(10000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		// 输入验证码后,再次点击登录。
    		sub.click();
    		// 手机安全认证,点击【下次再说】按钮
    		WebElement notdo = driver.findElement(By.xpath(".//*[@id='theme']/div[1]/div[1]/div[4]/span[2]"));
    		notdo.click();
    
    		WebDriverWait wait = new WebDriverWait(driver, 15);
    		// 显示等待15秒,通过查找【写邮件】按钮,判断是否已经成登录到邮箱中
    		wait.until(
    				ExpectedConditions.presenceOfElementLocated(By.xpath(".//*[@id='addSkinClass']/div[4]/div/ul/li[1]")));
    
    		// 定位【写邮件】的按钮,点击后进入写信页面
    		WebElement writeMailButton = driver.findElement(By.xpath(".//*[@id='addSkinClass']/div[4]/div/ul/li[1]"));
    		writeMailButton.click();
    
    		// 定位发件人输入框,输入要测试的数据
    		WebElement recipients = driver
    				.findElement(By.xpath(".//*[@id='mailContent']/div/div[1]/div[1]/div[1]/div[1]/div/span/input"));
    		recipients.sendKeys("fosterwu@sohu.com");
    
    		// 由于发件人输入进去后,要回车或者点击下才能编辑下一个。因此加上点击回车的操作
    		pressEnterKey();
    
    		// 定位主题输入框,输入要测试的数据
    		WebElement topic = driver.findElement(By.xpath(".//*[@id='mailContent']/div/div[1]/div[1]/div[4]/input"));
    		topic.sendKeys("给自己的信");
    
    		// 通过tab键切换到富文本框
    		pressTabKey();
    		
    		setAndctrlVClipboardData("邮件发送的正文内容");
    		
    		//点击发送
    	    WebElement send=driver.findElement(By.xpath(".//*[@id='mailContent']/div/div[2]/span[1]"));
    	    send.click();
    	}
    
    	@BeforeMethod
    	public void beforeMethod() {
    		url = "http://mail.sohu.com";
    		System.setProperty("webdriver.firefox.bin", "D:/Mozilla Firefox/firefox.exe");
    		driver = new FirefoxDriver();
    	}
    
    	@AfterMethod
    	public void afterMethod() {
    		driver.quit();
    	}
    
    	public void pressTabKey() {
    		Robot robot = null;
    		try {
    			robot = new Robot();
    		} catch (AWTException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		robot.keyPress(KeyEvent.VK_TAB);
    		robot.keyRelease(KeyEvent.VK_TAB);
    
    	}
    
    	public void pressEnterKey() {
    		Robot robot = null;
    		try {
    			robot = new Robot();
    		} catch (AWTException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		robot.keyPress(KeyEvent.VK_ENTER);
    		robot.keyRelease(KeyEvent.VK_ENTER);
    
    	}
    	
    	public void setAndctrlVClipboardData(String s) {
    		// 声明StringSelection对象,并使用函数的string参数来完成实例化
    		StringSelection stringSelection = new StringSelection(s);
    
    		// 使用Toolkit对象的setContents方法将字符串放到剪切板上
    		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
    
    		// 声明Robot对象
    		Robot robot = null;
    		try {
    			robot = new Robot();
    		} catch (AWTException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		// 调用KeyPress来实现按下Crtl键
    		robot.keyPress(KeyEvent.VK_CONTROL);
    		// 调用KeyPress来实现按下V键
    		robot.keyPress(KeyEvent.VK_V);
    		// 调用KeyPress来释放V键
    		robot.keyRelease(KeyEvent.VK_V);
    		// 调用KeyPress来释放crtl键
    		robot.keyRelease(KeyEvent.VK_CONTROL);
    
    	}
    
    }
    

            这个方法的优点是,无论什么种类的富文本框,只要找到它的上面紧邻的元素,通过按tab键的方式均可以进入到富文本框的文本编辑区域,可以使用一种方法解决所有类型的富文本框编辑区域的定位问题。

            缺点是,不能在富文本框编辑区域中进行HTML格式的文本输入。


            两种方法各有各的好处,在实际使用的时候,根据实际情况来进行选择。


    展开全文
  • 项目描述使用我开发的电子邮件jar包,轻松实现电子邮件发送操作.运行环境jdk8+tomcat7+IntelliJ IDEA项目技术(必填)bootstrap+jquery+javaMail数据库文件无jar包文件链接:...

    项目描述

    使用我开发的电子邮件jar包,轻松实现电子邮件发送操作.

    运行环境

    jdk8+tomcat7+IntelliJ IDEA

    项目技术(必填)

    bootstrap+jquery+javaMail

    数据库文件

    jar包文件

    链接:https://pan.baidu.com/s/11dWs6e5K7v4Jdk78O3gBNg

    提取码:g8pw

    展开全文
  • 展开全部、建立第一个PDF文档用iText生成PDF文档需要62616964757a686964616fe59b9ee7ad94313333613263625个步骤:①建立com.lowagie.text.Document对象的实例。Document document = new Document();②建立一个书写器...
  • %@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@include file="../common/common.jsp"%> <html> <head> <meta http-equi...
  • UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码… 2.下载 下载地址 ://www.jb51.net/codes/45434.html 选择开发版...
  • [导读]这篇文章主要介绍了使用富文本编辑器上传图片实例详解的相关资料,需要的朋友可以参考下富文本编辑器上传图片一、导入kindeditor的js二、将kindeditor与一个文本域textarea进行关联,即用textarea初始化一个...
  • 多 格 式 文 本 编 辑 器WMRichTextEditorWMRichTextEditor是一款Android端文本编辑器,目前支持16种编排格式,适用于Android项目的笔记板块的开发。开源地址添加依赖allprojects {repositories {...maven { url '...
  • 后台录入没有涉及到富文本编辑框,只有textarea,但要求保留textarea中输入的换行符;此时显示到web页面上时可以用“pre”等标签保留换行效果(\r\n),但存在如下问题: (1)将web页面用“pdf4”导出成PDF之后,...
  • 读取一般文本文件很好办,调用Java自带的io包里的类即可,富文本的doc文件我们可以用Apache的poi项目中的WordExtractor,这里我们一起来以实例讲解Java读取一般文本文件和word文档的方法
  • 完整实例,决对实用,我已测试成功的。不明白如何使用的可以按着下载文件中的说明文档进行操作
  • 读取一般文本文件很好办,调用Java自带的io包里的类即可,富文本的doc文件我们可以用Apache的poi项目中的WordExtractor,这里我们一起来以实例讲解Java读取一般文本文件和word文档的方法一般文本文件我们以日志文件.log...
  • [导读]这篇文章主要介绍了使用富文本编辑器上传图片实例详解的相关资料,需要的朋友可以参考下富文本编辑器上传图片一、导入kindeditor的js二、将kindeditor与一个文本域textarea进行关联,即用textarea初始化一个...
  • )TIM图片20200518173326.png项目结构TIM图片20200518173535.png重点在于:umeditor.config.js 中的 图片上传配置//为编辑器实例添加一个路径,这个不能被注释,默认其实是 '/utf8-jsp/' 是不是很熟悉,目录名字,//...
  • 4,此实例只新增UploadOSSUtil.java及修改BinaryUploader.java即可,其他地方不用做任何修改二:安装完成后需要更改的地方:1,打开包com.baidu.ueditor,upload,新建class文件:UploadOSSUtil.java内容如下/***上传...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
  • Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,...
  • 被ueditor折磨了近两天,最开始想用umeditor+kityformula,但是怎么都集成不好,浪费一天时间后放弃。...同时在最下面实例化编辑器 效果还是不错的,只是在谷歌浏览器里面打开kityformula页面,一直加载,无
  • 也就是说,它不依赖类特定的实例,被类的所有实例共享。 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无...
  • 富文本--->SpannableString

    2016-11-26 21:15:33
    转载至—享受技术带来的快乐在Android中,TextView是我们最常用的用来显示文本的控件。...下面我们通过SpannableString的具体实例操作来演示一下。[java] view plain copy 在CODE上查看代码片派生到我的代码片
  • 当前开发项目涉及到富文本框,了解了不少富文本编辑器之后,最终决定使用度娘的UEditor。原因:功能强大,并且自带适配java后端的图片和视频上传。项目地址简书不支持markdown其他站点的外链很遗憾整合过程后端改造...
  • 只针对 1.4.3 jsp 版本其他版本估计也差不多,刚开始上传图片各种错误,又是配路径又是导jar包啥的,这都不说了,作为一个前端真的不太会玩这些java的东西,刚好同事搞过,把他的搬来用,他的版本很低1.3.6,高了...
  • KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框(textarea)替换为可视化的富文本输入框。 KindEditor 使用 JavaScript ...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
  • Java资源包01

    2016-08-31 09:16:25
    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
  • java开源包101

    2016-07-13 10:11:08
    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
  • java开源包11

    热门讨论 2013-06-28 10:10:38
    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

空空如也

空空如也

1 2 3 4
收藏数 65
精华内容 26
关键字:

java富文本实例

java 订阅