Compare commits

...

53 Commits

Author SHA1 Message Date
thinkgem
9678b6e8b7 Merge branch 'master' of https://gitee.com/thinkgem/jeesite4.git 2019-05-20 18:22:37 +08:00
thinkgem
dd9e400f6a 添加jta在oracle下设置授权的提示信息 2019-05-18 00:35:59 +08:00
thinkgem
2de70e79ae 注意:@MyBatisDao如果不设置dataSourceName,则为default默认数据源,如果需要使用DataSourceHolder.setDataSourceName设置数据源,请将设置该注解属性设置为dataSourceName=DataSourceHolder.EMPTY 2019-05-17 23:16:01 +08:00
thinkgem
5248cf9a68 关闭jta事务最大超时时间限制 2019-05-17 18:53:29 +08:00
thinkgem
51a83b70a3 修正国际化遗留问题 2019-05-17 18:52:53 +08:00
thinkgem
1b66126184 jquery.validate新增重置验证方法,将valid替换为resetValid用户体验会更好 2019-05-16 16:10:48 +08:00
thinkgem
a2d9c846bf 代码优化 2019-05-14 23:09:04 +08:00
thinkgem
5da0520832 新增用户和组织管理功能的,控制权限类型设置user.adminCtrlPermi,1拥有的权限 2管理的权限,无限级授权应用场景使用 2019-05-13 17:49:02 +08:00
thinkgem
aae461a0b4 新增全局默认事务超时时间参数
jdbc.transactionTimeout,原jdbc.jta.transactionTimeout参数可不用配置了。
2019-05-13 17:42:15 +08:00
thinkgem
eb218f7973 开放所有国际化语言包,方便用户自定义语言包。 2019-05-10 23:52:20 +08:00
thinkgem
2d80ce3bda 开放所有国际化语言包,方便用户自定义语言包。 2019-05-10 23:48:44 +08:00
thinkgem
42b36a5377 新增日语(日本语)语言包 2019-05-09 23:11:22 +08:00
thinkgem
720148bea7 增加favicon网页收藏图标,可自行替换修改。 2019-05-09 14:27:04 +08:00
thinkgem
ff462950bd 用户管理新增附属机构配置,支持一个用户配置多个部门,支持多部门数据权限过滤 2019-05-08 17:07:45 +08:00
thinkgem
00cc2fa797 暂时注释掉无用的jquery-migrate-1.4.1.min.js,如果你需要可以放开注释。 2019-05-08 16:58:59 +08:00
thinkgem
b0d66960a8 ReflectUtils.invokeGetter支持静态类及方法调用 2019-05-08 16:58:08 +08:00
thinkgem
e123d96465 js.formatNumber优化,传递0数值的时候返回0.00,传递null的时候返回默认值。 2019-05-07 22:25:47 +08:00
thinkgem
7b4ca62ce8 文件上传组件新增 cueWords 提示语属性,默认:或将照片(文件)拖到这里,最多可选 maxUploadNum 张(个) 2019-05-07 17:29:39 +08:00
thinkgem
df74e417e8 点击右上角【Star】收藏本软件 ^_^ 2019-05-06 13:38:04 +08:00
thinkgem
fe7637a110 点击右上角【Star】收藏本软件 ^_^ 2019-05-06 13:36:13 +08:00
thinkgem
b71d2502ef 国际化译文细节优化 2019-05-06 10:37:24 +08:00
thinkgem
2792531a7d 角色数据权限配置,支持返回数组的情况,在一个用户多个部门的场景下使用。 2019-05-05 22:08:20 +08:00
thinkgem
04781bed25 记住密码 文字改为 自动登录 2019-05-05 16:42:00 +08:00
thinkgem
b82217e624 新增 web.strictMode,提供更严格的数据安全验证 2019-05-05 15:43:52 +08:00
thinkgem
3c92f26684 优化ServletUtils.renderResult 2019-05-05 15:41:52 +08:00
thinkgem
c31259d5c8 错别字修正,请稍后->请稍候 2019-05-05 15:41:20 +08:00
thinkgem
36dd4c70bc 增加web严格模式 web.strictMode=false(更严格的数据安全验证,如isAll=true这种参数形式将被禁用) 2019-05-01 23:49:59 +08:00
thinkgem
ddc8510479 会话过期后顶部菜单点击后显示json的代码优化 2019-04-29 08:36:15 +08:00
thinkgem
ac4c9f932d 编辑表格子表的表头增加新增按钮实例 2019-04-28 15:31:13 +08:00
thinkgem
9aa599fb0b 新增Docker部署脚本实例 2019-04-27 21:41:18 +08:00
thinkgem
1b0099c831 update 2019-04-24 22:45:58 +08:00
ThinkGem
fca4902a38 优化 File.downFile 如果传递 source=preview 则不添加 attachment 内容描述 2019-04-23 21:07:21 +08:00
thinkgem
59e1792467 优化 File.downFile 如果传递 source=preview 则不添加 attachment 内容描述 2019-04-23 20:22:38 +08:00
thinkgem
73ac352219 修复jQuery原型污染漏洞 ThinkGem 2019-04-23 20:21:03 +08:00
thinkgem
722029e555 update 2019-04-23 09:51:31 +08:00
thinkgem
2ce0eb76be 完成文件管理数据库初始化脚本 2019-04-22 16:50:36 +08:00
thinkgem
2d9548aa90 ListUtils.getPageList改为公共方法 2019-04-21 17:47:12 +08:00
thinkgem
1d31c9fcef 降级maven-surefire插件,新版本可能会出现VM崩溃。 2019-04-21 17:43:23 +08:00
thinkgem
9c8ae36924 优化代码 2019-04-18 18:15:40 +08:00
thinkgem
88a9b11859 静态资源路径前缀,可做CDN加速优化 2019-04-17 17:48:27 +08:00
thinkgem
72b536a4d5 DateUtils getOfDayFirst getOfDayLast 24小时制修正 2019-04-17 16:08:14 +08:00
thinkgem
e9763efaa7 新增文件管理模块 2019-04-11 22:38:34 +08:00
thinkgem
532ca319ec update 2019-04-11 10:54:44 +08:00
thinkgem
9c0fc71587 优化init-data 2019-04-11 10:50:22 +08:00
thinkgem
16ba2c92a0 优化对 .json .xml 后缀的URI会话失效后传递支持。 2019-04-08 10:04:24 +08:00
thinkgem
0729db8ae8 start 4.1.5 2019-04-01 16:43:10 +08:00
thinkgem
e1be50a2e6 jta开启情况下支持初始化db 2019-03-29 16:01:08 +08:00
thinkgem
6f5b7ee120 @Table单元测试类优化 2019-03-27 11:37:31 +08:00
thinkgem
c010df1fb6 我的工作内部消息菜单图标修改 2019-03-22 10:23:30 +08:00
thinkgem
5b16c6c3d2 当adminPath修改过后,发送通知的地址不正确问题 2019-03-21 18:09:30 +08:00
thinkgem
3b0060c300 初始化数据库脚本小优化 2019-03-21 17:04:36 +08:00
thinkgem
9cf1b944db 修正站内信Oracle下ORA-00932错误 2019-03-21 16:57:36 +08:00
thinkgem
5ff356665f 修正主子表示例,删除的时候子表数据未删除问题 2019-03-21 16:40:08 +08:00
146 changed files with 7972 additions and 4039 deletions

View File

