layui固定块怎么给微信图标总有未读信息加上一个未读消息

关于layui如何设置点击导航栏某一个按钮会跳转到指定页面的例子 - Fly社区
关于layui如何设置点击导航栏某一个按钮会跳转到指定页面的例子
 757
悬赏:20飞吻
版本:layui 2.25 浏览器:Chrome
问题如标题,本人是前端新手,工作是后端,现在老板要求我把这个框架学会,接触才几天就有这么个问题,不知道怎么去做跳转,能否给一个demo
你这个说的太笼统,a href就可以啊,你想怎么跳,需求具体是什么
&ul class=&layui-nav layui-nav-tree& lay-filter=&test&& &li class=&layui-nav-item layui-nav-itemed&& &a class=&& href=&javascript:;&&所有商品&/a& &dl class=&layui-nav-child&& &dd&&a href=&javascript:;&&列表一&/a&&/dd& &dd&&a href=&javascript:;&&列表二&/a&&/dd& &dd&&a href=&javascript:;&&列表三&/a&&/dd& &dd&&a href=&&&超链接&/a&&/dd& &/dl& &/li& &li class=&layui-nav-item&& &a href=&javascript:;&&解决方案&/a& &dl class=&layui-nav-child&& &dd&&a href=&javascript:;&&列表一&/a&&/dd& &dd&&a href=&javascript:;&&列表二&/a&&/dd& &dd&&a href=&&&超链接&/a&&/dd& &/dl& &/li& &li class=&layui-nav-item&&&a href=&&&云市场&/a&&/li& &li class=&layui-nav-item&&&a href=&&&发布商品&/a&&/li& &/ul&
@ 我想在列表这个li标签上加一个连接,该如何实现呢?
@ 很别致的想法。。。。你为什么不在a上加呢?
@ 直接在li标签里用a href会调到新的页面,不会在布局的框架里显示
你这个问题解决了吗 求解决方法
@ 你解决了吗 求解决方法
心级赞助商 -
微信扫码关注 layui 公众号一、LayUI介绍
layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用。其外在极简,却又不失饱满的内在,体积轻盈,组件丰盈,从核心代码到 API 的每一处细节都经过精心雕琢,非常适合界面的快速开发。layui 首个版本发布于2016年金秋,她区别于那些基于 MVVM 底层的 UI 框架,却并非逆道而行,而是信奉返璞归真之道。准确地说,她更多是为服务端程序员量身定做,你无需涉足各种前端工具的复杂配置,只需面对浏览器本身,让一切你所需要的元素与交互,从这里信手拈来。
layui 兼容人类正在使用的全部浏览器(IE6/7除外),可作为 PC 端后台系统与前台界面的速成开发方案。
二、Hello World
&2.1、引入UI框架
下载layui将dest中的内容添加到项目中
2.2、后台布局
新建admin.html
&!DOCTYPE html&
&meta charset="utf-8"&
&meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"&
&title&layout 后台大布局 - Layui&/title&
&link rel="stylesheet" href="js/layui/css/layui.css"&
&body class="layui-layout-body"&
&div class="layui-layout layui-layout-admin"&
&div class="layui-header"&
&div class="layui-logo"&layui 后台布局&/div&
&!-- 头部区域(可配合layui已有的水平导航) --&
&ul class="layui-nav layui-layout-left"&
&li class="layui-nav-item"&
&a href=""&控制台&/a&
&li class="layui-nav-item"&
&a href=""&商品管理&/a&
&li class="layui-nav-item"&
&a href=""&用户&/a&
&li class="layui-nav-item"&
&a href="javascript:;"&其它系统&/a&
&dl class="layui-nav-child"&
&a href=""&邮件管理&/a&
&a href=""&消息管理&/a&
&a href=""&授权管理&/a&
&ul class="layui-nav layui-layout-right"&
&li class="layui-nav-item"&
&a href="javascript:;"&
&img src="http://t.cn/RCzsdCq" class="layui-nav-img"& 贤心
&dl class="layui-nav-child"&
&a href=""&基本资料&/a&
&a href=""&安全设置&/a&
&li class="layui-nav-item"&
&a href=""&退了&/a&
&div class="layui-side layui-bg-black"&
&div class="layui-side-scroll"&
&!-- 左侧导航区域(可配合layui已有的垂直导航) --&
&ul class="layui-nav layui-nav-tree" lay-filter="test"&
&li class="layui-nav-item layui-nav-itemed"&
&a class="" href="javascript:;"&所有商品&/a&
&dl class="layui-nav-child"&
&a href="javascript:;"&列表一&/a&
&a href="javascript:;"&列表二&/a&
&a href="javascript:;"&列表三&/a&
&a href="http://www.baidu.com"&超链接&/a&
&li class="layui-nav-item"&
&a href="javascript:;"&解决方案&/a&
&dl class="layui-nav-child"&
&a href="javascript:;"&列表一&/a&
&a href="javascript:;"&列表二&/a&
&a href=""&超链接&/a&
&li class="layui-nav-item"&
&a href=""&云市场&/a&
&li class="layui-nav-item"&
&a href=""&发布商品&/a&
&div class="layui-body"&
&!-- 内容主体区域 --&
&div style="padding: 15"&
&table id="demo" lay-filter="test"&&/table&
&div class="layui-footer"&
&!-- 底部固定区域 --&
& layui.com - 底部固定区域
&script src="js/layui/layui.all.js"&&/script&
//JavaScript代码区域
layui.use('element', function() {
var element = layui.
layui.use('table', function(){
var table = layui.
//第一个实例
table.render({
elem: '#demo'
,height: 315
,url: '/demo/table/user/' //数据接口
,page: true //开启分页
,cols: [[ //表头
{field: 'id', title: 'ID', width:80, sort: true, fixed: 'left'}
,{field: 'username', title: '用户名', width:80}
,{field: 'sex', title: '性别', width:80, sort: true}
,{field: 'city', title: '城市', width:80}
,{field: 'sign', title: '签名', width: 177}
,{field: 'experience', title: '积分', width: 80, sort: true}
,{field: 'score', title: '评分', width: 80, sort: true}
,{field: 'classify', title: '职业', width: 80}
,{field: 'wealth', title: '财富', width: 135, sort: true}
2.3、后台服务
2.3.1、封装数据R.java
package com.zhangguo.
public class R {
/**响应编码*/
private int
/**响应消息*/
/**数据总量*/
private int
public R() {
public R(int code, String msg, int count, Object data) {
this.code =
this.msg =
this.count =
this.data =
public String toString() {
return "R [code=" + code + ", msg=" + msg + ", count=" + count + ", data=" + data + "]";
public int getCode() {
public void setCode(int code) {
this.code =
public String getMsg() {
public void setMsg(String msg) {
this.msg =
public int getCount() {
public void setCount(int count) {
this.count =
public Object getData() {
public void setData(Object data) {
this.data =
2.3.2、数据访问UserDao.java
package com.zhangguo.
import java.util.ArrayL
import java.util.L
import java.util.UUID;
import com.zhangguo.entity.U
* 用户数据访问
public class UserDao {
private static List&User& users = new ArrayList&&();
for (int i = 1; i &= 500; i += 3) {
users.add(new User(i, "张国立" + UUID.randomUUID(), "中国北京" + UUID.randomUUID()));
users.add(new User(i + 1, "张学友" + UUID.randomUUID(), "中国香港" + UUID.randomUUID()));
users.add(new User(i + 2, "张慧妹" + UUID.randomUUID(), "中国珠海" + UUID.randomUUID()));
//http://www.layui.com/demo/table/user/?page=1&limit=10
/** 获得所有用户 */
public List&User& getPager(int page,int limit) {
List&User& list = new ArrayList&&();
int start=(page-1)*
for (int i = i &start+limit&&i&users.size(); i++) {
list.add(users.get(i));
/** 获得所有用户 */
public List&User& getAllUsers() {
/** 添加用户 */
public void addUser(User user) {
if (user.getId() &= 0) { // 未设置id
int index = users.size() - 1; // 获得最后一个用户的索引号
if (index & 0) { // 如没有一个用户
user.setId(1); // 编号为1
user.setId(users.get(index).getId() + 1); // 获得最后一个用户的编号+1
users.add(user);
/** 删除用户 */
public void delUser(int id) {
User delUser = null;
for (User user : users) {
if (user.getId() == id) {
users.remove(delUser);
public void updateUser(User obj) {
User editUser = null;
for (User user : users) {
if (user.getId() == obj.getId()) {
editUser =
editUser.setName(obj.getName());
editUser.setCity(obj.getCity());
2.3.3、分页服务
package com.zhangguo.
import java.io.IOE
import javax.servlet.ServletE
import javax.servlet.annotation.WebS
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import com.zhangguo.dao.UserD
import com.zhangguo.entity.U
import com.zhangguo.test.JsonU
import com.zhangguo.utils.R;
* 用户控制器
@WebServlet("/UserController")
public class UserController extends HttpServlet {
private static final long serialVersionUID = 1L;
private UserDao userDao = new UserDao();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("application/charset=utf-8");
request.setCharacterEncoding("utf-8");
String action = request.getParameter("action");
if (action.equals("list")) {
list(response);
//获得所有用户
}else if (action.equals("add")) {
add(request, response);
//添加新用户
else if (action.equals("del")) { //删除用户
delUser(request, response);
else if (action.equals("update")) { //更新用户
int id =Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
String city = request.getParameter("city");
userDao.updateUser(new User(id,name, city));
response.getWriter().print("{\"msg\":\"更新成功\"}");
else if (action.equals("pager")) { //分页
int page =Integer.parseInt(request.getParameter("page"));
int limit =Integer.parseInt(request.getParameter("limit"));
R r=new R();
r.setCode(0);
r.setMsg("获得数据成功");
r.setCount(500);
r.setData(userDao.getPager(page, limit));
response.getWriter().print(JsonUtils.toJson(r));
/**删除用户*/
public void delUser(HttpServletRequest request, HttpServletResponse response) throws IOException {
int id =Integer.parseInt(request.getParameter("id"));
userDao.delUser(id);
response.getWriter().print("{\"msg\":\"删除成功\"}");
/**添加新用户*/
public void add(HttpServletRequest request, HttpServletResponse response) throws IOException {
String name = request.getParameter("name");
String city = request.getParameter("city");
userDao.addUser(new User(name, city));
response.getWriter().print("{\"msg\":\"添加成功\"}");
/**获得所有用户*/
public void list(HttpServletResponse response) throws IOException {
//Java 对象 - & 字符串 序列化成JSON
//字符串 -& Java对象 反序列化
String result = "[";
for (User user : userDao.getAllUsers()) {
result += "{\"id\":" + user.getId() + ",\"name\":\"" + user.getName() + "\",\"city\":\""
+ user.getCity() + "\"},";
if (result.substring(result.length() - 1, result.length()).equals(",")) {
result = result.substring(0, result.length() - 1);
result += "]";
response.getWriter().print(result);
public void delay(){
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
2.3.4、服务测试
2.3.5、对接前后台
&!DOCTYPE html&
&meta charset="utf-8"&
&meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"&
&title&layout 后台大布局 - Layui&/title&
&link rel="stylesheet" href="js/layui/css/layui.css"&
&body class="layui-layout-body"&
&div class="layui-layout layui-layout-admin"&
&div class="layui-header"&
&div class="layui-logo"&layui 后台布局&/div&
&!-- 头部区域(可配合layui已有的水平导航) --&
&ul class="layui-nav layui-layout-left"&
&li class="layui-nav-item"&
&a href=""&控制台&/a&
&li class="layui-nav-item"&
&a href=""&商品管理&/a&
&li class="layui-nav-item"&
&a href=""&用户&/a&
&li class="layui-nav-item"&
&a href="javascript:;"&其它系统&/a&
&dl class="layui-nav-child"&
&a href=""&邮件管理&/a&
&a href=""&消息管理&/a&
&a href=""&授权管理&/a&
&ul class="layui-nav layui-layout-right"&
&li class="layui-nav-item"&
&a href="javascript:;"&
&img src="http://t.cn/RCzsdCq" class="layui-nav-img"& 贤心
&dl class="layui-nav-child"&
&a href=""&基本资料&/a&
&a href=""&安全设置&/a&
&li class="layui-nav-item"&
&a href=""&退了&/a&
&div class="layui-side layui-bg-black"&
&div class="layui-side-scroll"&
&!-- 左侧导航区域(可配合layui已有的垂直导航) --&
&ul class="layui-nav layui-nav-tree" lay-filter="test"&
&li class="layui-nav-item layui-nav-itemed"&
&a class="" href="javascript:;"&所有商品&/a&
&dl class="layui-nav-child"&
&a href="javascript:;"&列表一&/a&
&a href="javascript:;"&列表二&/a&
&a href="javascript:;"&列表三&/a&
&a href="http://www.baidu.com"&超链接&/a&
&li class="layui-nav-item"&
&a href="javascript:;"&解决方案&/a&
&dl class="layui-nav-child"&
&a href="javascript:;"&列表一&/a&
&a href="javascript:;"&列表二&/a&
&a href=""&超链接&/a&
&li class="layui-nav-item"&
&a href=""&云市场&/a&
&li class="layui-nav-item"&
&a href=""&发布商品&/a&
&div class="layui-body"&
&!-- 内容主体区域 --&
&div style="padding: 15"&
&table id="users" lay-filter="test"&&/table&
&div class="layui-footer"&
&!-- 底部固定区域 --&
& layui.com - 底部固定区域
&script src="js/layui/layui.all.js"&&/script&
//JavaScript代码区域
layui.use('element', function() {
var element = layui.
layui.use('table', function(){
var table = layui.
//第一个实例
table.render({
elem: '#users'
,height: 515
,url: 'UserController?action=pager' //数据接口
,page: true //开启分页
,cols: [[ //表头
{field: 'id', title: 'ID', width:80, sort: true, fixed: 'left'}
,{field: 'name', title: '用户名', width:300,sort: true}
,{field: 'city', title: '城市', width:300,sort: true}
,{field: 'birthday', title: '出生日期', width: 177,sort: true}
2.3.6、运行结果
三、综合示例
实现商品的后台管理功能,添加,修改,删除,更新,上传,富文本,前台展示,手机端的浏览
3.2、创建数据库
--编号,名称,价格,上架时间,状态,图片
--创建数据库
create database GoMallP
use GoMallP
create table Product
id int primary key identity(100000,1),
name nvarchar(256) not null,
price decimal(9,2),
addDate datetime,
[state] int default(1),
picture varchar(126)
--添加数据
INSERT INTO [GoMallPro].[dbo].[Product]
,[addDate]
,[picture])
select 'iPhone X',5898.5,GETDATE(),1,'pic(1).jpg' union
select 'Meizu 魅蓝1',999.9,'',1,'pic(2).jpg' union
select 'ZTE U880',566.85,GETDATE(),0,'pic(3).jpg' union
select '华为 荣耀6',1487.3,'',1,'pic(4).jpg' union
select '小米 Max 2',1398.2,'',0,'pic(5).jpg'
SELECT [id] ,[name],[price] ,[addDate],[state],[picture] FROM [Product]
3.3、创建项目
创建一个web项目,记得选择生成web.xml文件
在webcontent目录下添加images图片目录
在webcontent目录下添加layui 后台模板
添加后的效果
创建页,未修改的模板
3.4、创建实体类
Product.java
package com.zhangguo.gomallpro.
import java.math.BigD
import java.util.D
* 产品 Bean
public class Product {
private int
private BigD
private Date addD
private int
public Product() {
public Product(int id, String name, BigDecimal price, Date addDate, int state, String picture) {
this.name =
this.price =
this.addDate = addD
this.state =
this.picture =
public String toString() {
return "Product [id=" + id + ", name=" + name + ", price=" + price + ", addDate=" + addDate + ", state=" + state
+ ", picture=" + picture + "]";
public int getId() {
public void setId(int id) {
public String getName() {
public void setName(String name) {
this.name =
public BigDecimal getPrice() {
public void setPrice(BigDecimal price) {
this.price =
public Date getAddDate() {
return addD
public void setAddDate(Date addDate) {
this.addDate = addD
public int getState() {
public void setState(int state) {
this.state =
public String getPicture() {
public void setPicture(String picture) {
this.picture =
3.5、数据访问
ProductDao.java
先添加依赖包sqljdbc4.jar
JDBCUitls工具类
package com.zhangguo.gomallpro.
import java.lang.reflect.InvocationTargetE
import java.lang.reflect.M
import java.sql.C
import java.sql.DriverM
import java.sql.PreparedS
import java.sql.ResultS
import java.sql.ResultSetMetaD
import java.sql.SQLE
import java.sql.S
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
public class JDBCUtils {
public static String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
public static String URL = "jdbc:sqlserver://localhost:1433;databasename=GoMallPro";
public static String USER_NAME = "sa";
public static String PASSWORD = "sa";
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
private JDBCUtils() {
* Get connection
public static Connection getconnnection() {
Connection con = null;
con = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
* Close connection
* @param rs
* @param st
* @param con
public static void close(ResultSet rs, Statement st, Connection con) {
if (rs != null) {
rs.close();
} finally {
if (st != null) {
st.close();
} finally {
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
* Close connection
* @param rs
public static void close(ResultSet rs) {
Statement st = null;
Connection con = null;
if (rs != null) {
st = rs.getStatement();
rs.close();
} finally {
if (st != null) {
con = st.getConnection();
st.close();
} finally {
if (con != null) {
con.close();
} catch (SQLException e) {
e.printStackTrace();
* Close connection
* @param st
* @param con
public static void close(Statement st, Connection con) {
if (st != null) {
st.close();
} finally {
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
* insert/update/delete
* @param sql
* @param args
public static int update(String sql, Object... args) {
int result = 0;
Connection con = getconnnection();
PreparedStatement ps = null;
ps = con.prepareStatement(sql);
if (args != null) {
for (int i = 0; i & args. i++) {
ps.setObject((i + 1), args[i]);
result = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(ps, con);
* query, because need to manually close the resource, so not recommended
* for use it
* @param sql
* @param args
* @return ResultSet
@Deprecated
public static ResultSet query(String sql, Object... args) {
ResultSet result = null;
Connection con = getconnnection();
PreparedStatement ps = null;
ps = con.prepareStatement(sql);
if (args != null) {
for (int i = 0; i & args. i++) {
ps.setObject((i + 1), args[i]);
result = ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
* Query a single record
* @param sql
* @param args
* @return Map&String,Object&
public static Map&String, Object& queryForMap(String sql, Object... args) {
Map&String, Object& result = new HashMap&String, Object&();
List&Map&String, Object&& list = queryForList(sql, args);
if (list.size() & 0) {
result = list.get(0);
* Query a single record
* @param sql
* @param args
* @return &T&
public static &T& T queryForObject(String sql, Class&T& clz, Object... args) {
T result = null;
List&T& list = queryForList(sql, clz, args);
if (list.size() & 0) {
result = list.get(0);
* Query a single record
* @param sql
* @param args
* @return List&Map&String,Object&&
public static List&Map&String, Object&& queryForList(String sql, Object... args) {
List&Map&String, Object&& result = new ArrayList&Map&String, Object&&();
Connection con = null;
ResultSet rs = null;
PreparedStatement ps = null;
con = getconnnection();
ps = con.prepareStatement(sql);
if (args != null) {
for (int i = 0; i & args. i++) {
ps.setObject((i + 1), args[i]);
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()) {
Map&String, Object& map = new HashMap&String, Object&();
for (int i = 1; i &= columnC i++) {
map.put(rsmd.getColumnLabel(i), rs.getObject(i));
result.add(map);
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rs, ps, con);
* Query a single record
* @param sql
* @param args
* @return List&T&
public static &T& List&T& queryForList(String sql, Class&T& clz, Object... args) {
List&T& result = new ArrayList&T&();
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
con = getconnnection();
ps = con.prepareStatement(sql);
if (args != null) {
for (int i = 0; i & args. i++) {
ps.setObject((i + 1), args[i]);
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()) {
T obj = clz.newInstance();
for (int i = 1; i &= columnC i++) {
String columnName = rsmd.getColumnName(i);
String methodName = "set" + columnName.substring(0, 1).toUpperCase()
+ columnName.substring(1, columnName.length());
Method method[] = clz.getMethods();
for (Method meth : method) {
if (methodName.equals(meth.getName())) {
meth.invoke(obj, rs.getObject(i));
result.add(obj);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} finally {
close(rs, ps, con);
ProductDao.java
package com.zhangguo.gomallpro.
import java.util.L
import com.zhangguo.gomallpro.model.P
import com.zhangguo.gomallpro.utils.JDBCU
public class ProductDao {
public List&Product& getPager(int page, int limit) {
// 开始索引
int start = (page - 1) * limit + 1;
// 结束索引
int end = page *
String sql = "select * from(SELECT [id] ,[name],[price] ,[addDate],[state],[picture],ROW_NUMBER() over(order by id desc) row FROM [Product]) t where t.row&=? and t.row&=?";
//执行查询返回List&Product&
return JDBCUtils.queryForList(sql, Product.class, start,end);
public static void main(String[] args) {
ProductDao dao=new ProductDao();
for (Product p : dao.getPager(1, 10)) {
System.out.println(p);
测试结果:
decimal-&BigDecimal
3.6、产品展示
ProductDao.java
package com.zhangguo.gomallpro.
import java.util.L
import java.util.M
import com.zhangguo.gomallpro.model.P
import com.zhangguo.gomallpro.utils.JDBCU
public class ProductDao {
/**产品分页列表*/
public List&Product& getPager(int page, int limit) {
// 开始索引
int start = (page - 1) * limit + 1;
// 结束索引
int end = page *
String sql = "select * from(SELECT [id] ,[name],[price] ,[addDate],[state],[picture],ROW_NUMBER() over(order by id desc) row FROM [Product]) t where t.row&=? and t.row&=?";
//执行查询返回List&Product&
return JDBCUtils.queryForList(sql, Product.class, start,end);
/**获得总记录数*/
public int getCount() {
String sql="select COUNT(*) count from Product";
Map&String,Object& map=JDBCUtils.queryForMap(sql);
return (int)map.get("count");
public static void main(String[] args) {
ProductDao dao=new ProductDao();
System.out.println(dao.getCount());
for (Product p : dao.getPager(2, 10)) {
System.out.println(p);
分页工具类R.java
package com.zhangguo.gomallpro.
public class R {
/**响应编码*/
private int
/**响应消息*/
/**数据总量*/
private int
public String toJson(){
return JsonUtils.toJson(this);
public R() {
public static R ok(){
return ok(0,null);
public static R ok(int count, Object data){
return new R(0, "操作成功!", count, data);
public static R ok(String msg){
return new R(0,msg, 0,null);
public static R error(int count, Object data){
return new R(1, "操作失败!", count, data);
public static R error(){
return error(0,null);
public static R error(String msg){
return new R(1, msg,0,null);
public R(int code, String msg, int count, Object data) {
this.code =
this.msg =
this.count =
this.data =
public String toString() {
return "R [code=" + code + ", msg=" + msg + ", count=" + count + ", data=" + data + "]";
public int getCode() {
public void setCode(int code) {
this.code =
public String getMsg() {
public void setMsg(String msg) {
this.msg =
public int getCount() {
public void setCount(int count) {
this.count =
public Object getData() {
public void setData(Object data) {
this.data =
JsonUtil工具类
package com.zhangguo.gomallpro.
import java.text.SimpleDateF
import com.fasterxml.jackson.core.JsonProcessingE
import com.fasterxml.jackson.databind.ObjectM
public class JsonUtils {
* 序列化成json
public static String toJson(Object obj) {
// 对象映射器
ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss");
mapper.setDateFormat(sdf);
String result = null;
// 序列化user对象为json字符串
result = mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
e.printStackTrace();
* 反序列化成对象
public static &T& T toObject(String json,Class&T& valueType) {
//对象映射器
ObjectMapper mapper=new ObjectMapper();
T result=null;
result=mapper.readValue(json,valueType);
}catch (Exception e) {
e.printStackTrace();
产品控制器,ProductController.java
package com.zhangguo.gomallpro.
import java.io.IOE
import java.io.PrintW
import javax.servlet.ServletE
import javax.servlet.annotation.WebS
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import com.zhangguo.gomallpro.dao.ProductD
import com.zhangguo.gomallpro.utils.R;
* 产品控制器
@WebServlet("/ProductController")
public class ProductController extends HttpServlet {
private static final long serialVersionUID = 1L;
ProductDao dao=new ProductDao();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
response.setContentType("application/charset=utf-8");
out=response.getWriter();
String action=request.getParameter("action");
if(action.equals("getPager")){
int page=Integer.parseInt(request.getParameter("page"));
int limit=Integer.parseInt(request.getParameter("limit"));
out.print(R.ok(dao.getCount(), dao.getPager(page, limit)).toJson());
out.print(R.error("不存在的动作"));
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
product.html
&!DOCTYPE html&
&meta charset="utf-8"&
&title&商品管理&/title&
&link rel="stylesheet" href="./plugins/layui/css/layui.css" media="all"&
&div style="padding: 10px 0 0 10"&
&button class="layui-btn layui-btn-sm layui-btn-normal" id="btnAdd"
data-type="auto"&添加&/button&
&table id="productList" lay-filter="test"&&/table&
&script src="./plugins/layui/layui.js"&&/script&
layui.use('table', function() {
var table = layui.
//第一个实例
table.render({
elem: '#productList'
,height:450
,url: 'ProductController?action=getPager' //数据接口
,page: true //开启分页
,cols: [[ //表头
{field: 'id', title: '编号', width:130, sort: true, fixed: 'left'}
,{field: 'name', title: '商品名称', width:200}
,{field: 'price', title: '价格', width:100, sort: true}
,{field: 'picture', title: '图片', width:130}
,{field: 'addDate', title: '上架时间', width: 160, sort: true}
,{field: 'state', title: '状态', width: 80}
layui.use('jquery',function(){
var $=layui.
$("#btnAdd").click(function() {
//通过这种方式弹出的层,每当它被选择,就会置顶。
layer.open({
shade: [0.4, '#393D49'],
area: ['600px', '400px'],
maxmin: true,
content: $("#form1"),
zIndex: layer.zIndex, //重点1
success: function(layero) {
layer.setTop(layero); //重点2
btn: ['按钮一', '按钮二', '按钮三'],
yes: function(index, layero) {
//按钮【按钮一】的回调
btn2: function(index, layero) {
//按钮【按钮二】的回调
//return false 开启该代码可禁止点击该按钮关闭
btn3: function(index, layero) {
//按钮【按钮三】的回调
//return false 开启该代码可禁止点击该按钮关闭
cancel: function() {
//右上角关闭回调
//return false 开启该代码可禁止点击该按钮关闭
&fieldset id="form1" hidden="hidden"&
&legend&用户信息&/legend&
&label for="name"&姓名:&/label& &input type="text" name="name" id="name"
placeholder="请输入姓名" /& &span id="nameMsg" class="red"&&/span&
&label for="city"&城市:&/label& &input type="text" name="city" id="city"
placeholder="请输入城市" /& &span id="cityMsg" class="red"&&/span&
&button type="button" id="btnSave" onclick="layer.closeAll()"&保存&/button&
&button type="button" id="btnUpdate"&更新&/button&
&/fieldset&
3.7、AJAX文件异步上传
3.7.1、前端页面
&div class="layui-upload"&
&button type="button" class="layui-btn" id="test1"&上传图片&/button&
&div class="layui-upload-list"&
&img class="layui-upload-img" id="demo1"&
&p id="demoText"&&/p&
layui.use('upload', function(){
var $ = layui.jquery
,upload = layui.
//普通图片上传
var uploadInst = upload.render({
elem: '#test1'
,url: 'UploadFile'
,before: function(obj){
//预读本地文件示例,不支持ie8
obj.preview(function(index, file, result){
$('#demo1').attr('src', result); //图片链接(base64)
,done: function(res){
//如果上传失败
if(res.code & 0){
return layer.msg('上传失败');
//上传成功
layer.msg(res.msg);
,error: function(){
//演示失败状态,并实现重传
var demoText = $('#demoText');
demoText.html('&span style="color: #FF5722;"&上传失败&/span& &a class="layui-btn layui-btn-mini demo-reload"&重试&/a&');
demoText.find('.demo-reload').on('click', function(){
uploadInst.upload();
3.7.2、后台服务
添加jar包的依赖
定义上传文件的Servlet
package com.zhangguo.gomallpro.
import java.io.F
import java.io.IOE
import java.util.HashM
import java.util.I
import java.util.L
import java.util.M
import java.util.UUID;
import javax.servlet.ServletE
import javax.servlet.annotation.WebS
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.apache.commons.fileupload.FileI
import org.apache.commons.fileupload.FileUploadE
import org.apache.commons.fileupload.disk.DiskFileItemF
import org.apache.commons.fileupload.servlet.ServletFileU
import com.zhangguo.gomallpro.utils.R;
@SuppressWarnings("serial")
@WebServlet("/UploadFile")
public class UploadFile extends HttpServlet {
@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置编码
response.setCharacterEncoding("utf-8");
// 物理路径
String savePath = this.getServletConfig().getServletContext().getRealPath("");
savePath = savePath + "images\\";
File f1 = new File(savePath);
if (!f1.exists()) {
f1.mkdirs();
DiskFileItemFactory fac = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(fac);
upload.setHeaderEncoding("utf-8");
List&FileItem& fileList = null;
fileList = upload.parseRequest(request);
} catch (FileUploadException ex) {
Iterator&FileItem& it = fileList.iterator();
String name = "";
String extName = "";
while (it.hasNext()) {
FileItem item = it.next();
if (!item.isFormField()) {
name = item.getName();
long size = item.getSize();
String type = item.getContentType();
System.out.println(size + " " + type);
if (name == null || name.trim().equals("")) {
// 扩展名格式:
if (name.lastIndexOf(".") &= 0) {
extName = name.substring(name.lastIndexOf("."));
File file = null;
// 生成文件名:
name = UUID.randomUUID().toString();
file = new File(savePath + name + extName);
} while (file.exists());
File saveFile = new File(savePath + name + extName);
item.write(saveFile);
} catch (Exception exp) {
response.getWriter().write(exp.getMessage());
exp.printStackTrace();
R r = new R();
r.setCode(0);
r.setMsg("上传成功");
Map&String, String& data = new HashMap&String, String&();
data.put("src", "images/" + name + extName);
data.put("name",name + extName);
r.setData(data);
response.getWriter().print(r.toJson());
3.7.3、演示结果
3.7.4、其它上传组件
3.8、富文本编辑器Kindeditor
KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所见即所得编辑效果,兼容IE、Firefox、Chrome、Safari、Opera等主流浏览器。KindEditor使用JavaScript编写,可以无缝的于Java、.NET、PHP、ASP等程序接合。 KindEditor非常适合在CMS、商城、论坛、博客、Wiki、电子邮件等互联网应用上使用
1. 体积小,加载速度快,但功能十分丰富。2. 内置自定义range,完美地支持span标记。
3. 基于插件的方式设计,所有功能都是插件,增加自定义和扩展功能非常简单。
4. 修改编辑器风格很容易,只需修改一个CSS文件。
5. 支持大部分主流浏览器,比如IE、Firefox、Safari、Chrome、Opera。
Github: https://github.com/kindsoft/kindeditor
Oschina: http://git.oschina.net/luolonghao/kindeditor
下载地址:
3.8.1、使用Kindeditor
1. 下载编辑器
下载 KindEditor 最新版本,下载之后打开 examples/index.html 就可以看到演示。下载页面: http://www.kindsoft.net/down.php
2. 部署编辑器
解压 kindeditor-x.x.x.zip 文件,将所有文件上传到您的网站程序目录里,例如:http://您的域名/editor/Note:您可以根据需求删除以下目录后上传到服务器。asp - ASP程序asp.net - ASP.NET程序php - PHP程序jsp - JSP程序examples - 演示文件
3. 修改HTML页面
1.在需要显示编辑器的位置添加textarea输入框。&textarea id="editor_id" name="content" style="width:700height:300"&&strong&HTML内容&/strong&&/textarea&Note:
id在当前页面必须是唯一的值。在textarea里设置HTML内容即可实现编辑,在这里需要注意的是,如果从服务器端程序(ASP、PHP、ASP.NET等)直接显示内容,则必须转换HTML特殊字符(&,&,&,&)。具体请参考各语言目录下面的demo.xxx程序,目前支持ASP、ASP.NET、PHP、JSP。在有些浏览器上不设宽度和高度可能显示有问题,所以最好设一下宽度和高度。宽度和高度可用inline样式设置,也可用 编辑器初始化参数 设置。2.在该HTML页面添加以下脚本。&script charset="utf-8" src="/editor/kindeditor.js"&&/script&&script charset="utf-8" src="/editor/lang/zh_CN.js"&&/script&&script&
KindEditor.ready(function(K) {
editor = K.create('#editor_id');
});&/script&Note:
第一个参数可用其它CSS选择器,匹配多个textarea时只在第一个元素上加载编辑器。通过K.create函数的第二个参数,可以对编辑器进行配置,具体参数请参考 编辑器初始化参数 。var options = {
cssPath : '/css/index.css',
filterMode : true};var editor = K.create('textarea[name="content"]', options);
4. 获取HTML数据// 取得HTML内容html = editor.html();
// 同步数据后可以直接取得textarea的valueeditor.sync();html = document.getElementById('editor_id'). // 原生APIhtml = K('#editor_id').val(); // KindEditor Node APIhtml = $('#editor_id').val(); // jQuery
// 设置HTML内容editor.html('HTML内容');Note:
KindEditor的可视化操作在新创建的iframe上执行,代码模式下的textarea框也是新创建的,所以最后提交前需要执行 sync() 将HTML数据设置到原来的textarea。KindEditor在默认情况下自动寻找textarea所属的form元素,找到form后onsubmit事件里添加sync函数,所以用form方式提交数据,不需要手动执行sync()函数。
3.8.2、文件上传
&将依赖的jar文件放置到项目的lib目录中,3个jar文件已在kindeditor中存在
找到用于处理上传的jsp程序,根据需要修改
upload_json.jsp
&%@ page language="java" contentType="text/ charset=UTF-8" pageEncoding="UTF-8"%&
&%@ page import="java.util.*,java.io.*" %&
&%@ page import="java.text.SimpleDateFormat" %&
&%@ page import="org.apache.commons.fileupload.*" %&
&%@ page import="org.apache.commons.fileupload.disk.*" %&
&%@ page import="org.apache.commons.fileupload.servlet.*" %&
&%@ page import="org.json.simple.*" %&
* KindEditor JSP
* 本JSP程序是演示程序,建议不要直接在实际项目中使用。
* 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
//文件保存目录路径
String savePath = pageContext.getServletContext().getRealPath("/") + "attached/";
//文件保存目录URL
String saveUrl
= request.getContextPath() + "/attached/";
//定义允许上传的文件扩展名
HashMap&String, String& extMap = new HashMap&String, String&();
extMap.put("image", "gif,jpg,jpeg,png,bmp");
extMap.put("flash", "swf,flv");
extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
//最大文件大小
long maxSize = 1000000;
response.setContentType("text/ charset=UTF-8");
if(!ServletFileUpload.isMultipartContent(request)){
out.println(getError("请选择文件。"));
//检查目录
File uploadDir = new File(savePath);
if(!uploadDir.isDirectory()){
out.println(getError("上传目录不存在。"));
//检查目录写权限
if(!uploadDir.canWrite()){
out.println(getError("上传目录没有写权限。"));
String dirName = request.getParameter("dir");
if (dirName == null) {
dirName = "image";
if(!extMap.containsKey(dirName)){
out.println(getError("目录名不正确。"));
//创建文件夹
savePath += dirName + "/";
saveUrl += dirName + "/";
File saveDirFile = new File(savePath);
if (!saveDirFile.exists()) {
saveDirFile.mkdirs();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String ymd = sdf.format(new Date());
savePath += ymd + "/";
saveUrl += ymd + "/";
File dirFile = new File(savePath);
if (!dirFile.exists()) {
dirFile.mkdirs();
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
String fileName = item.getName();
long fileSize = item.getSize();
if (!item.isFormField()) {
//检查文件大小
if(item.getSize() & maxSize){
out.println(getError("上传文件大小超过限制。"));
//检查扩展名
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if(!Arrays.&String&asList(extMap.get(dirName).split(",")).contains(fileExt)){
out.println(getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。"));
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileE
File uploadedFile = new File(savePath, newFileName);
item.write(uploadedFile);
}catch(Exception e){
out.println(getError("上传文件失败。"));
JSONObject obj = new JSONObject();
obj.put("error", 0);
obj.put("url", saveUrl + newFileName);
out.println(obj.toJSONString());
private String getError(String message) {
JSONObject obj = new JSONObject();
obj.put("error", 1);
obj.put("message", message);
return obj.toJSONString();
文件管理file_manager_json.jsp
&%@ page language="java" contentType="text/ charset=UTF-8" pageEncoding="UTF-8"%&
&%@ page import="java.util.*,java.io.*" %&
&%@ page import="java.text.SimpleDateFormat" %&
&%@ page import="org.json.simple.*" %&
* KindEditor JSP
* 本JSP程序是演示程序,建议不要直接在实际项目中使用。
* 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
//根目录路径,可以指定绝对路径,比如 /var/www/attached/
String rootPath = pageContext.getServletContext().getRealPath("/") + "attached/";
//根目录URL,可以指定绝对路径,比如 http://www.yoursite.com/attached/
String rootUrl
= request.getContextPath() + "/attached/";
//图片扩展名
String[] fileTypes = new String[]{"gif", "jpg", "jpeg", "png", "bmp"};
String dirName = request.getParameter("dir");
if (dirName != null) {
if(!Arrays.&String&asList(new String[]{"image", "flash", "media", "file"}).contains(dirName)){
out.println("Invalid Directory name.");
rootPath += dirName + "/";
rootUrl += dirName + "/";
File saveDirFile = new File(rootPath);
if (!saveDirFile.exists()) {
saveDirFile.mkdirs();
//根据path参数,设置各路径和URL
String path = request.getParameter("path") != null ? request.getParameter("path") : "";
String currentPath = rootPath +
String currentUrl = rootUrl +
String currentDirPath =
String moveupDirPath = "";
if (!"".equals(path)) {
String str = currentDirPath.substring(0, currentDirPath.length() - 1);
moveupDirPath = str.lastIndexOf("/") &= 0 ? str.substring(0, str.lastIndexOf("/") + 1) : "";
//排序形式,name or size or type
String order = request.getParameter("order") != null ? request.getParameter("order").toLowerCase() : "name";
//不允许使用..移动到上一级目录
if (path.indexOf("..") &= 0) {
out.println("Access is not allowed.");
//最后一个字符不是/
if (!"".equals(path) && !path.endsWith("/")) {
out.println("Parameter is not valid.");
//目录不存在或不是目录
File currentPathFile = new File(currentPath);
if(!currentPathFile.isDirectory()){
out.println("Directory does not exist.");
//遍历目录取的文件信息
List&Hashtable& fileList = new ArrayList&Hashtable&();
if(currentPathFile.listFiles() != null) {
for (File file : currentPathFile.listFiles()) {
Hashtable&String, Object& hash = new Hashtable&String, Object&();
String fileName = file.getName();
if(file.isDirectory()) {
hash.put("is_dir", true);
hash.put("has_file", (file.listFiles() != null));
hash.put("filesize", 0L);
hash.put("is_photo", false);
hash.put("filetype", "");
} else if(file.isFile()){
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
hash.put("is_dir", false);
hash.put("has_file", false);
hash.put("filesize", file.length());
hash.put("is_photo", Arrays.&String&asList(fileTypes).contains(fileExt));
hash.put("filetype", fileExt);
hash.put("filename", fileName);
hash.put("datetime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(file.lastModified()));
fileList.add(hash);
if ("size".equals(order)) {
Collections.sort(fileList, new SizeComparator());
} else if ("type".equals(order)) {
Collections.sort(fileList, new TypeComparator());
Collections.sort(fileList, new NameComparator());
JSONObject result = new JSONObject();
result.put("moveup_dir_path", moveupDirPath);
result.put("current_dir_path", currentDirPath);
result.put("current_url", currentUrl);
result.put("total_count", fileList.size());
result.put("file_list", fileList);
response.setContentType("application/ charset=UTF-8");
out.println(result.toJSONString());
public class NameComparator implements Comparator {
public int compare(Object a, Object b) {
Hashtable hashA = (Hashtable)a;
Hashtable hashB = (Hashtable)b;
if (((Boolean)hashA.get("is_dir")) && !((Boolean)hashB.get("is_dir"))) {
return -1;
} else if (!((Boolean)hashA.get("is_dir")) && ((Boolean)hashB.get("is_dir"))) {
return ((String)hashA.get("filename")).compareTo((String)hashB.get("filename"));
public class SizeComparator implements Comparator {
public int compare(Object a, Object b) {
Hashtable hashA = (Hashtable)a;
Hashtable hashB = (Hashtable)b;
if (((Boolean)hashA.get("is_dir")) && !((Boolean)hashB.get("is_dir"))) {
return -1;
} else if (!((Boolean)hashA.get("is_dir")) && ((Boolean)hashB.get("is_dir"))) {
if (((Long)hashA.get("filesize")) & ((Long)hashB.get("filesize"))) {
} else if (((Long)hashA.get("filesize")) & ((Long)hashB.get("filesize"))) {
return -1;
public class TypeComparator implements Comparator {
public int compare(Object a, Object b) {
Hashtable hashA = (Hashtable)a;
Hashtable hashB = (Hashtable)b;
if (((Boolean)hashA.get("is_dir")) && !((Boolean)hashB.get("is_dir"))) {
return -1;
} else if (!((Boolean)hashA.get("is_dir")) && ((Boolean)hashB.get("is_dir"))) {
return ((String)hashA.get("filetype")).compareTo((String)hashB.get("filetype"));
KindEditor默认提供ASP、ASP.NET、PHP、JSP上传程序,这些程序是演示程序,建议不要直接在实际项目中使用。如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
选择程序语言?// ASPKindEditor.ready(function(K) {
K.create('#textarea_id', {
uploadJson : '../asp/upload_json.asp',
fileManagerJson : '../asp/file_manager_json.asp',
allowFileManager : true
});});// ASP.NETKindEditor.ready(function(K) {
K.create('#textarea_id', {
uploadJson : '../asp.net/upload_json.ashx',
fileManagerJson : '../asp.net/file_manager_json.ashx',
allowFileManager : true
});});// JSPKindEditor.ready(function(K) {
K.create('#textarea_id', {
uploadJson : '../jsp/upload_json.jsp',
fileManagerJson : '../jsp/file_manager_json.jsp',
allowFileManager : true
});});Note:
具体使用方法请参见各语言(asp、asp.net、php、jsp)目录下的demo.xxx文件。
完整示例:
&!DOCTYPE html&
&meta charset="utf-8"&
&title&kind editor Demo&/title&
&h2&富文本编辑器&/h2&
&textarea cols="80" rows="10" id="details" style="width:700px"&&/textarea&
&button type="button" id="btnSubmit"&提交&/button&
&div id="divContent"&&/div&
&script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"&&/script&
&script type="text/javascript"
src="js/kindeditor4111/kindeditor-all-min.js"&&/script&
&script type="text/javascript" src="js/kindeditor4111/lang/zh-CN.js"&&/script&
KindEditor.ready(function(K) {
editor = K.create('#details',{
uploadJson : 'js/kindeditor4111/jsp/upload_json.jsp',
//上传程序
fileManagerJson : 'js/kindeditor4111/jsp/file_manager_json.jsp',
//文件管理
allowFileManager : true
//是否允许上传
//创建一个富文本编辑器
$("#btnSubmit").click(function(){
$("#divContent").html(editor.html());
运行结果:
3.8.3、其它属性设置
K.options = {
designMode : true,
fullscreenMode : false,
filterMode : true,
wellFormatMode : true,
shadowMode : true,
loadStyleMode : true,
basePath : K.basePath,
themesPath : K.basePath + 'themes/',
langPath : K.basePath + 'lang/',
pluginsPath : K.basePath + 'plugins/',
themeType : 'default',
langType : 'zh-CN',
urlType : '',
newlineTag : 'p',
resizeType : 2,
syncType : 'form',
pasteType : 2,
dialogAlignType : 'page',
useContextmenu : true,
fullscreenShortcut : false,
bodyClass : 'ke-content',
indentChar : '\t',
cssPath : '',
cssData : '',
minWidth : 650,
minHeight : 100,
minChangeSize : 50,
zIndex : 811213,
'source', '|', 'undo', 'redo', '|', 'preview', 'print', 'template', 'code', 'cut', 'copy', 'paste',
'plainpaste', 'wordpaste', '|', 'justifyleft', 'justifycenter', 'justifyright',
'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
'superscript', 'clearhtml', 'quickformat', 'selectall', '|', 'fullscreen', '/',
'formatblock', 'fontname', 'fontsize', '|', 'forecolor', 'hilitecolor', 'bold',
'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', '|', 'image', 'multiimage',
'flash', 'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
'anchor', 'link', 'unlink', '|', 'about'
noDisableItems : ['source', 'fullscreen'],
colorTable : [
['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
['#FFFFFF', '#CCCCCC', '#999999', '#666666', '#333333', '#000000']
fontSizeTable : ['9px', '10px', '12px', '14px', '16px', '18px', '24px', '32px'],
htmlTags : {
font : ['id', 'class', 'color', 'size', 'face', '.background-color'],
'id', 'class', '.color', '.background-color', '.font-size', '.font-family', '.background',
'.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.line-height'
'id', 'class', 'align', '.border', '.margin', '.padding', '.text-align', '.color',
'.background-color', '.font-size', '.font-family', '.font-weight', '.background',
'.font-style', '.text-decoration', '.vertical-align', '.margin-left'
'id', 'class', 'border', 'cellspacing', 'cellpadding', 'width', 'height', 'align', 'bordercolor',
'.padding', '.margin', '.border', 'bgcolor', '.text-align', '.color', '.background-color',
'.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration', '.background',
'.width', '.height', '.border-collapse'
'td,th': [
'id', 'class', 'align', 'valign', 'width', 'height', 'colspan', 'rowspan', 'bgcolor',
'.text-align', '.color', '.background-color', '.font-size', '.font-family', '.font-weight',
'.font-style', '.text-decoration', '.vertical-align', '.background', '.border'
a : ['id', 'class', 'href', 'target', 'name'],
embed : ['id', 'class', 'src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess', 'wmode'],
img : ['id', 'class', 'src', 'width', 'height', 'border', 'alt', 'title', 'align', '.width', '.height', '.border'],
'p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : [
'id', 'class', 'align', '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.background',
'.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.text-indent', '.margin-left'
pre : ['id', 'class'],
hr : ['id', 'class', '.page-break-after'],
'br,tbody,tr,strong,b,sub,sup,em,i,u,strike,s,del' : ['id', 'class'],
iframe : ['id', 'class', 'src', 'frameborder', 'width', 'height', '.width', '.height']
layout : '&div class="container"&&div class="toolbar"&&/div&&div class="edit"&&/div&&div class="statusbar"&&/div&&/div&'
kindeditor API ,kindeditor使用手册,kindeditor函数,kindeditor使用,超级大收集
唯一的全局变量,也是程序的命名空间。
数据类型:Object
2. KE.version
编辑器的版本信息。
数据类型:String
3. KE.lang
编辑器的中文信息。
数据类型:Object
4. KE.scriptPath
kindeditor.js的路径。
数据类型:String
5. KE.htmlPath
编辑器的HTML页面路径。
数据类型:String
注:3.4版本已废弃。
6. KE.browser
浏览器类型和版本,分别为KE.browser.VERSION、KE.browser.IE、KE.browser.WEBKIT、 KE.browser.GECKO、KE.browser.OPERA。
数据类型:Object
注:3.4以前版本直接返回字符串,分别为"IE"、"WEBKIT"、"GECKO"、"OPERA"。
7. KE.setting
编辑器的初始化属性和其它配置。
数据类型:Object
一个编辑器的变量集,包含所有编辑器属性,此外还包含以下变量,经常用KE.g[id]来表示。
例如:KE.g["content_1"].iframeDoc表示id为"content_1"的编辑器的iframe document对象。
数据类型:Object
主要变量:
container: 编辑器的外部element对象。
iframe: 编辑区域的iframe对象。
iframeWin: 编辑区域的iframe window对象。
iframeDoc: 编辑区域的iframe document对象。
keSel: 当前选中信息的KE.selection对象。
keRange: 当前选中信息的KE.range对象。
sel: 当前选中信息的浏览器原生selection对象。
range: 当前选中信息的浏览器原生range对象。
layoutDiv: 编辑器弹出层的div对象。3.4版本已废弃。
hideDiv: 编辑器弹出层的parent div对象。
dialog: 弹出窗口的iframe对象。3.4版本已废弃。
yesButton: 弹出窗口的确定按钮input对象。
noButton: 弹出窗口的取消按钮input对象。
previewButton: 弹出窗口的预览按钮input对象。
maskDiv: 弹出窗口时灰色遮罩层的div对象。
undoStack: undo/redo的undo记录。
redoStack: undo/redo的redo记录。
9. KE.plugin
定义编辑器的插件。
数据类型:Object
1. KE.$(id, doc)
取得element对象,doc.getElementById的别名。
id:String,element的id
doc:Object,element所在document对象,是可选参数,默认值为document。
Object,element对象
2. KE.$$(name, doc)
创建element对象,doc.createElement的别名。
name:String,element的tag name
doc:Object,element所在document对象,是可选参数,默认值为document。
Object,element对象
3. KE.event.add(el, event, listener)
添加一个事件。
el:Object,要添加事件的element对象
event:String,事件名称,可设置"click","change","mousedown"等。
listener:Function,事件处理回调函数。
返回值:无
4. KE.event.remove(el, event, listener)
删除已添加的一个事件。
el:Object,要添加事件的element对象
event:String,事件名称,可设置"click","change","mousedown"等。
listener:Function,事件处理回调函数。
返回值:无
5. KE.event.input(el, func)
添加一个编辑器输入事件。
el:Object,要添加事件的element对象
func:Function,编辑器输入内容时调用这个函数。
返回值:无
6. KE.event.ctrl(el, key, func)
添加一个Ctrl+[]事件。
el:Object,要添加事件的element对象
key:String,Ctrl组合键的字母,支持A到Z。
func:Function,按下Ctrl+[]时调用这个函数。
返回值:无
7. KE.event.ready(func)
添加一个document的DOMContentLoaded事件。
func:Function,DOM加载完成后调用这个函数。
返回值:无
8. KE.each(obj, func)
遍历一个object。
obj:Object,要遍历的object
func:Function,循环时调用这个函数,参数为object的key和value。
返回值:无
9. KE.eachNode(node, func)
遍历一个node。
node:Object,要遍历的parent node
func:Function,循环时调用这个函数,参数为node。
返回值:无
10. KE.format.getHtml(html, htmlTags)
把HTML转换成XHTML,当指定htmlTags参数时,按照htmlTags规则过滤HTML标签。
html:String,HTML文本
htmlTags:Object,过滤规则,可选参数。
String,XHTML文本
11. KE.util.getDocumentElement()
取得document element对象。
Object,element对象
12. KE.util.getDocumentWidth()
取得当前页面的宽度。
Int,document宽度
13. KE.util.getDocumentHeight()
取得当前页面的高度。
Int,document高度
14. KE.util.loadStyle(path)
在当前页面加载一个CSS文件。
path:String,CSS文件的URL路径
返回值:无
15. KE.util.inArray(str, arr)
判断一个字符串是否在一个数组里。
str:String
arr:Array
Boolean,返回true表示在数组里,返回false表示不在数组里。
16. KE.util.trim(str)
删除字符串两边的空格字符。
str:String
返回值:String
17. KE.util.getJsKey(key)
把HTML style里的CSS名转换成JavaScript属性名。例如:KE.util.getJsKey("font-size")会返回"fontSize"。
key:String
返回值:String
18. KE.util.escape(html)
转换HTML里的特殊字符。
html:String,HTML文本
返回值:String
19. KE.util.getElementPos(el)
取得指定element的坐标。
el:Object,element对象
返回值:Object
20. KE.util.getCoords(ev)
取得鼠标坐标。
ev:Object,event对象
返回值:Object
21. KE.util.setOpacity(el, opacity)
设置element的透明度。
el:Object,element对象
opacity:Int,透明度,可设置0到100的数字。
返回值:无
22. KE.util.getIframeDoc(iframe)
取得iframe document对象。
iframe:Object,iframe对象
返回值:Object
23. KE.util.rgbToHex(str)
把RGB格式的颜色转换成16进制的颜色。
str:String,RGB颜色标记
返回值:String
24. KE.util.createRange(doc)
创建指定document的range。
doc:Object,document对象
返回值:Object,range对象
25. KE.util.getFullHtml(id, tagLineMode)
取得编辑器iframe的初始化HTML文本。
id:String,编辑器的ID
tagLineMode:Boolean,true时显示模块标签的轮廓。
返回值:String
26. KE.util.getData(id)
取得编辑器的HTML内容。
id:String,编辑器的ID
返回值:String
27. KE.util.getSrcData(id)
取得编辑器的原生HTML内容,也就是innerHTML直接返回的HTML。
id:String,编辑器的ID
返回值:String
28. KE.util.getPureData(id)
取得编辑器的纯文本内容,不包含HTML标签。3.4版本开始包含img和embed标签。
id:String,编辑器的ID
返回值:String
29. KE.util.setData(id)
把编辑器的内容设置到原TEXTAREA控件里。
id:String,编辑器的ID
返回值:无
30. KE.util.focus(id)
把焦点移到编辑器里。
id:String,编辑器的ID
返回值:无
31. KE.util.selection(id)
把当前选中信息设置到KE.g[id].sel,KE.g[id].range,KE.g[id].keSel,KE.g[id].keRange里。
id:String,编辑器的ID
返回值:无
32. KE.util.select(id)
重新选中range,仅在IE有效。
id:String,编辑器的ID
返回值:无
33. KE.util.pToBr(id)
按下回车键时生成BR标签,仅在IE有效。
id:String,编辑器的ID
返回值:无
注:3.4版本已废弃。
34. KE.util.execCommand(id, cmd, value)
执行浏览器自带的命令,详细请参考浏览器API里的document.execCommand。
id:String,编辑器的ID
cmd:String,浏览器execCommand里的cmd参数
value:String,浏览器execCommand里的value参数
返回值:无
35. KE.util.insertHtml(id, html)
把HTML内容插入到编辑区域里的光标处。
id:String,编辑器的ID
html:String,HTML内容
返回值:无
注:执行本函数之前必须先执行过 KE.util.selection(id),因为要先设置KE.g[id].sel和KE.g[id].range。
36. KE.create(id, mode)
创建编辑器。
id:String,编辑器的ID
mode:Int,可选参数,指定1时在body下面创建编辑器,0或未指定时在TEXTAREA前面创建编辑器。
返回值:无
37. KE.remove(id, mode)
移除编辑器。
id:String,编辑器的ID
mode:Int,可选参数,指定1时移除在body下面的编辑器,0或未指定时移除在TEXTAREA前面的编辑器。
返回值:无
38. KE.init(config)
设置编辑器的初始化参数。
config:Object,编辑器属性的哈希数组,具体请参考编辑器属性
返回值:无
39. KE.show(config)
初始化并创建编辑器。执行本函数时先调用KE.init设置初始化参数,然后在DOM加载完成后执行KE.create。
config:Object,编辑器属性的哈希数组,具体请参考编辑器属性
返回值:无
1. KE.selection(win, doc)
KindEditor的selection类,取得或设置选中部分的range。
win:Object,window对象
oc:Object,document对象
成员变量:
sel:Object,浏览器原生selection对象
range:Object,当前selection的浏览器原生range对象
keRange:Object,当前selection的KindEditor range对象,请参考KE.range。
addRange(keRange):设置当前selection。
focus():重新选中、仅在IE有效。
2. KE.range(doc)
KindEditor的range类,为各浏览器提供统一的range接口。
doc:Object,document对象
成员变量:
startNode:Object,开始节点
startPos:Int,开始节点的位置
endNode:Object,结束节点
endPos:Int,结束节点的位置
getParentElement():返回包含range的parent element。
getNodeList():返回range里的node list。
comparePoints(how, range):比较2个keRange的位置,how可以设置"START_TO_START", "START_TO_END", "END_TO_START","END_TO_END"。
setStart(node, pos):设置range的开始节点和位置。
setEnd(node, pos):设置range的结束节点和位置。
selectNode(node):把node设置到range,开始节点和结束节点都是node。
extractContents():提取range的内容。
cloneContents():复制range的内容。
getText():取得range的纯文本内容。
3. KE.cmd(id)
KindEditor的命令类,类似execCommand。
id:String,编辑器的ID
成员变量:
doc:Object,编辑器的iframe document对象
keSel:Int,KindEditor selection对象
keRange:Object,当前selection的KindEditor range对象
wrap(tagName, attributes):用指定标签包当前选中文本,目前只支持inline tag。tagName为标签名,attributes为该标签属性数组。
remove(tags):在当前选中文本中,清除指定的标签和属性。tags为你要删除的标签和属性。
3.8.4、Kindeditor获取不了焦点的解决方法
使用layui弹出层时会发现kindeditor获取不了光标,这是因为多个层与iframe元素间叠放顺序的问题引起的,解决办法如下:
success: function(layero) {
layer.setTop(layero); //顶置
editor = KindEditor.create('#details',{
uploadJson : 'js/kindeditor4111/jsp/upload_json.jsp',
//上传程序
fileManagerJson : 'js/kindeditor4111/jsp/file_manager_json.jsp',
//文件管理
allowFileManager : true , //是否允许上传
layui zIndex:
KindEditor zIndex:811213
//创建一个富文本编辑器
要放在在窗体加载请求成功里面执行才有用,放外面没有用
第二次要移除KindEditor.remove("#details");&
3.8.5、上传问题
富文本框,pageContext可能遇到上传目录不存在的问题
3.9、移动端UI框架
https://weui.io
http://www.jqweui.cn/
http://www.dcloud.io/mui.html
&!DOCTYPE html&
&meta charset="utf-8"&
&meta http-equiv="X-UA-Compatible" content="IE=edge"&
&title&我的生活&/title&
&meta name="viewport" content="initial-scale=1, maximum-scale=1" /&
&link rel="shortcut icon" href="/favicon.ico" /&
&meta name="apple-mobile-web-app-capable" content="yes" /&
&meta name="apple-mobile-web-app-status-bar-style" content="black" /&
&link rel="stylesheet" href="js/suimobile/css/sm.min.css" /&
&link rel="stylesheet" href="js/suimobile/css/sm-extend.min.css" /&
&div class="page-group"&
&!-- 你的html代码 --&
&div class="page"&
&header class="bar bar-nav"&
&a class="button button-link button-nav pull-left" href="/demos/card"&
&span class="icon icon-left"&&/span&
&h1 class="title"&我的生活&/h1&
&nav class="bar bar-tab"&
&a class="tab-item external active" href="#"&
&span class="icon icon-home"&&/span&
&span class="tab-label"&首页&/span&
&a class="tab-item external" href="#"&
&span class="icon icon-me"&&/span&
&span class="tab-label"&我&/span&
&a class="tab-item external" href="#"&
&span class="icon icon-star"&&/span&
&span class="tab-label"&收藏&/span&
&a class="tab-item external" href="#"&
&span class="icon icon-settings"&&/span&
&span class="tab-label"&设置&/span&
&div class="content"&
&!-- 这里是页面内容区 --&
&div class="page-index" id="list"&
&script type='text/javascript' src='js/suimobile/js/zepto.js' charset='utf-8'&&/script&
&script type='text/javascript' src='js/suimobile/js/sm.min.js' charset='utf-8'&&/script&
&script type='text/javascript' src='js/suimobile/js/sm-extend.min.js' charset='utf-8'&&/script&
$(function(){
$.get("ProductController?action=getPager&limit=10&page=1",{},function(data){
$.each(data.data,function(index,obj){
c="&div class='card'&";
c+="&div style='background:url(\"images/"+obj.picture+"\") #fff center center' valign='bottom' class='card-header color-white no-border'&"+obj.name+"&/div&";
c+="&div class='card-content'&";
c+="&div class='card-content-inner'&";
c+="&p class='color-gray'&发布日期 "+obj.addDate+"&/p&";
c+="&p&此处是内容...&/p&";
c+="&/div&";
c+="&/div&";
c+="&div class='card-footer'&";
c+="&a href='#' class='link'&赞&/a&";
c+="&a href='#' class='link'&更多&/a&";
c+="&/div&";
c+="&/div&";
$("#list").append(c);
运行结果:
如果需要演示可使用Total Control软件
四、素材、示例与视频
密码: 5a19
layui文档:
layui文档:
上传jar包:
KindEditor下载:链接:
密码: tv9v
GoMallPro项目:链接:
密码: 13tw (SUI)
阅读(...) 评论()}

我要回帖

更多关于 未读消息图标 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信