Commit 0b5f68d9 by 丁伟

培训中心报名系统初始提交

parent 9f295dc1
/**
* Company Name : 中贸促信息技术有限责任公司
* Project Name:project
* File Name:UploadFileController.java
* Package Name:org.ccpit.base.controller
* Date:2015年10月13日下午2:38:00
* Copyright (c) 2015, dingwei@ccpit.org All Rights Reserved.
*
*/
package org.ccpit.base.controller;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.StringUtils;
import org.ccpit.base.utils.ReadConfigUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* ClassName:UploadFileController <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2015年10月13日 下午2:38:00 <br/>
*
* @author dingwei
* @version
* @since JDK 1.6
* @see
*/
@Controller
@RequestMapping("base/upload")
public class UploadFileController extends BaseController {
private static final List<String> allowedContentTypes = Arrays.asList(
"image/jpeg", "image/png", "image/gif", "image/bmp", "image/x-png");
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
public static final String UPLOADFILEPATH = ReadConfigUtil.getPlatformConfig("system.uploadFilePath"); // 文件上传保存路径
public static final String DOWNLOADFILEPATH = ReadConfigUtil.getPlatformConfig("system.downloadFilePath"); // 文件下载路径
@RequestMapping("ckupload")
public void ckUploadFile(HttpServletRequest request,
HttpServletResponse response) {
// response.setHeader("X-Frame-Options", "SAMEORIGIN");
String CKEditorFuncNum = request.getParameter("CKEditorFuncNum");
String fileName = request.getContextPath() + uploadFile(request);
PrintWriter out;
String s = "<script type=\"text/javascript\">window.parent.CKEDITOR.tools.callFunction("
+ CKEditorFuncNum + ", '" + fileName + "');</script>";
try {
out = response.getWriter();
out.print(s);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping("/progress")
@ResponseBody
public Object progress(HttpServletRequest request,
HttpServletResponse response) {
Object obj = request.getSession().getAttribute("UPLOAD_PERCENTAGE");
if (obj == null)
return 100.0d;
return obj;
}
@RequestMapping("/uploadFile")
@ResponseBody
public Object uploadFile(HttpServletRequest request,
HttpServletResponse response) {
Map<String, Object> result = new HashMap<String, Object>();
String file = uploadFile(request);
result.put("message", !StringUtils.isEmpty(file));
result.put("fileSavePath", DOWNLOADFILEPATH + file);
return result;
}
/**
* 保存上传图片实现方案:在uploadFile总目录下面按照月份创建目录,当其中某一个月的图片保存文件夹大小超过200M,再在该月目录下面创建
* 以当天日期命名的目录用以保存上传图片
*/
private String uploadFile(HttpServletRequest request) {
// 需要返回的fileName
String fileName = "";
String fileName1 = "";
String dateStr = sdf.format(new Date());
String monthStr = sdf1.format(new Date());
String realPath = UPLOADFILEPATH + "/uploadFile" + "/" + monthStr + "/";
String rp = "/uploadFile/" + monthStr + "/";
DiskFileItemFactory factory = new DiskFileItemFactory();
// Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = request.getSession()
.getServletContext();
File repository = (File) servletContext
.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置单个文件的大小
upload.setFileSizeMax(1024 * 1024);
// 设置总共文件的大小
upload.setProgressListener(new UploadListener(request));
try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
String type = item.getContentType();
if (type == null) {
continue;
}
// 文件参数
fileName = item.getName();
File dir = null;
if (allowedContentTypes.contains(type)) {
// 文件大小
long fileSize = (item.getSize() / (1024 * 1024));
if (fileSize < 1) {
String str = getRandomString(15);
fileName1 = dateStr + "_" + str + "."
+ fileName.split("[.]")[1];
dir = new File(realPath);
if (dir.exists()) {
double dirLong = getUploadFileSize(dir);
// 图片存放文件夹大小超过200M 将重新创建新的图片存放文件夹
if (dirLong >= 200) {
dir = new File(realPath + "/" + dateStr);
dir.mkdir();
rp += dateStr + "/";
}
} else {
dir.mkdirs();
}
File f = new File(dir, fileName1);
if (f.exists()) {
f.delete();
}
f.createNewFile();
// 保存
item.write(f);
return rp + fileName1;
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
return "上传文件过大,不要超过1M";
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String getRandomString(int length) { // length表示生成字符串的长度
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
// 读取上传文件目录大小
private static double getUploadFileSize(File dir) {
// 判断文件是否存在
if (dir.exists()) {
// 如果是目录则递归计算其内容的总大小
if (dir.isDirectory()) {
File[] files = dir.listFiles();
double size = 0;
for (File f : files) {
size += getUploadFileSize(f);
}
return size;
} else {
// 如果是文件则直接返回其大小,以“兆”为单位
double size = (double) dir.length() / 1024 / 1024;
return size;
}
} else {
System.out.println("文件或者文件夹不存在,请检查路径是否正确!");
return 0.0;
}
}
private class UploadListener implements ProgressListener {
private HttpServletRequest request;
private DecimalFormat df = new DecimalFormat("#00.0");
UploadListener(HttpServletRequest request) {
this.request = request;
}
@Override
public void update(long bytesRead, long bytesTotal, int items) {
double percent = (double) bytesRead * 100 / (double) bytesTotal;
request.getSession().setAttribute("UPLOAD_PERCENTAGE",
df.format(percent));
}
}
@RequestMapping("/uploadImage")
@ResponseBody
public void uploadImage(HttpServletRequest request,
HttpServletResponse response) {
String CKEditorFuncNum = request.getParameter("CKEditorFuncNum");
String fileName = request.getContextPath() + uploadFile(request);
PrintWriter out;
String serverIp = "http://www.expo-today.com";
String s = "<script type=\"text/javascript\">window.parent.CKEDITOR.tools.callFunction("
+ CKEditorFuncNum
+ ", '"
+ serverIp
+ fileName
+ "');</script>";
try {
out = response.getWriter();
out.print(s);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package org.ccpit.base.controller;
import org.apache.commons.lang.StringUtils;
import org.ccpit.base.utils.ValidateCode;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Date: 2015年10月08日 09:42
*
* @author 孙其鹏
* @version 1.0
*/
@Controller
@RequestMapping("/validate")
public class ValidateCodeController {
public static final String CODE="validate_code_in_session";
@RequestMapping("/code")
public void code(HttpServletRequest request,HttpServletResponse response){
ValidateCode vCode = new ValidateCode(100,30,4,100);
request.getSession().setAttribute(CODE, vCode.getCode().toLowerCase());
try {
vCode.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 验证验证码是否正确 (如果正确则删除session中的验证码)
* @param request
* @param input
* @return
*/
public static boolean validate(HttpServletRequest request,String input){
Object code = request.getSession().getAttribute(CODE);
String reqCode = input;
if (code==null || StringUtils.isEmpty((String) code)||StringUtils.isEmpty(reqCode))
return false;
boolean success = ((String)code).trim().toLowerCase().equals(reqCode.trim().toLowerCase());
if (success)
request.getSession().setAttribute(CODE,"");
return success;
}
}
package org.ccpit.base.user;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
import org.ccpit.base.modol.BaseEntity;
import org.ccpit.base.role.Role;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
/**
* Created by Administrator on 2015/9/2.
*/
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User extends BaseEntity implements IUser,Serializable{
/**
* serialVersionUID:TODO(用一句话描述这个变量表示什么).
* @since JDK 1.6
*/
private static final long serialVersionUID = 1L;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 登录名
*/
private String loginName;
/**
* 年龄
*/
private Integer age;
/**
* 性别
*/
private String sex;
/**
* 公司名称
*/
private String company;
/**
* 邮箱
*/
private String email;
/**
* 账号状态 (0 无效 | 1 有效)
*/
private Integer countStatus;
/**
* 电话
*/
private String telphone;
/**
* 创建人
*/
private String creator;
/**
* 创建人Id
*/
private long creatorId;
/**
* 创建时间
*/
private Date createTime;
/**
* 登录次数
*/
private Integer loginCount;
/**
* 用户类型 (back | front)
*/
private String userType;
private Set<Role> roles = new HashSet<Role>();
@Override
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long getId() {
return super.getId();
}
@Override
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
@Override
public int hashCode() {
return ("user"+getId()).hashCode();
}
@Override
public boolean equals(Object o) {
if(o == null){
return false;
}
if(o == this){
return true;
}
if(o.getClass() == User.class){
return o.hashCode()==this.hashCode();
}
return false;
}
@ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
@JoinTable(name = "user_Roles",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName ="id")})
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
public String getUserType() {
return userType;
}
public void setUserType(String userType) {
this.userType = userType;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getCountStatus() {
return countStatus;
}
public void setCountStatus(Integer countStatus) {
this.countStatus = countStatus;
}
public String getTelphone() {
return telphone;
}
public void setTelphone(String telphone) {
this.telphone = telphone;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public long getCreatorId() {
return creatorId;
}
public void setCreatorId(long creatorId) {
this.creatorId = creatorId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Integer getLoginCount() {
return loginCount;
}
public void setLoginCount(Integer loginCount) {
this.loginCount = loginCount;
}
}
package org.ccpit.base.user;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import org.ccpit.base.controller.BaseController;
import org.ccpit.base.controller.Page;
import org.ccpit.base.controller.PageRequest;
import org.ccpit.base.role.Role;
import org.ccpit.base.role.RoleDao;
import org.ccpit.base.usergroup.UserGroup;
import org.ccpit.base.usergroup.UserGroupDao;
import org.ccpit.base.usergroup.UserGroupService;
import org.ccpit.base.utils.CryptUtil;
import org.ccpit.base.utils.PasswordHash;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
/**
* Created by sqp on 2015/9/5.
*/
@Controller
@RequestMapping("/admin/user")
public class UserController extends BaseController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
@Autowired
private UserService userService;
@Autowired
private UserGroupService orgService;
@Autowired
private RoleDao roleDao;
@Autowired
private UserDao userDao;
@Autowired
private UserGroupDao orgDao;
@RequestMapping("/isExistUser")
@ResponseBody
public Object isExistUser(HttpServletRequest request) {
Map<String, Object> map = new HashMap<String, Object>();
String loginName = request.getParameter("loginName");
User user = userService.getUserByLoginName(loginName);
if (null == user) {
map.put("flag", false);
} else {
map.put("flag", true);
}
return map;
}
@RequestMapping("/addUser")
public void addUser(HttpServletRequest request,HttpServletResponse response,User user) {
String result = "";
User user_in_session = (User) request.getSession().getAttribute("user_in_session");
try {
//新增用户初始化密码
user.setPassword(PasswordHash.createHash("111111"));
} catch (Exception e) {
throw new RuntimeException("新增用户初始化密码加密失败....", e);
}
user.setCreatorId(user_in_session.getId());
user.setCreator(user_in_session.getUsername());
user.setCreateTime(new Date());
if(null == user.getUserType()){
user.setUserType("back");
}
if(null == user.getCountStatus()){
user.setCountStatus(1);
}
boolean flag = userService.addUser(user);
if(flag){
result = "{ \"flag\": "+ flag +", \"info\": \"数据保存成功!\" }";
}else {
result = "{ \"flag\": "+ flag +", \"info\": \"数据保存失败!\" }";
}
try {
response.setContentType("text/html");
response.getWriter().write(result);
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping("/edit/{id}")
@ResponseBody
public Object editUser(@PathVariable long id, User user) {
Map<String, Object> map = new HashMap<String, Object>();
User user1 = userService.getUser(id);
boolean flag = false;
if(null != user.getAge()){
user1.setAge(user.getAge());
}
if(null != user.getCountStatus()){
user1.setCountStatus(user.getCountStatus());
}
if(null != user.getCompany()){
user1.setCompany(user.getCompany());
}
if(null != user.getEmail()){
user1.setEmail(user.getEmail());
}
if(null != user.getLoginName()){
user1.setLoginName(user.getLoginName());
}
if(null != user.getSex()){
user1.setSex(user.getSex());
}
if(null != user.getTelphone()){
user1.setTelphone(user.getTelphone());
}
if(null != user.getUsername()){
user1.setUsername(user.getUsername());
}
if(null != user.getUserType()){
user1.setUserType(user.getUserType());
}
flag = userService.updateUser(user1);
if (flag) {
map.put("success", flag);
map.put("info", "修改用户数据成功!");
} else {
map.put("info", "修改用户数据失败...");
}
return map;
}
@RequestMapping("/getUserById/{id}")
@ResponseBody
public User getUserById(@PathVariable long id) {
User user = userService.getUser(id);
return user;
}
@RequestMapping("/deleteUser")
@ResponseBody
public Object deleteUser(HttpServletRequest request) {
Map<String, Object> map = new HashMap<String, Object>();
String jsonIds = request.getParameter("ids");
JSONArray jsonArray = JSONArray.fromObject(jsonIds);
Object[] ids = jsonArray.toArray();
boolean flag = false;
for(Object str : ids){
flag = userService.deleteUser((Integer) str);
}
if(flag){
map.put("flag", flag);
map.put("info", "数据删除成功!");
}else {
map.put("info", "数据删除失败!");
}
return map;
}
@RequestMapping("/queryAllUser")
public Object queryAllUser() {
ModelAndView mv = new ModelAndView("admin/user/manage");
return mv;
}
@RequestMapping("/getAllUsers")
@ResponseBody
public Object getAllUsers(HttpServletRequest request) {
Map<String, Object> map = new HashMap<String, Object>();
PageRequest pageRequest = this.getPage(request);
String userName = request.getParameter("userName");
String userType = request.getParameter("userType");
StringBuffer hql = new StringBuffer("from User where 1=1");
if(null == userName && null == userType){
hql.append(" order by createTime desc");
}else {
if(null != userName && !"".equals(userName)){
hql.append(" and userName like '%" + userName + "%'");
}
if(null != userType && !"".equals(userType)){
hql.append(" and userType ='"+ userType +"'");
}
hql.append(" order by createTime desc");
}
Page<User> users = userService.queryPage(pageRequest,hql.toString());
return userService.convert(users);
}
@RequestMapping("/get/{id}")
@ResponseBody
public Object get(@PathVariable long id) {
if (id != 0) {
UserGroup usergroup = new UserGroup();
Set<Role> roles = new HashSet<Role>();
Set<User> users = new HashSet<User>();
roles.add(roleDao.queryById(2L));
users.add(userDao.queryById(1L));
usergroup.setRoles(roles);
usergroup.setUsers(users);
usergroup.setName("test usergroup 1");
orgService.save(usergroup);
UserGroup org = orgDao.queryById(2L);
System.out.println(org);
User user = userService.getUser(id);
return user;
}
return "";
}
/**
* 用户密码重置
*/
@RequestMapping("/resetPass")
@ResponseBody
public Object resetPass(HttpServletRequest request, HttpServletResponse response){
Map result = new HashMap();
String id = request.getParameter("userId");
User user = userService.getUser(Long.valueOf(id));
try {
user.setPassword(PasswordHash.createHash("111111"));
} catch (Exception e) {
throw new RuntimeException("重置用户密码加密失败....", e);
}
boolean b = userService.updateUser(user);
if(b){
result.put("flag", true);
}else {
result.put("flag", false);
}
return result;
}
/**
* 用户密码修改
*/
@RequestMapping("/changePass/{rePass}")
@ResponseBody
public Object changePass(HttpServletRequest request,@PathVariable String rePass){
Map result = new HashMap();
User user = (User) request.getSession().getAttribute("user_in_session");
try {
user.setPassword(PasswordHash.createHash(rePass));
} catch (Exception e) {
throw new RuntimeException("修改用户密码加密失败....", e);
}
boolean b = userService.updateUser(user);
if(b){
result.put("flag", true);
result.put("info", "密码修改成功!");
}else {
result.put("flag", false);
}
return result;
}
@RequestMapping("/getUsersList")
@ResponseBody
public Object getUsersList(HttpServletRequest request){
List<User> listBo = userService.getAllUsers();
List list = new ArrayList();
if(null != listBo){
for(int i=0;i<listBo.size();i++){
Map result = new HashMap();
result.put("id", listBo.get(i).getId());
result.put("text", listBo.get(i).getUsername());
list.add(result);
}
}
return list;
}
}
package org.ccpit.base.user;
import java.util.Set;
import org.ccpit.base.dao.BaseDao;
import org.ccpit.base.role.Role;
import org.ccpit.base.usergroup.UserGroupDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
/**
* 用户实体操作类
* Created by sqp on 2015/9/5.
*/
@Repository
public class UserDao extends BaseDao<User>{
@Autowired
private UserGroupDao userGroupDao;
public User getUserByLoginName(String loginName){
String hql = "from User where loginName = ?";
User user = super.findUnique(hql, new String[]{loginName});
return user;
}
/**
* 检查用户是否具有此角色 或者用户所在的组是否具有此角色
*
* @param user
* @param role
* @return
*/
public boolean canUserOrInGroup(User user,Role role){
boolean can = canUser(user, role);
if (!can){
can = userGroupDao.canUserInGroup(user,role);
}
return can;
}
/**
* 获取一个用户所拥有的所有角色,包括用户所在的组拥有的角色
* @param user
* @return
*/
public Set<Role> getUserRolesIncludeGroup(User user){
Set<Role> roles = user.getRoles();
Set<Role> rolesInGroup = userGroupDao.getRolesForUser(user);
roles.addAll(rolesInGroup);
return roles;
}
/**
* 判断用户是否具有某个角色
* @param user
* @param role
* @return
*/
public boolean canUser(User user,Role role){
return user.getRoles().contains(role);
}
}
package org.ccpit.base.user;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.transaction.Transactional;
import org.ccpit.base.controller.Convert;
import org.ccpit.base.controller.Page;
import org.ccpit.base.controller.PageBo;
import org.ccpit.base.controller.PageRequest;
import org.ccpit.base.role.Role;
import org.ccpit.base.role.RoleDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
/**
* Created by sqp on 2015/9/5.
*/
@Repository
@Transactional
public class UserService {
private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd MM:hh:ss");
@Autowired
private UserDao userDao;
@Autowired
private RoleDao roleDao;
public List<User> getAllUsers(){
return userDao.queryAll();
}
public User getUserByLoginName(String loginName){
return userDao.getUserByLoginName(loginName);
}
public boolean addUser(User user){
return userDao.save(user);
}
public boolean updateUser(User user){
return userDao.update(user);
}
public boolean deleteUser(long id){
return userDao.deleteById(id);
}
public Page<User> queryPage(PageRequest pr){
Page<User> page = userDao.findPage(pr, "from " + User.class.getName(), new String[]{});
return page;
}
public Page<User> queryPage(PageRequest pr,String hql){
Page<User> page = userDao.findPage(pr, hql, new String[]{});
return page;
}
public User getUser(long id){
return userDao.queryById(id);
}
/**
* 检查用户是否具有此角色 或者用户所在的组是否具有此角色
*
* @param user
* @param role
* @return
*/
public boolean canUserOrInGroup(User user,Role role){
return userDao.canUserOrInGroup(user, role);
}
/**
* 获取一个用户的所有角色
* @param user
* @return
*/
public Set<Role> getUserRoles(User user){
User user1 = userDao.queryById(user.getId());
return user1.getRoles();
}
/**
* 获取一个用户所拥有的所有角色,包括用户所在的组拥有的角色
* @param user
* @return
*/
public Set<Role> getUserRolesIncludeGroup(User user){
return userDao.getUserRolesIncludeGroup(user);
}
public boolean saveUserRoles(User user,Long[] ids){
Set<Role> roles = new HashSet<Role>();
for (long id:ids){
roles.add(roleDao.queryById(id));
}
return saveUserRoles(user, roles);
}
public boolean saveUserRoles(User user,Set<Role> roleSet){
boolean success = false;
try {
user.getRoles().clear();
boolean b = userDao.update(user);
if(b){
User user1 = userDao.queryById(user.getId());
user1.setRoles(roleSet);
success = userDao.save(user1);
}
}catch (Exception e){
success = false;
}
return success;
}
public Map<String,Object> convertToMap(User User){
Map<String,Object> map = new HashMap<String, Object>();
if (User==null){
return map;
}
Set<Role> roleSet = User.getRoles();
String roles = "";
if(null != roleSet){
if(roleSet.size()>0){
for(Role role : roleSet){
roles += role.getRoleName()+",";
}
roles = roles.substring(0, roles.length()-1);
}
}
map.put("id",User.getId());
map.put("createTime",null == User.getCreateTime()? "": sdf.format(User.getCreateTime()));
map.put("creator", User.getCreator());
map.put("username",User.getUsername());
map.put("loginName",User.getLoginName());
map.put("countStatus", 1 == User.getCountStatus()?"有效":"无效");
map.put("loginCount", User.getLoginCount());
map.put("company", User.getCompany());
map.put("userType","back".equals(User.getUserType())?"后台用户":"非后台用户");
map.put("roles", roles);
return map;
}
public PageBo<User> convert(Page<User> page){
return new PageBo<User>(page, new Convert<User>() {
@Override
public Map<String, Object> convert(User obj) {
return convertToMap(obj);
}
});
}
}
package org.ccpit.base.usergroup;
import org.ccpit.base.modol.BaseEntity;
import org.ccpit.base.role.Role;
import org.ccpit.base.user.User;
import org.hibernate.annotations.*;
import org.hibernate.annotations.Cache;
import javax.persistence.*;
import javax.persistence.Entity;
import java.util.Set;
/**
* 用户组
* Created by Administrator on 2015/9/7.
*/
@Entity
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class UserGroup extends BaseEntity {
//用户组名称
private String name;
//用户组描述
private String description;
//用户组用户
private Set<User> users;
//用户组角色
private Set<Role> roles;
@Override
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long getId() {
return super.getId();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@ManyToMany(fetch = FetchType.EAGER)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
@ManyToMany(fetch = FetchType.EAGER)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
}
package org.ccpit.base.usergroup;
import org.ccpit.base.dao.BaseDao;
import org.ccpit.base.role.Role;
import org.ccpit.base.user.User;
import org.springframework.stereotype.Repository;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 用户组数据操作表
* Created by Administrator on 2015/9/7.
*/
@Repository
public class UserGroupDao extends BaseDao<UserGroup> {
/**
* 查询用户所在的用户组
*
* @param user
* @return
*/
public List<UserGroup> getUserGroupsByUser(User user) {
return query("select distinct ug from " + UserGroup.class.getName() + " as ug left join ug.users as u " +
"where u.id=? ", user.getId());
}
/**
* 查询所有拥有此角色的用户组
*
* @param role
* @return
*/
public List<UserGroup> getUserGroupsByRole(Role role) {
return query("select distinct ug from " + UserGroup.class.getName() + " as ug left join ug.roles as r " +
"where r.id=? ", role.getId());
}
/**
* 用户所在的组是否具有role的角色
*
* @param user
* @param role
* @return
*/
public boolean canUserInGroup(User user, Role role) {
List<UserGroup> userGroups = getUserGroupsByUser(user);
Set<Role> roleSet = new HashSet<Role>();
for (UserGroup userGroup : userGroups) {
roleSet.addAll(userGroup.getRoles());
}
return roleSet.contains(role);
}
/**
* 获取用户所在组的所有角色
* @param user
* @return
*/
public Set<Role> getRolesForUser(User user){
List<UserGroup> groups = getUserGroupsByUser(user);
Set<Role> roles = new HashSet<Role>();
for (UserGroup userGroup:groups){
roles.addAll(userGroup.getRoles());
}
return roles;
}
}
package org.ccpit.base.usergroup;
import org.ccpit.base.role.Role;
import org.ccpit.base.user.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import javax.transaction.Transactional;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 用户组服务操作表
* Created by Administrator on 2015/9/7.
*/
@Repository
@Transactional
public class UserGroupService {
@Autowired
private UserGroupDao userGroupDao;
public boolean save(UserGroup org){
return userGroupDao.save(org);
}
/**
* 查询用户所在的用户组
* @param user
* @return
*/
public List<UserGroup> getUserGroupsByUser(User user){
return userGroupDao.getUserGroupsByUser(user);
}
/**
* 查询所有拥有此角色的用户组
* @param role
* @return
*/
public List<UserGroup> getUserGroupsByRole(Role role){
return userGroupDao.getUserGroupsByRole(role);
}
/**
* 用户所在的组是否具有role的角色
* @param user
* @param role
* @return
*/
public boolean canUserInGroup(User user,Role role){
return userGroupDao.canUserInGroup(user, role);
}
/**
* 获取用户所在组的所有角色
* @param user
* @return
*/
public Set<Role> getRolesForUser(User user){
return userGroupDao.getRolesForUser(user);
}
/**
* Find UserGroup by id
* @param id
* @return
*/
public UserGroup get(long id){
return userGroupDao.queryById(id);
}
}
package org.ccpit.base.utils;
import org.ccpit.base.role.Role;
import org.ccpit.base.role.RoleService;
import org.ccpit.base.role.RoleUrl;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Repository;
import java.util.*;
/**
* url-role 缓存映射表
* 存储rul-role的映射
* Created by sqp on 2015/9/29.
*/
@Repository
public class UrlRolesMapper implements ApplicationContextAware {
//状态码 -1:不可用 0:未初始化 1:可用
private static int status = 0;
//存储器
private static final Map<String, Set<Role>> MAP = new HashMap<String, Set<Role>>();
//spring上下文根
private static ApplicationContext ac;
/**
* 从数据库中重载数据
*/
public void reload() {
MAP.clear();
Collections.synchronizedMap(MAP);
status = -1;
List<Role> roleList = ac.getBean(RoleService.class).getAllRoles();
for (Role role : roleList) {
List<RoleUrl> urls = role.getUrlPerfixs();
for (RoleUrl roleUrl : urls) {
String url = roleUrl.getUrl();
if (MAP.containsKey(url))
MAP.get(url).add(role);
else {
Set<Role> set = new HashSet<Role>();
MAP.put(url, set);
set.add(role);
}
}
}
status = 1;
}
/**
* 根据url获取对应的roles
*
* @param url
* @return
*/
public Set<Role> getRoles(String url) {
if (status == 1)
return MAP.get(url);
if (status == -1) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
return getRoles(url);
}
reload();
return getRoles(url);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ac = applicationContext;
}
}
package org.ccpit.base.utils;
import org.ccpit.base.controller.BaseController;
import org.ccpit.base.role.Role;
import org.ccpit.base.user.User;
import org.ccpit.base.user.UserService;
import org.ccpit.base.usergroup.UserGroupService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Repository;
import javax.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
* 用户角色缓存,操作工具
* <p/>
* Created by sqp on 2015/9/30.
*/
@Repository
public class UserRolesUtil implements ApplicationContextAware {
public static final String USER_ROLES = "user_roles_in_session";
public static final String USER_GROUP_ROLES = "user_group_roles_in_session";
public static final String ALL_ROLES = "user_all_roles_in_session";
private static ApplicationContext ac;
/**
* 从session中获取用户信息
*
* @param request
* @return
*/
public User getSessionUser(HttpServletRequest request) {
return (User) request.getSession().getAttribute(BaseController.USER_IN_SESSION);
}
/**
* 初始化或重新载入用户的所有role信息
*
* @param request
*/
public void initOrReload(HttpServletRequest request) {
User user = getSessionUser(request);
UserService userService = ac.getBean(UserService.class);
UserGroupService groupService = ac.getBean(UserGroupService.class);
Set<Role> userRoles = new HashSet<Role>(userService.getUserRoles(user));
Set<Role> groupRoles = new HashSet<Role>(groupService.getRolesForUser(user));
Set<Role> roleSet = new HashSet<Role>();
roleSet.addAll(userRoles);
roleSet.addAll(groupRoles);
request.getSession().setAttribute(ALL_ROLES, roleSet);
request.getSession().setAttribute(USER_ROLES, userRoles);
request.getSession().setAttribute(USER_GROUP_ROLES, groupRoles);
}
/**
* 获取用户roles
*
* @param request
* @param scope
* @return
*/
public Set<Role> getRoles(HttpServletRequest request, String scope) {
Set<Role> roles = new HashSet<Role>();
Object object = request.getSession().getAttribute(scope);
if(object==null) {
initOrReload(request);
object = request.getSession().getAttribute(scope);
}
roles.addAll((Set<Role>) object);
return roles;
}
/**
* 获取用户的所有角色 (可能来自缓存,如需重载请调用方法 @initOrReload)
*
* @param request
* @return
*/
public Set<Role> getUserRoles(HttpServletRequest request) {
return getRoles(request, USER_ROLES);
}
/**
* 获取用户的用户组所有角色 (可能来自缓存,如需重载请调用方法 @initOrReload)
*
* @param request
* @return
*/
public Set<Role> getUserGroupRoles(HttpServletRequest request) {
return getRoles(request, USER_GROUP_ROLES);
}
/**
* 获取用户的所有角色 包括用户角色和用户组角色 (可能来自缓存,如需重载请调用方法 @initOrReload)
*
* @param request
* @return
*/
public Set<Role> getAllRoles(HttpServletRequest request) {
return getRoles(request, ALL_ROLES);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ac = applicationContext;
}
}
package org.ccpit.base.utils;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
/**
* 验证码生成器
* @author dsna
*
*/
public class ValidateCode {
// 图片的宽度。
private int width = 160;
// 图片的高度。
private int height = 40;
// 验证码字符个数
private int codeCount = 4;
// 验证码干扰线数
private int lineCount = 80;
// 验证码
private String code = null;
// 验证码图片Buffer
private BufferedImage buffImg=null;
private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'M', 'N', 'P', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8' };
public ValidateCode() {
this.createCode();
}
/**
*
* @param width 图片宽
* @param height 图片高
*/
public ValidateCode(int width,int height) {
this.width=width;
this.height=height;
this.createCode();
}
/**
*
* @param width 图片宽
* @param height 图片高
* @param codeCount 字符个数
* @param lineCount 干扰线条数
*/
public ValidateCode(int width,int height,int codeCount,int lineCount) {
this.width=width;
this.height=height;
this.codeCount=codeCount;
this.lineCount=lineCount;
this.createCode();
}
public void createCode() {
int x = 0,fontHeight=0,codeY=0;
int red = 0, green = 0, blue = 0;
x = width / (codeCount +2);//每个字符的宽度
fontHeight = height - 2;//字体的高度
codeY = height - 4;
// 图像buffer
buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
// 生成随机数
Random random = new Random();
// 将图像填充为白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
// 创建字体
ImgFontByte imgFont=new ImgFontByte();
Font font =imgFont.getFont(fontHeight);
g.setFont(font);
for (int i = 0; i < lineCount; i++) {
int xs = random.nextInt(width);
int ys = random.nextInt(height);
int xe = xs+random.nextInt(width/8);
int ye = ys+random.nextInt(height/8);
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);
g.setColor(Color.white);
g.drawLine(xs, ys, xe, ye);
}
// randomCode记录随机产生的验证码
StringBuffer randomCode = new StringBuffer();
// 随机产生codeCount个字符的验证码。
for (int i = 0; i < codeCount; i++) {
String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
// 产生随机的颜色值,让输出的每个字符的颜色值都将不同。
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);
g.setColor(Color.black);
g.drawString(strRand, (i + 1) * x, codeY);
// 将产生的四个随机数组合在一起。
randomCode.append(strRand);
}
// 将四位数字的验证码保存到Session中。
code=randomCode.toString();
}
public void write(String path) throws IOException {
OutputStream sos = new FileOutputStream(path);
this.write(sos);
}
public void write(OutputStream sos) throws IOException {
ImageIO.write(buffImg, "png", sos);
sos.close();
}
public BufferedImage getBuffImg() {
return buffImg;
}
public String getCode() {
return code;
}
}
package org.ccpit.ueditor.upload;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.ccpit.ueditor.define.State;
public class Uploader {
private HttpServletRequest request = null;
private Map<String, Object> conf = null;
public Uploader(HttpServletRequest request, Map<String, Object> conf) {
this.request = request;
this.conf = conf;
}
public final State doExec() {
String filedName = (String) this.conf.get("fieldName");
State state = null;
if ("true".equals(this.conf.get("isBase64"))) {
state = Base64Uploader.save(this.request.getParameter(filedName),
this.conf);
} else {
state = BinaryUploader.save(this.request, this.conf);
}
return state;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>registration</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>servlet-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servlet-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>org.ccpit.base.security.LoginFilter</filter-class>
<init-param>
<param-name>exceptPaths</param-name>
<param-value>/admin/login</param-value>
</init-param>
<init-param>
<param-name>redirectPath</param-name>
<param-value>/error.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
<url-pattern>/business/*</url-pattern>
<url-pattern>/base/*</url-pattern>
<url-pattern>/resource/ueditor1_4_2/jsp/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- encoding filter for jsp page -->
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 解决 XSS 漏洞 -->
<!-- <filter>
<filter-name>XssEscape</filter-name>
<filter-class>org.ccpit.base.utils.XSSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XssEscape</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping> -->
<!-- Spring 管理hibernate Session-->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<jsp-config>
<!--定义标签库-->
<taglib>
<!--确定标签库的URI-->
<taglib-uri>http://www.ccpit.org/</taglib-uri>
<!-- 确定标签库定义文件的位置 -->
<taglib-location>/WEB-INF/tld/security.tld</taglib-location>
</taglib>
</jsp-config>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<!-- 错误页面 -->
<error-page>
<error-code>400</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
</web-app>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Validate DateBox - jQuery EasyUI Demo</title>
<link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../../themes/icon.css">
<link rel="stylesheet" type="text/css" href="../demo.css">
<script type="text/javascript" src="../../jquery.min.js"></script>
<script type="text/javascript" src="../../jquery.easyui.min.js"></script>
</head>
<body>
<h2>Validate DateBox</h2>
<p>When the selected date is greater than specified date. The field validator will raise an error.</p>
<div style="margin:20px 0;"></div>
<input class="easyui-datebox" required data-options="validType:'md[\'10/11/2012\']'"></input>
<script>
$.extend($.fn.validatebox.defaults.rules, {
md: {
validator: function(value, param){
var d1 = $.fn.datebox.defaults.parser(param[0]);
var d2 = $.fn.datebox.defaults.parser(value);
return d2<=d1;
},
message: 'The date must be less than or equals to {0}.'
}
})
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Validate Form on Submit - jQuery EasyUI Demo</title>
<link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../../themes/icon.css">
<link rel="stylesheet" type="text/css" href="../demo.css">
<script type="text/javascript" src="../../jquery.min.js"></script>
<script type="text/javascript" src="../../jquery.easyui.min.js"></script>
</head>
<body>
<h2>Validate Form on Submit</h2>
<p>The form does not perform validation before being submitted.</p>
<div style="margin:20px 0;"></div>
<div class="easyui-panel" title="New Topic" style="width:400px">
<div style="padding:10px 60px 20px 60px">
<form id="ff" class="easyui-form" method="post" data-options="novalidate:true">
<table cellpadding="5">
<tr>
<td>Name:</td>
<td><input class="easyui-textbox" type="text" name="name" data-options="required:true"></input></td>
</tr>
<tr>
<td>Email:</td>
<td><input class="easyui-textbox" type="text" name="email" data-options="required:true,validType:'email'"></input></td>
</tr>
<tr>
<td>Subject:</td>
<td><input class="easyui-textbox" type="text" name="subject" data-options="required:true"></input></td>
</tr>
<tr>
<td>Message:</td>
<td><input class="easyui-textbox" name="message" data-options="multiline:true" style="height:60px"></input></td>
</tr>
<tr>
<td>Language:</td>
<td>
<select class="easyui-combobox" name="language"><option value="ar">Arabic</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-cht">Chinese Traditional</option><option value="cs">Czech</option><option value="da">Danish</option><option value="nl">Dutch</option><option value="en" selected="selected">English</option><option value="et">Estonian</option><option value="fi">Finnish</option><option value="fr">French</option><option value="de">German</option><option value="el">Greek</option><option value="ht">Haitian Creole</option><option value="he">Hebrew</option><option value="hi">Hindi</option><option value="mww">Hmong Daw</option><option value="hu">Hungarian</option><option value="id">Indonesian</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="vi">Vietnamese</option></select>
</td>
</tr>
</table>
</form>
<div style="text-align:center;padding:5px">
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="submitForm()">Submit</a>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="clearForm()">Clear</a>
</div>
</div>
</div>
<script>
function submitForm(){
$('#ff').form('submit',{
onSubmit:function(){
return $(this).form('enableValidation').form('validate');
}
});
}
function clearForm(){
$('#ff').form('clear');
}
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Vertical Slider - jQuery EasyUI Demo</title>
<link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../../themes/icon.css">
<link rel="stylesheet" type="text/css" href="../demo.css">
<script type="text/javascript" src="../../jquery.min.js"></script>
<script type="text/javascript" src="../../jquery.easyui.min.js"></script>
</head>
<body>
<h2>Vertical Slider</h2>
<p>This sample shows how to create a vertical slider.</p>
<div style="margin:20px 0 50px 0;"></div>
<div style="margin:0 50px">
<input class="easyui-slider" style="height:300px" data-options="
showTip: true,
mode: 'v',
reversed: false,
rule: [0,'|',25,'|',50,'|',75,'|',100]
">
</div>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Validate On Blur - jQuery EasyUI Demo</title>
<link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../../themes/icon.css">
<link rel="stylesheet" type="text/css" href="../demo.css">
<script type="text/javascript" src="../../jquery.min.js"></script>
<script type="text/javascript" src="../../jquery.easyui.min.js"></script>
</head>
<body>
<h2>Validate On Blur</h2>
<p>Active validation on first blur event.</p>
<div style="margin:20px 0;"></div>
<div class="easyui-panel" title="Register" style="width:400px;padding:10px 60px 20px 60px">
<table cellpadding="5">
<tr>
<td>User Name:</td>
<td><input class="easyui-validatebox textbox" data-options="required:true,validType:'length[3,10]',novalidate:true"></td>
</tr>
<tr>
<td>Email:</td>
<td><input class="easyui-validatebox textbox" data-options="required:true,validType:'email',novalidate:true"></td>
</tr>
<tr>
<td>Birthday:</td>
<td><input class="easyui-datebox textbox" data-options="required:true,novalidate:true"></td>
</tr>
<tr>
<td>URL:</td>
<td><input class="easyui-validatebox textbox" data-options="required:true,validType:'url',novalidate:true"></td>
</tr>
<tr>
<td>Phone:</td>
<td><input class="easyui-validatebox textbox" data-options="required:true,novalidate:true"></td>
</tr>
</table>
</div>
<script type="text/javascript">
$(function(){
$('.validatebox-text').bind('blur', function(){
$(this).validatebox('enableValidation').validatebox('validate');
});
})
</script>
<style scoped="scoped">
.textbox{
height:20px;
margin:0;
padding:0 2px;
box-sizing:content-box;
}
</style>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Window Layout - jQuery EasyUI Demo</title>
<link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../../themes/icon.css">
<link rel="stylesheet" type="text/css" href="../demo.css">
<script type="text/javascript" src="../../jquery.min.js"></script>
<script type="text/javascript" src="../../jquery.easyui.min.js"></script>
</head>
<body>
<h2>Window Layout</h2>
<p>Using layout on window.</p>
<div style="margin:20px 0;">
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="$('#w').window('open')">Open</a>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="$('#w').window('close')">Close</a>
</div>
<div id="w" class="easyui-window" title="Window Layout" data-options="iconCls:'icon-save'" style="width:500px;height:200px;padding:5px;">
<div class="easyui-layout" data-options="fit:true">
<div data-options="region:'east',split:true" style="width:100px"></div>
<div data-options="region:'center'" style="padding:10px;">
jQuery EasyUI framework help you build your web page easily.
</div>
<div data-options="region:'south',border:false" style="text-align:right;padding:5px 0 0;">
<a class="easyui-linkbutton" data-options="iconCls:'icon-ok'" href="javascript:void(0)" onclick="javascript:alert('ok')" style="width:80px">Ok</a>
<a class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" href="javascript:void(0)" onclick="javascript:alert('cancel')" style="width:80px">Cancel</a>
</div>
</div>
</div>
</body>
</html>
\ No newline at end of file
.validatebox-invalid{
background:#FFFFEE url('images/validatebox_warning.png') no-repeat right 1px;
}
.validatebox-tip{
position:absolute;
width:200px;
height:auto;
display:none;
z-index:9900000;
}
.validatebox-tip-content{
display:inline-block;
position:absolute;
top:0px;
left:10px;
padding:3px 5px;
border:1px solid #CC9933;
background:#FFFFCC;
z-index:9900001;
font-size:12px;
}
.validatebox-tip-pointer{
background:url('images/validatebox_pointer.gif') no-repeat left top;
display:inline-block;
width:10px;
height:19px;
position:absolute;
left:1px;
top:0px;
z-index:9900002;
}
\ No newline at end of file
.window {
font-size:12px;
position:absolute;
overflow:hidden;
background:transparent url('images/panel_title.png');
background1:#878787;
padding:5px;
border:1px solid #99BBE8;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
}
.window-shadow{
position:absolute;
background:#ddd;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window .window-header{
background:transparent;
padding:2px 0px 4px 0px;
}
.window .window-body{
background:#fff;
border:1px solid #99BBE8;
border-top-width:0px;
}
.window .window-header .panel-icon{
left:1px;
top:1px;
}
.window .window-header .panel-with-icon{
padding-left:18px;
}
.window .window-header .panel-tool{
top:0px;
right:1px;
}
.window-proxy{
position:absolute;
overflow:hidden;
border:1px dashed #15428b;
}
.window-mask{
position:absolute;
left:0;
top:0;
width:100%;
height:100%;
filter:alpha(opacity=40);
opacity:0.40;
background:#ccc;
display1:none;
font-size:1px;
*zoom:1;
overflow:hidden;
}
.validatebox-invalid{
background:#FFFFEE url('images/validatebox_warning.png') no-repeat right 1px;
}
.validatebox-tip{
position:absolute;
width:200px;
height:auto;
display:none;
z-index:9900000;
}
.validatebox-tip-content{
display:inline-block;
position:absolute;
top:0px;
left:10px;
padding:3px 5px;
border:1px solid #CC9933;
background:#FFFFCC;
z-index:9900001;
font-size:12px;
}
.validatebox-tip-pointer{
background:url('images/validatebox_pointer.gif') no-repeat left top;
display:inline-block;
width:10px;
height:19px;
position:absolute;
left:1px;
top:0px;
z-index:9900002;
}
\ No newline at end of file
.window {
font-size:12px;
position:absolute;
overflow:hidden;
background:#eee url('images/panel_title.gif') repeat-x;
padding:5px;
border:1px solid #D3D3D3;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
}
.window-shadow{
position:absolute;
background:#ddd;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window .window-header{
background:transparent;
padding:2px 0px 4px 0px;
}
.window .window-body{
background:#fff;
border:1px solid #D3D3D3;
border-top-width:0px;
}
.window .window-header .panel-icon{
left:1px;
top:1px;
}
.window .window-header .panel-with-icon{
padding-left:18px;
}
.window .window-header .panel-tool{
top:0px;
right:1px;
}
.window-proxy{
position:absolute;
overflow:hidden;
border:1px dashed #3F3F3F;
}
.window-mask{
position:absolute;
left:0;
top:0;
width:100%;
height:100%;
filter:alpha(opacity=40);
opacity:0.40;
background:#ccc;
display1:none;
font-size:1px;
*zoom:1;
overflow:hidden;
}
.validatebox-invalid{
background:#FFFFEE url('images/validatebox_warning.png') no-repeat right 1px;
}
.validatebox-tip{
position:absolute;
width:200px;
height:auto;
display:none;
z-index:9900000;
}
.validatebox-tip-content{
display:inline-block;
position:absolute;
top:0px;
left:10px;
padding:3px 5px;
border:1px solid #CC9933;
background:#FFFFCC;
z-index:9900001;
font-size:12px;
}
.validatebox-tip-pointer{
background:url('images/validatebox_pointer.gif') no-repeat left top;
display:inline-block;
width:10px;
height:19px;
position:absolute;
left:1px;
top:0px;
z-index:9900002;
}
.window {
font-size:12px;
position:absolute;
overflow:hidden;
background:transparent url('images/panel_title.png');
padding:5px;
border:1px solid #99BBE8;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius:5px;
border-radius:5px;
}
.window-shadow{
position:absolute;
background:#ddd;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius:5px;
border-radius:5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window .window-header{
background:transparent;
padding:2px 0px 4px 0px;
}
.window .window-body{
background:#fff;
border:1px solid #99BBE8;
border-top-width:0px;
}
.window .window-body-noheader{
border-top-width:1px;
}
.window .window-header .panel-icon{
left:1px;
top:1px;
}
.window .window-header .panel-with-icon{
padding-left:18px;
}
.window .window-header .panel-tool{
top:0px;
right:1px;
}
.window-proxy{
position:absolute;
overflow:hidden;
border:1px dashed #15428b;
}
.window-proxy-mask{
position:absolute;
background:#fafafa;
filter:alpha(opacity=10);
opacity:0.10;
}
.window-mask{
position:absolute;
left:0;
top:0;
width:100%;
height:100%;
filter:alpha(opacity=40);
opacity:0.40;
background:#ccc;
font-size:1px;
*zoom:1;
overflow:hidden;
}
.validatebox-invalid{
background:#FFFFEE url('images/validatebox_warning.png') no-repeat right 1px;
}
.validatebox-tip{
position:absolute;
width:200px;
height:auto;
display:none;
z-index:9900000;
}
.validatebox-tip-content{
display:inline-block;
position:absolute;
top:0px;
left:10px;
padding:3px 5px;
border:1px solid #CC9933;
background:#FFFFCC;
z-index:9900001;
font-size:12px;
}
.validatebox-tip-pointer{
background:url('images/validatebox_pointer.gif') no-repeat left top;
display:inline-block;
width:10px;
height:19px;
position:absolute;
left:1px;
top:0px;
z-index:9900002;
}
.window {
font-size:12px;
position:absolute;
overflow:hidden;
background:#eee url('images/panel_title.gif') repeat-x;
padding:5px;
border:1px solid #D3D3D3;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius:5px;
border-radius:5px;
}
.window-shadow{
position:absolute;
background:#ddd;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius:5px;
border-radius:5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window .window-header{
background:transparent;
padding:2px 0px 4px 0px;
}
.window .window-body{
background:#fff;
border:1px solid #D3D3D3;
border-top-width:0px;
}
.window .window-body-noheader{
border-top-width:1px;
}
.window .window-header .panel-icon{
left:1px;
top:1px;
}
.window .window-header .panel-with-icon{
padding-left:18px;
}
.window .window-header .panel-tool{
top:0px;
right:1px;
}
.window-proxy{
position:absolute;
overflow:hidden;
border:1px dashed #3F3F3F;
}
.window-proxy-mask{
position:absolute;
background:#fafafa;
filter:alpha(opacity=10);
opacity:0.10;
}
.window-mask{
position:absolute;
left:0;
top:0;
width:100%;
height:100%;
filter:alpha(opacity=40);
opacity:0.40;
background:#ccc;
font-size:1px;
*zoom:1;
overflow:hidden;
}
.validatebox-invalid{
background:#FFFFEE url('images/validatebox_warning.png') no-repeat right 1px;
}
.validatebox-tip{
position:absolute;
width:200px;
height:auto;
display:none;
z-index:9900000;
}
.validatebox-tip-content{
display:inline-block;
position:absolute;
top:0px;
left:2px;
padding:3px 5px;
border:1px solid #ddd;
background:#fff;
z-index:9900001;
font-size:12px;
}
.validatebox-tip-pointer{
display:inline-block;
width:10px;
height:19px;
position:absolute;
left:1px;
top:0px;
z-index:9900002;
}
.window {
font-size:12px;
position:absolute;
overflow:hidden;
background:#fff;
padding:5px;
border:1px solid #ddd;
}
.window-shadow{
position:absolute;
background:transparent;
}
.window .window-header{
background:transparent;
padding:2px 0px 4px 0px;
}
.window .window-body{
background:#fff;
border:1px solid #ddd;
border-top-width:0px;
}
.window .window-body-noheader{
border-top-width:1px;
}
.window .window-header .panel-icon{
left:1px;
top:1px;
}
.window .window-header .panel-with-icon{
padding-left:18px;
}
.window .window-header .panel-tool{
top:0px;
right:1px;
}
.window-proxy{
position:absolute;
overflow:hidden;
border:1px dashed #777;
}
.window-proxy-mask{
position:absolute;
background:#fafafa;
filter:alpha(opacity=10);
opacity:0.10;
}
.window-mask{
position:absolute;
left:0;
top:0;
width:100%;
height:100%;
filter:alpha(opacity=40);
opacity:0.40;
background:#ddd;
font-size:1px;
*zoom:1;
overflow:hidden;
}
.validatebox-invalid {
border-color: #ffa8a8;
background-color: #fff3f3;
color: #000;
}
.window {
overflow: hidden;
padding: 5px;
border-width: 1px;
border-style: solid;
}
.window .window-header {
background: transparent;
padding: 0px 0px 6px 0px;
}
.window .window-body {
border-width: 1px;
border-style: solid;
border-top-width: 0px;
}
.window .window-body-noheader {
border-top-width: 1px;
}
.window .panel-body-nobottom {
border-bottom-width: 0;
}
.window .window-header .panel-icon,
.window .window-header .panel-tool {
top: 50%;
margin-top: -11px;
}
.window .window-header .panel-icon {
left: 1px;
}
.window .window-header .panel-tool {
right: 1px;
}
.window .window-header .panel-with-icon {
padding-left: 18px;
}
.window-proxy {
position: absolute;
overflow: hidden;
}
.window-proxy-mask {
position: absolute;
filter: alpha(opacity=5);
opacity: 0.05;
}
.window-mask {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
filter: alpha(opacity=40);
opacity: 0.40;
font-size: 1px;
overflow: hidden;
}
.window,
.window-shadow {
position: absolute;
-moz-border-radius: 5px 5px 5px 5px;
-webkit-border-radius: 5px 5px 5px 5px;
border-radius: 5px 5px 5px 5px;
}
.window-shadow {
background: #777;
-moz-box-shadow: 2px 2px 3px #787878;
-webkit-box-shadow: 2px 2px 3px #787878;
box-shadow: 2px 2px 3px #787878;
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window,
.window .window-body {
border-color: #000;
}
.window {
background-color: #3d3d3d;
background: -webkit-linear-gradient(top,#454545 0,#383838 20%);
background: -moz-linear-gradient(top,#454545 0,#383838 20%);
background: -o-linear-gradient(top,#454545 0,#383838 20%);
background: linear-gradient(to bottom,#454545 0,#383838 20%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0);
}
.window-proxy {
border: 1px dashed #000;
}
.window-proxy-mask,
.window-mask {
background: #000;
}
.window .panel-footer {
border: 1px solid #000;
position: relative;
top: -1px;
}
.validatebox-invalid {
border-color: #ffa8a8;
background-color: #fff3f3;
color: #000;
}
.window {
overflow: hidden;
padding: 5px;
border-width: 1px;
border-style: solid;
}
.window .window-header {
background: transparent;
padding: 0px 0px 6px 0px;
}
.window .window-body {
border-width: 1px;
border-style: solid;
border-top-width: 0px;
}
.window .window-body-noheader {
border-top-width: 1px;
}
.window .panel-body-nobottom {
border-bottom-width: 0;
}
.window .window-header .panel-icon,
.window .window-header .panel-tool {
top: 50%;
margin-top: -11px;
}
.window .window-header .panel-icon {
left: 1px;
}
.window .window-header .panel-tool {
right: 1px;
}
.window .window-header .panel-with-icon {
padding-left: 18px;
}
.window-proxy {
position: absolute;
overflow: hidden;
}
.window-proxy-mask {
position: absolute;
filter: alpha(opacity=5);
opacity: 0.05;
}
.window-mask {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
filter: alpha(opacity=40);
opacity: 0.40;
font-size: 1px;
overflow: hidden;
}
.window,
.window-shadow {
position: absolute;
-moz-border-radius: 5px 5px 5px 5px;
-webkit-border-radius: 5px 5px 5px 5px;
border-radius: 5px 5px 5px 5px;
}
.window-shadow {
background: #ccc;
-moz-box-shadow: 2px 2px 3px #cccccc;
-webkit-box-shadow: 2px 2px 3px #cccccc;
box-shadow: 2px 2px 3px #cccccc;
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window,
.window .window-body {
border-color: #D4D4D4;
}
.window {
background-color: #F2F2F2;
background: -webkit-linear-gradient(top,#ffffff 0,#F2F2F2 20%);
background: -moz-linear-gradient(top,#ffffff 0,#F2F2F2 20%);
background: -o-linear-gradient(top,#ffffff 0,#F2F2F2 20%);
background: linear-gradient(to bottom,#ffffff 0,#F2F2F2 20%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#F2F2F2,GradientType=0);
}
.window-proxy {
border: 1px dashed #D4D4D4;
}
.window-proxy-mask,
.window-mask {
background: #ccc;
}
.window .panel-footer {
border: 1px solid #D4D4D4;
position: relative;
top: -1px;
}
.validatebox-invalid {
border-color: #ffa8a8;
background-color: #fff3f3;
color: #000;
}
.window {
overflow: hidden;
padding: 5px;
border-width: 1px;
border-style: solid;
}
.window .window-header {
background: transparent;
padding: 0px 0px 6px 0px;
}
.window .window-body {
border-width: 1px;
border-style: solid;
border-top-width: 0px;
}
.window .window-body-noheader {
border-top-width: 1px;
}
.window .panel-body-nobottom {
border-bottom-width: 0;
}
.window .window-header .panel-icon,
.window .window-header .panel-tool {
top: 50%;
margin-top: -11px;
}
.window .window-header .panel-icon {
left: 1px;
}
.window .window-header .panel-tool {
right: 1px;
}
.window .window-header .panel-with-icon {
padding-left: 18px;
}
.window-proxy {
position: absolute;
overflow: hidden;
}
.window-proxy-mask {
position: absolute;
filter: alpha(opacity=5);
opacity: 0.05;
}
.window-mask {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
filter: alpha(opacity=40);
opacity: 0.40;
font-size: 1px;
overflow: hidden;
}
.window,
.window-shadow {
position: absolute;
-moz-border-radius: 5px 5px 5px 5px;
-webkit-border-radius: 5px 5px 5px 5px;
border-radius: 5px 5px 5px 5px;
}
.window-shadow {
background: #ccc;
-moz-box-shadow: 2px 2px 3px #cccccc;
-webkit-box-shadow: 2px 2px 3px #cccccc;
box-shadow: 2px 2px 3px #cccccc;
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window,
.window .window-body {
border-color: #95B8E7;
}
.window {
background-color: #E0ECFF;
background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);
background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);
background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);
background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 20%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);
}
.window-proxy {
border: 1px dashed #95B8E7;
}
.window-proxy-mask,
.window-mask {
background: #ccc;
}
.window .panel-footer {
border: 1px solid #95B8E7;
position: relative;
top: -1px;
}
.validatebox-invalid {
border-color: #ffa8a8;
background-color: #fff3f3;
color: #000;
}
.window {
overflow: hidden;
padding: 5px;
border-width: 1px;
border-style: solid;
}
.window .window-header {
background: transparent;
padding: 0px 0px 6px 0px;
}
.window .window-body {
border-width: 1px;
border-style: solid;
border-top-width: 0px;
}
.window .window-body-noheader {
border-top-width: 1px;
}
.window .panel-body-nobottom {
border-bottom-width: 0;
}
.window .window-header .panel-icon,
.window .window-header .panel-tool {
top: 50%;
margin-top: -11px;
}
.window .window-header .panel-icon {
left: 1px;
}
.window .window-header .panel-tool {
right: 1px;
}
.window .window-header .panel-with-icon {
padding-left: 18px;
}
.window-proxy {
position: absolute;
overflow: hidden;
}
.window-proxy-mask {
position: absolute;
filter: alpha(opacity=5);
opacity: 0.05;
}
.window-mask {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
filter: alpha(opacity=40);
opacity: 0.40;
font-size: 1px;
overflow: hidden;
}
.window,
.window-shadow {
position: absolute;
-moz-border-radius: 5px 5px 5px 5px;
-webkit-border-radius: 5px 5px 5px 5px;
border-radius: 5px 5px 5px 5px;
}
.window-shadow {
background: #ccc;
-moz-box-shadow: 2px 2px 3px #cccccc;
-webkit-box-shadow: 2px 2px 3px #cccccc;
box-shadow: 2px 2px 3px #cccccc;
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window,
.window .window-body {
border-color: #D3D3D3;
}
.window {
background-color: #f3f3f3;
background: -webkit-linear-gradient(top,#F8F8F8 0,#eeeeee 20%);
background: -moz-linear-gradient(top,#F8F8F8 0,#eeeeee 20%);
background: -o-linear-gradient(top,#F8F8F8 0,#eeeeee 20%);
background: linear-gradient(to bottom,#F8F8F8 0,#eeeeee 20%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F8F8F8,endColorstr=#eeeeee,GradientType=0);
}
.window-proxy {
border: 1px dashed #D3D3D3;
}
.window-proxy-mask,
.window-mask {
background: #ccc;
}
.window .panel-footer {
border: 1px solid #D3D3D3;
position: relative;
top: -1px;
}
.validatebox-invalid {
border-color: #ffa8a8;
background-color: #fff3f3;
color: #000;
}
.window {
overflow: hidden;
padding: 5px;
border-width: 1px;
border-style: solid;
}
.window .window-header {
background: transparent;
padding: 0px 0px 6px 0px;
}
.window .window-body {
border-width: 1px;
border-style: solid;
border-top-width: 0px;
}
.window .window-body-noheader {
border-top-width: 1px;
}
.window .panel-body-nobottom {
border-bottom-width: 0;
}
.window .window-header .panel-icon,
.window .window-header .panel-tool {
top: 50%;
margin-top: -11px;
}
.window .window-header .panel-icon {
left: 1px;
}
.window .window-header .panel-tool {
right: 1px;
}
.window .window-header .panel-with-icon {
padding-left: 18px;
}
.window-proxy {
position: absolute;
overflow: hidden;
}
.window-proxy-mask {
position: absolute;
filter: alpha(opacity=5);
opacity: 0.05;
}
.window-mask {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
filter: alpha(opacity=40);
opacity: 0.40;
font-size: 1px;
overflow: hidden;
}
.window,
.window-shadow {
position: absolute;
-moz-border-radius: 0px 0px 0px 0px;
-webkit-border-radius: 0px 0px 0px 0px;
border-radius: 0px 0px 0px 0px;
}
.window-shadow {
background: #eee;
-moz-box-shadow: 2px 2px 3px #ededed;
-webkit-box-shadow: 2px 2px 3px #ededed;
box-shadow: 2px 2px 3px #ededed;
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window,
.window .window-body {
border-color: #ddd;
}
.window {
background-color: #ffffff;
}
.window-proxy {
border: 1px dashed #ddd;
}
.window-proxy-mask,
.window-mask {
background: #eee;
}
.window .panel-footer {
border: 1px solid #ddd;
position: relative;
top: -1px;
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js"></script>
<link rel="stylesheet" type="text/css" href="video.css" />
</head>
<body>
<div class="wrapper">
<div id="videoTab">
<div id="tabHeads" class="tabhead">
<span tabSrc="video" class="focus" data-content-id="video"><var id="lang_tab_insertV"></var></span>
<span tabSrc="upload" data-content-id="upload"><var id="lang_tab_uploadV"></var></span>
</div>
<div id="tabBodys" class="tabbody">
<div id="video" class="panel focus">
<table><tr><td><label for="videoUrl" class="url"><var id="lang_video_url"></var></label></td><td><input id="videoUrl" type="text"></td></tr></table>
<div id="preview"></div>
<div id="videoInfo">
<fieldset>
<legend><var id="lang_video_size"></var></legend>
<table>
<tr><td><label for="videoWidth"><var id="lang_videoW"></var></label></td><td><input class="txt" id="videoWidth" type="text"/></td></tr>
<tr><td><label for="videoHeight"><var id="lang_videoH"></var></label></td><td><input class="txt" id="videoHeight" type="text"/></td></tr>
</table>
</fieldset>
<fieldset>
<legend><var id="lang_alignment"></var></legend>
<div id="videoFloat"></div>
</fieldset>
</div>
</div>
<div id="upload" class="panel">
<div id="upload_left">
<div id="queueList" class="queueList">
<div class="statusBar element-invisible">
<div class="progress">
<span class="text">0%</span>
<span class="percentage"></span>
</div><div class="info"></div>
<div class="btns">
<div id="filePickerBtn"></div>
<div class="uploadBtn"><var id="lang_start_upload"></var></div>
</div>
</div>
<div id="dndArea" class="placeholder">
<div class="filePickerContainer">
<div id="filePickerReady"></div>
</div>
</div>
<ul class="filelist element-invisible">
<li id="filePickerBlock" class="filePickerBlock"></li>
</ul>
</div>
</div>
<div id="uploadVideoInfo">
<fieldset>
<legend><var id="lang_upload_size"></var></legend>
<table>
<tr><td><label><var id="lang_upload_width"></var></label></td><td><input class="txt" id="upload_width" type="text"/></td></tr>
<tr><td><label><var id="lang_upload_height"></var></label></td><td><input class="txt" id="upload_height" type="text"/></td></tr>
</table>
</fieldset>
<fieldset>
<legend><var id="lang_upload_alignment"></var></legend>
<div id="upload_alignment"></div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<!-- jquery -->
<script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
<!-- webuploader -->
<script type="text/javascript" src="../../third-party/webuploader/webuploader.min.js"></script>
<link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
<!-- video -->
<script type="text/javascript" src="video.js"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js"></script>
<style type="text/css">
.wrapper{width: 540px; margin: 10px auto;}
#appShow {border: 1px solid #ddd;}
.errorMsg{font-size: 13px;margin: 10px;color: #dd0000}
</style>
</head>
<body>
<div class="wrapper">
<div id="appShow"></div>
</div>
<script type="text/javascript">
//此处配置您在百度上申请到的appkey。
var apikey = editor.options.webAppKey;
if ( apikey && apikey.length == 24 ) {
var searchConfig = {
container:'appShow', //容器ID
tips:"", //该值用于自动清空
search:1, //是否显示搜索框
ps:12, //每页显示的条数
suggest:1, //是否开启搜索自动完成
limit:0, //搜索结果显示条数,0表示无限制
searchNow:0, //是否在初始化完成时立即搜索
apikey:apikey, //每人得
pager:1,
cid:7134562,
outputHTML:1
},baiduApp;
function clickCallback() {
baiduApp.addEventListener( 'getAppHTML', function ( e, data ) {
var url = 'http://app.baidu.com/app/enter?appid='+data.data['app_id'] +'&tn=app_canvas&app_spce_id=1&apikey='+apikey+'&api_key=' + apikey;
editor.execCommand( "webapp", {url:url,width:data.uniWidth,height:data.uniHeight+60,logo:data.data['app_logo'],title:data.data['app_name']});
dialog.close();
} );
}
var script = document.createElement( "script" );
script.type = "text/javascript";
script.src = "http://app.baidu.com/appweb/api/search?auto=yes&container=container&apikey=" + apikey + "&instanceName=baiduApp&callback=clickCallback&config=searchConfig";
document.body.appendChild( script );
} else {
$G( "appShow" ).innerHTML = "<p class='errorMsg'>"+lang.tip1+"<a title='"+lang.anthorApi+"' href='http://app.baidu.com/static/cms/getapikey.html' target='_blank'>"+lang.applyFor+"</a></p><p class='errorMsg'>"+lang.tip2+"</p>" ;
}
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js"></script>
<style type="text/css">
.wrapper{width: 600px;padding: 10px;height: 352px;overflow: hidden;position: relative;border-bottom: 1px solid #d7d7d7}
.localPath input{float: left;width: 350px;line-height: 20px;height: 20px;}
#clipboard{float:left;width: 70px;height: 30px; }
.description{ color: #0066cc; margin-top: 2px; width: 450px; height: 45px;float: left;line-height: 22px}
#upload{width: 100px;height: 30px;float: right; margin:10px 2px 0 0;cursor: pointer;}
#msg{ width: 140px; height: 30px; line-height:25px;float: left;color: red}
</style>
</head>
<body>
<div class="wrapper">
<div class="localPath">
<input id="localPath" type="text" readonly />
<div id="clipboard"></div>
<div id="msg"></div>
</div>
<div id="flashContainer"></div>
<div>
<div id="upload" style="display: none" ><img id="uploadBtn"></div>
<div class="description">
<span style="color: red"><var id="lang_resave"></var>: </span><var id="lang_step"></var>
</div>
</div>
</div>
<script type="text/javascript" src="tangram.js"></script>
<script type="text/javascript" src="wordimage.js"></script>
<script type="text/javascript">
editor.setOpt({
wordImageFieldName:"upfile",
compressSide:0,
maxImageSideLength:900
});
//全局变量
var imageUrls = [], //用于保存从服务器返回的图片信息数组
selectedImageCount = 0, //当前已选择的但未上传的图片数量
optImageUrl = editor.getActionUrl(editor.getOpt('imageActionName')),
optImageFieldName = editor.getOpt('imageFieldName'),
optImageCompressBorder = editor.getOpt('imageCompressEnable') ? editor.getOpt('imageCompressBorder'):null,
maxSize = editor.getOpt('imageMaxSize') / 1024,
extension = editor.getOpt('imageAllowFiles').join(';').replace(/\./g, '*.');
/* 添加额外的GET参数 */
var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
urlWidthParams = optImageUrl + (optImageUrl.indexOf('?') == -1 ? '?':'&') + params;
utils.domReady(function(){
//创建Flash相关的参数集合
var flashOptions = {
container:"flashContainer", //flash容器id
url:urlWidthParams, // 上传处理页面的url地址
ext:editor.queryCommandValue('serverParam') || {}, //可向服务器提交的自定义参数列表
fileType:'{"description":"'+lang.fileType+'", "extension":"' + extension + '"}', //上传文件格式限制
flashUrl:'imageUploader.swf', //上传用的flash组件地址
width:600, //flash的宽度
height:272, //flash的高度
gridWidth:120, // 每一个预览图片所占的宽度
gridHeight:120, // 每一个预览图片所占的高度
picWidth:100, // 单张预览图片的宽度
picHeight:100, // 单张预览图片的高度
uploadDataFieldName: optImageFieldName, // POST请求中图片数据的key
picDescFieldName:'pictitle', // POST请求中图片描述的key
maxSize: maxSize, // 文件的最大体积,单位M
compressSize:1, // 上传前如果图片体积超过该值,会先压缩,单位M
maxNum:32, // 单次最大可上传多少个文件
compressSide: 0, //等比压缩的基准,0为按照最长边,1为按照宽度,2为按照高度
compressLength: optImageCompressBorder //能接受的最大边长,超过该值Flash会自动等比压缩
};
//回调函数集合,支持传递函数名的字符串、函数句柄以及函数本身三种类型
var callbacks={
selectFileCallback: function(selectFiles){ // 选择文件的回调
selectedImageCount += selectFiles.length;
if(selectedImageCount) baidu.g("upload").style.display = "";
dialog.buttons[0].setDisabled(true); //初始化时置灰确定按钮
},
deleteFileCallback: function(delFiles){ // 删除文件的回调
selectedImageCount -= delFiles.length;
if (!selectedImageCount) {
baidu.g("upload").style.display = "none";
dialog.buttons[0].setDisabled(false); //没有选择图片时重新点亮按钮
}
},
uploadCompleteCallback: function(data){ // 单个文件上传完成的回调
try{var info = eval("(" + data.info + ")");
info && imageUrls.push(info);
selectedImageCount--;
}catch(e){}
},
uploadErrorCallback: function (data){ // 单个文件上传失败的回调,
console && console.log(data);
},
allCompleteCallback: function(){ // 全部上传完成时的回调
dialog.buttons[0].setDisabled(false); //上传完毕后点亮按钮
}
//exceedFileCallback: 'exceedFileCallback', // 文件超出限制的最大体积时的回调
//startUploadCallback: startUploadCallback // 开始上传某个文件时的回调
};
wordImage.init(flashOptions,callbacks);
});
</script>
</body>
</html>
\ No newline at end of file
/**
* Created by JetBrains PhpStorm.
* User: taoqili
* Date: 12-1-30
* Time: 下午12:50
* To change this template use File | Settings | File Templates.
*/
var wordImage = {};
//(function(){
var g = baidu.g,
flashObj,flashContainer;
wordImage.init = function(opt, callbacks) {
showLocalPath("localPath");
//createCopyButton("clipboard","localPath");
createFlashUploader(opt, callbacks);
addUploadListener();
addOkListener();
};
function hideFlash(){
flashObj = null;
flashContainer.innerHTML = "";
}
function addOkListener() {
dialog.onok = function() {
if (!imageUrls.length) return;
var urlPrefix = editor.getOpt('imageUrlPrefix'),
images = domUtils.getElementsByTagName(editor.document,"img");
editor.fireEvent('saveScene');
for (var i = 0,img; img = images[i++];) {
var src = img.getAttribute("word_img");
if (!src) continue;
for (var j = 0,url; url = imageUrls[j++];) {
if (src.indexOf(url.original.replace(" ","")) != -1) {
img.src = urlPrefix + url.url;
img.setAttribute("_src", urlPrefix + url.url); //同时修改"_src"属性
img.setAttribute("title",url.title);
domUtils.removeAttributes(img, ["word_img","style","width","height"]);
editor.fireEvent("selectionchange");
break;
}
}
}
editor.fireEvent('saveScene');
hideFlash();
};
dialog.oncancel = function(){
hideFlash();
}
}
/**
* 绑定开始上传事件
*/
function addUploadListener() {
g("upload").onclick = function () {
flashObj.upload();
this.style.display = "none";
};
}
function showLocalPath(id) {
//单张编辑
var img = editor.selection.getRange().getClosedNode();
var images = editor.execCommand('wordimage');
if(images.length==1 || img && img.tagName == 'IMG'){
g(id).value = images[0];
return;
}
var path = images[0];
var leftSlashIndex = path.lastIndexOf("/")||0, //不同版本的doc和浏览器都可能影响到这个符号,故直接判断两种
rightSlashIndex = path.lastIndexOf("\\")||0,
separater = leftSlashIndex > rightSlashIndex ? "/":"\\" ;
path = path.substring(0, path.lastIndexOf(separater)+1);
g(id).value = path;
}
function createFlashUploader(opt, callbacks) {
//由于lang.flashI18n是静态属性,不可以直接进行修改,否则会影响到后续内容
var i18n = utils.extend({},lang.flashI18n);
//处理图片资源地址的编码,补全等问题
for(var i in i18n){
if(!(i in {"lang":1,"uploadingTF":1,"imageTF":1,"textEncoding":1}) && i18n[i]){
i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]);
}
}
opt = utils.extend(opt,i18n,false);
var option = {
createOptions:{
id:'flash',
url:opt.flashUrl,
width:opt.width,
height:opt.height,
errorMessage:lang.flashError,
wmode:browser.safari ? 'transparent' : 'window',
ver:'10.0.0',
vars:opt,
container:opt.container
}
};
option = extendProperty(callbacks, option);
flashObj = new baidu.flash.imageUploader(option);
flashContainer = $G(opt.container);
}
function extendProperty(fromObj, toObj) {
for (var i in fromObj) {
if (!toObj[i]) {
toObj[i] = fromObj[i];
}
}
return toObj;
}
//})();
function getPasteData(id) {
baidu.g("msg").innerHTML = lang.copySuccess + "</br>";
setTimeout(function() {
baidu.g("msg").innerHTML = "";
}, 5000);
return baidu.g(id).value;
}
function createCopyButton(id, dataFrom) {
baidu.swf.create({
id:"copyFlash",
url:"fClipboard_ueditor.swf",
width:"58",
height:"25",
errorMessage:"",
bgColor:"#CBCBCB",
wmode:"transparent",
ver:"10.0.0",
vars:{
tid:dataFrom
}
}, id
);
var clipboard = baidu.swf.getMovie("copyFlash");
var clipinterval = setInterval(function() {
if (clipboard && clipboard.flashInit) {
clearInterval(clipinterval);
clipboard.setHandCursor(true);
clipboard.setContentFuncName("getPasteData");
//clipboard.setMEFuncName("mouseEventHandler");
}
}, 500);
}
createCopyButton("clipboard", "localPath");
\ No newline at end of file
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
This is a custom SVG font generated by IcoMoon.
<iconset grid="16"></iconset>
</metadata>
<defs>
<font id="VideoJS" horiz-adv-x="512" >
<font-face units-per-em="512" ascent="480" descent="-32" />
<missing-glyph horiz-adv-x="512" />
<glyph class="hidden" unicode="&#xf000;" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" />
<glyph unicode="&#xe002;" d="M 64,416L 224,416L 224,32L 64,32zM 288,416L 448,416L 448,32L 288,32z" />
<glyph unicode="&#xe003;" d="M 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" />
<glyph unicode="&#xe004;" d="M 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" />
<glyph unicode="&#xe005;" d="M 359.765,64.235c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0,33.941
c 65.503,65.503, 65.503,172.085,0,237.588c-9.372,9.373-9.372,24.569,0,33.941c 9.372,9.371, 24.569,9.372, 33.941,0
C 417.532,335.938, 440,281.696, 440,224c0-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" />
<glyph unicode="&#xe006;" d="M 445.020,18.98c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.373-9.372,24.568,0,33.941
C 471.868,103.771, 496.001,162.030, 496.001,224c0,61.969-24.133,120.229-67.952,164.049c-9.372,9.373-9.372,24.569,0,33.941
c 9.372,9.372, 24.569,9.372, 33.941,0c 52.885-52.886, 82.011-123.2, 82.011-197.99c0-74.791-29.126-145.104-82.011-197.99
C 457.304,21.323, 451.162,18.98, 445.020,18.98zM 359.765,64.235c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0,33.941
c 65.503,65.503, 65.503,172.085,0,237.588c-9.372,9.373-9.372,24.569,0,33.941c 9.372,9.371, 24.569,9.372, 33.941,0
C 417.532,335.938, 440,281.696, 440,224c0-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" horiz-adv-x="544" />
<glyph unicode="&#xe007;" d="M 256,480L 96,224L 256-32L 416,224 z" />
<glyph unicode="&#xe008;" d="M 0,480 L 687.158,480 L 687.158-35.207 L 0-35.207 L 0,480 z M 622.731,224.638 C 621.878,314.664 618.46,353.922 597.131,381.656 C 593.291,387.629 586.038,391.042 580.065,395.304 C 559.158,410.669 460.593,416.211 346.247,416.211 C 231.896,416.211 128.642,410.669 108.162,395.304 C 101.762,391.042 94.504,387.629 90.242,381.656 C 69.331,353.922 66.349,314.664 65.069,224.638 C 66.349,134.607 69.331,95.353 90.242,67.62 C 94.504,61.22 101.762,58.233 108.162,53.967 C 128.642,38.18 231.896,33.060 346.247,32.207 C 460.593,33.060 559.158,38.18 580.065,53.967 C 586.038,58.233 593.291,61.22 597.131,67.62 C 618.46,95.353 621.878,134.607 622.731,224.638 z M 331.179,247.952 C 325.389,318.401 287.924,359.905 220.901,359.905 C 159.672,359.905 111.54,304.689 111.54,215.965 C 111.54,126.859 155.405,71.267 227.907,71.267 C 285.79,71.267 326.306,113.916 332.701,184.742 L 263.55,184.742 C 260.81,158.468 249.843,138.285 226.69,138.285 C 190.136,138.285 183.435,174.462 183.435,212.92 C 183.435,265.854 198.665,292.886 223.951,292.886 C 246.492,292.886 260.81,276.511 262.939,247.952 L 331.179,247.952 z M 570.013,247.952 C 564.228,318.401 526.758,359.905 459.74,359.905 C 398.507,359.905 350.379,304.689 350.379,215.965 C 350.379,126.859 394.244,71.267 466.746,71.267 C 524.625,71.267 565.14,113.916 571.536,184.742 L 502.384,184.742 C 499.649,158.468 488.682,138.285 465.529,138.285 C 428.971,138.285 422.27,174.462 422.27,212.92 C 422.27,265.854 437.504,292.886 462.785,292.886 C 485.327,292.886 499.649,276.511 501.778,247.952 L 570.013,247.952 z " horiz-adv-x="687.158" />
<glyph unicode="&#xe009;" d="M 64,416L 448,416L 448,32L 64,32z" />
<glyph unicode="&#xe00a;" d="M 192,416A64,64 12780 1 1 320,416A64,64 12780 1 1 192,416zM 327.765,359.765A64,64 12780 1 1 455.765,359.765A64,64 12780 1 1 327.765,359.765zM 416,224A32,32 12780 1 1 480,224A32,32 12780 1 1 416,224zM 359.765,88.235A32,32 12780 1 1 423.765,88.23500000000001A32,32 12780 1 1 359.765,88.23500000000001zM 224.001,32A32,32 12780 1 1 288.001,32A32,32 12780 1 1 224.001,32zM 88.236,88.235A32,32 12780 1 1 152.236,88.23500000000001A32,32 12780 1 1 88.236,88.23500000000001zM 72.236,359.765A48,48 12780 1 1 168.236,359.765A48,48 12780 1 1 72.236,359.765zM 28,224A36,36 12780 1 1 100,224A36,36 12780 1 1 28,224z" />
<glyph unicode="&#xe00b;" d="M 224,192 L 224-16 L 144,64 L 48-32 L 0,16 L 96,112 L 16,192 ZM 512,432 L 416,336 L 496,256 L 288,256 L 288,464 L 368,384 L 464,480 Z" />
<glyph unicode="&#xe00c;" d="M 256,448 C 397.385,448 512,354.875 512,240 C 512,125.124 397.385,32 256,32 C 242.422,32 229.095,32.867 216.088,34.522 C 161.099-20.467 95.463-30.328 32-31.776 L 32-18.318 C 66.268-1.529 96,29.052 96,64 C 96,68.877 95.621,73.665 94.918,78.348 C 37.020,116.48 0,174.725 0,240 C 0,354.875 114.615,448 256,448 Z" />
<glyph unicode="&#xe00d;" d="M 256,480C 114.615,480,0,365.385,0,224s 114.615-256, 256-256s 256,114.615, 256,256S 397.385,480, 256,480z M 256,352
c 70.692,0, 128-57.308, 128-128s-57.308-128-128-128s-128,57.308-128,128S 185.308,352, 256,352z M 408.735,71.265
C 367.938,30.468, 313.695,8, 256,8c-57.696,0-111.938,22.468-152.735,63.265C 62.468,112.062, 40,166.304, 40,224
c0,57.695, 22.468,111.938, 63.265,152.735l 33.941-33.941c0,0,0,0,0,0c-65.503-65.503-65.503-172.085,0-237.588
C 168.937,73.475, 211.125,56, 256,56c 44.874,0, 87.062,17.475, 118.794,49.206c 65.503,65.503, 65.503,172.084,0,237.588l 33.941,33.941
C 449.532,335.938, 472,281.695, 472,224C 472,166.304, 449.532,112.062, 408.735,71.265z" />
<glyph unicode="&#xe01e;" d="M 512,224c-0.639,33.431-7.892,66.758-21.288,97.231c-13.352,30.5-32.731,58.129-56.521,80.96
c-23.776,22.848-51.972,40.91-82.492,52.826C 321.197,466.979, 288.401,472.693, 256,472c-32.405-0.641-64.666-7.687-94.167-20.678
c-29.524-12.948-56.271-31.735-78.367-54.788c-22.112-23.041-39.58-50.354-51.093-79.899C 20.816,287.104, 15.309,255.375, 16,224
c 0.643-31.38, 7.482-62.574, 20.067-91.103c 12.544-28.55, 30.738-54.414, 53.055-75.774c 22.305-21.377, 48.736-38.252, 77.307-49.36
C 194.988-3.389, 225.652-8.688, 256-8c 30.354,0.645, 60.481,7.277, 88.038,19.457c 27.575,12.141, 52.558,29.74, 73.183,51.322
c 20.641,21.57, 36.922,47.118, 47.627,74.715c 6.517,16.729, 10.94,34.2, 13.271,51.899c 0.623-0.036, 1.249-0.060, 1.881-0.060
c 17.673,0, 32,14.326, 32,32c0,0.898-0.047,1.786-0.119,2.666L 512,223.999 z M 461.153,139.026c-11.736-26.601-28.742-50.7-49.589-70.59
c-20.835-19.905-45.5-35.593-72.122-45.895C 312.828,12.202, 284.297,7.315, 256,8c-28.302,0.649-56.298,6.868-81.91,18.237
c-25.625,11.333-48.842,27.745-67.997,47.856c-19.169,20.099-34.264,43.882-44.161,69.529C 51.997,169.264, 47.318,196.729, 48,224
c 0.651,27.276, 6.664,54.206, 17.627,78.845c 10.929,24.65, 26.749,46.985, 46.123,65.405c 19.365,18.434, 42.265,32.935, 66.937,42.428
C 203.356,420.208, 229.755,424.681, 256,424c 26.25-0.653, 52.114-6.459, 75.781-17.017c 23.676-10.525, 45.128-25.751, 62.812-44.391
c 17.698-18.629, 31.605-40.647, 40.695-64.344C 444.412,274.552, 448.679,249.219, 448,224l 0.119,0 c-0.072-0.88-0.119-1.768-0.119-2.666
c0-16.506, 12.496-30.087, 28.543-31.812C 473.431,172.111, 468.278,155.113, 461.153,139.026z" />
<glyph unicode="&#xe01f;" d="M 256,480 C 116.626,480 3.271,368.619 0.076,230.013 C 3.036,350.945 94.992,448 208,448 C 322.875,448 416,347.712 416,224 C 416,197.49 437.49,176 464,176 C 490.51,176 512,197.49 512,224 C 512,365.385 397.385,480 256,480 ZM 256-32 C 395.374-32 508.729,79.381 511.924,217.987 C 508.964,97.055 417.008,0 304,0 C 189.125,0 96,100.288 96,224 C 96,250.51 74.51,272 48,272 C 21.49,272 0,250.51 0,224 C 0,82.615 114.615-32 256-32 Z" />
<glyph unicode="&#xe00e;" d="M 432,128c-22.58,0-42.96-9.369-57.506-24.415L 158.992,211.336C 159.649,215.462, 160,219.689, 160,224
s-0.351,8.538-1.008,12.663l 215.502,107.751C 389.040,329.369, 409.42,320, 432,320c 44.183,0, 80,35.817, 80,80S 476.183,480, 432,480
s-80-35.817-80-80c0-4.311, 0.352-8.538, 1.008-12.663L 137.506,279.585C 122.96,294.63, 102.58,304, 80,304c-44.183,0-80-35.818-80-80
c0-44.184, 35.817-80, 80-80c 22.58,0, 42.96,9.369, 57.506,24.414l 215.502-107.751C 352.352,56.538, 352,52.311, 352,48
c0-44.184, 35.817-80, 80-80s 80,35.816, 80,80C 512,92.182, 476.183,128, 432,128z" />
<glyph unicode="&#xe001;" d="M 96,416L 416,224L 96,32 z" />
<glyph unicode="&#xe000;" d="M 512,480 L 512,272 L 432,352 L 336,256 L 288,304 L 384,400 L 304,480 ZM 224,144 L 128,48 L 208-32 L 0-32 L 0,176 L 80,96 L 176,192 Z" />
<glyph unicode="&#x20;" horiz-adv-x="256" />
</font></defs></svg>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment