于俊龙 1 月之前
父节点
当前提交
ac746060bb

+ 127 - 62
farm-common/src/main/java/jp/yamoto/farm/common/core/domain/AjaxResult.java

@@ -6,118 +6,183 @@ import jp.yamoto.farm.common.constant.HttpStatus;
 import jp.yamoto.farm.common.utils.StringUtils;
 
 /**
- * 操作メッセージリマインダ
- * 
+ * 操作メッセージリマインダ
+ *
  * @author nextosd
  */
-public class AjaxResult extends HashMap<String, Object>
-{
-    private static final long serialVersionUID = 1L;
-
-    /** Status Code */
+public class AjaxResult extends HashMap<String, Object> {
+    /**
+     * ステータスコード
+     */
     public static final String CODE_TAG = "code";
-
+    /**
+     * 戻り内容
+     */
     public static final String MSG_TAG = "msg";
-
-    /** Data */
+    /**
+     * データオブジェクト
+     */
     public static final String DATA_TAG = "data";
+    /**
+     * 成功のメッセージ内容
+     */
+    public static final String SUCCESS_MSG = "OK";
+    /**
+     * 失敗のメッセージ内容
+     */
+    public static final String ERROR_MSG = "NG";
+
+    private static final long serialVersionUID = 1L;
 
-    public AjaxResult()
-    {
+    /**
+     * 新しい AjaxResult オブジェクトを初期化し、空のメッセージを表すようにします。
+     */
+    public AjaxResult() {
     }
 
     /**
-     * AjaxResult
-     * 
-     * @param code Status Code
-     * @param msg
+     * 新しい AjaxResult オブジェクトを初期化します
+     *
+     * @param code ステータスコード
+     * @param msg  戻り内容
      */
-    public AjaxResult(int code, String msg)
-    {
+    public AjaxResult(int code, String msg) {
         super.put(CODE_TAG, code);
         super.put(MSG_TAG, msg);
     }
 
-    public AjaxResult(int code, String msg, Object data)
-    {
+    /**
+     * 新しい AjaxResult オブジェクトを初期化します
+     *
+     * @param code ステータスコード
+     * @param msg  戻り内容
+     * @param data データオブジェクト
+     */
+    public AjaxResult(int code, String msg, Object data) {
         super.put(CODE_TAG, code);
         super.put(MSG_TAG, msg);
-        if (StringUtils.isNotNull(data))
-        {
+        if (StringUtils.isNotNull(data)) {
             super.put(DATA_TAG, data);
         }
     }
 
-    public static AjaxResult success()
-    {
-        return AjaxResult.success("操作に成功しました");
-    }
-
-
-    public static AjaxResult success(Object data)
-    {
-        return AjaxResult.success("操作に成功しました", data);
+    /**
+     * 成功メッセージを返します
+     *
+     * @return 成功メッセージ
+     */
+    public static AjaxResult success() {
+        return AjaxResult.success(StringUtils.EMPTY);
     }
 
-    public static AjaxResult success(String msg)
-    {
-        return AjaxResult.success(msg, null);
+    /**
+     * 成功データを返します
+     *
+     * @return 成功メッセージ
+     */
+    public static AjaxResult success(Object data) {
+        return AjaxResult.success(SUCCESS_MSG, data);
     }
 
-    public static AjaxResult success(String msg, Object data)
-    {
+    /**
+     * 成功メッセージを返します
+     *
+     * @param msg  戻り内容
+     * @param data データオブジェクト
+     * @return 成功メッセージ
+     */
+    public static AjaxResult success(String msg, Object data) {
         return new AjaxResult(HttpStatus.SUCCESS, msg, data);
     }
 
-    public static AjaxResult warn(String msg)
-    {
+    /**
+     * 警告メッセージを返します
+     *
+     * @param msg 戻り内容
+     * @return 警告メッセージ
+     */
+    public static AjaxResult warn(String msg) {
         return AjaxResult.warn(msg, null);
     }
 
-    public static AjaxResult warn(String msg, Object data)
-    {
+    /**
+     * 警告メッセージを返します
+     *
+     * @param msg  戻り内容
+     * @param data データオブジェクト
+     * @return 警告メッセージ
+     */
+    public static AjaxResult warn(String msg, Object data) {
         return new AjaxResult(HttpStatus.WARN, msg, data);
     }
 
-    public static AjaxResult error()
-    {
-        return AjaxResult.error("操作に失敗しました");
-    }
-
-    public static AjaxResult error(String msg)
-    {
-        return AjaxResult.error(msg, null);
+    /**
+     * エラーメッセージを返します
+     *
+     * @return エラーメッセージ
+     */
+    public static AjaxResult error() {
+        return AjaxResult.error(HttpStatus.ERROR, ERROR_MSG);
     }
 
-    public static AjaxResult error(String msg, Object data)
-    {
-        return new AjaxResult(HttpStatus.ERROR, msg, data);
+    /**
+     * エラーメッセージを返します
+     *
+     * @param msg 戻り内容
+     * @return エラーメッセージ
+     */
+    public static AjaxResult error(String msg) {
+        return AjaxResult.error(HttpStatus.ERROR, msg);
     }
 
-    public static AjaxResult error(int code, String msg)
-    {
+    /**
+     * エラーメッセージを返します
+     *
+     * @param code ステータスコード
+     * @param msg  戻り内容
+     * @return エラーメッセージ
+     */
+    public static AjaxResult error(int code, String msg) {
         return new AjaxResult(code, msg, null);
     }
 
-    public boolean isSuccess()
-    {
+    /**
+     * 成功メッセージかどうかを確認します
+     *
+     * @return 結果
+     */
+    public boolean isSuccess() {
         return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG));
     }
 
-    public boolean isWarn()
-    {
+    /**
+     * 警告メッセージかどうかを確認します
+     *
+     * @return 結果
+     */
+    public boolean isWarn() {
         return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG));
     }
 
-    public boolean isError()
-    {
+    /**
+     * エラーメッセージかどうかを確認します
+     *
+     * @return 結果
+     */
+    public boolean isError() {
         return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG));
     }
 
+    /**
+     * チェーン呼び出しを便利にする
+     *
+     * @param key   キー
+     * @param value 値
+     * @return データオブジェクト
+     */
     @Override
-    public AjaxResult put(String key, Object value)
-    {
+    public AjaxResult put(String key, Object value) {
         super.put(key, value);
         return this;
     }
-}
+}

+ 14 - 0
farm-common/src/main/java/jp/yamoto/farm/common/core/domain/entity/SysRole.java

@@ -51,6 +51,11 @@ public class SysRole extends BaseEntity
     /** ユーザーにこのロールIDが存在するかどうか  デフォルトで存在しません */
     private boolean flag = false;
 
+    /**
+     * リビジョン
+     */
+    private Integer version;
+
     /** メニューグループ */
     private Long[] menuIds;
 
@@ -172,6 +177,14 @@ public class SysRole extends BaseEntity
         this.flag = flag;
     }
 
+    public Integer getVersion() {
+        return version;
+    }
+
+    public void setVersion(Integer version) {
+        this.version = version;
+    }
+
     public Long[] getMenuIds()
     {
         return menuIds;
@@ -202,6 +215,7 @@ public class SysRole extends BaseEntity
             .append("dataScope", getDataScope())
             .append("menuCheckStrictly", isMenuCheckStrictly())
             .append("status", getStatus())
+            .append("version", getVersion())
             .append("delFlag", getDelFlag())
             .append("createBy", getCreateBy())
             .append("createTime", getCreateTime())

+ 14 - 0
farm-common/src/main/java/jp/yamoto/farm/common/core/domain/entity/SysUser.java

@@ -64,6 +64,11 @@ public class SysUser extends BaseEntity
     @Excel(name = "最終ログイン時間", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Excel.Type.EXPORT)
     private Date loginDate;
 
+    /**
+     * リビジョン
+     */
+    private Integer version;
+
     /** ロールオブジェクト */
     private List<SysRole> roles;
 
@@ -221,6 +226,14 @@ public class SysUser extends BaseEntity
         this.loginDate = loginDate;
     }
 
+    public Integer getVersion() {
+        return version;
+    }
+
+    public void setVersion(Integer version) {
+        this.version = version;
+    }
+
     public List<SysRole> getRoles()
     {
         return roles;
@@ -266,6 +279,7 @@ public class SysUser extends BaseEntity
             .append("delFlag", getDelFlag())
             .append("loginIp", getLoginIp())
             .append("loginDate", getLoginDate())
+            .append("version", getVersion())
             .append("createBy", getCreateBy())
             .append("createTime", getCreateTime())
             .append("updateBy", getUpdateBy())

+ 7 - 41
farm-crm-biz/src/main/java/jp/yamoto/farm/crm/biz/user/security/SysLoginService.java

@@ -4,7 +4,6 @@ import jakarta.annotation.Resource;
 import jp.yamoto.farm.common.config.AppConfig;
 import jp.yamoto.farm.crm.biz.user.service.ISysConfigService;
 import jp.yamoto.farm.crm.biz.user.service.ISysUserService;
-import jp.yamoto.farm.common.constant.CacheConstants;
 import jp.yamoto.farm.common.constant.Constants;
 import jp.yamoto.farm.common.constant.UserConstants;
 import jp.yamoto.farm.common.core.domain.entity.SysUser;
@@ -58,14 +57,10 @@ public class SysLoginService
      * 
      * @param username ユーザー名
      * @param password パスワード
-     * @param code 認証コード
-     * @param uuid UUID
      * @return
      */
-    public String login(String username, String password, String code, String uuid)
+    public String login(String username, String password)
     {
-        // 検証コード検証
-        validateCaptcha(username, code, uuid);
         // ログイン前チェック
         loginPreCheck(username, password);
         // ユーザー認証
@@ -80,7 +75,7 @@ public class SysLoginService
         {
             if (e instanceof BadCredentialsException)
             {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("E0004")));
                 throw new UserPasswordNotMatchException();
             }
             else
@@ -93,7 +88,7 @@ public class SysLoginService
         {
             AuthenticationContextHolder.clearContext();
         }
-        AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_SUCCESS, MessageUtils.message("I0008")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
         recordLoginInfo(loginUser.getUserId());
         // token
@@ -101,35 +96,6 @@ public class SysLoginService
     }
 
     /**
-     * 検証コード
-     * 
-     * @param username ユーザー名
-     * @param code コード
-     * @param uuid UUID
-     * @return
-     */
-    public void validateCaptcha(String username, String code, String uuid)
-    {
-        boolean captchaEnabled = configService.selectCaptchaEnabled();
-        if (captchaEnabled)
-        {
-            String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
-            String captcha = appCache.getCacheObject(verifyKey, String.class);
-            if (captcha == null)
-            {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
-                throw new CaptchaExpireException();
-            }
-            appCache.deleteObject(verifyKey);
-            if (!code.equalsIgnoreCase(captcha))
-            {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
-                throw new CaptchaException();
-            }
-        }
-    }
-
-    /**
      * ログイン前チェック
      * @param username ユーザー名
      * @param password ユーザーパスワード
@@ -139,28 +105,28 @@ public class SysLoginService
         // ユーザー名またはパスワードがNULLのエラー
         if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password))
         {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("not.null")));
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("E0052")));
             throw new UserNotExistsException();
         }
         // パスワードが指定された範囲内でなければエラー
         if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                 || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
         {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("E0004")));
             throw new UserPasswordNotMatchException();
         }
         // ユーザー名が指定された範囲外のエラー
         if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                 || username.length() > UserConstants.USERNAME_MAX_LENGTH)
         {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("E0004")));
             throw new UserPasswordNotMatchException();
         }
         // IPブラックリスト検証
         String blackStr = configService.selectConfigByKey("sys.login.blackIPList");
         if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr()))
         {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked")));
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(appConfig.getName(), username, Constants.LOGIN_FAIL, MessageUtils.message("E0061")));
             throw new BlackListException();
         }
     }

+ 3 - 3
farm-crm-biz/src/main/java/jp/yamoto/farm/crm/biz/user/security/UserDetailsServiceImpl.java

@@ -42,17 +42,17 @@ public class UserDetailsServiceImpl implements UserDetailsService
         if (StringUtils.isNull(user))
         {
             log.info("ログインユーザ:{}は存在しません.", username);
-            throw new ServiceException(MessageUtils.message("user.not.exists"));
+            throw new ServiceException(MessageUtils.message("E0050", username));
         }
         else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
         {
             log.info("ログインユーザー:{}が削除されました。", username);
-            throw new ServiceException(MessageUtils.message("user.password.delete"));
+            throw new ServiceException(MessageUtils.message("E0054"));
         }
         else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
         {
             log.info("ログインユーザ:{}が停止されました", username);
-            throw new ServiceException(MessageUtils.message("user.blocked"));
+            throw new ServiceException(MessageUtils.message("E0049"));
         }
 
         passwordService.validate(user);

+ 1 - 4
farm-crm-biz/src/main/java/jp/yamoto/farm/crm/biz/user/service/impl/SysConfigServiceImpl.java

@@ -159,10 +159,7 @@ public class SysConfigServiceImpl implements ISysConfigService
         for (Long configId : configIds)
         {
             SysConfig config = selectConfigById(configId);
-            if (StringUtils.equals(UserConstants.YES, config.getConfigType()))
-            {
-                throw new ServiceException(String.format("組み込みパラメータ[%1$s]は削除できません ", config.getConfigKey()));
-            }
+
             configMapper.deleteConfigById(configId);
             appCache.deleteObject(getCacheKey(config.getConfigKey()));
         }

+ 8 - 3
farm-crm-biz/src/main/java/jp/yamoto/farm/crm/biz/user/service/impl/SysRoleServiceImpl.java

@@ -6,6 +6,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import jp.yamoto.farm.common.utils.MessageUtils;
 import jp.yamoto.farm.crm.biz.user.mapper.SysRoleMapper;
 import jp.yamoto.farm.crm.biz.user.mapper.SysRoleMenuMapper;
 import jp.yamoto.farm.crm.biz.user.mapper.SysUserRoleMapper;
@@ -177,7 +178,7 @@ public class SysRoleServiceImpl implements ISysRoleService
     {
         if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin())
         {
-            throw new ServiceException("スーパー管理者ロールの操作は許可されていません");
+            throw new ServiceException("スーパーアドミンの役割を操作することはできません");
         }
     }
 
@@ -240,8 +241,12 @@ public class SysRoleServiceImpl implements ISysRoleService
     @Transactional
     public int updateRole(SysRole role)
     {
-        // ロール情報の変更
-        roleMapper.updateRole(role);
+        // 役割情報の更新
+        int result = roleMapper.updateRole(role);
+        if (result < 1) {
+            // 該当データは既に別のユーザーより更新されました。
+            throw new ServiceException(MessageUtils.message("E0007"));
+        }
         // ロールの削除メニューへの関連付け
         roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId());
         return insertRoleMenu(role);

+ 92 - 15
farm-crm-biz/src/main/resources/mapper/crm/SysMenuMapper.xml

@@ -29,7 +29,23 @@
 	</resultMap>
 
 	<sql id="selectMenuVo">
-        select menu_id, menu_name, parent_id, order_num, path, component, `query`, route_name, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time 
+        select
+            menu_id,
+            menu_name,
+            parent_id,
+            order_num,
+            path,
+            component,
+            query,
+            route_name,
+            is_frame,
+            is_cache,
+            menu_type,
+            visible,
+            status,
+            COALESCE(perms,'') as perms,
+            icon,
+            create_time
 		from sys_menu
     </sql>
     
@@ -50,18 +66,61 @@
 	</select>
 	
 	<select id="selectMenuTreeAll" resultMap="SysMenuResult">
-		select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
-		from sys_menu m where m.menu_type in ('M', 'C') and m.status = 0
+		select
+		    distinct
+		    m.menu_id,
+		    m.parent_id,
+		    m.menu_name,
+		    m.path,
+		    m.component,
+		    m.query,
+		    m.route_name,
+		    m.visible,
+		    m.status,
+		    COALESCE(m.perms,'') as perms,
+		    m.is_frame,
+		    m.is_cache,
+		    m.menu_type,
+		    m.icon,
+		    m.order_num,
+		    m.create_time
+		from
+		    sys_menu m
+		where
+		    m.menu_type in ('M', 'C')
+		  and m.status = '0'
 		order by m.parent_id, m.order_num
 	</select>
 	
 	<select id="selectMenuListByUserId" parameterType="SysMenu" resultMap="SysMenuResult">
-		select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
-		from sys_menu m
-		left join sys_role_menu rm on m.menu_id = rm.menu_id
-		left join sys_user_role ur on rm.role_id = ur.role_id
-		left join sys_role ro on ur.role_id = ro.role_id
-		where ur.user_id = #{params.userId}
+		select
+		    distinct
+		    m.menu_id,
+		    m.parent_id,
+		    m.menu_name,
+		    m.path,
+		    m.component,
+		    m.query,
+		    m.route_name,
+		    m.visible,
+		    m.status,
+		    COALESCE(m.perms,'') as perms,
+		    m.is_frame,
+		    m.is_cache,
+		    m.menu_type,
+		    m.icon,
+		    m.order_num,
+		    m.create_time
+		from
+		    sys_menu m
+		left join sys_role_menu rm
+		    on m.menu_id = rm.menu_id
+		left join sys_user_role ur
+		    on rm.role_id = ur.role_id
+		left join sys_role ro
+		    on ur.role_id = ro.role_id
+		where
+		    ur.user_id = #{params.userId}
 		<if test="menuName != null and menuName != ''">
             AND m.menu_name like concat('%', #{menuName}, '%')
 		</if>
@@ -75,13 +134,31 @@
 	</select>
     
     <select id="selectMenuTreeByUserId" parameterType="Long" resultMap="SysMenuResult">
-		select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
+		select
+		distinct
+		    m.menu_id
+		  , m.parent_id
+		  , m.menu_name
+		  , m.path
+		  , m.component
+		  , m.`query`
+		  , m.route_name
+		  , m.visible
+		  , m.status
+		  , COALESCE(m.perms,'') as perms
+		  , m.is_frame
+		  , m.is_cache
+		  , m.menu_type
+		  , m.icon
+		  , m.order_num
+		  , m.create_time
 		from sys_menu m
-			 left join sys_role_menu rm on m.menu_id = rm.menu_id
-			 left join sys_user_role ur on rm.role_id = ur.role_id
-			 left join sys_role ro on ur.role_id = ro.role_id
-			 left join sys_user u on ur.user_id = u.user_id
-		where u.user_id = #{userId} and m.menu_type in ('M', 'C') and m.status = 0  AND ro.status = 0
+		 left join sys_role_menu rm on m.menu_id = rm.menu_id
+		 left join sys_user_role ur on rm.role_id = ur.role_id
+		 left join sys_role ro on ur.role_id = ro.role_id
+		 left join sys_user u on ur.user_id = u.user_id
+		where u.user_id = #{userId} and m.menu_type in ('M', 'C')
+		  and m.status = '0'  AND ro.status = '0'
 		order by m.parent_id, m.order_num
 	</select>
 	

+ 20 - 3
farm-crm-biz/src/main/resources/mapper/crm/SysRoleMapper.xml

@@ -12,6 +12,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="dataScope"          column="data_scope"            />
 		<result property="menuCheckStrictly"  column="menu_check_strictly"   />
 		<result property="status"             column="status"                />
+		<result property="version"            column="version"/>
 		<result property="delFlag"            column="del_flag"              />
 		<result property="createBy"           column="create_by"             />
 		<result property="createTime"         column="create_time"           />
@@ -22,7 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	
 	<sql id="selectRoleVo">
 	    select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly,
-            r.status, r.del_flag, r.create_time, r.remark 
+            r.status, r.del_flag,r.version, r.create_time, r.remark
         from sys_role r
 	        left join sys_user_role ur on ur.role_id = r.role_id
 	        left join sys_user u on u.user_id = ur.user_id
@@ -128,9 +129,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="status != null and status != ''">status = #{status},</if>
  			<if test="remark != null">remark = #{remark},</if>
  			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
- 			update_time = now()
+			<if test="version != null">version = #{version}+1,</if>
+			update_time = #{updateTime}
  		</set>
  		where role_id = #{roleId}
+		and del_flag = '0'
+		and version = #{version}
 	</update>
 	
 	<delete id="deleteRoleById" parameterType="Long">
@@ -143,5 +147,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			#{roleId}
         </foreach> 
  	</delete>
- 	
+	
+	<update id="deleteLogicRoleByIdAndVersion" parameterType="SysRole">
+		update sys_role
+		set del_flag = 1,
+		version = version + 1,
+		update_by = #{updateBy},
+		update_time = #{updateTime}
+		<where>
+			role_id = #{roleId}
+			and version = #{version}
+			and del_flag = 0
+		</where>
+
+	</update>
 </mapper> 

+ 11 - 4
farm-crm-biz/src/main/resources/mapper/crm/SysUserMapper.xml

@@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="avatar"       column="avatar"       />
         <result property="password"     column="password"     />
         <result property="status"       column="status"       />
+		<result property="version"      column="version"/>
         <result property="delFlag"      column="del_flag"     />
         <result property="loginIp"      column="login_ip"     />
         <result property="loginDate"    column="login_date"   />
@@ -36,14 +37,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	
 	<sql id="selectUserVo">
         select u.user_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
-        r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
+				u.version,r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from sys_user u
 		    left join sys_user_role ur on u.user_id = ur.user_id
 		    left join sys_role r on r.role_id = ur.role_id
     </sql>
     
     <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
-		select u.user_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark
+		select u.user_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip
+		     , u.login_date,u.version, u.create_by, u.create_time, u.remark
 		from sys_user u
 		where u.del_flag = '0'
 		<if test="userId != null and userId != 0">
@@ -64,7 +66,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<if test="params.endTime != null and params.endTime != ''">
 			AND date_format(u.create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
 		</if>
-		<!-- 数据范围过滤 -->
+		<!-- データ範囲フィルタリング -->
 		${params.dataScope}
 	</select>
 	
@@ -168,9 +170,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="loginDate != null">login_date = #{loginDate},</if>
  			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
  			<if test="remark != null">remark = #{remark},</if>
- 			update_time = now()
+			<if test="version != null">version = version+1,</if>
+			<if test="updateTime != null">update_time = #{updateTime}</if>
  		</set>
  		where user_id = #{userId}
+		and del_flag = '0'
+		<if test="version != null">
+			and version = #{version}
+		</if>
 	</update>
 	
 	<update id="updateUserStatus" parameterType="SysUser">

+ 18 - 10
farm-crm/src/main/java/jp/yamoto/farm/crm/web/controller/system/SysLoginController.java

@@ -8,6 +8,8 @@ import jp.yamoto.farm.common.core.domain.AjaxResult;
 import jp.yamoto.farm.common.core.domain.entity.SysMenu;
 import jp.yamoto.farm.common.core.domain.entity.SysUser;
 import jp.yamoto.farm.common.core.domain.model.LoginBody;
+import jp.yamoto.farm.common.core.domain.model.LoginUser;
+import jp.yamoto.farm.common.core.service.TokenService;
 import jp.yamoto.farm.common.utils.SecurityUtils;
 import jp.yamoto.farm.crm.biz.user.security.SysLoginService;
 import jp.yamoto.farm.crm.biz.user.security.SysPermissionService;
@@ -35,6 +37,9 @@ public class SysLoginController
     @Autowired
     private SysPermissionService permissionService;
 
+    @Autowired
+    private TokenService tokenService;
+
     /**
      * ログイン方法
      * 
@@ -45,26 +50,29 @@ public class SysLoginController
     public AjaxResult login(@RequestBody LoginBody loginBody)
     {
         AjaxResult ajax = AjaxResult.success();
-        // 生成令牌
-        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
-                loginBody.getUuid());
+        // Token
+        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword());
         ajax.put(Constants.TOKEN, token);
         return ajax;
     }
 
     /**
-     * ユーザー情報取得
-     * 
+     * ユーザー情報取得
+     *
      * @return ユーザー情報
      */
     @GetMapping("getInfo")
-    public AjaxResult getInfo()
-    {
-        SysUser user = SecurityUtils.getLoginUser().getUser();
-        // ロールコレクション
+    public AjaxResult getInfo() {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        // ロール集合
         Set<String> roles = permissionService.getRolePermission(user);
-        // アクセス権コレクション
+        // 権限集合
         Set<String> permissions = permissionService.getMenuPermission(user);
+        if (!loginUser.getPermissions().equals(permissions)) {
+            loginUser.setPermissions(permissions);
+            tokenService.refreshToken(loginUser);
+        }
         AjaxResult ajax = AjaxResult.success();
         ajax.put("user", user);
         ajax.put("roles", roles);

+ 124 - 35
farm-crm/src/main/resources/i18n/messages.properties

@@ -1,38 +1,127 @@
-#エラーメッセージ
-not.null=*は必ず記入してください
-user.jcaptcha.error=認証コードエラー
-user.jcaptcha.expire=認証コードが無効になりました
-user.not.exists=ユーザーが存在しない/パスワードエラー
-user.password.not.match=ユーザーが存在しない/パスワードエラー
-user.password.retry.limit.count=パスワード入力エラー{0}回
-user.password.retry.limit.exceed=パスワード入力エラー{0}回、アカウントロック{1}分
-user.password.delete=申し訳ありませんが、アカウントは削除されました
-user.bloked=ユーザーがロックされているので、管理者に連絡してください
-role.bloked=役割がロックされているので、管理者に連絡してください
-login.blocked=残念ながら、アクセスIPはシステムブラックリストに登録されています
-user.logout.success=終了成功
+E0001=入力された{0}は既に登録されています。
+E0002=パスワードを設定する際は、長さは8~20で、英大文字と小文字、数字、記号(#?!@$%^&*-)を組み合わせて入力してください。
+E0003={0}は必須入力です。
+E0004=ユーザー名またはパスワードが間違っています。
+E0005=現在ログイン中のユーザーは削除できません。
+E0006=枝番は999になるので、登録できません。
+E0007=該当データは既に別のユーザーより更新されました。
+E0008=メールアドレスの形式が正しくありません。
+E0009={0}ファイルを選択してください。
+E0010=ユーザー名が間違っています。
+E0011=該当検定種類は既に紐付けされているため、完全に削除することはできません。
+E0012={0}の重複登録はできません。
+E0013=該当検定種類は既に紐付けされているため、並び順を修正することはできません。
+E0014={0}は10件を上回ってはならない。
+E0015=認証情報が誤っているため、<br>成績情報の取得ができませんでした。
+E0016={0}は存在しません。
+E0017=ご入力いただいた成績情報は引継ぎされていません。
+E0018={0}が割り当てられているため、削除できません。
+E0019=並び順は順番ではないので、修正してください。
+E0020=生涯学習アカウントを取得してから再度ログインしてください。
+E0021=アカウントがロックされています。<br>※30分後にロックが自動解除されますので、解除後に再度ログインをお試しください。
+E0022=ご入力いただいた成績情報は既に別プロファイルより{0}されました。
+E0023={0}は必須選択してください。
+E0024=ファイルのサイズは{0}以下を選択してください。
+E0025={0}ファイルのサイズが0Mであるか、データの件数が0件であるか。データを追加した後、再度アップロードしてください。
+E0026={0}のフォーマット({1})が不正です。正しいフォーマットのCSVファイルを選択してください。
+E0027=アップロード対象が{0}の場合、{1}以外ファイル({2})を選択しないでください。
+E0028={0}ファイルの{1}項目個数が{2}個ではありません。項目個数を調整して、再度アップロードしてください。
+E0029={0}が入力されていません。
+E0030={0}の桁数は{1}桁以上になる。
+E0031=「検定種類」と「検定ごとの受験特定ID」の組み合わせが重複しています。
+E0032=CSVファイルの中身の{0}と{1}が不一致です。
+E0033={0}の整合性が不正です。
+E0034=「検定種類」と「検定ごとの受験特定ID」の組み合わせは成績ヘッダ情報に存在ありません。
+E0035=検定種類が重複しています。
+E0036={0}に既に存在あります。
+E0037={0}が{1}以外になる。
+E0038=下記の引継ぎ情報は既に紐付けされました。
+E0039=該当「検定種類」は検定種類情報に存在ありません。
+E0040=並び順は順番ではないです。
+E0041=並び順は重複になる。
+E0042=試験基本情報は既に削除されております。そのため、システム管理者にご連絡いただき、情報を追加した後、再度紐付けを行ってください。
+E0043=最新ではないメールのログインリンクをクリックした際のエラー
+E0044=認証トークンが無効です。
+E0045=認証トークンの有効期限が切れました。
+E0046=システム管理者のユーザーには操作を許可しません。
+E0047=ファイルは変更されているので、もう一度選択してください。
+E0048=確認用のパスワードと新パスワードが一致しません。
+E0049=ユーザーは禁止されています。管理者にお問い合わせください。
+E0050=ログインユーザー:{0}が存在しません。
+E0051={0}の桁数は{1}桁以上、もしくはサロゲートペアが含まれ最長バイト数を超過
+E0052=ユーザー名またはパスワードは入力必要です。
+E0053=パスワードが{0}回間違えており、アカウントは{1}分ロックされています。
+E0054=ロールにアクセスする権限がありません。
+E0055={0}に存在しません。
+E0056={0}は日付フォーマットではありません。
+E0057=「検定種類」と「検定ごとの受験特定ID」の組み合わせは複数のファイルで取り込むことはできません。
+E0058=Excel以外のファイルは選択できません。
+E0059=該当検定種類は既に紐付けされているため、{0}することはできません。
+E0060=認証項目マスタにおける認証項目の個数が変更されたため、<br>紐付けを行うことができませんでした。
+E0061=残念ながら、アクセスIPはシステムブラックリストに登録されています.
 
-length.not.valid=長さは{min}から{max}文字の間でなければなりません
+EM001=文字数は1~64で入力してください。
+EM002=並び順は1~10で入力してください。
+EM003={0}は必須入力です。
+EM004={0}は{1}のみで入力してください。
+EM005={0}は{1}文字以下で入力してください。
+EM006={0}が不正です。
 
-user.username.not.valid=*2から20個の漢字、文字、数字またはアンダースコアで構成され、非数字で始まる必要があります
-user.password.not.valid=*5-50文字
- 
-user.email.not.valid=メールボックス形式エラー
-user.mobile.phone.number.not.valid=携帯電話番号フォーマットエラー
-user.login.success=ログイン成功
-user.register.success=登録に成功しました
-user.notfound=再ログインしてください
-user.forcelogout=管理者が強制的に終了します。再ログインしてください
-user.unknown.error=不明なエラー、再ログインしてください
+I0001=成功しました。
+I0002=失敗しました。
+I0003=取込に成功しました。
+I0004=取込に失敗しました。
+I0008=ログインしました。
+I0009=ログアウトしました。
 
-###ファイルアップロードメッセージ
-upload.exceed.maxSize=アップロードされたファイルサイズが制限されたファイルサイズを超えています!<br/>許可されるファイルの最大サイズは次のとおりです。{0}MB!
-upload.filename.exceed.length=アップロードされたファイル名は最長{0}文字
-
-####パーミッション
-no.permission=データの権限がありません。管理者に連絡して権限を追加してください[{0}]
-no.create.permission=データを作成する権限がありません。管理者に連絡して権限を追加してください[{0}]
-no.update.permission=データを変更する権限がありません。管理者に連絡して権限を追加してください[{0}]
-no.delete.permission=データを削除する権限がありません。管理者に連絡して権限を追加してください[{0}]
-no.export.permission=データをエクスポートする権限がありません。管理者に連絡して権限を追加してください[{0}]
-no.view.permission=データを表示する権限がありません。管理者に連絡して権限を追加してください[{0}]
+label.certificationType=検定種類
+label.branchNo=枝番
+label.orderNo=並び順
+label.itemLabel=項目ラベル
+label.examName=試験名
+label.examKey=試験キー
+label.charType=文字種
+label.charCount=文字数
+label.isInput=入力要否
+label.keyWord=キーワード
+label.profileId=プロファイルID
+label.profileInfo=プロファイル情報
+label.specificExamId=検定種類ごとの受験特定ID
+label.certificationItem=認証項目
+label.listDisplayItem=一覧表示項目
+label.resultDetailInfo=成績詳細情報
+label.masterCertificationItem2=認証項目マスタの認証項目
+label.masterCertificationItem=認証項目マスタ
+label.masterListDisplayItem=一覧表示項目マスタ
+label.masterExamKind=検定種類マスタ
+label.mailAddress=メールアドレス
+label.roleName=ロール名
+label.remark=備考
+label.userName=アカウント
+label.nickName=ユーザー名称
+label.password=パスワード
+label.role=ロール
+label.attachInfoConnect=紐付け
+label.attachInfoRelieve=解除
+label.halfAlphabetNumericSymbol=半角英数字記号
+label.halfAlphabetNumeric=半角英数字
+label.halfAlphabet=半角英字
+label.halfNumeric=半角数字
+label.menuAuthority=メニュー権限
+label.csvExtension=CSV
+label.xlsxExtension=EXCEL
+label.examMasterInfo=試験基本情報
+label.resultInfo=成績情報
+label.errorLF=LF
+label.errorUtf8=UTF-8
+label.item001=認証項目_001
+label.list001=一覧表示項目_001
+label.list002=一覧表示項目_002
+label.input=入力否の場合、キーワード
+label.pkMasterCertificationItem={0}は認証項目マスタ
+label.pkMasterListDisplayItem={0}は一覧表示項目マスタ
+label.parameterInvalid=パラメータエラー
+label.forbidden=遷移元システムID不正
+label.authenticateError=認証エラー
+label.newAdd=新規登録
+label.edit=編集