@@ -877,4 +877,4 @@ For more information on this, and how to apply and follow the GNU AGPL, see
理解您的用意。
5. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议、版权声明和其他
原作者规定需要包含的说明(请尊重原作者的著作权,不要删除或修改文件中的`@author`信息)。
6. 您可以应用于商业软件,但必须遵循以上条款原则(请协助改进本作品)。
6. 您可以应用于商业软件,但必须遵循以上条款原则(请协助改进本作品 http://jeesite.com)。

View File

@@ -91,13 +91,13 @@ JeeSite 4.x 的升级,作者结合了多年总结和经验,以及各方面
尽量不修改web项目以外的源码项目如 jeesite-common、jeesite-modele-core如果修改了请 Pull Requests 上来,否则代码编码将与官方不同步,将对你的日后升级带来困难。
JeeSite的小版本4.1.x升级是非常便捷的你只需要将 pom.xml 文件中的 parent.version 版本修改到最新版本即可同版本下你可进行Maven快照强制更新即可将最新版的依赖jar更新到本地下面介绍一下在Eclipse如何操作:
JeeSite的小版本4.1.x升级是非常便捷的你只需要将 pom.xml 文件中的 parent.version 版本修改到最新版本即可,同版本下你可进行 Maven 快照强制更新,即可将最新版的依赖 jar 更新到本地,下面Eclipse 举例,介绍如何操作:
在web项目上右键选择菜单 -> Maven -> Update Project...或按Alt+F5 -> 点击 Select All 按钮 -> 选择 Force Update of Snapshots/Releases 复选框 -> 点击OK按钮即可。
web 项目上右键,选择菜单 -> Maven -> Update Project...或按Alt+F5 -> 点击 Select All 按钮 -> 选择 Force Update of Snapshots/Releases 复选框 -> 点击OK按钮即可。
如果您修改了其它依赖模块代码,这时你需要与官方Git仓库代码进行同步。
如果您修改了其它依赖模块代码,这时你需要利用 Git 版本控制工具,与官方仓库代码进行同步,合并代码即可
如果进行相对大的版本4.x.x升级这里我们会附加一个声明帮助你进行迁移操作。
如果进行相对大的版本4.x.x升级这里我们会附加一个声明帮助你进行迁移操作,更新日志:<http://jeesite.com/?t=273830>
# Git 全局设置技巧

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>4.1.4-SNAPSHOT</version>
<version>4.1.5-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>

View File

@@ -255,7 +255,7 @@ public class EncodeUtils {
// 预编译SQL过滤正则表达式
private static Pattern sqlPattern = Pattern.compile("(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)", Pattern.CASE_INSENSITIVE);
/**
* SQL过滤防止注入传入参数输入有select相关代码替换空。
* @author ThinkGem
@@ -263,7 +263,7 @@ public class EncodeUtils {
public static String sqlFilter(String text){
if (text != null){
String value = text;
Matcher matcher = sqlPattern.matcher(text);
Matcher matcher = sqlPattern.matcher(value);
if (matcher.find()) {
value = matcher.replaceAll(StringUtils.EMPTY);
}

View File

@@ -356,7 +356,7 @@ public class ListUtils extends org.apache.commons.collections.ListUtils {
* @param totalPage 总页码数
* @author ThinkGem
*/
private static <T> List<T> getPageList(List<T> list, int pageNo, int pageSize, int totalPage) {
public static <T> List<T> getPageList(List<T> list, int pageNo, int pageSize, int totalPage) {
int fromIndex = 0; // 从哪里开始截取
int toIndex = 0; // 截取几个
if (list == null || list.size() == 0){

View File

@@ -756,7 +756,8 @@ public class FileUtils extends org.apache.commons.io.FileUtils {
}
try {
response.addHeader("Content-Disposition", "attachment; filename=\"" +
boolean isPreview = "preview".equalsIgnoreCase(request.getParameter("source"));
response.addHeader("Content-Disposition", (!isPreview ? "attachment; " : "") + "filename=\"" +
EncodeUtils.encodeUrl(StringUtils.isBlank(fileName) ? file.getName() : fileName) + "\"");
response.setContentType(FileUtils.getContentType(file.getName())); // set the MIME type.
response.addHeader("Content-Length", String.valueOf(contentLength));

View File

@@ -16,7 +16,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import com.jeesite.common.collect.SetUtils;
@@ -215,7 +214,7 @@ public class PropertiesUtils {
String logPath = null;
try {
// 获取当前classes目录
logPath = new DefaultResourceLoader().getResource("/").getFile().getPath();
logPath = ResourceUtils.getResource("/").getFile().getPath();
} catch (Exception e) {
// 取不到,取当前工作路径
logPath = System.getProperty("user.dir");

View File

@@ -244,7 +244,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
@@ -262,7 +262,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR, 23);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);

View File

@@ -40,8 +40,9 @@ public class ReflectUtils {
private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class);
/**
* 调用Getter方法.
* 支持多级,如:对象名.对象名.方法
* 调用Getter方法
* 支持多级,如:对象名.对象名.方法
* 支持静态类及方法调用
*/
@SuppressWarnings("unchecked")
public static <E> E invokeGetter(Object obj, String propertyName) {
@@ -54,8 +55,9 @@ public class ReflectUtils {
}
/**
* 调用Setter方法, 仅匹配方法名
* 支持多级,如:对象名.对象名.方法
* 调用Setter方法仅匹配方法名
* 支持多级,如:对象名.对象名.方法
* 支持静态类及方法调用
*/
public static <E> void invokeSetter(Object obj, String propertyName, E value) {
Object object = obj;
@@ -72,7 +74,7 @@ public class ReflectUtils {
}
/**
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
* 直接读取对象属性值无视private/protected修饰符不经过getter函数
*/
@SuppressWarnings("unchecked")
public static <E> E getFieldValue(final Object obj, final String fieldName) {
@@ -92,7 +94,7 @@ public class ReflectUtils {
}
/**
* 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
* 直接设置对象属性值无视private/protected修饰符不经过setter函数
*/
public static <E> void setFieldValue(final Object obj, final String fieldName, final E value) {
Field field = getAccessibleField(obj, fieldName);
@@ -109,9 +111,10 @@ public class ReflectUtils {
}
/**
* 直接调用对象方法, 无视private/protected修饰符.
* 用于一次性调用的情况否则应使用getAccessibleMethod()函数获得Method后反复调用.
* 直接调用对象方法无视private/protected修饰符
* 用于一次性调用的情况否则应使用getAccessibleMethod()函数获得Method后反复调用
* 同时匹配方法名+参数类型,
* 支持静态类及方法调用
*/
@SuppressWarnings("unchecked")
public static <E> E invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes,
@@ -122,11 +125,11 @@ public class ReflectUtils {
Method method = getAccessibleMethod(obj, methodName, parameterTypes);
if (method == null) {
//throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 ");
logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 ");
logger.debug("在 [" + (obj.getClass() == Class.class ? obj : obj.getClass()) + "] 中,没有找到 [" + methodName + "] 方法 ");
return null;
}
try {
return (E)method.invoke(obj, args);
return (E)method.invoke(obj.getClass() == Class.class ? null : obj, args);
} catch (Exception e) {
String msg = "method: "+method+", obj: "+obj+", args: "+args+"";
throw convertReflectionExceptionToUnchecked(msg, e);
@@ -134,9 +137,10 @@ public class ReflectUtils {
}
/**
* 直接调用对象方法, 无视private/protected修饰符
* 用于一次性调用的情况否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
* 只匹配函数名,如果有多个同名函数调用第一个
* 直接调用对象方法无视private/protected修饰符
* 用于一次性调用的情况否则应使用getAccessibleMethodByName()函数获得Method后反复调用
* 只匹配函数名,如果有多个同名函数调用第一个
* 支持静态类及方法调用
*/
@SuppressWarnings("unchecked")
public static <E> E invokeMethodByName(final Object obj, final String methodName, final Object[] args) {
@@ -144,7 +148,7 @@ public class ReflectUtils {
if (method == null) {
// 如果为空不报错,直接返回空。
// throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 ");
logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 ");
logger.debug("在 [" + (obj.getClass() == Class.class ? obj : obj.getClass()) + "] 中,没有找到 [" + methodName + "] 方法 ");
return null;
}
try {
@@ -175,7 +179,7 @@ public class ReflectUtils {
}
}
}
return (E)method.invoke(obj, args);
return (E)method.invoke(obj.getClass() == Class.class ? null : obj, args);
} catch (Exception e) {
String msg = "method: "+method+", obj: "+obj+", args: "+args+"";
throw convertReflectionExceptionToUnchecked(msg, e);
@@ -183,8 +187,8 @@ public class ReflectUtils {
}
/**
* 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问.
* 如向上转型到Object仍无法找到, 返回null.
* 循环向上转型获取对象的DeclaredField并强制设置为可访问
* 如向上转型到Object仍无法找到返回null
*/
public static Field getAccessibleField(final Object obj, final String fieldName) {
// 为空不报错。直接返回 null
@@ -207,10 +211,10 @@ public class ReflectUtils {
}
/**
* 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
* 如向上转型到Object仍无法找到, 返回null.
* 循环向上转型获取对象的DeclaredMethod,并强制设置为可访问
* 如向上转型到Object仍无法找到返回null
* 匹配函数名+参数类型。
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
* 用于方法需要被多次调用的情况先使用本函数先取得Method然后调用Method.invoke(Object obj, Object... args)
*/
public static Method getAccessibleMethod(final Object obj, final String methodName,
final Class<?>... parameterTypes) {
@@ -219,8 +223,12 @@ public class ReflectUtils {
if (obj == null){
return null;
}
Class<?> clazz = obj.getClass();
if (clazz == Class.class){
clazz = (Class) obj;
}
Validate.notBlank(methodName, "methodName can't be blank");
for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
for (Class<?> searchType = clazz; searchType != Object.class; searchType = searchType.getSuperclass()) {
try {
Method method = searchType.getDeclaredMethod(methodName, parameterTypes);
makeAccessible(method);
@@ -234,10 +242,10 @@ public class ReflectUtils {
}
/**
* 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
* 如向上转型到Object仍无法找到, 返回null.
* 循环向上转型获取对象的DeclaredMethod并强制设置为可访问
* 如向上转型到Object仍无法找到返回null
* 只匹配函数名。
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
* 用于方法需要被多次调用的情况先使用本函数先取得Method然后调用Method.invoke(Object obj, Object... args)
*/
public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) {
// 为空不报错。直接返回 null
@@ -245,8 +253,12 @@ public class ReflectUtils {
if (obj == null){
return null;
}
Class<?> clazz = obj.getClass();
if (clazz == Class.class){
clazz = (Class) obj;
}
Validate.notBlank(methodName, "methodName can't be blank");
for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
for (Class<?> searchType = clazz; searchType != Object.class; searchType = searchType.getSuperclass()) {
Method[] methods = searchType.getDeclaredMethods();
for (Method method : methods) {
if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) {
@@ -279,10 +291,9 @@ public class ReflectUtils {
}
/**
* 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处
* 如无法找到, 返回Object.class.
* eg.
* public UserDao extends HibernateDao<User>
* 通过反射获得Class定义中声明的泛型参数的类型注意泛型必须定义在父类处
* 如无法找到返回Object.class
* 如 public UserDao extends CrudDao<User>
* @param clazz The class to introspect
* @return the first generic declaration, or Object.class if cannot be determined
*/
@@ -292,9 +303,9 @@ public class ReflectUtils {
}
/**
* 通过反射, 获得Class定义中声明的父类的泛型参数的类型.
* 如无法找到, 返回Object.class.
* 如public UserDao extends HibernateDao<User,Long>
* 通过反射获得Class定义中声明的父类的泛型参数的类型
* 如无法找到返回Object.class
* 如 public UserDao extends CrudDao<User, Long>
* @param clazz clazz The class to introspect
* @param index the Index of the generic ddeclaration,start from 0.
* @return the index generic declaration, or Object.class if cannot be determined
@@ -323,6 +334,9 @@ public class ReflectUtils {
return (Class) params[index];
}
/**
* 获取类的Class如果为内部类则返回上级类Class
*/
public static Class<?> getUserClass(Object instance) {
if (instance == null){
throw new RuntimeException("Instance must not be null");
@@ -339,7 +353,7 @@ public class ReflectUtils {
}
/**
* 将反射时的checked exception转换为unchecked exception.
* 将反射时的checked exception转换为unchecked exception
*/
public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) {
if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException

View File

@@ -110,7 +110,8 @@ public class ServletUtils {
}
String uri = request.getRequestURI();
if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")){
if (StringUtils.endsWithIgnoreCase(uri, ".json")
|| StringUtils.endsWithIgnoreCase(uri, ".xml")){
return true;
}
@@ -189,19 +190,22 @@ public class ServletUtils {
}
}
HttpServletRequest request = getRequest();
String uri = request.getRequestURI();
if (StringUtils.endsWithIgnoreCase(uri, ".xml") || StringUtils
.equalsIgnoreCase(request.getParameter("__ajax"), "xml")){
return XmlMapper.toXml(resultMap);
}else{
String functionName = request.getParameter("__callback");
if (StringUtils.isNotBlank(functionName)){
return JsonMapper.toJsonp(functionName, resultMap);
if (request != null){
String uri = request.getRequestURI();
if (StringUtils.endsWithIgnoreCase(uri, ".xml") || StringUtils
.equalsIgnoreCase(request.getParameter("__ajax"), "xml")){
return XmlMapper.toXml(resultMap);
}else{
return JsonMapper.toJson(resultMap);
String functionName = request.getParameter("__callback");
if (StringUtils.isNotBlank(functionName)){
return JsonMapper.toJsonp(functionName, resultMap);
}else{
return JsonMapper.toJson(resultMap);
}
}
}else{
return JsonMapper.toJson(resultMap);
}
}
/**

View File

@@ -1,4 +1,4 @@
/* Electron */ if(typeof module==='object'){window.module=module;module=undefined;}
if(typeof module==='object'){window.module=module;module=undefined;}/* Electron Support */
/*!
* jQuery JavaScript Library v1.12.4
* http://jquery.com/
@@ -211,7 +211,8 @@ jQuery.extend = jQuery.fn.extend = function() {
copy = options[ name ];
// Prevent never-ending loop
if ( target === copy ) {
// if ( target === copy ) {
if (name === "__proto__" || target === copy) { // 修复jQuery原型污染漏洞 ThinkGem
continue;
}

File diff suppressed because one or more lines are too long

View File

@@ -1,41 +1,12 @@
/**
@Namelayer v3.0.3 Web弹层组件
@Author贤心
@Sitehttp://layer.layui.com
@LicenseMIT
*/
;!function(window, undefined){
"use strict";
var i18n = {
btnOk: '确定',
btnCancel: '取消',
title: '信息',
promptTipA: '最多输入',
promptTipB: '个字符',
noPicture: '没有图片',
photoError: '当前图片地址异常<br>是否继续查看下一张?',
photoNextPage: '下一张',
photoClose: '不看了'
};
if (window.lang == 'en'){
i18n = {
btnOk: 'Ok',
btnCancel: 'Cancle',
title: 'Information',
promptTipA: 'Enter ',
promptTipB: 'character at most.',
noPicture: 'No picture',
photoError: 'Current image address error.<br>Next slide?',
photoNextPage: 'The next',
photoClose: 'Close'
};
}
var isLayui = window.layui && layui.define, $, win, ready = {
getPath: function(){
var js = document.scripts, script = js[js.length - 1], jsPath = script.src;
@@ -44,7 +15,7 @@ var isLayui = window.layui && layui.define, $, win, ready = {
}(),
config: {}, end: {}, minIndex: 0, minLeft: [],
btn: [i18n.btnOk, i18n.btnCancel],
//btn: [layer.i18n.btnOk, layer.i18n.btnCancel], // ThinkGem
//五种原始层模式
type: ['dialog', 'page', 'iframe', 'loading', 'tips']
@@ -53,6 +24,17 @@ var isLayui = window.layui && layui.define, $, win, ready = {
//默认内置方法。
var layer = {
v: '3.0.3',
i18n: { // ThinkGem 国际化支持
btnOk: '确定',
btnCancel: '取消',
title: '信息',
promptTipA: '最多输入',
promptTipB: '个字符',
noPicture: '没有图片',
photoError: '当前图片地址异常<br>是否继续查看下一张?',
photoNextPage: '下一张',
photoClose: '不看了'
},
ie: function(){ //ie版本
var agent = navigator.userAgent.toLowerCase();
return (!!window.ActiveXObject || "ActiveXObject" in window) ? (
@@ -133,7 +115,8 @@ var layer = {
}
return layer.open($.extend({
content: content,
btn: ready.btn,
//btn: ready.btn,
btn: [layer.i18n.btnOk, layer.i18n.btnCancel],
yes: yes,
btn2: cancel
}, type ? {} : options));
@@ -210,7 +193,7 @@ Class.pt.config = {
shade: 0.3,
fixed: true,
move: doms[1],
title: i18n.title,
title: layer.i18n.title,
offset: 'auto',
area: 'auto',
closeBtn: 1,
@@ -232,7 +215,7 @@ Class.pt.vessel = function(conType, callback){
var zIndex = config.zIndex + times, titype = typeof config.title === 'object';
var ismax = config.maxmin && (config.type === 1 || config.type === 2);
var titleHTML = (config.title ? '<div class="layui-layer-title" style="'+ (titype ? config.title[1] : '') +'">'
+ (titype ? config.title[0] : config.title)
+ (titype ? config.title[0] : layer.i18n.title)
+ '</div>' : '');
config.zIndex = zIndex;
@@ -248,7 +231,8 @@ Class.pt.vessel = function(conType, callback){
+ (config.type == 1 && conType ? '' : (config.content||''))
+ '</div>'
+ '<span class="layui-layer-setwin">'+ function(){
var closebtn = ismax ? '<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>' : '';
var closebtn = ismax && config.title ? '<a class="layui-layer-min" href="javascript:;"><cite></cite></a>' : ''; // ThinkGem 必须有标题的清空下才能最小化
closebtn += ismax ? '<a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>' : '';
config.closeBtn && (closebtn += '<a class="layui-layer-ico '+ doms[7] +' '+ doms[7] + (config.title ? config.closeBtn : (config.type == 4 ? '1' : '2')) +'" href="javascript:;"></a>');
return closebtn;
}() + '</span>'
@@ -292,7 +276,8 @@ Class.pt.creat = function(){
switch(config.type){
case 0:
config.btn = ('btn' in config) ? config.btn : ready.btn[0];
//config.btn = ('btn' in config) ? config.btn : ready.btn[0]; ThinkGem
config.btn = ('btn' in config) ? config.btn : layer.i18n.btnOk;// ThinkGem
layer.closeAll('dialog');
break;
case 2:
@@ -1020,7 +1005,7 @@ layer.prompt = function(options, yes){
return layer.open($.extend({
type: 1
,btn: [i18n.btnOk,i18n.btnCancel]
,btn: [layer.i18n.btnOk,layer.i18n.btnCancel]
,content: content
,skin: 'layui-layer-prompt' + skin('prompt')
,maxWidth: win.width()
@@ -1035,7 +1020,7 @@ layer.prompt = function(options, yes){
if(value === ''){
prompt.focus();
} else if(value.length > (options.maxlength||500)) {
layer.tips(i18n.promptTipA + (options.maxlength || 500) + i18n.promptTipB, prompt, {tips: 1});
layer.tips(layer.i18n.promptTipA + (options.maxlength || 500) + layer.i18n.promptTipB, prompt, {tips: 1});
} else {
yes && yes(value, index, prompt);
}
@@ -1287,9 +1272,9 @@ layer.photos = function(options, loop, key){
}, options));
}, function(){
layer.close(dict.loadi);
layer.msg(i18n.photoError, {
layer.msg(layer.i18n.photoError, {
time: 30000,
btn: [i18n.photoNextPage, i18n.photoClose],
btn: [layer.i18n.photoNextPage, layer.i18n.photoClose],
yes: function(){
data.length > 1 && dict.imgnext(true,true);
}

View File

@@ -0,0 +1,24 @@
(function() {
if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd)
var e = jQuery.fn.select2.amd;
return e.define("select2/i18n/zh_CN", [], function() {
return { errorLoading : function() {
return "結果に載せることはできない。"
}, inputTooLong : function(e) {
var t = e.input.length - e.maximum, n = "" + t + "文字を削除してください";
return n
}, inputTooShort : function(e) {
var t = e.minimum - e.input.length, n = "少なくとも" + t + "文字を入力してください";
return n
}, loadingMore : function() {
return "より多くの……"
}, maximumSelected : function(e) {
var t = "選択するしかない" + e.maximum + "項目別";
return t
}, noResults : function() {
return "一致する項目を見つけることができなかった"
}, searching : function() {
return "検索しています……"
} }
}), { define : e.define, require : e.require }
})();

File diff suppressed because it is too large Load Diff

View File

@@ -4,6 +4,7 @@
DROP TABLE js_gen_table_column;
DROP TABLE js_gen_table;
DROP TABLE js_sys_company_office;
DROP TABLE js_sys_employee_office;
DROP TABLE js_sys_employee_post;
DROP TABLE js_sys_user_data_scope;
DROP TABLE js_sys_user_role;
@@ -276,6 +277,17 @@ CREATE TABLE js_sys_employee
);
-- 员工附属机构关系表
CREATE TABLE js_sys_employee_office
(
id varchar(64) NOT NULL UNIQUE,
emp_code varchar(64) NOT NULL,
office_code varchar(64) NOT NULL,
post_code varchar(64),
PRIMARY KEY (emp_code, office_code)
);
-- 员工与岗位关联表
CREATE TABLE js_sys_employee_post
(
@@ -503,7 +515,7 @@ CREATE TABLE js_sys_msg_inner_record
(
id varchar(64) NOT NULL,
msg_inner_id varchar(64) NOT NULL,
receive_user_code varchar(64),
receive_user_code varchar(64) NOT NULL,
receive_user_name varchar(100) NOT NULL,
read_status char(1) NOT NULL,
read_date timestamp,

View File

@@ -4,6 +4,7 @@
IF OBJECT_ID('[js_gen_table_column]') IS NOT NULL DROP TABLE [js_gen_table_column];
IF OBJECT_ID('[js_gen_table]') IS NOT NULL DROP TABLE [js_gen_table];
IF OBJECT_ID('[js_sys_company_office]') IS NOT NULL DROP TABLE [js_sys_company_office];
IF OBJECT_ID('[js_sys_employee_office]') IS NOT NULL DROP TABLE [js_sys_employee_office];
IF OBJECT_ID('[js_sys_employee_post]') IS NOT NULL DROP TABLE [js_sys_employee_post];
IF OBJECT_ID('[js_sys_user_data_scope]') IS NOT NULL DROP TABLE [js_sys_user_data_scope];
IF OBJECT_ID('[js_sys_user_role]') IS NOT NULL DROP TABLE [js_sys_user_role];
@@ -276,6 +277,17 @@ CREATE TABLE [js_sys_employee]
);
-- 员工附属机构关系表
CREATE TABLE [js_sys_employee_office]
(
[id] varchar(64) NOT NULL UNIQUE,
[emp_code] varchar(64) NOT NULL,
[office_code] varchar(64) NOT NULL,
[post_code] varchar(64),
PRIMARY KEY ([emp_code], [office_code])
);
-- 员工与岗位关联表
CREATE TABLE [js_sys_employee_post]
(
@@ -503,7 +515,7 @@ CREATE TABLE [js_sys_msg_inner_record]
(
[id] varchar(64) NOT NULL,
[msg_inner_id] varchar(64) NOT NULL,
[receive_user_code] varchar(64),
[receive_user_code] varchar(64) NOT NULL,
[receive_user_name] varchar(100) NOT NULL,
[read_status] char(1) NOT NULL,
[read_date] datetime,

View File

@@ -5,6 +5,7 @@ SET SESSION FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS js_gen_table_column;
DROP TABLE IF EXISTS js_gen_table;
DROP TABLE IF EXISTS js_sys_company_office;
DROP TABLE IF EXISTS js_sys_employee_office;
DROP TABLE IF EXISTS js_sys_employee_post;
DROP TABLE IF EXISTS js_sys_user_data_scope;
DROP TABLE IF EXISTS js_sys_user_role;
@@ -277,6 +278,18 @@ CREATE TABLE js_sys_employee
) COMMENT = '员工表';
-- 员工附属机构关系表
CREATE TABLE js_sys_employee_office
(
id varchar(64) NOT NULL COMMENT '编号',
emp_code varchar(64) NOT NULL COMMENT '员工编码',
office_code varchar(64) NOT NULL COMMENT '机构编码',
post_code varchar(64) COMMENT '岗位编码',
PRIMARY KEY (emp_code, office_code),
UNIQUE (id)
) COMMENT = '员工附属机构关系表';
-- 员工与岗位关联表
CREATE TABLE js_sys_employee_post
(
@@ -504,7 +517,7 @@ CREATE TABLE js_sys_msg_inner_record
(
id varchar(64) NOT NULL COMMENT '编号',
msg_inner_id varchar(64) NOT NULL COMMENT '所属消息',
receive_user_code varchar(64) COMMENT '接受者用户编码',
receive_user_code varchar(64) NOT NULL COMMENT '接受者用户编码',
receive_user_name varchar(100) NOT NULL COMMENT '接受者用户姓名',
read_status char(1) NOT NULL COMMENT '读取状态0未送达 1已读 2未读',
read_date datetime COMMENT '阅读时间',

View File

@@ -4,6 +4,7 @@
DROP TABLE js_gen_table_column CASCADE CONSTRAINTS;
DROP TABLE js_gen_table CASCADE CONSTRAINTS;
DROP TABLE js_sys_company_office CASCADE CONSTRAINTS;
DROP TABLE js_sys_employee_office CASCADE CONSTRAINTS;
DROP TABLE js_sys_employee_post CASCADE CONSTRAINTS;
DROP TABLE js_sys_user_data_scope CASCADE CONSTRAINTS;
DROP TABLE js_sys_user_role CASCADE CONSTRAINTS;
@@ -276,6 +277,17 @@ CREATE TABLE js_sys_employee
);
-- 员工附属机构关系表
CREATE TABLE js_sys_employee_office
(
id varchar2(64) NOT NULL UNIQUE,
emp_code varchar2(64) NOT NULL,
office_code varchar2(64) NOT NULL,
post_code varchar2(64),
PRIMARY KEY (emp_code, office_code)
);
-- 员工与岗位关联表
CREATE TABLE js_sys_employee_post
(
@@ -503,7 +515,7 @@ CREATE TABLE js_sys_msg_inner_record
(
id varchar2(64) NOT NULL,
msg_inner_id varchar2(64) NOT NULL,
receive_user_code varchar2(64),
receive_user_code varchar2(64) NOT NULL,
receive_user_name varchar2(100) NOT NULL,
read_status char(1) NOT NULL,
read_date timestamp,
@@ -1104,6 +1116,11 @@ COMMENT ON COLUMN js_sys_employee.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_employee.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_employee.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_employee.corp_name IS '租户名称';
COMMENT ON TABLE js_sys_employee_office IS '员工附属机构关系表';
COMMENT ON COLUMN js_sys_employee_office.id IS '编号';
COMMENT ON COLUMN js_sys_employee_office.emp_code IS '员工编码';
COMMENT ON COLUMN js_sys_employee_office.office_code IS '机构编码';
COMMENT ON COLUMN js_sys_employee_office.post_code IS '岗位编码';
COMMENT ON TABLE js_sys_employee_post IS '员工与岗位关联表';
COMMENT ON COLUMN js_sys_employee_post.emp_code IS '员工编码';
COMMENT ON COLUMN js_sys_employee_post.post_code IS '岗位编码';

View File

@@ -4,6 +4,7 @@
DROP TABLE IF EXISTS js_gen_table_column;
DROP TABLE IF EXISTS js_gen_table;
DROP TABLE IF EXISTS js_sys_company_office;
DROP TABLE IF EXISTS js_sys_employee_office;
DROP TABLE IF EXISTS js_sys_employee_post;
DROP TABLE IF EXISTS js_sys_user_data_scope;
DROP TABLE IF EXISTS js_sys_user_role;
@@ -276,6 +277,17 @@ CREATE TABLE js_sys_employee
) WITHOUT OIDS;
-- 员工附属机构关系表
CREATE TABLE js_sys_employee_office
(
id varchar(64) NOT NULL UNIQUE,
emp_code varchar(64) NOT NULL,
office_code varchar(64) NOT NULL,
post_code varchar(64),
PRIMARY KEY (emp_code, office_code)
) WITHOUT OIDS;
-- 员工与岗位关联表
CREATE TABLE js_sys_employee_post
(
@@ -503,7 +515,7 @@ CREATE TABLE js_sys_msg_inner_record
(
id varchar(64) NOT NULL,
msg_inner_id varchar(64) NOT NULL,
receive_user_code varchar(64),
receive_user_code varchar(64) NOT NULL,
receive_user_name varchar(100) NOT NULL,
read_status char(1) NOT NULL,
read_date timestamp,
@@ -1104,6 +1116,11 @@ COMMENT ON COLUMN js_sys_employee.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_employee.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_employee.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_employee.corp_name IS '租户名称';
COMMENT ON TABLE js_sys_employee_office IS '员工附属机构关系表';
COMMENT ON COLUMN js_sys_employee_office.id IS '编号';
COMMENT ON COLUMN js_sys_employee_office.emp_code IS '员工编码';
COMMENT ON COLUMN js_sys_employee_office.office_code IS '机构编码';
COMMENT ON COLUMN js_sys_employee_office.post_code IS '岗位编码';
COMMENT ON TABLE js_sys_employee_post IS '员工与岗位关联表';
COMMENT ON COLUMN js_sys_employee_post.emp_code IS '员工编码';
COMMENT ON COLUMN js_sys_employee_post.post_code IS '岗位编码';

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>4.1.4-SNAPSHOT</version>
<version>4.1.5-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -70,7 +70,7 @@ public class FormAuthenticationFilter extends org.apache.shiro.web.filter.authc.
protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {
String username = getUsername(request, response); // 用户名
String password = getPassword(request); // 登录密码
boolean rememberMe = isRememberMe(request); // 记住我(记住密码
boolean rememberMe = isRememberMe(request); // 记住我(自动登录
String host = getHost(request); // 登录主机
String captcha = getCaptcha(request); // 登录验证码
Map<String, Object> paramMap = ServletUtils.getExtParams(request); // 登录附加参数

View File

@@ -73,6 +73,14 @@ public class PermissionsAuthorizationFilter extends org.apache.shiro.web.filter.
}
if (ServletUtils.isAjaxRequest(req)) {
try {
String uri = req.getRequestURI();
if (StringUtils.endsWithIgnoreCase(uri, ".json")
&& !StringUtils.endsWithIgnoreCase(loginUrl, ".json")){
loginUrl += ".json";
}else if (StringUtils.endsWithIgnoreCase(uri, ".xml")
&& !StringUtils.endsWithIgnoreCase(loginUrl, ".xml")){
loginUrl += ".xml";
}
request.getRequestDispatcher(loginUrl).forward(
new GetHttpServletRequestWrapper(request), response);
} catch (ServletException e) {

View File

@@ -5,8 +5,11 @@ package com.jeesite.common.shiro.realm;
import javax.servlet.http.HttpServletRequest;
import org.apache.shiro.authc.AuthenticationToken;
import com.jeesite.common.codec.EncodeUtils;
import com.jeesite.common.codec.Sha1Utils;
import com.jeesite.common.shiro.authc.FormToken;
import com.jeesite.common.utils.SpringUtils;
import com.jeesite.modules.sys.entity.Log;
import com.jeesite.modules.sys.entity.User;
@@ -35,6 +38,22 @@ public class AuthorizingRealm extends BaseAuthorizingRealm {
// this.setCredentialsMatcher(matcher);
}
/**
* 获取登录令牌
*/
@Override
protected FormToken getFormToken(AuthenticationToken authcToken) {
return super.getFormToken(authcToken);
}
/**
* 获取用户信息
*/
@Override
protected User getUserInfo(FormToken token) {
return super.getUserInfo(token);
}
/**
* 生成密文密码生成随机的16位salt并经过1024次 sha-1 hash
* @param plainPassword 明文密码

View File

@@ -159,8 +159,8 @@ public class MsgInnerService extends CrudService<MsgInnerDao, MsgInner> {
if (MsgPush.TYPE_PC.equals(type)){
msgContent = new PcMsgContent();
msgContent.setContent("你有一条内部消息,点击“详情”进行查阅。");
((PcMsgContent)msgContent).addButton(new String[]{
"详情", "/a/msg/msgInner/view?id="+msgInner.getId()});
((PcMsgContent)msgContent).addButton(new String[]{"详情",
Global.getAdminPath()+"/msg/msgInner/view?id="+msgInner.getId()});
}else if (MsgPush.TYPE_APP.equals(type)){
msgContent = new AppMsgContent();
}else if (MsgPush.TYPE_SMS.equals(type)){

View File

@@ -4,7 +4,6 @@
package com.jeesite.modules.sys.dao;
import com.jeesite.common.dao.TreeDao;
import com.jeesite.common.datasource.DataSourceHolder;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.sys.entity.Area;
@@ -13,7 +12,7 @@ import com.jeesite.modules.sys.entity.Area;
* @author ThinkGem
* @version 2017-03-22
*/
@MyBatisDao(dataSourceName=DataSourceHolder.DEFAULT)
@MyBatisDao
public interface AreaDao extends TreeDao<Area> {
}

View File

@@ -4,7 +4,6 @@
package com.jeesite.modules.sys.dao;
import com.jeesite.common.dao.TreeDao;
import com.jeesite.common.datasource.DataSourceHolder;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.sys.entity.Company;
@@ -13,7 +12,7 @@ import com.jeesite.modules.sys.entity.Company;
* @author ThinkGem
* @version 2017-03-12
*/
@MyBatisDao(dataSourceName=DataSourceHolder.DEFAULT)
@MyBatisDao
public interface CompanyDao extends TreeDao<Company> {
}

View File

@@ -4,7 +4,6 @@
package com.jeesite.modules.sys.dao;
import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.datasource.DataSourceHolder;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.sys.entity.CompanyOffice;
@@ -13,7 +12,7 @@ import com.jeesite.modules.sys.entity.CompanyOffice;
* @author ThinkGem
* @version 2017-03-23
*/
@MyBatisDao(dataSourceName=DataSourceHolder.DEFAULT)
@MyBatisDao
public interface CompanyOfficeDao extends CrudDao<CompanyOffice> {
}

View File

@@ -6,7 +6,6 @@ package com.jeesite.modules.sys.dao;
import java.util.List;
import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.datasource.DataSourceHolder;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.sys.entity.EmpUser;
@@ -15,7 +14,7 @@ import com.jeesite.modules.sys.entity.EmpUser;
* @author ThinkGem
* @version 2017-03-25
*/
@MyBatisDao(dataSourceName=DataSourceHolder.DEFAULT)
@MyBatisDao
public interface EmpUserDao extends CrudDao<EmpUser> {
/**

View File

@@ -4,7 +4,6 @@
package com.jeesite.modules.sys.dao;
import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.datasource.DataSourceHolder;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.sys.entity.Employee;
@@ -14,7 +13,7 @@ import com.jeesite.modules.sys.entity.Employee;
* @version 2017-03-25
* 通过 UserUtils.loadRefObj() 加载引用类型对象时需要给MyBatisDao指定引用entity类型。
*/
@MyBatisDao(entity=Employee.class, dataSourceName=DataSourceHolder.DEFAULT)
@MyBatisDao(entity=Employee.class)
public interface EmployeeDao extends CrudDao<Employee> {
}

View File

@@ -0,0 +1,18 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.modules.sys.dao;
import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.sys.entity.EmployeeOffice;
/**
* 员工附属机构关系表DAO接口
* @author ThinkGem
* @version 2019-04-29
*/
@MyBatisDao
public interface EmployeeOfficeDao extends CrudDao<EmployeeOffice> {
}

View File

@@ -4,7 +4,6 @@
package com.jeesite.modules.sys.dao;
import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.datasource.DataSourceHolder;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.sys.entity.EmployeePost;
@@ -13,7 +12,7 @@ import com.jeesite.modules.sys.entity.EmployeePost;
* @author ThinkGem
* @version 2017-03-25
*/
@MyBatisDao(dataSourceName=DataSourceHolder.DEFAULT)
@MyBatisDao
public interface EmployeePostDao extends CrudDao<EmployeePost> {
}

View File

@@ -4,7 +4,6 @@
package com.jeesite.modules.sys.dao;
import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.datasource.DataSourceHolder;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.sys.entity.Log;
@@ -13,7 +12,7 @@ import com.jeesite.modules.sys.entity.Log;
* @author ThinkGem
* @version 2017-03-19
*/
@MyBatisDao(dataSourceName=DataSourceHolder.DEFAULT)
@MyBatisDao
public interface LogDao extends CrudDao<Log> {
}

View File

@@ -4,7 +4,6 @@
package com.jeesite.modules.sys.dao;
import com.jeesite.common.dao.TreeDao;
import com.jeesite.common.datasource.DataSourceHolder;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.sys.entity.Office;
@@ -13,7 +12,7 @@ import com.jeesite.modules.sys.entity.Office;
* @author ThinkGem
* @version 2017-03-23
*/
@MyBatisDao(dataSourceName=DataSourceHolder.DEFAULT)
@MyBatisDao
public interface OfficeDao extends TreeDao<Office> {
}

View File

@@ -4,7 +4,6 @@
package com.jeesite.modules.sys.dao;
import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.datasource.DataSourceHolder;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.sys.entity.Post;
@@ -13,7 +12,7 @@ import com.jeesite.modules.sys.entity.Post;
* @author ThinkGem
* @version 2017-03-25
*/
@MyBatisDao(dataSourceName=DataSourceHolder.DEFAULT)
@MyBatisDao
public interface PostDao extends CrudDao<Post> {
}

View File

@@ -61,8 +61,7 @@ public class InitCoreData extends BaseInitDataTests {
@Override
public void begin() {
super.begin();
excelFile = InitCoreData.class.getName().replaceAll("\\.", "/")+".xlsx";
super.begin(InitCoreData.class);
}
/**

View File

@@ -96,7 +96,7 @@ public class EmpUser extends User {
public Employee getEmployee(){
Employee employee = (Employee)super.getRefObj();
if (employee == null){
employee = new Employee();
employee = new Employee(getRefCode());
super.setRefObj(employee);
}
return employee;

View File

@@ -61,6 +61,7 @@ public class Employee extends DataEntity<Employee> {
private String postCode; // 根据职位查询
private List<EmployeePost> employeePostList = ListUtils.newArrayList(); // 关联岗位信息
private List<EmployeeOffice> employeeOfficeList = ListUtils.newArrayList(); // 关联附属机构信息
public Employee() {
this(null);
@@ -150,5 +151,13 @@ public class Employee extends DataEntity<Employee> {
}
}
}
public List<EmployeeOffice> getEmployeeOfficeList() {
return employeeOfficeList;
}
public void setEmployeeOfficeList(List<EmployeeOffice> employeeOfficeList) {
this.employeeOfficeList = employeeOfficeList;
}
}

View File

@@ -0,0 +1,111 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.modules.sys.entity;
import org.hibernate.validator.constraints.Length;
import com.jeesite.common.entity.DataEntity;
import com.jeesite.common.mybatis.annotation.Column;
import com.jeesite.common.mybatis.annotation.JoinTable;
import com.jeesite.common.mybatis.annotation.Table;
import com.jeesite.common.mybatis.annotation.JoinTable.Type;
import com.jeesite.common.mybatis.mapper.query.QueryType;
/**
* 附属机构Entity
* @author ThinkGem
* @version 2019-04-29
*/
@Table(name="${_prefix}sys_employee_office", alias="a", columns={
@Column(name="id", attrName="id", label="编码", isPK=true),
@Column(name="emp_code", attrName="empCode", label="员工编码"),
@Column(name="office_code", attrName="officeCode", label="机构编码"),
@Column(name="post_code", attrName="postCode", label="岗位编码"),
}, joinTable={
@JoinTable(type=Type.LEFT_JOIN, entity=Office.class, alias="o",
on="o.office_code=a.office_code", attrName="this",
columns={
@Column(name="office_code", label="机构编码", isPK=true),
@Column(name="parent_codes",label="所有父级编码", queryType=QueryType.LIKE),
@Column(name="office_name", label="机构名称", isQuery=false),
}),
@JoinTable(type=Type.LEFT_JOIN, entity=Post.class, alias="p",
on="p.post_code=a.post_code", attrName="this",
columns={
@Column(name="post_code", label="岗位编码", isPK=true),
@Column(name="post_name", label="岗位名称", isQuery=false),
}),
}, orderBy="a.id ASC"
)
public class EmployeeOffice extends DataEntity<EmployeeOffice> {
private static final long serialVersionUID = 1L;
private String empCode; // 员工编码
private String officeCode; // 机构编码
private String postCode; // 岗位编码
private String parentCodes; // 机构所有上级编码(数据权限用)
private String officeName; // 机构名称(联合查询项)
private String postName; // 岗位名称(联合查询项)
public EmployeeOffice() {
this(null, null);
}
public EmployeeOffice(String empCode, String officeCode){
super(null);
this.empCode = empCode;
this.officeCode = officeCode;
}
public String getEmpCode() {
return empCode;
}
public void setEmpCode(String empCode) {
this.empCode = empCode;
}
public String getOfficeCode() {
return officeCode;
}
public void setOfficeCode(String officeCode) {
this.officeCode = officeCode;
}
@Length(min=0, max=64, message="岗位编码长度不能超过 64 个字符")
public String getPostCode() {
return postCode;
}
public void setPostCode(String postCode) {
this.postCode = postCode;
}
public String getParentCodes() {
return parentCodes;
}
public void setParentCodes(String parentCodes) {
this.parentCodes = parentCodes;
}
public String getOfficeName() {
return officeName;
}
public void setOfficeName(String officeName) {
this.officeName = officeName;
}
public String getPostName() {
return postName;
}
public void setPostName(String postName) {
this.postName = postName;
}
}

View File

@@ -8,6 +8,7 @@ import java.util.List;
import com.jeesite.common.entity.Page;
import com.jeesite.common.service.api.CrudServiceApi;
import com.jeesite.modules.sys.entity.Employee;
import com.jeesite.modules.sys.entity.EmployeeOffice;
import com.jeesite.modules.sys.entity.EmployeePost;
/**
@@ -45,5 +46,10 @@ public interface EmployeeService extends CrudServiceApi<Employee> {
* 查询当前员工关联的岗位信息
*/
public List<EmployeePost> findEmployeePostList(Employee employee);
/**
* 查询当前员工关联的附属机构信息
*/
public List<EmployeeOffice> findEmployeeOfficeList(Employee employee);
}

View File

@@ -19,8 +19,10 @@ import com.jeesite.common.service.ServiceException;
import com.jeesite.common.utils.excel.ExcelImport;
import com.jeesite.common.validator.ValidatorUtils;
import com.jeesite.modules.sys.dao.EmpUserDao;
import com.jeesite.modules.sys.dao.EmployeeOfficeDao;
import com.jeesite.modules.sys.entity.EmpUser;
import com.jeesite.modules.sys.entity.Employee;
import com.jeesite.modules.sys.entity.EmployeeOffice;
import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.service.EmpUserService;
import com.jeesite.modules.sys.service.EmployeeService;
@@ -39,9 +41,10 @@ public class EmpUserServiceSupport extends CrudService<EmpUserDao, EmpUser>
@Autowired
private UserService userService;
@Autowired
private EmployeeService employeeService;
@Autowired
private EmployeeOfficeDao employeeOfficeDao;
/**
* 获取单条数据
@@ -131,6 +134,17 @@ public class EmpUserServiceSupport extends CrudService<EmpUserDao, EmpUser>
// 3、保存员工
employee.setIsNewRecord(user.getIsNewRecord());
employeeService.save(employee);
// 4、保存附属机构
EmployeeOffice employeeOfficeWhere = new EmployeeOffice();
employeeOfficeWhere.setEmpCode(employee.getEmpCode());
employeeOfficeDao.deleteByEntity(employeeOfficeWhere);
if (employee.getEmployeeOfficeList().size() > 0){
employee.getEmployeeOfficeList().forEach(employeeOffice -> {
employeeOffice.setId(IdGen.nextId());
employeeOffice.setEmpCode(employee.getEmpCode());
});
employeeOfficeDao.insertBatch(employee.getEmployeeOfficeList());
}
}
/**

View File

@@ -12,8 +12,10 @@ import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.entity.Page;
import com.jeesite.common.service.CrudService;
import com.jeesite.modules.sys.dao.EmployeeDao;
import com.jeesite.modules.sys.dao.EmployeeOfficeDao;
import com.jeesite.modules.sys.dao.EmployeePostDao;
import com.jeesite.modules.sys.entity.Employee;
import com.jeesite.modules.sys.entity.EmployeeOffice;
import com.jeesite.modules.sys.entity.EmployeePost;
import com.jeesite.modules.sys.service.EmployeeService;
@@ -25,9 +27,11 @@ import com.jeesite.modules.sys.service.EmployeeService;
@Transactional(readOnly=true)
public class EmployeeServiceSupport extends CrudService<EmployeeDao, Employee>
implements EmployeeService{
@Autowired
private EmployeePostDao employeePostDao;
@Autowired
private EmployeeOfficeDao employeeOfficeDao;
/**
* 获取单条数据
@@ -86,4 +90,13 @@ public class EmployeeServiceSupport extends CrudService<EmployeeDao, Employee>
employeePost.setEmpCode(employee.getEmpCode());
return employeePostDao.findList(employeePost);
}
/**
* 查询当前员工关联的附属机构信息
*/
public List<EmployeeOffice> findEmployeeOfficeList(Employee employee){
EmployeeOffice employeeOffice = new EmployeeOffice();
employeeOffice.setEmpCode(employee.getEmpCode());
return employeeOfficeDao.findList(employeeOffice);
}
}

View File

@@ -5,13 +5,16 @@ package com.jeesite.modules.sys.utils;
import java.util.List;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.utils.SpringUtils;
import com.jeesite.modules.sys.entity.Company;
import com.jeesite.modules.sys.entity.Employee;
import com.jeesite.modules.sys.entity.EmployeeOffice;
import com.jeesite.modules.sys.entity.Office;
import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.service.CompanyService;
import com.jeesite.modules.sys.service.EmployeeService;
import com.jeesite.modules.sys.service.OfficeService;
/**
@@ -28,6 +31,7 @@ public class EmpUtils {
// 部门和公司缓存常量
public static final String CACHE_OFFICE_ALL_LIST = "officeAllList";
public static final String CACHE_COMPANY_ALL_LIST = "companyAllList";
public static final String CACHE_COMPANY_OFFICE_LIST = "employeeOfficeList";
/**
* 静态内部类,延迟加载,懒汉式,线程安全的单例模式
@@ -35,6 +39,7 @@ public class EmpUtils {
private static final class Static {
private static OfficeService officeService = SpringUtils.getBean(OfficeService.class);
private static CompanyService companyService = SpringUtils.getBean(CompanyService.class);
private static EmployeeService employeeService = SpringUtils.getBean(EmployeeService.class);
}
/**
@@ -45,7 +50,7 @@ public class EmpUtils {
User user = UserUtils.getUser();
Employee employee = null;
if (User.USER_TYPE_EMPLOYEE.equals(user.getUserType())){
employee = (Employee)UserUtils.getUser().getRefObj();
employee = (Employee)user.getRefObj();
}
if (employee == null){
employee = new Employee();
@@ -54,10 +59,43 @@ public class EmpUtils {
}
/**
* 获取当前部门对象
* 获取当前附属部门对象列表
*/
public static Office getOffice(){
return getEmployee().getOffice();
public static List<EmployeeOffice> getEmployeeOfficeList(){
List<EmployeeOffice> list = UserUtils.getCache(CACHE_COMPANY_OFFICE_LIST);
if (list == null){
list = Static.employeeService.findEmployeeOfficeList(getEmployee());
UserUtils.putCache(CACHE_COMPANY_OFFICE_LIST, list);
}
return list;
}
/**
* 获取所有部门编码,包括附属部门(数据权限用)
* @return
* @author ThinkGem
*/
public static String[] getOfficeCodes(){
List<String> list = ListUtils.newArrayList();
list.add(getOffice().getOfficeCode());
getEmployeeOfficeList().forEach(e -> {
list.add(e.getOfficeCode());
});
return list.toArray(new String[list.size()]);
}
/**
* 获取所有部门编码,包括附属部门(数据权限用)
* @return
* @author ThinkGem
*/
public static String[] getOfficeParentCodess(){
List<String> list = ListUtils.newArrayList();
list.add(getOffice().getParentCodes());
getEmployeeOfficeList().forEach(e -> {
list.add(e.getParentCodes());
});
return list.toArray(new String[list.size()]);
}
/**
@@ -74,6 +112,13 @@ public class EmpUtils {
}
return null;
}
/**
* 获取当前员工附属部门
*/
public static Office getOffice(){
return getEmployee().getOffice();
}
//
// /**
// * 获取当前用户有权限访问的机构

View File

@@ -63,7 +63,7 @@ public class AreaController extends BaseController {
* 查询区域数据
* @param area
*/
@RequiresPermissions("user")
@RequiresPermissions("sys:area:view")
@RequestMapping(value = "listData")
@ResponseBody
public List<Area> listData(Area area) {

View File

@@ -70,7 +70,7 @@ public class CompanyController extends BaseController {
* 查询公司数据
* @param company
*/
@RequiresPermissions("user")
@RequiresPermissions("sys:company:view")
@RequestMapping(value = "listData")
@ResponseBody
public List<Company> listData(Company company, String ctrlPermi) {
@@ -209,7 +209,7 @@ public class CompanyController extends BaseController {
List<Map<String, Object>> mapList = ListUtils.newArrayList();
Company where = new Company();
where.setStatus(Company.STATUS_NORMAL);
if (!(isAll != null && isAll)){
if (!(isAll != null && isAll) || Global.isStrictMode()){
companyService.addDataScopeFilter(where, ctrlPermi);
}
List<Company> list = companyService.findList(where);

View File

@@ -24,6 +24,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.fasterxml.jackson.annotation.JsonView;
import com.jeesite.common.codec.DesUtils;
import com.jeesite.common.config.Global;
import com.jeesite.common.lang.StringUtils;
@@ -344,6 +345,7 @@ public class LoginController extends BaseController{
@RequiresPermissions("user")
@RequestMapping(value = "menuTree")
@ResponseBody
@JsonView(Menu.SimpleView.class)
public List<Menu> menuTree(String parentCode) {
if (StringUtils.isNotBlank(parentCode)){
return UserUtils.getMenuListByParentCode(parentCode);

View File

@@ -67,7 +67,7 @@ public class OfficeController extends BaseController {
* 查询机构数据
* @param office
*/
@RequiresPermissions("user")
@RequiresPermissions("sys:company:view")
@RequestMapping(value = "listData")
@ResponseBody
public List<Office> listData(Office office, String ctrlPermi) {
@@ -222,7 +222,7 @@ public class OfficeController extends BaseController {
Office where = new Office();
where.setStatus(Office.STATUS_NORMAL);
where.setCompanyCode(companyCode);
if (!(isAll != null && isAll)){
if (!(isAll != null && isAll) || Global.isStrictMode()){
officeService.addDataScopeFilter(where, ctrlPermi);
}
List<Office> list = officeService.findList(where);

View File

@@ -131,7 +131,6 @@ public class PostController extends BaseController {
/**
* 获取岗位树结构数据
* @param isAll 是否显示所有机构true不进行权限过滤
* @param isShowCode 是否显示编码true or 1显示在左侧2显示在右侧false or null不显示
* @return
*/

View File

@@ -95,7 +95,7 @@ public class EmpUserController extends BaseController {
public Page<EmpUser> listData(EmpUser empUser, Boolean isAll, String ctrlPermi, HttpServletRequest request, HttpServletResponse response) {
empUser.getEmployee().getOffice().setIsQueryChildren(true);
empUser.getEmployee().getCompany().setIsQueryChildren(true);
if (!(isAll != null && isAll)){
if (!(isAll != null && isAll) || Global.isStrictMode()){
empUserService.addDataScopeFilter(empUser, ctrlPermi);
}
empUser.setPage(new Page<>(request, response));
@@ -123,9 +123,11 @@ public class EmpUserController extends BaseController {
Post post = new Post();
model.addAttribute("postList", postService.findList(post));
// 获取当前用户所拥有的岗位
if (StringUtils.isNotBlank(employee.getEmpCode())){
// 获取当前用户所拥有的岗位
employee.setEmployeePostList(employeeService.findEmployeePostList(employee));
// 获取当前员工关联的附属机构信息
employee.setEmployeeOfficeList(employeeService.findEmployeeOfficeList(employee));
}
// 获取当前编辑用户的角色和权限
@@ -175,7 +177,7 @@ public class EmpUserController extends BaseController {
public void exportData(EmpUser empUser, Boolean isAll, String ctrlPermi, HttpServletResponse response) {
empUser.getEmployee().getOffice().setIsQueryChildren(true);
empUser.getEmployee().getCompany().setIsQueryChildren(true);
if (!(isAll != null && isAll)){
if (!(isAll != null && isAll) || Global.isStrictMode()){
empUserService.addDataScopeFilter(empUser, ctrlPermi);
}
List<EmpUser> list = empUserService.findList(empUser);
@@ -367,7 +369,7 @@ public class EmpUserController extends BaseController {
empUser.setRoleCode(roleCode);
empUser.setStatus(User.STATUS_NORMAL);
empUser.setUserType(User.USER_TYPE_EMPLOYEE);
if (!(isAll != null && isAll)) {
if (!(isAll != null && isAll) || Global.isStrictMode()) {
empUserService.addDataScopeFilter(empUser, ctrlPermi);
}
List<EmpUser> list = empUserService.findList(empUser);

View File

@@ -50,7 +50,7 @@ public class SecAdminController extends BaseController {
return "modules/sys/user/secAdminList";
}
@RequiresPermissions("user")
@RequiresPermissions("sys:secAdmin:view")
@RequestMapping(value = "listData")
@ResponseBody
public Page<User> listData(User user, HttpServletRequest request, HttpServletResponse response) {

View File

@@ -47,8 +47,14 @@ jdbc:
# JTA 分布式事务v4.0.4+
jta:
enabled: false
# 事务超时时间单位毫秒3分钟
transactionTimeout: 180000
# 注意:如果报 oracle.jdbc.xa.OracleXAResource.recover 错误,则需要授权如下:
# grant select on sys.dba_pending_transactions to jeesite;
# grant select on sys.pending_trans$ to jeesite;
# grant select on sys.dba_2pc_pending to jeesite;
# grant execute on sys.dbms_system to jeesite;
# 事务超时时间单位秒30分钟v4.1.5+
transactionTimeout: 1800
# 表名前缀
tablePrefix: js_
@@ -147,6 +153,9 @@ user:
remarks: ""
}]
# 管理功能的控制权限类型1拥有的权限 2管理的权限v4.1.5+
adminCtrlPermi: 2
# 多租户模式SAAS模式专业版
useCorpModel: false
@@ -160,14 +169,18 @@ user:
# 角色管理
role:
# 扩展数据权限定义3本部门4本公司5本部门和本公司
# 如果 ctrlTypeClass 为 NONE则代表是不控制该类型权限
extendDataScopes: >
{
3: {
Office: {
#控制类型的类名 : "用来获取控制表名和主键,如果为 NONE则代表是不控制该类型权限",
ctrlTypeClass: "com.jeesite.modules.sys.entity.Office",
ctrlDataAttrName: "currentUser.refObj.office.officeCode",
ctrlDataParentCodesAttrName: "currentUser.refObj.office.parentCodes"
#控制数据的类名: "指定一个静态类名,方便 ctrlDataAttrName 得到权限数据,如:当前部门编码、公司编码",
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
#控制数据的类名下的属性名 : "可看做类下的 get 方法EmpUtils.getOffices(),支持返回字符串或字符串数组类型",
ctrlDataAttrName: "officeCodes",
#控制数据的所有上级编码 : "用于控制数据为树表的情况,为数组时,必须与 ctrlDataAttrName 返回的长度相同,不是树表设置为空",
ctrlDataParentCodesAttrName: "officeParentCodess"
},
Company: {
ctrlTypeClass: "NONE"
@@ -179,20 +192,23 @@ role:
},
Company: {
ctrlTypeClass: "com.jeesite.modules.sys.entity.Company",
ctrlDataAttrName: "currentUser.refObj.company.companyCode",
ctrlDataParentCodesAttrName: "currentUser.refObj.company.parentCodes"
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
ctrlDataAttrName: "company.companyCode",
ctrlDataParentCodesAttrName: "company.parentCodes"
}
},
5: {
Office: {
ctrlTypeClass: "com.jeesite.modules.sys.entity.Office",
ctrlDataAttrName: "currentUser.refObj.office.officeCode",
ctrlDataParentCodesAttrName: "currentUser.refObj.office.parentCodes"
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
ctrlDataAttrName: "officeCodes",
ctrlDataParentCodesAttrName: "officeParentCodess"
},
Company: {
ctrlTypeClass: "com.jeesite.modules.sys.entity.Company",
ctrlDataAttrName: "currentUser.refObj.company.companyCode",
ctrlDataParentCodesAttrName: "currentUser.refObj.company.parentCodes"
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
ctrlDataAttrName: "company.companyCode",
ctrlDataParentCodesAttrName: "company.parentCodes"
}
}
}
@@ -414,7 +430,7 @@ mybatis:
# Web 相关
web:
# MVC 视图相关
view:
@@ -455,12 +471,18 @@ web:
# 静态文件后缀排除的url路径指定哪些uri路径不进行静态文件过滤。
staticFileExcludeUri: /druid/
# 静态资源路径前缀可做CDN加速优化
staticPrefix: /static
# 严格模式(更严格的数据安全验证)
strictMode: false
# 自定义正则表达式验证(主键、登录名)
validator:
id: '[a-zA-Z0-9_\-/#\u4e00-\u9fa5]{0,64}'
user.loginCode: '[a-zA-Z0-9_\u4e00-\u9fa5]{4,20}'
# 核心模块的Web功能仅作为微服务时设为false
core:
enabled: true

View File

@@ -14,6 +14,7 @@
<logger name="com.atomikos.icatch.provider.imp.AssemblerImp" level="ERROR" />
<logger name="com.atomikos.jdbc.AbstractDataSourceBean" level="ERROR" />
<logger name="com.atomikos.jdbc.AtomikosConnectionProxy" level="ERROR" />
<logger name="com.atomikos.recovery.xa.XaResourceRecoveryManager" level="ERROR" />
<!-- <logger name="org.springframework.transaction.support.TransactionSynchronizationManager" level="TRACE" /> -->
<logger name="springfox.documentation.spring.web.readers.parameter.ParameterDataTypeReader" level="ERROR" />

View File

@@ -0,0 +1,18 @@
-- 新增文件管理模块
INSERT INTO ${_prefix}sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', getdate(), 'system', getdate(), NULL);
-- 员工附属机构关系表
CREATE TABLE [${_prefix}sys_employee_office]
(
[id] varchar(64) NOT NULL UNIQUE,
[emp_code] varchar(64) NOT NULL,
[office_code] varchar(64) NOT NULL,
[post_code] varchar(64),
PRIMARY KEY ([emp_code], [office_code])
);
-- 新增日语(日本语)语言包
INSERT INTO ${_prefix}sys_dict_data(dict_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, dict_label, dict_value, dict_type, is_sys, description, css_style, css_class, status, create_by, create_date, update_by, update_date, remarks, corp_code, corp_name, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4)
VALUES ('1126375062364020736', '0', '0,', 60, '0000000060,', '1', 0, '日本語', '日本語', 'ja_JP', 'sys_lang_type', '1', '', '', '', '0', 'system', getdate(), 'system', getdate(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

View File

@@ -0,0 +1,19 @@
-- 新增文件管理模块
INSERT INTO ${_prefix}sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', now(), 'system', now(), NULL);
-- 员工附属机构关系表
CREATE TABLE ${_prefix}sys_employee_office
(
id varchar(64) NOT NULL COMMENT '编号',
emp_code varchar(64) NOT NULL COMMENT '员工编码',
office_code varchar(64) NOT NULL COMMENT '机构编码',
post_code varchar(64) COMMENT '岗位编码',
PRIMARY KEY (emp_code, office_code),
UNIQUE (id)
) COMMENT = '员工附属机构关系表';
-- 新增日语(日本语)语言包
INSERT INTO ${_prefix}sys_dict_data(dict_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, dict_label, dict_value, dict_type, is_sys, description, css_style, css_class, status, create_by, create_date, update_by, update_date, remarks, corp_code, corp_name, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4)
VALUES ('1126375062364020736', '0', '0,', 60, '0000000060,', '1', 0, '日本語', '日本語', 'ja_JP', 'sys_lang_type', '1', '', '', '', '0', 'system', now(), 'system', now(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

View File

@@ -0,0 +1,23 @@
-- 新增文件管理模块
INSERT INTO ${_prefix}sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', sysdate, 'system', sysdate, NULL);
-- 员工附属机构关系表
CREATE TABLE ${_prefix}sys_employee_office
(
id varchar2(64) NOT NULL UNIQUE,
emp_code varchar2(64) NOT NULL,
office_code varchar2(64) NOT NULL,
post_code varchar2(64),
PRIMARY KEY (emp_code, office_code)
);
COMMENT ON TABLE ${_prefix}sys_employee_office IS '员工附属机构关系表';
COMMENT ON COLUMN ${_prefix}sys_employee_office.id IS '编号';
COMMENT ON COLUMN ${_prefix}sys_employee_office.emp_code IS '员工编码';
COMMENT ON COLUMN ${_prefix}sys_employee_office.office_code IS '机构编码';
COMMENT ON COLUMN ${_prefix}sys_employee_office.post_code IS '岗位编码';
-- 新增日语(日本语)语言包
INSERT INTO ${_prefix}sys_dict_data(dict_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, dict_label, dict_value, dict_type, is_sys, description, css_style, css_class, status, create_by, create_date, update_by, update_date, remarks, corp_code, corp_name, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4)
VALUES ('1126375062364020736', '0', '0,', 60, '0000000060,', '1', 0, '日本語', '日本語', 'ja_JP', 'sys_lang_type', '1', '', '', '', '0', 'system', sysdate, 'system', sysdate, '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

View File

@@ -0,0 +1,23 @@
-- 新增文件管理模块
INSERT INTO ${_prefix}sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', now(), 'system', now(), NULL);
-- 员工附属机构关系表
CREATE TABLE ${_prefix}sys_employee_office
(
id varchar(64) NOT NULL UNIQUE,
emp_code varchar(64) NOT NULL,
office_code varchar(64) NOT NULL,
post_code varchar(64),
PRIMARY KEY (emp_code, office_code)
) WITHOUT OIDS;
COMMENT ON TABLE ${_prefix}sys_employee_office IS '员工附属机构关系表';
COMMENT ON COLUMN ${_prefix}sys_employee_office.id IS '编号';
COMMENT ON COLUMN ${_prefix}sys_employee_office.emp_code IS '员工编码';
COMMENT ON COLUMN ${_prefix}sys_employee_office.office_code IS '机构编码';
COMMENT ON COLUMN ${_prefix}sys_employee_office.post_code IS '岗位编码';
-- 新增日语(日本语)语言包
INSERT INTO ${_prefix}sys_dict_data(dict_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, dict_label, dict_value, dict_type, is_sys, description, css_style, css_class, status, create_by, create_date, update_by, update_date, remarks, corp_code, corp_name, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4)
VALUES ('1126375062364020736', '0', '0,', 60, '0000000060,', '1', 0, '日本語', '日本語', 'ja_JP', 'sys_lang_type', '1', '', '', '', '0', 'system', now(), 'system', now(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

View File

@@ -10,4 +10,5 @@
4.1.1
4.1.2
4.1.3
4.1.4
4.1.4
4.1.5

View File

@@ -15,6 +15,7 @@ sys.login.accountDisabled=This Account has disabled.
sys.login.accountFreezed=This Account has freezed.
sys.login.accountAudited=This Account has audited.
sys.login.accountInvalid=This Account has invalid.
sys.login.tickOutMessage=The account has been removed by the administrator. Please login again.
sys.login.multiAddrMessage=The account has been logged in elsewhere. Please login again.
sys.login.failedNumLock=Login failed, try too many times, the account has been locked, please {0} in minutes after retry.

View File

@@ -0,0 +1,74 @@
# =========== 登录登出相关 ===========
sys.login.notLongIn=ログインしていないか、またはログインがタイムアウトしました。もう一度ログインしてください
sys.login.success=ログイン成功!
sys.login.getInfo=情報取得成功!
sys.login.failure=ログインID或いはパスワードに誤りがあります。もう一度にゅうしてください。
sys.login.error=申し訳ございません。ただいまシステムへアクセスできません。しばらくお待ちしてから再度お試してください!
sys.logout.success=ログアウト成功!
# =========== 账号登录相关 ===========
sys.login.accountIsBlank=ログインIDを入力してください。
sys.login.validCodeError=確認コードに誤りがあります。
sys.login.accountDisabled=このアカウントは無効されています。
sys.login.accountFreezed=このアカウントは凍結されています。
sys.login.accountAudited=このアカウントは審査中です。
sys.login.accountInvalid=このアカウントは存在しません。
sys.login.tickOutMessage=アカウントは管理者によってオンラインから削除されました。もう一度ログインしてください。
sys.login.multiAddrMessage=アカウントは他の場所でログインしています。もう一度ログインしてください。
sys.login.failedNumLock=ログインに失敗しました。試行回数が多すぎます。アカウントがロックされています。{0}分後にもう一度お試しください。
# =========== 用户管理相关 ===========
sys.user.loginCodeExists=ログインアカウントは既に存在します
sys.user.userCodeNotExists=ログインコードが存在しません
sys.user.userNameNotBlank=ユーザー名を入力してください
sys.user.infoSaveSuccess=ユーザー情報保存成功
# =========== 用户密码安全策略 ===========
sys.user.oldPasswordError=旧パスワードが間違っています。再入力してください
sys.user.confirmPasswrodError=新パスワードは新パスワード確認とは異なります。再入力してください
sys.user.passwordModifySuccess=パスワード変更に成功
sys.user.passwordModifyNotRepeat=新パスワードを以前の{0}回以内の設定記録と同じにすることはできません。
sys.user.passwordModifySecurityLevel=設定したパスワードが弱いパスワードであるため、パスワードの更新に失敗しました。
sys.user.initPasswordModifyTip=パスワードはまだ初期パスワードです、パスワードを変更してください
sys.user.passwordModifyTip=パスワードは{0}日間変更されていません。パスワードを変更してください。
sys.user.passwordError=ログインパスワードが正しくありません。再入力してください
sys.user.pwdQuestionModifySuccess=合言葉変更成功
sys.user.pwdQuestionAnswerError=合言葉違います
# =========== 错误页面相关 ===========
sys.error.400.title=リクエストパラメーターに誤りがあります
sys.error.400.message=リクエストパラメーターに誤りがあります。このパラメーターの解析ができません。
sys.error.403.title=権限がありません
sys.error.403.message=該当操作の権限がありません!
sys.error.403.message.p1=申し訳ございません。このページのアクセス権限がありません。適当ではない場合システム管理者へ連絡してください。
sys.error.404.title=ページが存在しません
sys.error.404.message=アクセスしたページは存在しません!
sys.error.404.message.p1=このエラーは次のような理由で発生する可能性があります:
sys.error.404.message.p2=アドレスURLが正しく入力されておらず、リンクの有効期限が切れています。
sys.error.404.message.p3=アクセスしているアドレスURLは:
sys.error.404.message.p4=質問がある場合は、管理者に連絡してください。.
sys.error.500.title=システム内部エラー
sys.error.500.message=アクセスしたページは問題が発生しました!
sys.error.500.message.p1=申し訳ございません。アクセスしたページは問題が発生しました,システム管理者へ連絡してください。
sys.error.returnButton=前のページに戻る
# =========== 文件上传相关 ===========
sys.file.uploadFileIsEmpty=サーバーに該当ファイルはありません。
sys.file.uploadValidNotBlank=ファイル検証番号とファイル名を入力してください。
sys.file.uploadValidImage=画像のみアップロードできます({0}
sys.file.uploadValidVideo=動画のみアップロードできます({0}
sys.file.uploadValidFile=文書のみをアップロードできます({0}
sys.file.uploadValidAll=フォーマットが正しくありません({0}
sys.file.uploadValidSize=サイズは{0}を超過できません
sys.file.uploadValidContent=ファイルコンテンツフォーマットは許可されていません。
sys.file.uploadSuccessSeconds=セカンドアップロード成功,時間{0}
sys.file.uploadSuccess=アップロード成功,時間{0}
sys.file.downloadFileNotExist=ファイルが存在しません!
sys.file.chunkUploading=アップロード中 {0}/{1}

View File

@@ -1,8 +1,6 @@
# =========== common ===========
英语=English
保\ 存=Save
关\ 闭=Close
确定=Ok
@@ -62,7 +60,7 @@
请上传=Please upload
开始上传=Start upload
或将照片拖到这里,最多可选\ {0}\ 张=Drag the photo here, at most \ {0} \ sheet
或将照片拖到这里,最多可选\ {0}\ 个=Drag the photo here, at most \ {0}
或将文件拖到这里,最多可选\ {0}\ 个=Drag the file here, at most \ {0}
# =========== iconselect ===========
@@ -78,6 +76,6 @@
验证码=Captcha
请填写验证码=Please fill in the captcha.
验证码不正确=The captcha is incorrect.
验证码不正确.=The captcha is incorrect.
看不清,点击图片刷新=Can't see clearly, click on the picture to refresh.

View File

@@ -0,0 +1,81 @@
# =========== common ===========
保\ 存=保存
关\ 闭=閉じる
确定=はい
清除=クリア
关闭=閉じる
查询=検索
重置=リセット
新增=作成
增行=行作成
刷新=リフレッシュ
查看=詳細
展开=展開
展开一级=一階層展開
折叠=収束
折叠全部=全部収束
操作=操作
更多操作=他の操作
基本信息=基本情報
详细信息=詳細情報
扩展字段=拡張項目
# =========== imageclip ===========
图片裁剪=画像編集
选择图片=画像選択
放大=拡大
缩小=縮小
向左移动=左へ移動
向右移动=右へ移動
向上移动=上へ移動
向下移动=下へ移動
逆时针旋转=左回り
顺时针旋转=右回り
水平反转=水平反転
左右反转=左右反転
# =========== treeselect ===========
选项选择=オプション選択
显示搜索=フィルター表示
隐藏搜索=フィルター非表示
关键字=キーワード
搜索=検索
展开=開く
折叠=隠す
不能选择根节点=ルート要素の選択ができません
不能选择父节点=親要素の選択ができません
请重新选择=もう一度選択してください
# =========== fileupload ===========
文件=ファイル
文档=ドキュメント
图片=画像
音频或视频=音声 or 動画
请上传=アップロード
开始上传=アップロード
或将照片拖到这里,最多可选\ {0}\ 张=画像をここにドラッグしてください、最大 \ {0} \ 枚可能
或将文件拖到这里,最多可选\ {0}\ 个=ファイルをここにドラッグしてください、最大 \ {0} \ 個可能
# =========== iconselect ===========
图标选择=アイコン選択
提示:双击选择图标。=ツールチープ: ダブルクリックでアイオンの選択ができます.
# =========== ueditor ===========
目录标题=ディレクトリタイトル
暂无大纲标题=アウトラインのタイトルはまだありません
# =========== validcode ===========
验证码=検証コード
请填写验证码=検証コードを入力してください
验证码不正确.=検証コードが正しくありません
看不清,点击图片刷新=はっきり見えない場合、画像更新をクリックしてリフレッシュできます.

View File

@@ -52,10 +52,10 @@
公共场所慎用,下次不需要再填写帐号=Use caution in public places.
记住账号=Remember account
公共场所慎用,下次不需要再填写帐号和密码=Use caution in public places.
记住密码=Remember password
自动登录=Remember password
登录验证成功,正在进入...=Login authentication successful, entering...
正在验证登录,请稍...=Verify login, please later...
正在验证登录,请稍...=Verify login, please wait...
立即登录=Login
注册账号=Register
@@ -71,6 +71,9 @@
修改密码=Change password
退出登录=Log out
系统切换=System switching
当前租户=Current tenant
租户切换=Tenant switch
在线人员=Online user
在线=Online
注销=Logout
@@ -114,6 +117,8 @@
组织机构=Office
新增用户=New user
编辑用户=Edit user
导出=Export
导入=Import
停用用户=Disable user
确认要停用该用户吗?=Are you sure want to disable this user?
@@ -165,6 +170,9 @@
所在岗位=Position
英文名=English name
附属机构=Auxiliary Office
附属岗位=Auxiliary Post
角色名称=Role name
角色编码=Role code

View File

@@ -0,0 +1,254 @@
# =========== 通用字典 ===========
=はい
=いいえ
=
=
正常=正常
删除=削除
停用=無効
冻结=凍結
待审=診察
驳回=却下
草稿=草稿
# =========== 通用字段 ===========
状态=状態
备注信息=備考
创建者=作成者
创建时间=作成日時
更新者=更新者
更新时间=更新日時
排序号=ソート
# =========== 功能标题 ===========
系统管理=システム管理
组织管理=組織管理
用户管理=ユーザー管理
机构管理=機構管理
公司管理=会社管理
岗位管理=職位管理
用户选择=ユーザー選択
机构选择=事務所選択
公司选择=会社選択
区域选择=区域選択
日期选择=日付選択
日期时间=日時
# =========== 登录页 ===========
登录=ログイン
请填写登录账号.=ログインIDを入力してください.
登录账号=ログインアカウント
登录密码,鼠标按下显示密码=押下するとパスワードを表示します.
请填写登录密码.=パスワードを入力してください.
登录密码=パスワード
公共场所慎用,下次不需要再填写帐号=次回からログインIDの入力が不要にします.
记住账号=ログインID記憶
公共场所慎用,下次不需要再填写帐号和密码=次回からパスワードの入力が不要にします.
自动登录=パスワード記憶
登录验证成功,正在进入...=ログイン中、少々お待ちください...
正在验证登录,请稍候...=登録を行っています...
立即登录=ログイン
注册账号=アカウント作成
忘记密码=パスワードを忘れた
# =========== 主框架页 ===========
仪表盘=計器盤
全屏=最大化
切换主题=テーマ切替
个人中心=マイページ
修改密码=パスワード変更
退出登录=ログアウト
系统切换=システム切替
当前租户=当面テナント
租户切换=テナント切り替え
在线人员=オンラインスタッフ
在线=オンライン
注销=ログアウト
# =========== 消息提醒 ===========
消息=メッセージ
你有=見読
条消息=件メッセージ
查看全部消息=全部見る
查看消息=開く
系统消息=システムメッセージ
您有\ {0}\ 条新消息,由于消息太多,这里为您合并,请点击查看按钮看详情。=見読メッセージ {0} 件, 省略で表示しているため, クリックで一覧を見る.
# =========== 个人中心 ===========
修改密保=セキュリティ変更
个人信息=個人情報
修改头像=アバター変更
个性签名=署名
上次登录=前回ログイン
时间=時間
首次登录=初めてログイン
旧密码=旧パスワード
新密码=新パスワード
确认新密码=新パスワード確認
您还未设置过密保问题,您可以根据登录密码设置新的密保问题及答案。=セキュリティ合言葉が設定されていません。ログイン後新しいセキュリティ合言葉を設定してください。.
旧的密保问题及答案=古いセキュリティ合言葉
旧密保问题=古いセキュリティ合言葉の質問
旧密保问题答案=古いセキュリティ合言葉の答え
新的密保问题及答案=新しいセキュリティ合言葉
新密保问题=新しいセキュリティ合言葉の質問
新密保问题答案=新しいセキュリティ合言葉の答え
# =========== 用户管理 ===========
组织机构=機構
新增用户=ユーザー作成
编辑用户=ユーザー編集
导出=導入
导入=を導く
停用用户=ユーザー無効
确认要停用该用户吗?=このユーザーを無効にしてもよろしいですか?
启用用户=ユーザー有効
确认要启用该用户吗?=このユーザーを有効にしてもよろしいですか?
删除用户=ユーザー削除
确认要删除该用户吗?=このユーザーを削除してもよろしいですか?
用户分配角色=ユーザーロール設定
分配角色=ロール設定
用户分配数据权限=ユーザーデータ権限設定
数据权限=データ権限
用户密码重置=パスワードリセット
确认要将该用户密码重置到初始状态吗?=ユーザーのログインパスワードをリセットします。よろしいですか?
重置密码=パスワードリセット
保存用户失败,登录账号''{0}''已存在=ユーザーの保存に失敗しました。ログインアカウント '' {0} ''は既に存在します
保存用户''{0}''成功=ユーザー ''{0}'' 保存成功
停用用户失败,不允许停用当前用户=ユーザー無効に更新する処理失敗。このユーザーは無効にすることできません
停用用户''{0}''成功=ユーザー ''{0}'' 無効設定成功
启用用户''{0}''成功=ユーザー ''{0}'' 有効設定成功
重置用户''{0}''密码成功=ユーザー ''{0}'' のパスワードを初期化成功しました
删除用户失败,不允许删除当前用户=ユーザー削除失敗. このユーザーを削除することができません
删除用户''{0}''成功=ユーザー ''{0}'' 削除成功
用户分配数据权限成功=ユーザーデータ権限設定成功
账号=アカウント
昵称=ニックネーム
邮箱=メール
手机=携帯
电话=電話
姓名=氏名
机构=機構
公司=会社
岗位=職位
归属机构=所属機構
归属公司=所属会社
登录账号=アカウント
登录账号已存在=ログインアカウントがすでに存在します
用户昵称=ニックネーム
电子邮箱=メール
手机号码=携帯電話
办公电话=会社電話
权重(排序)=レベル(ソート)
权重越大排名越靠前,请填写数字。=重要度が大きいほど前に表示します。数字を入力してください.
员工编号=社員コード
员工姓名=氏名
所在岗位=所属職位
英文名=英語氏名
附属机构=付属機構
附属岗位=付属職位
角色名称=ロール名称
角色编码=ロールコード
# =========== 機構管理 ===========
新增机构=機構追加
编辑机构=機構編集
停用机构=機構無効にする
确认要停用该机构吗?=機構無効にします、よろしいですか?
启用机构=機構有効にする
确认要启用该机构吗?=機構有効にします、よろしいですか?
删除机构=機構削除
确认要删除该机构及所有子机构吗?=機構及び子機構を削除します、よろしいですか?
新增下级机构=子機構追加
保存机构''{0}''成功=機構 ''{0}'' 保存成功
该机构包含未停用的子机构!=有効な子機構が含まれています!
停用机构''{0}''成功=機構 ''{0}'' 無効にする処理成功
启用机构''{0}''成功=機構 ''{0}'' 有効にする処理成功
删除机构''{0}''成功=機構 ''{0}'' 削除成功
上级机构=親機構
机构名称=機構名称
机构代码=機構コード
机构全称=機構フルネーム
机构类型=機構タイプ
负责人=責任者
联系地址=住所
邮政编码=郵便番号
# =========== 公司管理 ===========
新增公司=会社追加
编辑公司=会社編集
停用公司=会社無効にする
确认要停用该公司吗?=会社無効にします、よろしいですか?
启用公司=会社有効にする
确认要启用该公司吗?=会社有効にします、よろしいですか?
删除公司=会社削除
确认要删除该公司及所有子公司吗?=会社及び子会社を削除します、よろしいですか?
新增下级公司=子会社追加
保存公司''{0}''成功=会社 ''{0}'' 保存成功
该公司包含未停用的子公司!=有効な会社が含まれています!
停用公司''{0}''成功=会社 ''{0}'' 無効設定成功
启用公司''{0}''成功=会社 ''{0}'' 有効設定成功
删除公司''{0}''成功=会社 ''{0}'' 削除成功
上级公司=親会社
公司名称=会社名称
公司编码=会社コード
公司全称=会社フルネーム
归属区域=エリア
包含机构=機構
# =========== 岗位管理 ===========
新增岗位=職位追加
编辑岗位=職位編集
停用岗位=職位無効にする
确认要停用该岗位吗?=職位無効にします、よろしいですか?
启用岗位=職位有効にする
确认要启用该岗位吗?=職位有効にします、よろしいですか?
删除岗位=職位削除
确认要删除该岗位吗?=職位を削除します、よろしいですか?
保存岗位失败,岗位名称''{0}''已存在=職位保存失敗。職位名称 ''{0}'' 既に存在します
保存岗位''{0}''成功=職位 ''{0}'' 保存成功
停用岗位''{0}''成功=職位 ''{0}'' 無効設定成功
启用岗位''{0}''成功=職位 ''{0}'' 有効設定成功
删除岗位''{0}''成功=職位 ''{0}'' 削除成功
岗位名称=職位名称
岗位名称已存在=職位名称が既に存在します
岗位编码=職位コード
岗位分类=職位分類

View File

@@ -1,11 +1,12 @@
# transactions.properties not found - looking for jta.properties in classpath...
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.max_timeout=-1
com.atomikos.icatch.max_actives=-1
com.atomikos.icatch.enable_logging=false
com.atomikos.icatch.registered=true
# 提示 oracle.jdbc.xa.OracleXAResource.recover 错误需要授权:
#grant select on sys.dba_pending_transactions to jeesite;
#grant select on sys.pending_trans$ to jeesite;
#grant select on sys.dba_2pc_pending to jeesite;
#grant execute on sys.dbms_system to jeesite;
# 注意:如果报 oracle.jdbc.xa.OracleXAResource.recover 错误,则需要授权如下
# grant select on sys.dba_pending_transactions to jeesite;
# grant select on sys.pending_trans$ to jeesite;
# grant select on sys.dba_2pc_pending to jeesite;
# grant execute on sys.dbms_system to jeesite;

View File

@@ -4,7 +4,7 @@
<!-- 查询数据 -->
<select id="findList" resultType="MsgInner">
SELECT distinct ${sqlMap.column.toSql()}
SELECT ${sqlMap.column.toSql()}
<if test="record != null and record.receiveUserCode != null and record.receiveUserCode != ''">,
r.read_status AS "record.readStatus",
r.read_date AS "record.readDate",

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeesite.modules.sys.dao.EmployeeOfficeDao">
<!-- 查询数据
<select id="findList" resultType="EmployeeOffice">
SELECT ${sqlMap.column.toSql()}
FROM ${sqlMap.table.toSql()}
<where>
${sqlMap.where.toSql()}
</where>
ORDER BY ${sqlMap.order.toSql()}
</select> -->
</mapper>

View File

@@ -6,13 +6,26 @@
* @version 2017-12-24
*/
(function($) {
window.js = window.js || {};
js.i18n = $.extend({}, js.i18n, {
'tabpanel.newTabPage':'New Page',
'loading.message':'Loading ...',
'loading.submitMessage':'Submission ...',
'showMessage.error':'failure,error',
'showMessage.success':'success,completion',
'showMessage.warning':'no'
});
window.js = window.js || {};
js.i18n = $.extend({}, js.i18n, {
'tabpanel.newTabPage':'New Page',
'loading.message':'Loading ...',
'loading.submitMessage':'Submission ...',
'showMessage.error':'failure,error',
'showMessage.success':'success,completion',
'showMessage.warning':'no'
});
// ============ layer ============
window.layer = window.layer || {};
layer.i18n = $.extend({}, layer.i18n, {
btnOk: 'Ok',
btnCancel: 'Cancle',
title: 'Information',
promptTipA: 'Enter ',
promptTipB: 'character at most.',
noPicture: 'No picture',
photoError: 'Current image address error.<br>Next slide?',
photoNextPage: 'The next',
photoClose: 'Close'
});
})(jQuery);

View File

@@ -0,0 +1,31 @@
/*!
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*
* 国际化文件
* @author ThinkGem
* @version 2017-12-24
*/
(function($) {
window.js = window.js || {};
js.i18n = $.extend({}, js.i18n, {
'tabpanel.newTabPage':'新タブ',
'loading.message':'ローディング...お待ちください...',
'loading.submitMessage':'送信中...お待ちください...',
'showMessage.error':'失敗,エラー,未完了',
'showMessage.success':'成功,完了',
'showMessage.warning':'不可,不許可,必須,既に存在,不要,不正確'
});
// ============ layer ============
window.layer = window.layer || {};
layer.i18n = $.extend({}, layer.i18n, {
btnOk: '確定',
btnCancel: 'キャンセル',
title: 'メッセージ',
promptTipA: '最大入力',
promptTipB: '個文字',
noPicture: '画像が存在しません',
photoError: 'この画像が表示できません<br>次の画像へ遷移しますか?',
photoNextPage: '次へ',
photoClose: '閉じる'
});
})(jQuery);

View File

@@ -6,13 +6,13 @@
* @version 2017-12-24
*/
(function($) {
window.js = window.js || {};
js.i18n = $.extend({}, js.i18n, {
'tabpanel.newTabPage':'新页签',
'loading.message':'正在加载,请稍后...',
'loading.submitMessage':'正在提交,请稍后...',
'showMessage.error':'失败,错误,未完成',
'showMessage.success':'成功,完成',
'showMessage.warning':'不能,不允许,必须,已存在,不需要,不正确'
});
window.js = window.js || {};
js.i18n = $.extend({}, js.i18n, {
'tabpanel.newTabPage':'新页签',
'loading.message':'正在加载,请稍后...',
'loading.submitMessage':'正在提交,请稍后...',
'showMessage.error':'失败,错误,未完成',
'showMessage.success':'成功,完成',
'showMessage.warning':'不能,不允许,必须,已存在,不需要,不正确'
});
})(jQuery);

View File

@@ -0,0 +1,186 @@
;(function($){
/**
* jqGrid English Translation
* Tony Tomov tony@trirand.com
* http://trirand.com/blog/
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
**/
$.jgrid = $.jgrid || {};
$.extend($.jgrid,{
extend : {
btnSearch: 'Search',
btnHideSearch: 'Hide Search',
expandTooMany: 'You need to expand the "{0}" node, because there are too many nodes, and the execution is canceled.',
pageTitle: 'Click the number, you can fill in the page number of pages, press enter to take effect!',
pageLabelA: 'Page',
pageLabelB: ' / ',
pageLabelC: 'of {0}',
},
defaults : {
recordtext: "View {0} - {1} of {2}",
emptyrecords: "No records to view",
loadtext: "Loading...",
pgtext : "Page {0} of {1}",
pgfirst : "First Page",
pglast : "Last Page",
pgnext : "Next Page",
pgprev : "Previous Page",
pgrecs : "Records per Page",
showhide: "Toggle Expand Collapse Grid"
},
search : {
caption: "Search...",
Find: "Find",
Reset: "Reset",
odata: [{ oper:'eq', text:'equal'},{ oper:'ne', text:'not equal'},{ oper:'lt', text:'less'},{ oper:'le', text:'less or equal'},{ oper:'gt', text:'greater'},{ oper:'ge', text:'greater or equal'},{ oper:'bw', text:'begins with'},{ oper:'bn', text:'does not begin with'},{ oper:'in', text:'is in'},{ oper:'ni', text:'is not in'},{ oper:'ew', text:'ends with'},{ oper:'en', text:'does not end with'},{ oper:'cn', text:'contains'},{ oper:'nc', text:'does not contain'},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}],
groupOps: [{ op: "AND", text: "all" },{ op: "OR", text: "any" }],
operandTitle : "Click to select search operation.",
resetTitle : "Reset Search Value"
},
edit : {
addCaption: "Add Record",
editCaption: "Edit Record",
bSubmit: "Submit",
bCancel: "Cancel",
bClose: "Close",
saveData: "Data has been changed! Save changes?",
bYes : "Yes",
bNo : "No",
bExit : "Cancel",
msg: {
required:"Field is required",
number:"Please, enter valid number",
minValue:"value must be greater than or equal to ",
maxValue:"value must be less than or equal to",
email: "is not a valid e-mail",
integer: "Please, enter valid integer value",
date: "Please, enter valid date value",
url: "is not a valid URL. Prefix required ('http://' or 'https://')",
nodefined : " is not defined!",
novalue : " return value is required!",
customarray : "Custom function should return array!",
customfcheck : "Custom function should be present in case of custom checking!"
}
},
view : {
caption: "View Record",
bClose: "Close"
},
del : {
caption: "Delete",
msg: "Delete selected record(s)?",
bSubmit: "Delete",
bCancel: "Cancel"
},
nav : {
edittext: "",
edittitle: "Edit selected row",
addtext:"",
addtitle: "Add new row",
deltext: "",
deltitle: "Delete selected row",
searchtext: "",
searchtitle: "Find records",
refreshtext: "",
refreshtitle: "Reload Grid",
alertcap: "Warning",
alerttext: "Please, select row",
viewtext: "",
viewtitle: "View selected row"
},
col : {
caption: "Select columns",
bSubmit: "Ok",
bCancel: "Cancel"
},
errors : {
errcap : "Error",
nourl : "No url is set",
norecords: "No records to process",
model : "Length of colNames <> colModel!"
},
formatter : {
integer : {thousandsSeparator: ",", defaultValue: '0'},
number : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, defaultValue: '0.00'},
currency : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'},
date : {
dayNames: [
"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat",
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
],
monthNames: [
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
],
AmPm : ["am","pm","AM","PM"],
S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';},
srcformat: 'Y-m-d',
newformat: 'n/j/Y',
parseRe : /[#%\\\/:_;.,\t\s-]/,
masks : {
// see http://php.net/manual/en/function.date.php for PHP format used in jqGrid
// and see http://docs.jquery.com/UI/Datepicker/formatDate
// and https://github.com/jquery/globalize#dates for alternative formats used frequently
// one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many
// information about date, time, numbers and currency formats used in different countries
// one should just convert the information in PHP format
ISO8601Long:"Y-m-d H:i:s",
ISO8601Short:"Y-m-d",
// short date:
// n - Numeric representation of a month, without leading zeros
// j - Day of the month without leading zeros
// Y - A full numeric representation of a year, 4 digits
// example: 3/1/2012 which means 1 March 2012
ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy"
// long date:
// l - A full textual representation of the day of the week
// F - A full textual representation of a month
// d - Day of the month, 2 digits with leading zeros
// Y - A full numeric representation of a year, 4 digits
LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy"
// long date with long time:
// l - A full textual representation of the day of the week
// F - A full textual representation of a month
// d - Day of the month, 2 digits with leading zeros
// Y - A full numeric representation of a year, 4 digits
// g - 12-hour format of an hour without leading zeros
// i - Minutes with leading zeros
// s - Seconds, with leading zeros
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt"
// month day:
// F - A full textual representation of a month
// d - Day of the month, 2 digits with leading zeros
MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd"
// short time (without seconds)
// g - 12-hour format of an hour without leading zeros
// i - Minutes with leading zeros
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt"
// long time (with seconds)
// g - 12-hour format of an hour without leading zeros
// i - Minutes with leading zeros
// s - Seconds, with leading zeros
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt"
SortableDateTime: "Y-m-d\\TH:i:s",
UniversalSortableDateTime: "Y-m-d H:i:sO",
// month with year
// Y - A full numeric representation of a year, 4 digits
// F - A full textual representation of a month
YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy"
},
reformatAfterEdit : false,
userLocalTime : false
},
baseLinkUrl: '',
showAction: '',
target: '',
checkbox : {disabled:true},
idName : 'id'
}
});
})(jQuery);

View File

@@ -0,0 +1,137 @@
;(function($){
/**
* jqGrid Japanese Translation
* OKADA Yoshitada okada.dev@sth.jp
* http://trirand.com/blog/
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
**/
$.jgrid = $.jgrid || {};
$.extend($.jgrid,{
extend : {
btnSearch: '検索',
btnHideSearch: '隠匿',
expandTooMany: '今回は“{0}”のノードを展開しなければならない。展開ノードが多すぎるため、キャンセルが実行される。',
pageTitle: '数字をクリックすると、ページ番号とページ数を入力して、リターンカーを押して有効になります。!',
pageLabelA: '現在の',
pageLabelB: 'ページは,各ページ',
pageLabelC: '枚,全部 で{0} つ',
},
defaults : {
recordtext: "View {0} - {1} of {2}",
emptyrecords: "No records to view",
loadtext: "\u8aad\u307f\u8fbc\u307f\u4e2d...",
pgtext : "Page {0} of {1}"
},
search : {
caption: "\u691c\u7d22...",
Find: "\u691c\u7d22",
Reset: "\u30ea\u30bb\u30c3\u30c8",
odata : ['equal', 'not equal', 'less', 'less or equal','greater','greater or equal', 'begins with','does not begin with','is in','is not in','ends with','does not end with','contains','does not contain'],
groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ],
matchText: " match",
rulesText: " rules"
},
edit : {
addCaption: "\u30ec\u30b3\u30fc\u30c9\u8ffd\u52a0",
editCaption: "\u30ec\u30b3\u30fc\u30c9\u7de8\u96c6",
bSubmit: "\u9001\u4fe1",
bCancel: "\u30ad\u30e3\u30f3\u30bb\u30eb",
bClose: "\u9589\u3058\u308b",
saveData: "Data has been changed! Save changes?",
bYes : "Yes",
bNo : "No",
bExit : "Cancel",
msg: {
required:"\u3053\u306e\u9805\u76ee\u306f\u5fc5\u9808\u3067\u3059\u3002",
number:"\u6b63\u3057\u3044\u6570\u5024\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002",
minValue:"\u6b21\u306e\u5024\u4ee5\u4e0a\u3067\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002",
maxValue:"\u6b21\u306e\u5024\u4ee5\u4e0b\u3067\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002",
email: "e-mail\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002",
integer: "\u6b63\u3057\u3044\u6574\u6570\u5024\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002",
date: "\u6b63\u3057\u3044\u5024\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002",
url: "is not a valid URL. Prefix required ('http://' or 'https://')",
nodefined : " is not defined!",
novalue : " return value is required!",
customarray : "Custom function should return array!",
customfcheck : "Custom function should be present in case of custom checking!"
}
},
view : {
caption: "View Record",
bClose: "Close"
},
del : {
caption: "\u524a\u9664",
msg: "\u9078\u629e\u3057\u305f\u30ec\u30b3\u30fc\u30c9\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f",
bSubmit: "\u524a\u9664",
bCancel: "\u30ad\u30e3\u30f3\u30bb\u30eb"
},
nav : {
edittext: " ",
edittitle: "\u9078\u629e\u3057\u305f\u884c\u3092\u7de8\u96c6",
addtext:" ",
addtitle: "\u884c\u3092\u65b0\u898f\u8ffd\u52a0",
deltext: " ",
deltitle: "\u9078\u629e\u3057\u305f\u884c\u3092\u524a\u9664",
searchtext: " ",
searchtitle: "\u30ec\u30b3\u30fc\u30c9\u691c\u7d22",
refreshtext: "",
refreshtitle: "\u30b0\u30ea\u30c3\u30c9\u3092\u30ea\u30ed\u30fc\u30c9",
alertcap: "\u8b66\u544a",
alerttext: "\u884c\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\u3002",
viewtext: "",
viewtitle: "View selected row"
},
col : {
caption: "\u5217\u3092\u8868\u793a\uff0f\u96a0\u3059",
bSubmit: "\u9001\u4fe1",
bCancel: "\u30ad\u30e3\u30f3\u30bb\u30eb"
},
errors : {
errcap : "\u30a8\u30e9\u30fc",
nourl : "URL\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002",
norecords: "\u51e6\u7406\u5bfe\u8c61\u306e\u30ec\u30b3\u30fc\u30c9\u304c\u3042\u308a\u307e\u305b\u3093\u3002",
model : "colNames\u306e\u9577\u3055\u304ccolModel\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093\u3002"
},
formatter : {
integer : {thousandsSeparator: " ", defaultValue: '0'},
number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'},
currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'},
date : {
dayNames: [
"\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f",
"\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"
],
monthNames: [
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
"1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"
],
AmPm : ["am","pm","AM","PM"],
S: "\u756a\u76ee",
srcformat: 'Y-m-d',
newformat: 'd/m/Y',
masks : {
ISO8601Long:"Y-m-d H:i:s",
ISO8601Short:"Y-m-d",
ShortDate: "n/j/Y",
LongDate: "l, F d, Y",
FullDateTime: "l, F d, Y g:i:s A",
MonthDay: "F d",
ShortTime: "g:i A",
LongTime: "g:i:s A",
SortableDateTime: "Y-m-d\\TH:i:s",
UniversalSortableDateTime: "Y-m-d H:i:sO",
YearMonth: "F, Y"
},
reformatAfterEdit : false
},
baseLinkUrl: '',
showAction: '',
target: '',
checkbox : {disabled:true},
idName : 'id'
}
});
})(jQuery);

View File

@@ -0,0 +1,185 @@
;(function($){
/**
* jqGrid Chinese Translation
* 咖啡兔 yanhonglei@gmail.com
* http://www.kafeitu.me
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
**/
$.jgrid = $.jgrid || {};
$.extend($.jgrid,{
extend : {
btnSearch: '查询',
btnHideSearch: '隐藏',
expandTooMany: '本次需要展开“{0}”个节点,因为展开节点过多,执行取消。',
pageTitle: '点击数字,可填写页码和每页条数,按回车即可生效!',
pageLabelA: '当前',
pageLabelB: '页,每页',
pageLabelC: '条,共 {0} 条',
},
defaults : {
recordtext: "{0} - {1}\u3000共 {2} 条", // 共字前是全角空格
emptyrecords: "无数据显示",
loadtext: "正在加载...",
pgtext : " {0} 共 {1} 页",
pgfirst : "First Page",
pglast : "Last Page",
pgnext : "Next Page",
pgprev : "Previous Page",
pgrecs : "Records per Page",
showhide: "Toggle Expand Collapse Grid"
},
search : {
caption: "搜索...",
Find: "查找",
Reset: "重置",
odata: [{ oper:'eq', text:'等于\u3000\u3000'},{ oper:'ne', text:'不等\u3000\u3000'},{ oper:'lt', text:'小于\u3000\u3000'},{ oper:'le', text:'小于等于'},{ oper:'gt', text:'大于\u3000\u3000'},{ oper:'ge', text:'大于等于'},{ oper:'bw', text:'开始于'},{ oper:'bn', text:'不开始于'},{ oper:'in', text:'属于\u3000\u3000'},{ oper:'ni', text:'不属于'},{ oper:'ew', text:'结束于'},{ oper:'en', text:'不结束于'},{ oper:'cn', text:'包含\u3000\u3000'},{ oper:'nc', text:'不包含'},{ oper:'nu', text:'不存在'},{ oper:'nn', text:'存在'}],
groupOps: [ { op: "AND", text: "所有" }, { op: "OR", text: "任一" } ],
operandTitle : "Click to select search operation.",
resetTitle : "Reset Search Value"
},
edit : {
addCaption: "添加记录",
editCaption: "编辑记录",
bSubmit: "提交",
bCancel: "取消",
bClose: "关闭",
saveData: "数据已改变,是否保存?",
bYes : "是",
bNo : "否",
bExit : "取消",
msg: {
required:"此字段必需",
number:"请输入有效数字",
minValue:"输值必须大于等于 ",
maxValue:"输值必须小于等于 ",
email: "这不是有效的e-mail地址",
integer: "请输入有效整数",
date: "请输入有效时间",
url: "无效网址。前缀必须为 ('http://' 或 'https://')",
nodefined : " 未定义!",
novalue : " 需要返回值!",
customarray : "自定义函数需要返回数组!",
customfcheck : "必须有自定义函数!"
}
},
view : {
caption: "查看记录",
bClose: "关闭"
},
del : {
caption: "删除",
msg: "删除所选记录?",
bSubmit: "删除",
bCancel: "取消"
},
nav : {
edittext: "",
edittitle: "编辑所选记录",
addtext:"",
addtitle: "添加新记录",
deltext: "",
deltitle: "删除所选记录",
searchtext: "",
searchtitle: "查找",
refreshtext: "",
refreshtitle: "刷新表格",
alertcap: "注意",
alerttext: "请选择记录",
viewtext: "",
viewtitle: "查看所选记录"
},
col : {
caption: "选择列",
bSubmit: "确定",
bCancel: "取消"
},
errors : {
errcap : "错误",
nourl : "没有设置url",
norecords: "没有要处理的记录",
model : "colNames 和 colModel 长度不等!"
},
formatter : {
integer : {thousandsSeparator: ",", defaultValue: '0'},
number : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, defaultValue: '0.00'},
currency : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'},
date : {
dayNames: [
"日", "一", "二", "三", "四", "五", "六",
"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六",
],
monthNames: [
"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二",
"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
],
AmPm : ["am","pm","上午","下午"],
S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';},
srcformat: 'Y-m-d',
newformat: 'Y-m-d',
parseRe : /[#%\\\/:_;.,\t\s-]/,
masks : {
// see http://php.net/manual/en/function.date.php for PHP format used in jqGrid
// and see http://docs.jquery.com/UI/Datepicker/formatDate
// and https://github.com/jquery/globalize#dates for alternative formats used frequently
// one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many
// information about date, time, numbers and currency formats used in different countries
// one should just convert the information in PHP format
ISO8601Long:"Y-m-d H:i:s",
ISO8601Short:"Y-m-d",
// short date:
// n - Numeric representation of a month, without leading zeros
// j - Day of the month without leading zeros
// Y - A full numeric representation of a year, 4 digits
// example: 3/1/2012 which means 1 March 2012
ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy"
// long date:
// l - A full textual representation of the day of the week
// F - A full textual representation of a month
// d - Day of the month, 2 digits with leading zeros
// Y - A full numeric representation of a year, 4 digits
LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy"
// long date with long time:
// l - A full textual representation of the day of the week
// F - A full textual representation of a month
// d - Day of the month, 2 digits with leading zeros
// Y - A full numeric representation of a year, 4 digits
// g - 12-hour format of an hour without leading zeros
// i - Minutes with leading zeros
// s - Seconds, with leading zeros
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt"
// month day:
// F - A full textual representation of a month
// d - Day of the month, 2 digits with leading zeros
MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd"
// short time (without seconds)
// g - 12-hour format of an hour without leading zeros
// i - Minutes with leading zeros
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt"
// long time (with seconds)
// g - 12-hour format of an hour without leading zeros
// i - Minutes with leading zeros
// s - Seconds, with leading zeros
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt"
SortableDateTime: "Y-m-d\\TH:i:s",
UniversalSortableDateTime: "Y-m-d H:i:sO",
// month with year
// Y - A full numeric representation of a year, 4 digits
// F - A full textual representation of a month
YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy"
},
reformatAfterEdit : false,
userLocalTime : false
},
baseLinkUrl: '',
showAction: '',
target: '',
checkbox : {disabled:true},
idName : 'id'
}
});
})(jQuery);

View File

@@ -0,0 +1,138 @@
;(function($){
/**
* jqGrid Chinese (Taiwan) Translation for v4.2
* linquize
* https://github.com/linquize/jqGrid
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
**/
$.jgrid = $.jgrid || {};
$.extend($.jgrid,{
defaults : {
recordtext: "{0} - {1} 共 {2} 條",
emptyrecords: "沒有記錄",
loadtext: "載入中...",
pgtext : " {0} 共 {1} 頁",
pgfirst : "First Page",
pglast : "Last Page",
pgnext : "Next Page",
pgprev : "Previous Page",
pgrecs : "Records per Page",
showhide: "Toggle Expand Collapse Grid"
},
search : {
caption: "搜尋...",
Find: "搜尋",
Reset: "重設",
odata: [{ oper:'eq', text:"等於 "},{ oper:'ne', text:"不等於 "},{ oper:'lt', text:"小於 "},{ oper:'le', text:"小於等於 "},{ oper:'gt', text:"大於 "},{ oper:'ge', text:"大於等於 "},{ oper:'bw', text:"開始於 "},{ oper:'bn', text:"不開始於 "},{ oper:'in', text:"在其中 "},{ oper:'ni', text:"不在其中 "},{ oper:'ew', text:"結束於 "},{ oper:'en', text:"不結束於 "},{ oper:'cn', text:"包含 "},{ oper:'nc', text:"不包含 "},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}],
groupOps: [ { op: "AND", text: "所有" }, { op: "OR", text: "任一" } ],
operandTitle : "Click to select search operation.",
resetTitle : "Reset Search Value"
},
edit : {
addCaption: "新增記錄",
editCaption: "編輯記錄",
bSubmit: "提交",
bCancel: "取消",
bClose: "關閉",
saveData: "資料已改變,是否儲存?",
bYes : "是",
bNo : "否",
bExit : "取消",
msg: {
required:"此欄必要",
number:"請輸入有效的數字",
minValue:"值必須大於等於 ",
maxValue:"值必須小於等於 ",
email: "不是有效的e-mail地址",
integer: "請輸入有效整数",
date: "請輸入有效時間",
url: "網址無效。前綴必須為 ('http://' 或 'https://')",
nodefined : " 未定義!",
novalue : " 需要傳回值!",
customarray : "自訂函數應傳回陣列!",
customfcheck : "自訂檢查應有自訂函數!"
}
},
view : {
caption: "查看記錄",
bClose: "關閉"
},
del : {
caption: "刪除",
msg: "刪除已選記錄?",
bSubmit: "刪除",
bCancel: "取消"
},
nav : {
edittext: "",
edittitle: "編輯已選列",
addtext:"",
addtitle: "新增列",
deltext: "",
deltitle: "刪除已選列",
searchtext: "",
searchtitle: "搜尋記錄",
refreshtext: "",
refreshtitle: "重新整理表格",
alertcap: "警告",
alerttext: "請選擇列",
viewtext: "",
viewtitle: "檢視已選列"
},
col : {
caption: "選擇欄",
bSubmit: "確定",
bCancel: "取消"
},
errors : {
errcap : "錯誤",
nourl : "未設定URL",
norecords: "無需要處理的記錄",
model : "colNames 和 colModel 長度不同!"
},
formatter : {
integer : {thousandsSeparator: " ", defaultValue: '0'},
number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'},
currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'},
date : {
dayNames: [
"日", "一", "二", "三", "四", "五", "六",
"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"
],
monthNames: [
"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二",
"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
],
AmPm : ["上午","下午","上午","下午"],
S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';},
srcformat: 'Y-m-d',
newformat: 'm-d-Y',
parseRe : /[#%\\\/:_;.,\t\s-]/,
masks : {
ISO8601Long:"Y-m-d H:i:s",
ISO8601Short:"Y-m-d",
ShortDate: "Y/j/n",
LongDate: "l, F d, Y",
FullDateTime: "l, F d, Y g:i:s A",
MonthDay: "F d",
ShortTime: "g:i A",
LongTime: "g:i:s A",
SortableDateTime: "Y-m-d\\TH:i:s",
UniversalSortableDateTime: "Y-m-d H:i:sO",
YearMonth: "F, Y"
},
reformatAfterEdit : false,
userLocalTime : false
},
baseLinkUrl: '',
showAction: '',
target: '',
checkbox : {disabled:true},
idName : 'id'
}
});
})(jQuery);

View File

@@ -0,0 +1,26 @@
(function($) {
$.fn.strength = $.fn.strength || {};
if (window.lang == 'en'){
$.extend(true, $.fn.strength.defaults, {
strengthTipText: 'Password no less than 8 bits in length, and included, upper case letters, lower case letters, Numbers and symbols.',
strengthButtonText: 'Click to display the password.',
strengthButtonTextToggle: 'Click the hidden password.',
veryweakText: 'Password is too weak!',
weakText: 'Password is weak!',
mediumText: 'Password is safer!',
strongText: 'Password is very strong and safe!'
});
} else if (window.lang == 'ja_JP'){
$.extend(true, $.fn.strength.defaults, {
strengthTipText: 'パスワードは长さが8ビット以内で、その中には、上のケース、下のケース、数字、記号があります。',
strengthButtonText: 'クリックしてパスワードを表示します。',
strengthButtonTextToggle: '隠れパスワードをクリックします。',
veryweakText: 'パスワードが弱すぎる!',
weakText: '体の弱いパスワードは',
mediumText: 'パスワードは!平和な',
strongText: 'パスワードは丈夫で安全です!'
});
}
})(jQuery);

View File

@@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// English (Template)
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "ago",
suffixFromNow: "from now",
seconds: "less than a minute",
minute: "about a minute",
minutes: "%d minutes",
hour: "about an hour",
hours: "about %d hours",
day: "a day",
days: "%d days",
month: "about a month",
months: "%d months",
year: "about a year",
years: "%d years",
wordSeparator: " ",
numbers: []
};
}));

View File

@@ -0,0 +1,29 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Japanese
jQuery.timeago.settings.strings = {
prefixAgo: "",
prefixFromNow: "今から",
suffixAgo: "前",
suffixFromNow: "後",
seconds: "1 分未満",
minute: "約 1 分",
minutes: "%d 分",
hour: "約 1 時間",
hours: "約 %d 時間",
day: "約 1 日",
days: "約 %d 日",
month: "約 1 ヶ月",
months: "約 %d ヶ月",
year: "約 1 年",
years: "約 %d 年",
wordSeparator: ""
};
}));

View File

@@ -0,0 +1,31 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Simplified Chinese
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "之前",
suffixFromNow: "之后",
seconds: "不到1分钟",
minute: "大约1分钟",
minutes: "%d分钟",
hour: "大约1小时",
hours: "大约%d小时",
day: "1天",
days: "%d天",
month: "大约1个月",
months: "%d月",
year: "大约1年",
years: "%d年",
numbers: [],
wordSeparator: ""
};
}));

View File

@@ -0,0 +1,30 @@
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Traditional Chinese, zh-tw
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "之前",
suffixFromNow: "之後",
seconds: "不到1分鐘",
minute: "大約1分鐘",
minutes: "%d分鐘",
hour: "大約1小時",
hours: "%d小時",
day: "大約1天",
days: "%d天",
month: "大約1個月",
months: "%d個月",
year: "大約1年",
years: "%d年",
numbers: [],
wordSeparator: ""
};
}));

View File

@@ -0,0 +1,232 @@
/**
* Timeago is a jQuery plugin that makes it easy to support automatically
* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
*
* @name timeago
* @version 1.6.3
* @requires jQuery v1.2.3+
* @author Ryan McGeary
* @license MIT License - http://www.opensource.org/licenses/mit-license.php
*
* For usage and examples, visit:
* http://timeago.yarp.com/
*
* Copyright (c) 2008-2017, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
$.timeago = function(timestamp) {
if (timestamp instanceof Date) {
return inWords(timestamp);
} else if (typeof timestamp === "string") {
return inWords($.timeago.parse(timestamp));
} else if (typeof timestamp === "number") {
return inWords(new Date(timestamp));
} else {
return inWords($.timeago.datetime(timestamp));
}
};
var $t = $.timeago;
$.extend($.timeago, {
settings: {
refreshMillis: 60000,
allowPast: true,
allowFuture: false,
localeTitle: false,
cutoff: 0,
autoDispose: true,
strings: {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "ago",
suffixFromNow: "from now",
inPast: 'any moment now',
seconds: "less than a minute",
minute: "about a minute",
minutes: "%d minutes",
hour: "about an hour",
hours: "about %d hours",
day: "a day",
days: "%d days",
month: "about a month",
months: "%d months",
year: "about a year",
years: "%d years",
wordSeparator: " ",
numbers: []
}
},
inWords: function(distanceMillis) {
if (!this.settings.allowPast && ! this.settings.allowFuture) {
throw 'timeago allowPast and allowFuture settings can not both be set to false.';
}
var $l = this.settings.strings;
var prefix = $l.prefixAgo;
var suffix = $l.suffixAgo;
if (this.settings.allowFuture) {
if (distanceMillis < 0) {
prefix = $l.prefixFromNow;
suffix = $l.suffixFromNow;
}
}
if (!this.settings.allowPast && distanceMillis >= 0) {
return this.settings.strings.inPast;
}
var seconds = Math.abs(distanceMillis) / 1000;
var minutes = seconds / 60;
var hours = minutes / 60;
var days = hours / 24;
var years = days / 365;
function substitute(stringOrFunction, number) {
var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
var value = ($l.numbers && $l.numbers[number]) || number;
return string.replace(/%d/i, value);
}
var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
seconds < 90 && substitute($l.minute, 1) ||
minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
minutes < 90 && substitute($l.hour, 1) ||
hours < 24 && substitute($l.hours, Math.round(hours)) ||
hours < 42 && substitute($l.day, 1) ||
days < 30 && substitute($l.days, Math.round(days)) ||
days < 45 && substitute($l.month, 1) ||
days < 365 && substitute($l.months, Math.round(days / 30)) ||
years < 1.5 && substitute($l.year, 1) ||
substitute($l.years, Math.round(years));
var separator = $l.wordSeparator || "";
if ($l.wordSeparator === undefined) { separator = " "; }
return $.trim([prefix, words, suffix].join(separator));
},
parse: function(iso8601) {
var s = $.trim(iso8601);
s = s.replace(/\.\d+/,""); // remove milliseconds
s = s.replace(/-/,"/").replace(/-/,"/");
s = s.replace(/T/," ").replace(/Z/," UTC");
s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900
return new Date(s);
},
datetime: function(elem) {
var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
return $t.parse(iso8601);
},
isTime: function(elem) {
// jQuery's `is()` doesn't play well with HTML5 in IE
return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
}
});
// functions that can be called via $(el).timeago('action')
// init is default when no action is given
// functions are called with context of a single element
var functions = {
init: function() {
functions.dispose.call(this);
var refresh_el = $.proxy(refresh, this);
refresh_el();
var $s = $t.settings;
if ($s.refreshMillis > 0) {
this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis);
}
},
update: function(timestamp) {
var date = (timestamp instanceof Date) ? timestamp : $t.parse(timestamp);
$(this).data('timeago', { datetime: date });
if ($t.settings.localeTitle) {
$(this).attr("title", date.toLocaleString());
}
refresh.apply(this);
},
updateFromDOM: function() {
$(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) });
refresh.apply(this);
},
dispose: function () {
if (this._timeagoInterval) {
window.clearInterval(this._timeagoInterval);
this._timeagoInterval = null;
}
}
};
$.fn.timeago = function(action, options) {
var fn = action ? functions[action] : functions.init;
if (!fn) {
throw new Error("Unknown function name '"+ action +"' for timeago");
}
// each over objects here and call the requested function
this.each(function() {
fn.call(this, options);
});
return this;
};
function refresh() {
var $s = $t.settings;
//check if it's still visible
if ($s.autoDispose && !$.contains(document.documentElement,this)) {
//stop if it has been removed
$(this).timeago("dispose");
return this;
}
var data = prepareData(this);
if (!isNaN(data.datetime)) {
if ( $s.cutoff === 0 || Math.abs(distance(data.datetime)) < $s.cutoff) {
$(this).text(inWords(data.datetime));
} else {
if ($(this).attr('title').length > 0) {
$(this).text($(this).attr('title'));
}
}
}
return this;
}
function prepareData(element) {
element = $(element);
if (!element.data("timeago")) {
element.data("timeago", { datetime: $t.datetime(element) });
var text = $.trim(element.text());
if ($t.settings.localeTitle) {
element.attr("title", element.data('timeago').datetime.toLocaleString());
} else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
element.attr("title", text);
}
}
return element.data("timeago");
}
function inWords(date) {
return $t.inWords(distance(date));
}
function distance(date) {
return (new Date().getTime() - date.getTime());
}
// fix for IE6 suckage
document.createElement("abbr");
document.createElement("time");
}));

View File

@@ -0,0 +1,33 @@
(function ($) {
$.extend($.validator.messages, {
required: "This field is required.",
remote: "Please fix this field.",
email: "Please enter a valid email address.",
url: "Please enter a valid URL.",
date: "Please enter a valid date.",
dateISO: "Please enter a valid date (ISO).",
number: "Please enter a valid number.",
digits: "Please enter only digits.",
equalTo: "Please enter the same value again.",
maxlength: $.validator.format( "Please enter no more than {0} characters." ),
minlength: $.validator.format( "Please enter at least {0} characters." ),
rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
range: $.validator.format( "Please enter a value between {0} and {1}." ),
max: $.validator.format( "Please enter a value less than or equal to {0}." ),
min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
errorMessage: "The information you filled in is wrong.",
userName: "Chinese characters, English letters, Numbers and underscores.",
realName: "Can only be 2-30 Chinese characters",
abc: "Please enter alphanumeric or underline",
noEqualTo: "Please enter different values again",
mobile: "Please fill in your mobile number correctly, only 13,14,15,16,17,18,19",
simplePhone: "Please fill in your phone number correctly, and the fixed number is the area code (3-4 digits),",
phone: "Please fill in your phone number correctly, the number (3-4 digits), and the phone number is 13,14,15,16,17,18,19.",
zipCode: "Please fill in your zipCode correctly",
integer: "Please enter an integer",
ipv4: "Please enter a valid IP v4 address",
ipv6: "Please enter a valid IP v6 address",
qq: "Please fill in your qq number correctly",
idcard: "Please enter the correct id number (15-18)"
});
}(jQuery));

View File

@@ -0,0 +1,33 @@
(function ($) {
$.extend( $.validator.messages, {
required: "このフィールドは必須です。",
remote: "このフィールドを修正してください。",
email: "有効なEメールアドレスを入力してください。",
url: "有効なURLを入力してください。",
date: "有効な日付を入力してください。",
dateISO: "有効な日付ISOを入力してください。",
number: "有効な数字を入力してください。",
digits: "数字のみを入力してください。",
equalTo: "同じ値をもう一度入力してください。",
maxlength: $.validator.format( "{0} 文字以内で入力してください。" ),
minlength: $.validator.format( "{0} 文字以上で入力してください。" ),
rangelength: $.validator.format( "{0} 文字から {1} 文字までの値を入力してください。" ),
range: $.validator.format( "{0} から {1} までの値を入力してください。" ),
max: $.validator.format( "{0} 以下の値を入力してください。" ),
min: $.validator.format( "{0} 以上の値を入力してください。" ),
errorMessage: "ご記入頂いた情報に誤りがございましたので、提示に基づき修正をお願いします。",
userName: "ご記入頂いた情報に誤りがございましたので、提示に基づき修正をお願いします。登录アカウントは中文字、英字、数字、下線のみです",
realName: "名前は2 ~ 30字程度",
abc: "数字または下線を入力してください",
noEqualTo: "再度異なる値を入力して下さい",
mobile: "お电话番号を正确にお书きください。ただ13、14、15、16、17、18、19番です",
simplePhone: "お电话番号を正しくお书きください。固定番号(3-4位)番号(7-9位)",
phone: "お电话番号を正确にお书きください。固定番号(3-4位)番号(7-9位)、携帯电话は13、14、15、16、17、18、19番です",
zipCode: "郵便番号を正しく入力してください",
integer: "整数を入力してください",
ipv4: "有効なIP v4アドレスを入力してください",
ipv6: "有効なIP v6アドレスを入力してください",
qq: "あなたのQQ番号を正しく入力してください",
idcard: "正しい住民登録番号(15 ~ 18位)を入力してください。"
});
}(jQuery));

View File

@@ -0,0 +1,33 @@
(function ($) {
$.extend($.validator.messages, {
required: "必填信息",
remote: "请修正该信息",
email: "请输入正确格式的电子邮件",
url: "请输入合法的网址",
date: "请输入合法的日期",
dateISO: "请输入合法的日期 (YYYY-MM-DD).",
number: "请输入合法的数值",
digits: "请输入一个正整数",
equalTo: "请再次输入相同的值",
maxlength: $.validator.format("最多可以输入 {0} 个字符"),
minlength: $.validator.format("最少要输入 {0} 个字符"),
rangelength: $.validator.format("请输入长度在 {0} 到 {1} 之间的字符串"),
range: $.validator.format("请输入范围在 {0} 到 {1} 之间的数值"),
max: $.validator.format("请输入不大于 {0} 的数值"),
min: $.validator.format("请输入不小于 {0} 的数值"),
errorMessage: "您填写的信息有误,请根据提示修正。",
userName: "登录账号只能包括中文字、英文字母、数字和下划线",
realName: "姓名只能为2-30个汉字",
abc: "请输入字母数字或下划线",
noEqualTo: "请再次输入不同的值",
mobile: "请正确填写您的手机号码只能是13,14,15,16,17,18,19号段",
simplePhone: "请正确填写您的电话号码,固话为区号(3-4位)号码(7-9位)",
phone: "请正确填写您的电话号码,固话为区号(3-4位)号码(7-9位),手机为13,14,15,16,17,18,19号段",
zipCode: "请正确填写您的邮政编码",
integer: "请输入一个整数",
ipv4: "请输入一个有效的 IP v4 地址",
ipv6: "请输入一个有效的 IP v6 地址",
qq: "请正确填写您的QQ号码",
idcard: "请输入正确的身份证号码(15-18位)"
});
}(jQuery));

View File

@@ -0,0 +1,33 @@
(function ($) {
$.extend( $.validator.messages, {
required: "必須填寫",
remote: "請修正此欄位",
email: "請輸入有效的電子郵件",
url: "請輸入有效的網址",
date: "請輸入有效的日期",
dateISO: "請輸入有效的日期 (YYYY-MM-DD)",
number: "請輸入正確的數值",
digits: "只可輸入數字",
equalTo: "請重複輸入一次",
maxlength: $.validator.format( "最多 {0} 個字" ),
minlength: $.validator.format( "最少 {0} 個字" ),
rangelength: $.validator.format( "請輸入長度為 {0} 至 {1} 之間的字串" ),
range: $.validator.format( "請輸入 {0} 至 {1} 之間的數值" ),
max: $.validator.format( "請輸入不大於 {0} 的數值" ),
min: $.validator.format( "請輸入不小於 {0} 的數值" ),
errorMessage: "您填寫的信息有誤,請根據提示修正。",
userName: "登錄賬號只能包括中文字、英文字母、數字和下劃線",
realName: "姓名只能爲2-30個漢字",
abc: "請輸入字母數字或下劃線",
noEqualTo: "請再次輸入不同的值",
mobile: "請正確填寫您的手機號碼只能是13,14,15,16,17,18,19號段",
simplePhone: "請正確填寫您的電話號碼,固話爲區號(3-4位)號碼(7-9位)",
phone: "請正確填寫您的電話號碼,固話爲區號(3-4位)號碼(7-9位),手機爲13,14,15,16,17,18,19號段",
zipCode: "請正確填寫您的郵政編碼",
integer: "請輸入一個整數",
ipv4: "請輸入一個有效的 IP v4 地址",
ipv6: "請輸入一個有效的 IP v6 地址",
qq: "請正確填寫您的QQ號碼",
idcard: "請輸入正確的身份證號碼(15-18位)"
});
}(jQuery));

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,669 @@
/**
* Created with JetBrains PhpStorm.
* User: taoqili
* Date: 12-6-12
* Time: 下午5:02
* To change this template use File | Settings | File Templates.
*/
UE.I18N['ja_JP'] = {
'labelMap':{
'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图',
'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框',
'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用',
'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览',
'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期',
'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格',
'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行',
'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题',
'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言',
'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'多图上传','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接',
'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图', 'gmap':'Google地图',
'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐',
'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表',
'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入',
'rowspacingtop':'段前距', 'rowspacingbottom':'段后距', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认',
'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存',
'lineheight':'行间距','edittip' :'编辑提示','customstyle':'扩展样式', 'autotypeset':'自动排版',
'webapp':'百度应用','touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦',
'music':'音乐','inserttable':'插入表格','drafts': '从草稿箱加载', 'charts': '图表'
},
'insertorderedlist':{
'num':'1,2,3...',
'num1':'1),2),3)...',
'num2':'(1),(2),(3)...',
'cn':'一,二,三....',
'cn1':'一),二),三)....',
'cn2':'(一),(二),(三)....',
'decimal':'1,2,3...',
'lower-alpha':'a,b,c...',
'lower-roman':'i,ii,iii...',
'upper-alpha':'A,B,C...',
'upper-roman':'I,II,III...'
},
'insertunorderedlist':{
'circle':'○ 大圆圈',
'disc':'● 小黑点',
'square':'■ 小方块 ',
'dash' :'— 破折号',
'dot':' 。 小圆圈'
},
'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'},
'fontfamily':{
'songti':'宋体',
'kaiti':'楷体',
'heiti':'黑体',
'lishu':'隶书',
'yahei':'微软雅黑',
'andaleMono':'andale mono',
'arial': 'arial',
'arialBlack':'arial black',
'comicSansMs':'comic sans ms',
'impact':'impact',
'timesNewRoman':'times new roman'
},
'customstyle':{
'tc':'标题居中',
'tl':'标题居左',
'im':'强调',
'hi':'明显强调'
},
'autoupload': {
'exceedSizeError': '文件大小超出限制',
'exceedTypeError': '文件格式不允许',
'jsonEncodeError': '服务器返回格式错误',
'loading':"正在上传...",
'loadError':"上传错误",
'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
},
'simpleupload':{
'exceedSizeError': '文件大小超出限制',
'exceedTypeError': '文件格式不允许',
'jsonEncodeError': '服务器返回格式错误',
'loading':"正在上传...",
'loadError':"上传错误",
'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
},
'elementPathTip':"元素路径",
'wordCountTip':"字数统计",
'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ',
'wordOverFlowMsg':'<span style="color:red;">字数超出最大允许值,服务器可能拒绝保存!</span>',
'ok':"确认",
'cancel':"取消",
'closeDialog':"关闭对话框",
'tableDrag':"表格拖动必须引入uiUtils.js文件",
'autofloatMsg':"工具栏浮动依赖编辑器UI您首先需要引入UI文件!",
'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!',
'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!',
'loadconfigHttpError': '请求后台配置项http错误上传功能将不能正常使用',
'snapScreen_plugin':{
'browserMsg':"仅支持IE浏览器",
'callBackErrorMsg':"服务器返回数据有误,请检查配置项之后重试。",
'uploadErrorMsg':"截图上传失败,请检查服务器端环境! "
},
'insertcode':{
'as3':'ActionScript 3',
'bash':'Bash/Shell',
'cpp':'C/C++',
'css':'CSS',
'cf':'ColdFusion',
'c#':'C#',
'delphi':'Delphi',
'diff':'Diff',
'erlang':'Erlang',
'groovy':'Groovy',
'html':'HTML',
'java':'Java',
'jfx':'JavaFX',
'js':'JavaScript',
'pl':'Perl',
'php':'PHP',
'plain':'Plain Text',
'ps':'PowerShell',
'python':'Python',
'ruby':'Ruby',
'scala':'Scala',
'sql':'SQL',
'vb':'Visual Basic',
'xml':'XML'
},
'confirmClear':"确定清空当前文档么?",
'contextMenu':{
'delete':"删除",
'selectall':"全选",
'deletecode':"删除代码",
'cleardoc':"清空文档",
'confirmclear':"确定清空当前文档么?",
'unlink':"删除超链接",
'paragraph':"段落格式",
'edittable':"表格属性",
'aligntd':"单元格对齐方式",
'aligntable':'表格对齐方式',
'tableleft':'左浮动',
'tablecenter':'居中显示',
'tableright':'右浮动',
'edittd':"单元格属性",
'setbordervisible':'设置表格边线可见',
'justifyleft':'左对齐',
'justifyright':'右对齐',
'justifycenter':'居中对齐',
'justifyjustify':'两端对齐',
'table':"表格",
'inserttable':'插入表格',
'deletetable':"删除表格",
'insertparagraphbefore':"前插入段落",
'insertparagraphafter':'后插入段落',
'deleterow':"删除当前行",
'deletecol':"删除当前列",
'insertrow':"前插入行",
'insertcol':"左插入列",
'insertrownext':'后插入行',
'insertcolnext':'右插入列',
'insertcaption':'插入表格名称',
'deletecaption':'删除表格名称',
'inserttitle':'插入表格标题行',
'deletetitle':'删除表格标题行',
'inserttitlecol':'插入表格标题列',
'deletetitlecol':'删除表格标题列',
'averageDiseRow':'平均分布各行',
'averageDisCol':'平均分布各列',
'mergeright':"向右合并",
'mergeleft':"向左合并",
'mergedown':"向下合并",
'mergecells':"合并单元格",
'splittocells':"完全拆分单元格",
'splittocols':"拆分成列",
'splittorows':"拆分成行",
'tablesort':'表格排序',
'enablesort':'设置表格可排序',
'disablesort':'取消表格可排序',
'reversecurrent':'逆序当前',
'orderbyasc':'按ASCII字符升序',
'reversebyasc':'按ASCII字符降序',
'orderbynum':'按数值大小升序',
'reversebynum':'按数值大小降序',
'borderbk':'边框底纹',
'setcolor':'表格隔行变色',
'unsetcolor':'取消表格隔行变色',
'setbackground':'选区背景隔行',
'unsetbackground':'取消选区背景',
'redandblue':'红蓝相间',
'threecolorgradient':'三色渐变',
'copy':"复制(Ctrl + c)",
'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
'paste':"粘贴(Ctrl + v)",
'pastemsg': "浏览器不支持,请使用 'Ctrl + v'"
},
'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
'pastemsg': "浏览器不支持,请使用 'Ctrl + v'",
'anthorMsg':"链接",
'clearColor':'清空颜色',
'standardColor':'标准颜色',
'themeColor':'主题颜色',
'property':'属性',
'default':'默认',
'modify':'修改',
'justifyleft':'左对齐',
'justifyright':'右对齐',
'justifycenter':'居中',
'justify':'默认',
'clear':'清除',
'anchorMsg':'锚点',
'delete':'删除',
'clickToUpload':"点击上传",
'unset':'尚未设置语言文件',
't_row':'行',
't_col':'列',
'more':'更多',
'pasteOpt':'粘贴选项',
'pasteSourceFormat':"保留源格式",
'tagFormat':'只保留标签',
'pasteTextFormat':'只保留文本',
'autoTypeSet':{
'mergeLine':"合并空行",
'delLine':"清除空行",
'removeFormat':"清除格式",
'indent':"首行缩进",
'alignment':"对齐方式",
'imageFloat':"图片浮动",
'removeFontsize':"清除字号",
'removeFontFamily':"清除字体",
'removeHtml':"清除冗余HTML代码",
'pasteFilter':"粘贴过滤",
'run':"执行",
'symbol':'符号转换',
'bdc2sb':'全角转半角',
'tobdc':'半角转全角'
},
'background':{
'static':{
'lang_background_normal':'背景设置',
'lang_background_local':'在线图片',
'lang_background_set':'选项',
'lang_background_none':'无背景色',
'lang_background_colored':'有背景色',
'lang_background_color':'颜色设置',
'lang_background_netimg':'网络图片',
'lang_background_align':'对齐方式',
'lang_background_position':'精确定位',
'repeatType':{'options':["居中", "横向重复", "纵向重复", "平铺","自定义"]}
},
'noUploadImage':"当前未上传过任何图片!",
'toggleSelect':"单击可切换选中状态\n原图尺寸: "
},
//===============dialog i18N=======================
'insertimage':{
'static':{
'lang_tab_remote':"插入图片", //节点
'lang_tab_upload':"本地上传",
'lang_tab_online':"在线管理",
'lang_tab_search':"图片搜索",
'lang_input_url':"地 址:",
'lang_input_size':"大 小:",
'lang_input_width':"宽度",
'lang_input_height':"高度",
'lang_input_border':"边 框:",
'lang_input_vhspace':"边 距:",
'lang_input_title':"描 述:",
'lang_input_align':'图片浮动方式:',
'lang_imgLoading':" 图片加载中……",
'lang_start_upload':"开始上传",
'lock':{'title':"锁定宽高比例"}, //属性
'searchType':{'title':"图片类型", 'options':["新闻", "壁纸", "表情", "头像"]}, //select的option
'searchTxt':{'value':"请输入搜索关键词"},
'searchBtn':{'value':"百度一下"},
'searchReset':{'value':"清空搜索"},
'noneAlign':{'title':'无浮动'},
'leftAlign':{'title':'左浮动'},
'rightAlign':{'title':'右浮动'},
'centerAlign':{'title':'居中独占一行'}
},
'uploadSelectFile':'点击选择图片',
'uploadAddFile':'继续添加',
'uploadStart':'开始上传',
'uploadPause':'暂停上传',
'uploadContinue':'继续上传',
'uploadRetry':'重试上传',
'uploadDelete':'删除',
'uploadTurnLeft':'向左旋转',
'uploadTurnRight':'向右旋转',
'uploadPreview':'预览中',
'uploadNoPreview':'不能预览',
'updateStatusReady': '选中_张图片共_KB。',
'updateStatusConfirm': '已成功上传_张照片_张照片上传失败',
'updateStatusFinish': '共_张_KB_张上传成功',
'updateStatusError': '_张上传失败。',
'errorNotSupport': 'WebUploader 不支持您的浏览器如果你使用的是IE浏览器请尝试升级 flash 播放器。',
'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
'errorExceedSize':'文件大小超出',
'errorFileType':'文件格式不允许',
'errorInterrupt':'文件传输中断',
'errorUploadRetry':'上传失败,请重试',
'errorHttp':'http请求错误',
'errorServerUpload':'服务器返回出错',
'remoteLockError':"宽高不正确,不能所定比例",
'numError':"请输入正确的长度或者宽度值例如123400",
'imageUrlError':"不允许的图片格式或者图片域!",
'imageLoadError':"图片加载失败!请检查链接地址或网络状态!",
'searchRemind':"请输入搜索关键词",
'searchLoading':"图片加载中,请稍后……",
'searchRetry':" :( ,抱歉,没有找到图片!请重试一次!"
},
'attachment':{
'static':{
'lang_tab_upload': '上传附件',
'lang_tab_online': '在线附件',
'lang_start_upload':"开始上传",
'lang_drop_remind':"可以将文件拖到这里单次最多可选100个文件"
},
'uploadSelectFile':'点击选择文件',
'uploadAddFile':'继续添加',
'uploadStart':'开始上传',
'uploadPause':'暂停上传',
'uploadContinue':'继续上传',
'uploadRetry':'重试上传',
'uploadDelete':'删除',
'uploadTurnLeft':'向左旋转',
'uploadTurnRight':'向右旋转',
'uploadPreview':'预览中',
'updateStatusReady': '选中_个文件共_KB。',
'updateStatusConfirm': '已成功上传_个文件_个文件上传失败',
'updateStatusFinish': '共_个_KB_个上传成功',
'updateStatusError': '_张上传失败。',
'errorNotSupport': 'WebUploader 不支持您的浏览器如果你使用的是IE浏览器请尝试升级 flash 播放器。',
'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
'errorExceedSize':'文件大小超出',
'errorFileType':'文件格式不允许',
'errorInterrupt':'文件传输中断',
'errorUploadRetry':'上传失败,请重试',
'errorHttp':'http请求错误',
'errorServerUpload':'服务器返回出错'
},
'insertvideo':{
'static':{
'lang_tab_insertV':"插入视频",
'lang_tab_searchV':"搜索视频",
'lang_tab_uploadV':"上传视频",
'lang_video_url':"视频网址",
'lang_video_size':"视频尺寸",
'lang_videoW':"宽度",
'lang_videoH':"高度",
'lang_alignment':"对齐方式",
'videoSearchTxt':{'value':"请输入搜索关键字!"},
'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]},
'videoSearchBtn':{'value':"百度一下"},
'videoSearchReset':{'value':"清空结果"},
'lang_input_fileStatus':' 当前未上传文件',
'startUpload':{'style':"background:url(upload.png) no-repeat;"},
'lang_upload_size':"视频尺寸",
'lang_upload_width':"宽度",
'lang_upload_height':"高度",
'lang_upload_alignment':"对齐方式",
'lang_format_advice':"建议使用mp4格式."
},
'numError':"请输入正确的数值如123,400",
'floatLeft':"左浮动",
'floatRight':"右浮动",
'"default"':"默认",
'block':"独占一行",
'urlError':"输入的视频地址有误,请检查后再试!",
'loading':" &nbsp;视频加载中,请等待……",
'clickToSelect':"点击选中",
'goToSource':'访问源视频',
'noVideo':" &nbsp; &nbsp;抱歉,找不到对应的视频,请重试!",
'browseFiles':'浏览文件',
'uploadSuccess':'上传成功!',
'delSuccessFile':'从成功队列中移除',
'delFailSaveFile':'移除保存失败文件',
'statusPrompt':' 个文件已上传! ',
'flashVersionError':'当前Flash版本过低请更新FlashPlayer后重试',
'flashLoadingError':'Flash加载失败!请检查路径或网络状态',
'fileUploadReady':'等待上传……',
'delUploadQueue':'从上传队列中移除',
'limitPrompt1':'单次不能选择超过',
'limitPrompt2':'个文件!请重新选择!',
'delFailFile':'移除失败文件',
'fileSizeLimit':'文件大小超出限制!',
'emptyFile':'空文件无法上传!',
'fileTypeError':'文件类型不允许!',
'unknownError':'未知错误!',
'fileUploading':'上传中,请等待……',
'cancelUpload':'取消上传',
'netError':'网络错误',
'failUpload':'上传失败!',
'serverIOError':'服务器IO错误',
'noAuthority':'无权限!',
'fileNumLimit':'上传个数限制',
'failCheck':'验证失败,本次上传被跳过!',
'fileCanceling':'取消中,请等待……',
'stopUploading':'上传已停止……',
'uploadSelectFile':'点击选择文件',
'uploadAddFile':'继续添加',
'uploadStart':'开始上传',
'uploadPause':'暂停上传',
'uploadContinue':'继续上传',
'uploadRetry':'重试上传',
'uploadDelete':'删除',
'uploadTurnLeft':'向左旋转',
'uploadTurnRight':'向右旋转',
'uploadPreview':'预览中',
'updateStatusReady': '选中_个文件共_KB。',
'updateStatusConfirm': '成功上传_个_个失败',
'updateStatusFinish': '共_个(_KB)_个成功上传',
'updateStatusError': '_张上传失败。',
'errorNotSupport': 'WebUploader 不支持您的浏览器如果你使用的是IE浏览器请尝试升级 flash 播放器。',
'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
'errorExceedSize':'文件大小超出',
'errorFileType':'文件格式不允许',
'errorInterrupt':'文件传输中断',
'errorUploadRetry':'上传失败,请重试',
'errorHttp':'http请求错误',
'errorServerUpload':'服务器返回出错'
},
'webapp':{
'tip1':"本功能由百度APP提供如看到此页面请各位站长首先申请百度APPKey!",
'tip2':"申请完成之后请至ueditor.config.js中配置获得的appkey! ",
'applyFor':"点此申请",
'anthorApi':"百度API"
},
'template':{
'static':{
'lang_template_bkcolor':'背景颜色',
'lang_template_clear' : '保留原有内容',
'lang_template_select' : '选择模板'
},
'blank':"空白文档",
'blog':"博客文章",
'resume':"个人简历",
'richText':"图文混排",
'sciPapers':"科技论文"
},
'scrawl':{
'static':{
'lang_input_previousStep':"上一步",
'lang_input_nextsStep':"下一步",
'lang_input_clear':'清空',
'lang_input_addPic':'添加背景',
'lang_input_ScalePic':'缩放背景',
'lang_input_removePic':'删除背景',
'J_imgTxt':{title:'添加背景图片'}
},
'noScarwl':"尚未作画,白纸一张~",
'scrawlUpLoading':"涂鸦上传中,别急哦~",
'continueBtn':"继续",
'imageError':"糟糕,图片读取失败了!",
'backgroundUploading':'背景图片上传中,别急哦~'
},
'music':{
'static':{
'lang_input_tips':"输入歌手/歌曲/专辑,搜索您感兴趣的音乐!",
'J_searchBtn':{value:'搜索歌曲'}
},
'emptyTxt':'未搜索到相关音乐结果,请换一个关键词试试。',
'chapter':'歌曲',
'singer':'歌手',
'special':'专辑',
'listenTest':'试听'
},
'anchor':{
'static':{
'lang_input_anchorName':'锚点名字:'
}
},
'charts':{
'static':{
'lang_data_source':'数据源:',
'lang_chart_format': '图表格式:',
'lang_data_align': '数据对齐方式',
'lang_chart_align_same': '数据源与图表X轴Y轴一致',
'lang_chart_align_reverse': '数据源与图表X轴Y轴相反',
'lang_chart_title': '图表标题',
'lang_chart_main_title': '主标题:',
'lang_chart_sub_title': '子标题:',
'lang_chart_x_title': 'X轴标题',
'lang_chart_y_title': 'Y轴标题',
'lang_chart_tip': '提示文字',
'lang_cahrt_tip_prefix': '提示文字前缀:',
'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀',
'lang_chart_data_unit': '数据单位',
'lang_chart_data_unit_title': '单位:',
'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃',
'lang_chart_type': '图表类型:',
'lang_prev_btn': '上一个',
'lang_next_btn': '下一个'
}
},
'emotion':{
'static':{
'lang_input_choice':'精选',
'lang_input_Tuzki':'兔斯基',
'lang_input_BOBO':'BOBO',
'lang_input_lvdouwa':'绿豆蛙',
'lang_input_babyCat':'baby猫',
'lang_input_bubble':'泡泡',
'lang_input_youa':'有啊'
}
},
'gmap':{
'static':{
'lang_input_address':'地址',
'lang_input_search':'搜索',
'address':{value:"北京"}
},
searchError:'无法定位到该地址!'
},
'help':{
'static':{
'lang_input_about':'关于UEditor',
'lang_input_shortcuts':'快捷键',
'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器具有轻量可定制注重用户体验等特点。开源基于BSD协议允许自由使用和修改代码。',
'lang_Txt_shortcuts':'快捷键',
'lang_Txt_func':'功能',
'lang_Txt_bold':'给选中字设置为加粗',
'lang_Txt_copy':'复制选中内容',
'lang_Txt_cut':'剪切选中内容',
'lang_Txt_Paste':'粘贴',
'lang_Txt_undo':'重新执行上次操作',
'lang_Txt_redo':'撤销上一次操作',
'lang_Txt_italic':'给选中字设置为斜体',
'lang_Txt_underline':'给选中字加下划线',
'lang_Txt_selectAll':'全部选中',
'lang_Txt_visualEnter':'软回车',
'lang_Txt_fullscreen':'全屏'
}
},
'insertframe':{
'static':{
'lang_input_address':'地址:',
'lang_input_width':'宽度:',
'lang_input_height':'高度:',
'lang_input_isScroll':'允许滚动条:',
'lang_input_frameborder':'显示框架边框:',
'lang_input_alignMode':'对齐方式:',
'align':{title:"对齐方式", options:["默认", "左对齐", "右对齐", "居中"]}
},
'enterAddress':'请输入地址!'
},
'link':{
'static':{
'lang_input_text':'文本内容:',
'lang_input_url':'链接地址:',
'lang_input_title':'标题:',
'lang_input_target':'是否在新窗口打开:'
},
'validLink':'只支持选中一个链接时生效',
'httpPrompt':'您输入的超链接中不包含http等协议名称默认将为您添加http://前缀'
},
'map':{
'static':{
lang_city:"城市",
lang_address:"地址",
city:{value:"北京"},
lang_search:"搜索",
lang_dynamicmap:"插入动态地图"
},
cityMsg:"请选择城市",
errorMsg:"抱歉,找不到该位置!"
},
'searchreplace':{
'static':{
lang_tab_search:"查找",
lang_tab_replace:"替换",
lang_search1:"查找",
lang_search2:"查找",
lang_replace:"替换",
lang_searchReg:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
lang_searchReg1:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
lang_case_sensitive1:"区分大小写",
lang_case_sensitive2:"区分大小写",
nextFindBtn:{value:"下一个"},
preFindBtn:{value:"上一个"},
nextReplaceBtn:{value:"下一个"},
preReplaceBtn:{value:"上一个"},
repalceBtn:{value:"替换"},
repalceAllBtn:{value:"全部替换"}
},
getEnd:"已经搜索到文章末尾!",
getStart:"已经搜索到文章头部",
countMsg:"总共替换了{#count}处!"
},
'snapscreen':{
'static':{
lang_showMsg:"截图功能需要首先安装UEditor截图插件 ",
lang_download:"点此下载",
lang_step1:"第一步下载UEditor截图插件并运行安装。",
lang_step2:"第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!"
}
},
'spechars':{
'static':{},
tsfh:"特殊字符",
lmsz:"罗马字符",
szfh:"数学字符",
rwfh:"日文字符",
xlzm:"希腊字母",
ewzm:"俄文字符",
pyzm:"拼音字母",
yyyb:"英语音标",
zyzf:"其他"
},
'edittable':{
'static':{
'lang_tableStyle':'表格样式',
'lang_insertCaption':'添加表格名称行',
'lang_insertTitle':'添加表格标题行',
'lang_insertTitleCol':'添加表格标题列',
'lang_orderbycontent':"使表格内容可排序",
'lang_tableSize':'自动调整表格尺寸',
'lang_autoSizeContent':'按表格文字自适应',
'lang_autoSizePage':'按页面宽度自适应',
'lang_example':'示例',
'lang_borderStyle':'表格边框',
'lang_color':'颜色:'
},
captionName:'表格名称',
titleName:'标题',
cellsName:'内容',
errorMsg:'有合并单元格,不可排序'
},
'edittip':{
'static':{
lang_delRow:'删除整行',
lang_delCol:'删除整列'
}
},
'edittd':{
'static':{
lang_tdBkColor:'背景颜色:'
}
},
'formula':{
'static':{
}
},
'wordimage':{
'static':{
lang_resave:"转存步骤",
uploadBtn:{src:"upload.png",alt:"上传"},
clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
lang_step:"1、点击顶部复制按钮将地址复制到剪贴板2、点击添加照片按钮在弹出的对话框中使用Ctrl+V粘贴地址3、点击打开后选择图片上传流程。"
},
'fileType':"图片",
'flashError':"FLASH初始化失败请检查FLASH插件是否正确安装",
'netError':"网络连接错误,请重试!",
'copySuccess':"图片地址已经复制!",
'flashI18n':{} //留空默认中文
},
'autosave': {
'saving':'保存中...',
'success':'本地保存成功'
}
};

View File

@@ -0,0 +1,22 @@
(function($) {
window.TabPanel = window.TabPanel || {};
if (window.lang == 'en'){
TabPanel.i18n = $.extend({}, TabPanel.i18n, {
closeTab: 'Close',
refreshTab: 'Refresh',
closeOther: 'Close Other',
closeLeft: 'Close Left',
closeRight: 'Close Right'
});
} else if (window.lang == 'ja_JP'){
TabPanel.i18n = $.extend({}, TabPanel.i18n, {
closeTab: '閉じる',
refreshTab: '更新',
closeOther: '他を閉じる',
closeLeft: '左側を閉じる',
closeRight: '右側を閉じる'
});
}
})(jQuery);

View File

@@ -0,0 +1,60 @@
(function($) {
$.fn.webuploader.defaults.i18n = {
'安装失败!': 'Installation failed!',
'安装已成功,请刷新!': 'Installation successful, please refresh!',
'文件上传组件不支持您的浏览器,请使用高版本浏览器!': 'Does not support your browser, please use the high version browser!',
'点击选择文件': 'Select files',
'点击选择图片': 'Select images',
'点击选择视频': 'Select videos',
'继续添加': 'Add files',
'暂停上传': 'Pause upload',
'继续上传': 'Continue upload',
'开始上传': 'Start upload',
'上传成功': 'Upload success',
'张图片': ' images',
'个文件': ' files',
'上传失败': ' Failure',
'重新上传': ' Retry ',
'或': ' or ',
'忽略': ' Ignore ',
'总共': 'Total ',
'已上传': 'Uploaded ',
'失败{0}个': ' {0} failure',
'您只能上传{0}个文件': 'You can only upload {0} files.',
'正在验证文件,请稍等。': 'File is being validated.',
'删除': 'Delete',
'向右旋转': 'Rotate right',
'向左旋转': 'Rotate left',
'文件类型不对': 'File type error',
'文件大小超出': 'File size exceeded',
'文件传输中断': 'File transfer interrupt',
'HTTP请求错误': 'HTTP request error',
'文件格式不允许': 'File format not allowed',
'不要选择重复文件': 'Do not select duplicate files',
'上传失败,请重试': 'Upload failed, please try again',
'服务器返回出错': 'The server returned an error',
'预览生成中': 'Preview create',
'不能预览': 'Cannot preview',
'确定删除该图片吗?': 'Are you sure to delete the image?',
'确定删除该文件吗?': 'Are you sure to delete this file?',
'等待上传': 'Waiting for the upload',
'正在上传': 'Are uploading',
'取消': 'Cancel',
'下载': 'Download',
'预览': 'Preview',
'查看': 'To view'
};
})(jQuery);

View File

@@ -0,0 +1,60 @@
(function($) {
$.fn.webuploader.defaults.i18n = {
'安装失败!': 'インストールに失敗!',
'安装已成功,请刷新!': 'インストールは成功しました。!',
'文件上传组件不支持您的浏览器,请使用高版本浏览器!': 'ファイルアップロードコンポーネントがあなたのブラウザをサポートしません。!',
'点击选择文件': '選択ファイルをクリックする。',
'点击选择图片': '選択画像をクリックする。',
'点击选择视频': '選択動画をクリックする。',
'继续添加': '追加し続ける',
'暂停上传': 'アップロードを一時停止する。',
'继续上传': 'アップロードを継続する',
'开始上传': 'アップロードを始める',
'上传成功': 'アップロードが成功する',
'张图片': ' 枚画像',
'个文件': ' 一つの書類',
'上传失败': ' アップロードの失敗',
'重新上传': ' アップロードを再開する ',
'或': ' または ',
'忽略': ' 無視する ',
'总共': '計 ',
'已上传': 'アップロードした ',
'失败{0}个': ' {0} つ失敗する',
'您只能上传{0}个文件': 'ファイルは{0}つしかアップロードできません',
'正在验证文件,请稍等。': '書類を検証中ですので、少々お待ちください。',
'删除': '削除',
'向右旋转': '右にまがる',
'向左旋转': '左に回る',
'文件类型不对': '書類のタイプが違う',
'文件大小超出': '書類のサイズがはみ出る',
'文件传输中断': 'ファイル転送を中断する。',
'HTTP请求错误': 'HTTPリクエストエラー',
'文件格式不允许': 'ファイルフォーマットは許可されない',
'不要选择重复文件': '重複ファイルは選択しないでください',
'上传失败,请重试': 'アップロードに失敗したので、試してみてください',
'服务器返回出错': 'サーバーがエラーに戻る',
'预览生成中': 'プレビュー生成中',
'不能预览': 'プレビューができない。',
'确定删除该图片吗?': 'この写真を削除することは確定しましたか?',
'确定删除该文件吗?': 'このファイルを削除することは確定しましたか?',
'等待上传': 'アップロードを待つ',
'正在上传': 'アップロード中',
'取消': 'キャンセル',
'下载': 'ダウンロード',
'预览': 'プレビュー',
'查看': 'チェック'
};
})(jQuery);

View File

@@ -120,10 +120,8 @@ public class ${ClassName}Service extends ${table.isTreeEntity?'Tree':'Crud'}Serv
}
%>
if (${@StringUtils.uncap(child.className)}.getIsNewRecord()){
${@StringUtils.uncap(child.className)}.preInsert();
${@StringUtils.uncap(child.className)}Dao.insert(${@StringUtils.uncap(child.className)});
}else{
${@StringUtils.uncap(child.className)}.preUpdate();
${@StringUtils.uncap(child.className)}Dao.update(${@StringUtils.uncap(child.className)});
}
}else{
@@ -162,7 +160,7 @@ public class ${ClassName}Service extends ${table.isTreeEntity?'Tree':'Crud'}Serv
}
}
%>
${@StringUtils.uncap(child.className)}Dao.delete(${@StringUtils.uncap(child.className)});
${@StringUtils.uncap(child.className)}Dao.deleteByEntity(${@StringUtils.uncap(child.className)});
<% } %>
}

View File

@@ -81,7 +81,7 @@ $("#inputForm").validate({
});
<% if(table.isTreeEntity){ %>
// 选择父级菜单回调方法
// 选择上级节点回调方法
function treeselectCallback(id, act, index, layero){
if (id == 'parent' && (act == 'ok' || act == 'clear')){
// 创建并初始化下一个节点信息,如:排序号、默认值

View File

@@ -61,7 +61,7 @@ for (c in child.columnList){
editable:true, edittype:'select', editoptions:{<%if (c.showType == 'select_multiple' || c.showType == 'checkbox'){ %>multiple:true, <% } %>'class':'form-control${cssClass}',
items: $.merge([<%if (!(c.showType == 'select_multiple' || c.showType == 'checkbox')){ %>{dictLabel:'&nbsp;',dictValue:''}<% } %>], \${@DictUtils.getDictListJson('${c.optionMap['dictType']}')}),
itemLabel: 'dictLabel', itemValue: 'dictValue', dataInit: function(element){
$(element).select2().on("change",function(){$(this).valid()});
$(element).select2().on("change",function(){$(this).resetValid()});
}
}
},
@@ -107,7 +107,7 @@ for (c in child.columnList){
id: 'office_'+editOptions.id, title: '机构选择',
name: '${c.attrName}', value: val.split('|')[0],
labelName: '${c.attrName2}', labelValue: val.split('|')[1],
url: '\${ctx}/sys/office/treeData?officeTypes=1,2', cssClass: '${cssClass}'
url: '\${ctx}/sys/office/treeData', cssClass: '${cssClass}'
});
}
}

View File

@@ -5,9 +5,10 @@ content="no-cache, no-store, must-revalidate"/><meta name="description" content=
content="no-cache" http-equiv="Pragma"/><meta http-equiv="Expires" content="0"/><meta
content="width=device-width, initial-scale=1, user-scalable=1" name="viewport"/>
<title>${(isNotBlank(title!) ? title! + ' - ' : '') + @Global.getConfig('productName')}</title>
<link rel="shortcut icon" href="${ctxStatic}/favicon.png" type="image/png">
<script src="${ctxPath}/global.min.js?ctx=${ctx}"></script>
<script src="${ctxStatic}/jquery/jquery-1.12.4.min.js"></script>
<script src="${ctxStatic}/jquery/jquery-migrate-1.4.1.min.js"></script>
<!-- <script src="${ctxStatic}/jquery/jquery-migrate-1.4.1.min.js"></script> -->
<!--[if lt IE 9]><script src="${ctxStatic}/common/h5fix.min.js"></script><![endif]-->
<% if(parameter.__layer! == 'true'){ %>
<style>.main-content>.box-main>.box-header{display:none;}</style>

View File

@@ -10,6 +10,7 @@
<% if (@ListUtils.inString('tabPage', libs!)){ %>
<script src="${ctxStatic}/wdScrollTab/js/TabPanel.js?${_version}"></script>
<script src="${ctxStatic}/wdScrollTab/js/TabPanel.extend.js?${_version}"></script>
<script src="${ctxStatic}/wdScrollTab/js/TabPanel_i18n.js?${_version}"></script>
<% } %>
<% if (@ListUtils.inString('dataGrid', libs!)){ %>
<script src="${ctxStatic}/jqGrid/4.7/js/jquery.jqGrid.js?${_version}"></script>
@@ -32,6 +33,7 @@
<% if (@ListUtils.inString('fileupload', libs!)){ %>
<script src="${ctxStatic}/webuploader/0.1/webuploader.js?${_version}"></script>
<script src="${ctxStatic}/webuploader/0.1/webuploader.extend.js?${_version}"></script>
<script src="${ctxStatic}/webuploader/0.1/i18n/${lang()}.js?${_version}"></script>
<% } %>
<% if (@ListUtils.inString('ueditor', libs!)){ %>
<script src="${ctxStatic}/ueditor/1.4/ueditor.config.js?${_version}"></script>

View File

@@ -111,7 +111,7 @@ $("#inputForm").validate({
}
});
//选择父级菜单回调方法
//选择上级节点回调方法
function treeselectCallback(id, act, index, layero){
if (id == 'parent' && (act == 'ok' || act == 'clear')){
// 创建并初始化下一个节点信息,如:排序号、默认值

View File

@@ -19,7 +19,7 @@
<div class="col-sm-8">
<#form:treeselect id="parent" title="${text('上级公司')}"
path="parent.id" labelPath="parent.companyName"
url="${ctx}/sys/company/treeData?excludeCode=${company.id}&ctrlPermi=2"
url="${ctx}/sys/company/treeData?excludeCode=${company.id}&ctrlPermi=${@Global.getConfig('user.adminCtrlPermi', '2')}"
class="" allowClear="true" canSelectRoot="true" canSelectParent="true"/>
</div>
</div>
@@ -143,7 +143,7 @@ $('#companyName').change(function(){
$('#fullName').val($(this).val());
}
});
// 选择父级菜单回调方法
// 选择上级节点回调方法
function treeselectCallback(id, act, index, layero){
if (id == 'parent' && (act == 'ok' || act == 'clear')){
// 创建并初始化下一个节点信息,如:排序号、默认值

Some files were not shown because too many files have changed in this diff Show More