Merge branch 'v4.1_dev'

# Conflicts:
#	modules/core/src/main/resources/i18n/core/common/i18n_en.properties
This commit is contained in:
thinkgem
2019-03-20 22:30:03 +08:00
65 changed files with 4364 additions and 1602 deletions

View File

@@ -47,6 +47,8 @@ jdbc:
# JTA 分布式事务v4.0.4+
jta:
enabled: false
# 事务超时时间单位毫秒3分钟
transactionTimeout: 180000
# 表名前缀
tablePrefix: js_
@@ -498,7 +500,14 @@ file:
# application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,
# application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
# application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation
# 是否开启分片上传
chunked: false
# 分片大小单位字节10M
chunkSize: 10485760
# 最大上传线程数
threads: 1
# 是否用文件流方式下载(支持断点续传)
isFileStreamDown: true

View File

@@ -0,0 +1,27 @@
-- 删除sys_file_entity表的file_md5唯一索引
-- ALTER TABLE [${_prefix}sys_file_entity] DROP CONSTRAINT [UQ__${_prefix}sys_f__3BD63C9E32E0915F];
-- 增加文件信息字段(可存储图片大小)
ALTER TABLE [${_prefix}sys_file_entity] ADD [file_meta] varchar(64) NULL;
-- 集群的实例名字
ALTER TABLE [${_prefix}sys_job] ADD [instance_name] varchar(64) DEFAULT 'JeeSiteScheduler' NOT NULL;
-- 内部消息菜单
INSERT INTO ${_prefix}sys_menu(menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks, 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 ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', getdate(), 'system', getdate(), '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 内部消息新增字典数据
INSERT INTO ${_prefix}sys_dict_type(id, dict_name, dict_type, is_sys, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', getdate(), 'system', getdate(), '');
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 ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', getdate(), 'system', getdate(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 取消内部消息部分字段必填选项
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [receive_codes] text NULL;
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [receive_names] text NULL;
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [send_user_code] varchar(64) NULL;
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [send_user_name] varchar(100) NULL;
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [send_date] datetime NULL;
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [notify_types] varchar(100) NULL;

View File

@@ -0,0 +1,32 @@
-- 删除sys_file_entity表的file_md5唯一索引
ALTER TABLE `${_prefix}sys_file_entity`
DROP INDEX `file_md5`,
ADD INDEX `file_md5`(`file_md5`);
-- 增加文件信息字段(可存储图片大小)
ALTER TABLE `${_prefix}sys_file_entity`
ADD COLUMN `file_meta` varchar(255) NULL COMMENT '文件信息(JSON格式)' AFTER `file_size`;
-- 集群的实例名字
ALTER TABLE `${_prefix}sys_job`
ADD COLUMN `instance_name` varchar(64) NOT NULL DEFAULT 'JeeSiteScheduler' COMMENT '集群的实例名字' AFTER `concurrent`;
-- 内部消息菜单
INSERT INTO `${_prefix}sys_menu`(`menu_code`, `parent_code`, `parent_codes`, `tree_sort`, `tree_sorts`, `tree_leaf`, `tree_level`, `tree_names`, `menu_name`, `menu_type`, `menu_href`, `menu_target`, `menu_icon`, `menu_color`, `permission`, `weight`, `is_show`, `sys_code`, `module_codes`, `status`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `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 ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', now(), 'system', now(), '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 内部消息新增字典数据
INSERT INTO `${_prefix}sys_dict_type`(`id`, `dict_name`, `dict_type`, `is_sys`, `status`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`)
VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', now(), 'system', now(), '');
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 ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', now(), 'system', now(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 取消内部消息部分字段必填选项
ALTER TABLE `${_prefix}sys_msg_inner`
MODIFY COLUMN `receive_codes` text NULL COMMENT '接受者字符串' AFTER `receive_type`,
MODIFY COLUMN `receive_names` text NULL COMMENT '接受者名称字符串' AFTER `receive_codes`,
MODIFY COLUMN `send_user_code` varchar(64) NULL COMMENT '发送者用户编码' AFTER `receive_names`,
MODIFY COLUMN `send_user_name` varchar(100) NULL COMMENT '发送者用户姓名' AFTER `send_user_code`,
MODIFY COLUMN `send_date` datetime(0) NULL COMMENT '发送时间' AFTER `send_user_name`,
MODIFY COLUMN `notify_types` varchar(100) NULL COMMENT '通知类型PC APP 短信 邮件 微信)多选' AFTER `is_attac`;

View File

@@ -0,0 +1,32 @@
-- 删除sys_file_entity表的file_md5唯一索引
-- ALTER TABLE ${_prefix}SYS_FILE_ENTITY DROP CONSTRAINT SYS_C0019398
-- 增加文件信息字段(可存储图片大小)
ALTER TABLE ${_prefix}SYS_FILE_ENTITY
ADD (file_meta VARCHAR2(64) NULL );
COMMENT ON COLUMN ${_prefix}SYS_FILE_ENTITY.file_meta IS '文件信息(JSON格式)';
-- 集群的实例名字
ALTER TABLE ${_prefix}SYS_JOB
ADD (instance_name VARCHAR2(64) DEFAULT 'JeeSiteScheduler' NOT NULL );
COMMENT ON COLUMN ${_prefix}SYS_JOB.instance_name IS '集群的实例名字';
-- 内部消息菜单
INSERT INTO ${_prefix}sys_menu(menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks, 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 ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', sysdate, 'system', sysdate, '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 内部消息新增字典数据
INSERT INTO ${_prefix}sys_dict_type(id, dict_name, dict_type, is_sys, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', sysdate, 'system', sysdate, '');
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 ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', sysdate, 'system', sysdate, '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 取消内部消息部分字段必填选项
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (RECEIVE_CODES NULL );
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (RECEIVE_NAMES NULL );
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (SEND_USER_CODE NULL );
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (SEND_USER_NAME NULL );
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (SEND_DATE NULL );
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (NOTIFY_TYPES NULL );

View File

@@ -0,0 +1,34 @@
-- 删除sys_file_entity表的file_md5唯一索引
ALTER TABLE ${_prefix}sys_file_entity
DROP CONSTRAINT ${_prefix}sys_file_entity_file_md5_key;
-- 增加文件信息字段(可存储图片大小)
ALTER TABLE ${_prefix}sys_file_entity
ADD COLUMN file_meta varchar(255) NULL;
COMMENT ON COLUMN ${_prefix}sys_file_entity.file_meta IS '文件信息(JSON格式)';
-- 集群的实例名字
ALTER TABLE ${_prefix}sys_job
ADD COLUMN instance_name varchar(255) NOT NULL DEFAULT 'JeeSiteScheduler';
COMMENT ON COLUMN ${_prefix}sys_job.instance_name IS '集群的实例名字';
-- 内部消息菜单
INSERT INTO ${_prefix}sys_menu(menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks, 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 ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', now(), 'system', now(), '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 内部消息新增字典数据
INSERT INTO ${_prefix}sys_dict_type(id, dict_name, dict_type, is_sys, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', now(), 'system', now(), '');
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 ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', now(), 'system', now(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 取消内部消息部分字段必填选项
ALTER TABLE ${_prefix}sys_msg_inner
ALTER COLUMN receive_codes DROP NOT NULL,
ALTER COLUMN receive_names DROP NOT NULL,
ALTER COLUMN send_user_code DROP NOT NULL,
ALTER COLUMN send_user_name DROP NOT NULL,
ALTER COLUMN send_date DROP NOT NULL,
ALTER COLUMN notify_types DROP NOT NULL;

View File

@@ -9,4 +9,5 @@
4.1.0
4.1.1
4.1.2
4.1.3
4.1.3
4.1.4

View File

@@ -1,4 +1,3 @@
# =========== 登录登出相关 ===========
sys.login.notLongIn=No login or login timeout.Please login again, thank you!
@@ -59,7 +58,7 @@ sys.error.returnButton=Previous page
# =========== 文件上传相关 ===========
sys.file.uploadFileIsEmpty=This is a new file, please upload file!
sys.file.uploadFileIsEmpty=No files to upload!
sys.file.uploadValidNotBlank=File md5 and file name cannot be empty!
sys.file.uploadValidImage=Can only upload images ({0})
sys.file.uploadValidVideo=Can only upload video ({0})
@@ -70,3 +69,4 @@ sys.file.uploadValidContent=File content format not allowed!
sys.file.uploadSuccessSeconds=Seconds upload success , time {0}
sys.file.uploadSuccess=Upload success {0}
sys.file.downloadFileNotExist=File lost or non-existent!
sys.file.chunkUploading=Uploading {0}/{1}

View File

@@ -60,7 +60,7 @@ sys.error.returnButton=返回上一页
# =========== 文件上传相关 ===========
sys.file.uploadFileIsEmpty=没有找到上传的文件!
sys.file.uploadFileIsEmpty=服务器上没有这个文件!
sys.file.uploadValidNotBlank=文件校验码和文件名不能为空!
sys.file.uploadValidImage=只能上传图片({0}
sys.file.uploadValidVideo=只能上传视频({0}
@@ -71,3 +71,4 @@ sys.file.uploadValidContent=文件内容格式不允许!
sys.file.uploadSuccessSeconds=秒传成功,用时{0}
sys.file.uploadSuccess=上传成功,用时{0}
sys.file.downloadFileNotExist=文件已丢失或不存在!
sys.file.chunkUploading=正在上传 {0}/{1}

View File

@@ -103,11 +103,11 @@
您还未设置过密保问题,您可以根据登录密码设置新的密保问题及答案。=You have not set up the security problem, you can set up the new security problem and answer according to the login password.
旧的密保问题及答案=Old secret questions and answers
密问题=Old secret questions
密问题答案=Old secret answers
旧密问题=Old secret questions
旧密问题答案=Old secret answers
新的密保问题及答案=New secret questions and answers
密问题=New secret questions
密问题答案=New secret answers
新密问题=New secret questions
新密问题答案=New secret answers
# =========== 用户管理 ===========

View File

@@ -0,0 +1,28 @@
<?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.msg.dao.MsgInnerDao">
<!-- 查询数据 -->
<select id="findList" resultType="MsgInner">
SELECT distinct ${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",
r.is_star AS "record.isStar"
</if>
FROM ${sqlMap.table.toSql()}
<if test="record != null and record.receiveUserCode != null and record.receiveUserCode != ''">
LEFT JOIN ${_prefix}sys_msg_inner_record r ON r.msg_inner_id = a.id
AND r.receive_user_code = #{record.receiveUserCode}
</if>
<where>
${sqlMap.where.toSql()}
<if test="record != null and record.receiveUserCode != null and record.receiveUserCode != ''">
AND ((a.status = #{STATUS_NORMAL} AND r.receive_user_code = #{record.receiveUserCode})
OR a.create_by = #{currentUser.userCode})
</if>
</where>
ORDER BY ${sqlMap.order.toSql()}
</select>
</mapper>

View File

@@ -0,0 +1,24 @@
<?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.msg.dao.MsgInnerRecordDao">
<!-- 查询数据
<select id="findList" resultType="MsgInnerRecord">
SELECT ${sqlMap.column.toSql()}
FROM ${sqlMap.table.toSql()}
<where>
${sqlMap.where.toSql()}
</where>
ORDER BY ${sqlMap.order.toSql()}
</select> -->
<update id="updateReadStatus">
UPDATE ${_prefix}sys_msg_inner_record SET
read_status = #{readStatus},
read_date = #{readDate}
WHERE msg_inner_id = #{msgInnerId}
AND receive_user_code = #{receiveUserCode}
AND read_date is null
</update>
</mapper>

View File

@@ -24,4 +24,81 @@
ORDER BY ${sqlMap.order.toSql()}
</select>
<sql id="userColumns">
a.user_code as "userCode",
a.user_name as "userName"
</sql>
<!-- 查询全部用户,仅返回基本信息 -->
<select id="findUserList" resultType="EmpUser">
SELECT
<include refid="userColumns"/>
FROM ${_prefix}sys_user a
WHERE a.status = #{STATUS_NORMAL}
AND a.user_type = #{USER_TYPE_EMPLOYEE}
<if test="global.useCorpModel">
AND a.corp_code = #{corpCode}
</if>
</select>
<!-- 根据部门编码查询用户,仅返回基本信息 -->
<select id="findUserListByOfficeCodes" resultType="EmpUser">
SELECT
<include refid="userColumns"/>
FROM ${_prefix}sys_user a
JOIN ${_prefix}sys_employee e ON e.emp_code = a.ref_code
JOIN ${_prefix}sys_office o ON o.office_code = e.office_code
WHERE a.status = #{STATUS_NORMAL}
AND a.user_type = #{USER_TYPE_EMPLOYEE}
<if test="global.useCorpModel">
AND a.corp_code = #{corpCode}
</if>
AND e.status = #{STATUS_NORMAL}
AND o.status = #{STATUS_NORMAL}
AND o.office_code IN
<foreach item="code" index="index" collection="codes" open="(" separator="," close=")">
#{code}
</foreach>
</select>
<!-- 根据角色编码查询用户,仅返回基本信息 -->
<select id="findUserListByRoleCodes" resultType="EmpUser">
SELECT
<include refid="userColumns"/>
FROM ${_prefix}sys_user a
JOIN ${_prefix}sys_user_role ur ON ur.user_code = a.user_code
JOIN ${_prefix}sys_role r ON r.role_code = ur.role_code
WHERE a.status = #{STATUS_NORMAL}
AND a.user_type = #{USER_TYPE_EMPLOYEE}
<if test="global.useCorpModel">
AND a.corp_code = #{corpCode}
</if>
AND r.status = #{STATUS_NORMAL}
AND r.role_code IN
<foreach item="code" index="index" collection="codes" open="(" separator="," close=")">
#{code}
</foreach>
</select>
<!-- 根据岗位编码查询用户,仅返回基本信息 -->
<select id="findUserListByPostCodes" resultType="EmpUser">
SELECT
<include refid="userColumns"/>
FROM ${_prefix}sys_user a
JOIN ${_prefix}sys_employee e ON e.emp_code = a.ref_code
JOIN ${_prefix}sys_employee_post ep ON ep.emp_code = e.emp_code
JOIN ${_prefix}sys_post p ON p.post_code = ep.post_code
WHERE a.status = #{STATUS_NORMAL}
AND a.user_type = #{USER_TYPE_EMPLOYEE}
<if test="global.useCorpModel">
AND a.corp_code = #{corpCode}
</if>
AND e.status = #{STATUS_NORMAL}
AND p.status = #{STATUS_NORMAL}
AND p.post_code IN
<foreach item="code" index="index" collection="codes" open="(" separator="," close=")">
#{code}
</foreach>
</select>
</mapper>

View File

@@ -37,6 +37,9 @@
<!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER插入空值时不需要指定类型 -->
<setting name="jdbcTypeForNull" value="NULL"/>
<!-- 返回值为Map时当返回空值字段时仍然需要返回这个Key -->
<setting name="callSettersOnNulls" value="true"/>
</settings>
<!-- 类型别名 -->

View File

@@ -0,0 +1,177 @@
<% layout('/layouts/default.html', {title: '站内消息', libs: ['validate','fileupload','ueditor']}){ %>
<div class="main-content">
<div class="box box-main">
<div class="box-header with-border">
<div class="box-title">
<i class="fa icon-speech"></i> ${text(msgInner.isNewRecord ? '发送消息' : '编辑消息')}
</div>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div>
<#form:form id="inputForm" model="${msgInner}" action="${ctx}/msg/msgInner/save" method="post" class="form-horizontal">
<div class="box-body">
<div class="form-unit">${text('基本信息')}</div>
<#form:hidden path="id"/>
<#form:hidden path="status"/>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2" title="">
<span class="required ">*</span> ${text('标题')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-10">
<#form:input path="msgTitle" maxlength="200" class="form-control required text-ruler"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required ">*</span> ${text('等级')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:radio path="contentLevel" dictType="msg_inner_content_level" class="form-control required" />
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required hide">*</span> ${text('类型')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:radio path="contentType" dictType="msg_inner_content_type" blankOption="true" class="form-control" />
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2" title="">
<span class="required ">*</span> ${text('内容')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-10">
<#form:ueditor path="msgContent" rows="4" class="form-control required" simpleToolbars="true"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2">${text('附件')}</label>
<div class="col-sm-10">
<#form:fileupload id="uploadFile" bizKey="${msgInner.id}" bizType="msgInner_file"
uploadType="all" class="" readonly="false"/>
</div>
</div>
</div>
</div>
<div class="form-unit">${text('接受者信息')}</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2" title="">
<span class="required ">*</span> ${text('接受者')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-10">
<#form:radio path="receiveType" dictType="msg_inner_receiver_type" class="form-control required" />
<#form:treeselect id="receive" title="${text('接受者选择')}"
path="receiveCodes" labelPath="receiveNames"
url="${ctx}/sys/office/treeData?isLoadUser=true"
class=" required" allowClear="true" checkbox="true"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2" title="">
<span class="required ">*</span> ${text('通知')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-10">
<#form:checkbox path="notifyTypes" dictType="sys_msg_type" class="form-control required" />
<% if(__info_type == '0'){ %>(专业版功能)<% } %>
</div>
</div>
</div>
</div>
<% if(!msgInner.isNewRecord){ %>
<div class="form-unit">${text('发送者信息')}</div>
<div class="row">
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required hide">*</span> ${text('发送者')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:input path="sendUserName" readonly="true" maxlength="100" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required hide">*</span> ${text('发送时间')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:input path="sendDate" dataFormat="datetime" readonly="true" maxlength="20" class="form-control required"/>
</div>
</div>
</div>
</div>
<% } %>
</div>
<div class="box-footer">
<div class="row">
<div class="col-sm-offset-2 col-sm-10">
<% if (hasPermi('msg:msgInner:edit')){ %>
<% if (msgInner.status == null || msgInner.status == '9'){ %>
<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit" onclick="$('#status').val(9)"><i class="fa fa-save"></i> ${text('保存草稿')}</button>&nbsp;
<button type="submit" class="btn btn-sm btn-info" id="btnRelease" onclick="$('#status').val(0)"><i class="fa fa-send"></i> ${text('发布消息')}</button>&nbsp;
<% } %>
<% } %>
<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
</div>
</div>
</div>
</#form:form>
</div>
</div>
<% } %>
<script>
$('#receiveType input').on('ifCreated ifChecked', function(event){
if ($(this).is(':checked')){
var url, val = $(this).val(); // 接受者类型1用户 2部门 3角色 4岗位
if (val == '0'){
$('#receiveDiv').hide();
$('#receiveName').removeClass('required');
}else{
$('#receiveDiv').show();
$('#receiveName').addClass('required');
if (val == '1'){
url = '${ctx}/sys/office/treeData?isLoadUser=true&isAll=true';
}else if (val == '2'){
url = '${ctx}/sys/office/treeData?isAll=true';
}else if (val == '3'){
url = '${ctx}/sys/role/treeData?isAll=true';
}else if (val == '4'){
url = '${ctx}/sys/post/treeData?isAll=true';
}
$('#receiveDiv').attr('data-url', url);
}
if (event.type != 'ifCreated'){
$('#receiveCode,#receiveName').val('');
}
}
});
$("#inputForm").validate({
submitHandler: function(form){
js.ajaxSubmitForm($(form), function(data){
js.showMessage(data.message);
if(data.result == Global.TRUE){
js.closeCurrentTabPage(function(contentWindow){
contentWindow.page();
});
}
}, "json");
}
});
</script>

View File

@@ -0,0 +1,107 @@
<% layout('/layouts/default.html', {title: '站内消息', libs: ['dataGrid']}){ %>
<div class="main-content">
<div class="box box-main">
<div class="box-header">
<div class="box-title">
<i class="fa icon-speech"></i> ${text('站内消息')}
</div>
<div class="box-tools pull-right">
<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
<% if(hasPermi('msg:msgInner:edit')){ %>
<a href="${ctx}/msg/msgInner/form" class="btn btn-default btnTool" title="${text('新增')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
<% } %>
</div>
</div>
<div class="box-body">
<#form:form id="searchForm" model="${msgInner}" action="${ctx}/msg/msgInner/listData" method="post" class="form-inline hide"
data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
<div class="form-group">
<label class="control-label">${text('标题')}</label>
<div class="control-inline">
<#form:input path="msgTitle" maxlength="200" class="form-control width-120"/>
</div>
</div>
<div class="form-group">
<label class="control-label">${text('级别')}</label>
<div class="control-inline width-60">
<#form:select path="contentLevel" dictType="msg_inner_content_level" blankOption="true" class="form-control"/>
</div>
</div>
<div class="form-group">
<label class="control-label">${text('类型')}</label>
<div class="control-inline width-60">
<#form:select path="contentType" dictType="msg_inner_content_type" blankOption="true" class="form-control"/>
</div>
</div>
<div class="form-group">
<label class="control-label">${text('发送时间')}</label>
<div class="control-inline">
<#form:input path="sendDate_gte" readonly="true" maxlength="20" class="form-control Wdate-date"
dataFormat="date" onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:false,onpicked:function(){sendDate_lte.click()}});"/>
&nbsp;--&nbsp;
<#form:input path="sendDate_lte" readonly="true" maxlength="20" class="form-control Wdate-date"
dataFormat="date" onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:false});"/>
</div>
</div>
<div class="form-group">
<label class="control-label">${text('状态')}</label>
<div class="control-inline width-60">
<#form:select path="status" dictType="msg_inner_msg_status" blankOption="true" class="form-control"/>
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-sm">${text('查询')}</button>
<button type="reset" class="btn btn-default btn-sm">${text('重置')}</button>
</div>
</#form:form>
<table id="dataGrid"></table>
<div id="dataGridPage"></div>
</div>
</div>
</div>
<% } %>
<script>
// 初始化DataGrid对象
$('#dataGrid').dataGrid({
searchForm: $("#searchForm"),
columnModel: [
{header:'${text("标题")}', name:'msgTitle', index:'a.msg_title', width:280, align:"left", frozen:true, formatter: function(val, obj, row, act){
if(row.status == Global.STATUS_DRAFT){
return '<a href="${ctx}/msg/msgInner/form?id='+row.id+'" class="btnList" data-title="${text("编辑消息")}">'
+(val||row.id)+'</a>'+(row.isAttac==1?' <i class="fa fa-paperclip"></i>':'');
}else{
return '<a href="${ctx}/msg/msgInner/view?id='+row.id+'" class="btnList" data-title="${text("查看消息")}">'
+(val||row.id)+'</a>'+(row.isAttac==1?' <i class="fa fa-paperclip"></i>':'');
}
}},
{header:'${text("等级")}', name:'contentLevel', index:'a.content_level', width:80, align:"center", formatter: function(val, obj, row, act){
return js.getDictLabel(${@DictUtils.getDictListJson('msg_inner_content_level')}, val, '${text("未知")}', true);
}},
{header:'${text("类型")}', name:'contentType', index:'a.content_type', width:80, align:"center", formatter: function(val, obj, row, act){
return js.getDictLabel(${@DictUtils.getDictListJson('msg_inner_content_type')}, val, '${text("未知")}', true);
}},
{header:'${text("发送者")}', name:'sendUserName', index:'a.send_user_name', width:100, align:"center"},
{header:'${text("发送时间")}', name:'sendDate', index:'a.send_date', width:150, align:"center"},
// {header:'${text("更新时间")}', name:'updateDate', index:'a.update_date', width:150, align:"center"},
{header:'${text("状态")}', name:'status', index:'a.status', width:80, align:"center", formatter: function(val, obj, row, act){
return js.getDictLabel(${@DictUtils.getDictListJson('msg_inner_msg_status')}, val, '${text("未知")}', true);
}},
{header:'${text("操作")}', name:'actions', width:120, sortable:false, title:false, formatter: function(val, obj, row, act){
var actions = [];
if(row.status == Global.STATUS_DRAFT){
<% if(hasPermi('msg:msgInner:edit')){ %>
actions.push('<a href="${ctx}/msg/msgInner/form?id='+row.id+'" class="btnList" title="${text("编辑消息")}"><i class="fa fa-pencil"></i></a>&nbsp;');
actions.push('<a href="${ctx}/msg/msgInner/delete?id='+row.id+'" class="btnList" title="${text("删除消息")}" data-confirm="${text("确认要删除该消息吗?")}"><i class="fa fa-trash-o"></i></a>&nbsp;');
<% } %>
}else{
actions.push('<a href="${ctx}/msg/msgInner/view?id='+row.id+'" class="btnList" title="${text("查看消息")}"><i class="fa fa-book"></i></a>&nbsp;');
}
return actions.join('');
}}
],
// 加载成功后执行事件
ajaxSuccess: function(data){
}
});
</script>

View File

@@ -0,0 +1,50 @@
<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved. */ %>
<% layout('/layouts/default.html', {title: '查看消息', libs: ['validate','fileupload']}){ %>
<div class="main-content">
<div class="box box-main">
<div class="box-header with-border hide">
<div class="box-title">
<i class="fa icon-envelope-letter"></i> ${text('查看消息')}
</div>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div>
<div class="box-body article-view">
<h2 class="article-title">${msgInner.msgTitle}</h2>
<div class="content-text">
<!-- <blockquote>摘要:</blockquote> -->
${msgInner.msgContent}
<% if(msgInner.isAttac == @Global.YES){ %>
<div class="form-group pt20">
<#form:fileupload id="uploadFile" bizKey="${msgInner.id}" bizType="msgInner_file"
uploadType="all" class="" readonly="true" preview="weboffice"/>
</div>
<% } %>
</div>
<ul class="content-info">
<li><i class="fa fa-user"></i> 发送者:${msgInner.sendUserName}</li>
<li><i class="fa fa-calendar"></i> 发送时间:${msgInner.sendDate, 'yyyy-MM-dd HH:mm'}</li>
<li><i class="fa icon-envelope-letter"></i> 读取时间:${msgInner.sendDate, 'yyyy-MM-dd HH:mm'}</li>
<li><i class="fa fa-bookmark-o"></i> 等级:${@DictUtils.getDictLabel('msg_inner_content_level', msgInner.contentLevel, '普通')}</li>
<li><i class="fa fa-bookmark-o"></i> 类型:${@DictUtils.getDictLabel('msg_inner_content_type', msgInner.contentType, '其它')}</li>
</ul>
<% if (readList! != null && readList.~size > 0){ %>
<div class="content-info">已读用户:<% for (e in readList){ %>
<span class="label bg-green" title="${e.readDate,dateFormat='yyyy-MM-dd HH:mm:ss'}" data-code="${e.receiveUserName}">${e.receiveUserName}</span><% } %>
</div><% } %>
<% if (unReadList! != null && unReadList.~size > 0){ %>
<div class="content-info">未读用户:<% for (e in unReadList){ %>
<span class="label bg-yellow" data-code="${e.receiveUserName}">${e.receiveUserName}</span><% } %>
</div><% } %>
</div>
<div class="box-footer">
<div class="row">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
</div>
</div>
</div>
</div>
</div>
<% } %>

View File

@@ -29,6 +29,7 @@
<script>
// 初始化布局
$('body').layout({
west__initClosed: false, // 是否默认关闭
west__size: 180
});
// 主页框架
@@ -37,7 +38,7 @@ var win = $("#mainFrame")[0].contentWindow;
var setting = {view:{selectedMulti:false},data:{key:{title:"title"},simpleData:{enable:true}},
callback:{onClick:function(event, treeId, treeNode){
tree.expandNode(treeNode);
win.$('input[type=reset]').click();
win.$('button[type=reset]').click();
win.$('#officeCode').val(treeNode.id);
win.$('#officeName').val(treeNode.name);
win.page();

View File

@@ -1,7 +1,7 @@
<% if(@Global.getConfigToBoolean('user.useCorpModel', 'false') && user.superAdmin){ %>
<li>
<a href="javascript:" id="switchCorp">
<i class="fa icon-home"></i> 当前租户:(${session.corpCode}) ${session.corpName}
<i class="fa icon-home"></i> ${text('当前租户')}(${session.corpCode}) ${session.corpName}
</a>
<div class="hide"><#form:treeselect id="switchCorpSelect" title="${text('租户切换')}" allowClear="false"
url="${ctx}/sys/corpAdmin/treeData?isShowCode=true" callbackFuncName="switchCorpSelectCallback"/>

View File

@@ -47,6 +47,7 @@
</div>
</div>
<div class="form-group">
<input type="hidden" name="__url" value="${parameter.__url!}">
<button type="submit" class="btn btn-primary btn-block btn-flat"
id="btnSubmit" data-loading="${text('登录验证成功,正在进入...')}"
data-login-valid="${text('正在验证登录,请稍后...')}">${text('立即登录')}</button>