Bladeren bron

提交代码

7 maanden geleden
bovenliggende
commit
73336c0ade
27 gewijzigde bestanden met toevoegingen van 362 en 130 verwijderingen
  1. 20 43
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/monitor/SysUserOnlineController.java
  2. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysCaptchaController.java
  3. 2 2
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysConfigController.java
  4. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysDeptController.java
  5. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysDictDataController.java
  6. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysDictTypeController.java
  7. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysFileUploadController.java
  8. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysIndexController.java
  9. 19 27
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysLoginController.java
  10. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysMenuController.java
  11. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysNoticeController.java
  12. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysPostController.java
  13. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysProfileController.java
  14. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysRegisterController.java
  15. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysRoleController.java
  16. 1 1
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysUserController.java
  17. 13 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/ISysConfigVoService.java
  18. 13 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/ISysDictTypeVoService.java
  19. 55 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/impl/SysConfigVoServiceImpl.java
  20. 46 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/impl/SysDictTypeVoServiceImpl.java
  21. 13 0
      08.src/Xingxi/xingxi-admin/src/main/resources/application-local.yml
  22. 44 0
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/product/prodAttr/add.html
  23. 26 0
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/product/prodAttr/edit.html
  24. 58 0
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/product/prodAttr/prodAttr.html
  25. 5 0
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/tag/tag.html
  26. 20 45
      08.src/Xingxi/xingxi-framework/src/main/java/com/xingxi/framework/shiro/realm/UserRealm.java
  27. 15 0
      08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/master/tag/service/impl/TagServiceImpl.java

+ 20 - 43
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/monitor/SysUserOnlineController.java

@@ -48,43 +48,30 @@ public class SysUserOnlineController extends BaseController {
     @RequiresPermissions("monitor:online:list")
     @PostMapping("/list")
     @ResponseBody
-    public TableDataInfo list(SysUserOnline userOnline)
-    {
+    public TableDataInfo list(SysUserOnline userOnline) {
         String ipaddr = userOnline.getIpaddr();
         String loginName = userOnline.getLoginName();
         TableDataInfo rspData = new TableDataInfo();
         Collection<Session> sessions = redisSessionDAO.getActiveSessions();
         Iterator<Session> it = sessions.iterator();
         List<SysUserOnline> sessionList = new ArrayList<SysUserOnline>();
-        while (it.hasNext())
-        {
+        while (it.hasNext()) {
             SysUserOnline user = getSession(it.next());
-            if (StringUtils.isNotNull(user))
-            {
-                if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(loginName))
-                {
+            if (StringUtils.isNotNull(user)) {
+                if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(loginName)) {
                     if (StringUtils.equals(ipaddr, user.getIpaddr())
-                            && StringUtils.equals(loginName, user.getLoginName()))
-                    {
+                            && StringUtils.equals(loginName, user.getLoginName())) {
                         sessionList.add(user);
                     }
-                }
-                else if (StringUtils.isNotEmpty(ipaddr))
-                {
-                    if (StringUtils.equals(ipaddr, user.getIpaddr()))
-                    {
+                } else if (StringUtils.isNotEmpty(ipaddr)) {
+                    if (StringUtils.equals(ipaddr, user.getIpaddr())) {
                         sessionList.add(user);
                     }
-                }
-                else if (StringUtils.isNotEmpty(loginName))
-                {
-                    if (StringUtils.equals(loginName, user.getLoginName()))
-                    {
+                } else if (StringUtils.isNotEmpty(loginName)) {
+                    if (StringUtils.equals(loginName, user.getLoginName())) {
                         sessionList.add(user);
                     }
-                }
-                else
-                {
+                } else {
                     sessionList.add(user);
                 }
             }
@@ -98,14 +85,11 @@ public class SysUserOnlineController extends BaseController {
     @Log(title = "在线用户", businessType = BusinessType.FORCE)
     @PostMapping("/batchForceLogout")
     @ResponseBody
-    public AjaxResult batchForceLogout(@RequestBody List<SysUserOnline> sysUserOnlines)
-    {
-        for (SysUserOnline userOnline : sysUserOnlines)
-        {
+    public AjaxResult batchForceLogout(@RequestBody List<SysUserOnline> sysUserOnlines) {
+        for (SysUserOnline userOnline : sysUserOnlines) {
             String sessionId = userOnline.getSessionId();
             String loginName = userOnline.getLoginName();
-            if (sessionId.equals(ShiroUtils.getSessionId()))
-            {
+            if (sessionId.equals(ShiroUtils.getSessionId())) {
                 return error("当前登录用户无法强退");
             }
             redisSessionDAO.delete(redisSessionDAO.readSession(sessionId));
@@ -114,25 +98,20 @@ public class SysUserOnlineController extends BaseController {
         return success();
     }
 
-    private SysUserOnline getSession(Session session)
-    {
+    private SysUserOnline getSession(Session session) {
         Object obj = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
-        if (null == obj)
-        {
+        if (null == obj) {
             return null;
         }
-        if (obj instanceof SimplePrincipalCollection)
-        {
+        if (obj instanceof SimplePrincipalCollection) {
             SimplePrincipalCollection spc = (SimplePrincipalCollection) obj;
             obj = spc.getPrimaryPrincipal();
-            if (null != obj && obj instanceof SysUser)
-            {
+            if (obj instanceof SysUser) {
                 SysUser sysUser = (SysUser) obj;
                 SysUserOnline userOnline = new SysUserOnline();
                 userOnline.setSessionId(session.getId().toString());
                 userOnline.setLoginName(sysUser.getLoginName());
-                if (StringUtils.isNotNull(sysUser.getDept()) && StringUtils.isNotEmpty(sysUser.getDept().getDeptName()))
-                {
+                if (StringUtils.isNotNull(sysUser.getDept()) && StringUtils.isNotEmpty(sysUser.getDept().getDeptName())) {
                     userOnline.setDeptName(sysUser.getDept().getDeptName());
                 }
                 userOnline.setIpaddr(session.getHost());
@@ -144,12 +123,10 @@ public class SysUserOnlineController extends BaseController {
         return null;
     }
 
-    public void removeUserCache(String loginName, String sessionId)
-    {
+    public void removeUserCache(String loginName, String sessionId) {
         Cache<String, Deque<Serializable>> cache = SpringUtils.getBean(RedisCacheManager.class).getCache(ShiroConstants.SYS_USERCACHE);
         Deque<Serializable> deque = cache.get(loginName);
-        if (StringUtils.isEmpty(deque) || deque.size() == 0)
-        {
+        if (StringUtils.isEmpty(deque) || deque.size() == 0) {
             return;
         }
         deque.remove(sessionId);

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysCaptchaController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysCaptchaController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import java.awt.image.BufferedImage;
 import java.io.IOException;

+ 2 - 2
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysConfigController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysConfigController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import java.util.List;
 
@@ -130,7 +130,7 @@ public class SysConfigController extends BaseController {
     @GetMapping("/refreshCache")
     @ResponseBody
     public AjaxResult refreshCache() {
-//        configService.resetConfigCache();
+        configService.resetConfigCache();
         return success();
     }
 

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysDeptController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysDeptController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import java.util.List;
 

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysDictDataController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysDictDataController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import java.util.List;
 

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysDictTypeController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysDictTypeController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import java.util.List;
 

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysFileUploadController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysFileUploadController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import com.xingxi.common.core.controller.BaseController;
 import com.xingxi.common.core.domain.AjaxResult;

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysIndexController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysIndexController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import java.util.Date;
 import java.util.List;

+ 19 - 27
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysLoginController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysLoginController.java

@@ -1,7 +1,11 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import com.xingxi.common.core.controller.BaseController;
+import com.xingxi.common.core.domain.AjaxResult;
+import com.xingxi.common.core.text.Convert;
+import com.xingxi.common.utils.ServletUtils;
+import com.xingxi.common.utils.StringUtils;
+import com.xingxi.framework.web.service.ConfigService;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.AuthenticationException;
 import org.apache.shiro.authc.UsernamePasswordToken;
@@ -13,21 +17,17 @@ import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
-import com.xingxi.common.core.controller.BaseController;
-import com.xingxi.common.core.domain.AjaxResult;
-import com.xingxi.common.core.text.Convert;
-import com.xingxi.common.utils.ServletUtils;
-import com.xingxi.common.utils.StringUtils;
-import com.xingxi.framework.web.service.ConfigService;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 /**
  * 登录验证
- * 
+ *
  * @author ruoyi
  */
 @Controller
-public class SysLoginController extends BaseController
-{
+public class SysLoginController extends BaseController {
     /**
      * 是否开启记住我功能
      */
@@ -38,11 +38,9 @@ public class SysLoginController extends BaseController
     private ConfigService configService;
 
     @GetMapping("/login")
-    public String login(HttpServletRequest request, HttpServletResponse response, ModelMap mmap)
-    {
+    public String login(HttpServletRequest request, HttpServletResponse response, ModelMap mmap) {
         // 如果是Ajax请求,返回Json字符串。
-        if (ServletUtils.isAjaxRequest(request))
-        {
+        if (ServletUtils.isAjaxRequest(request)) {
             return ServletUtils.renderString(response, "{\"code\":\"1\",\"msg\":\"未登录或登录超时。请重新登录\"}");
         }
         // 是否开启记住我
@@ -54,20 +52,15 @@ public class SysLoginController extends BaseController
 
     @PostMapping("/login")
     @ResponseBody
-    public AjaxResult ajaxLogin(String username, String password, Boolean rememberMe)
-    {
+    public AjaxResult ajaxLogin(String username, String password, Boolean rememberMe) {
         UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe);
         Subject subject = SecurityUtils.getSubject();
-        try
-        {
+        try {
             subject.login(token);
             return success();
-        }
-        catch (AuthenticationException e)
-        {
+        } catch (AuthenticationException e) {
             String msg = "用户或密码错误";
-            if (StringUtils.isNotEmpty(e.getMessage()))
-            {
+            if (StringUtils.isNotEmpty(e.getMessage())) {
                 msg = e.getMessage();
             }
             return error(msg);
@@ -75,8 +68,7 @@ public class SysLoginController extends BaseController
     }
 
     @GetMapping("/unauth")
-    public String unauth()
-    {
+    public String unauth() {
         return "error/unauth";
     }
 }

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysMenuController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysMenuController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import java.util.List;
 

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysNoticeController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysNoticeController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import java.util.List;
 

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysPostController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysPostController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import java.util.List;
 

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysProfileController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysProfileController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysRegisterController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysRegisterController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysRoleController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysRoleController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import java.util.List;
 

+ 1 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/SysUserController.java → 08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/controller/SysUserController.java

@@ -1,4 +1,4 @@
-package com.xingxi.web.controller.system;
+package com.xingxi.web.controller.system.controller;
 
 import java.util.List;
 import java.util.stream.Collectors;

+ 13 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/ISysConfigVoService.java

@@ -0,0 +1,13 @@
+package com.xingxi.web.controller.system.service;
+
+/**
+ * 参数配置 服务层
+ *
+ * @author xingxi
+ */
+public interface ISysConfigVoService {
+    /**
+     * 加载参数缓存数据
+     */
+    void loadingConfigCache();
+}

+ 13 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/ISysDictTypeVoService.java

@@ -0,0 +1,13 @@
+package com.xingxi.web.controller.system.service;
+
+/**
+ * 字典 业务层
+ *
+ * @author xingxi
+ */
+public interface ISysDictTypeVoService {
+    /**
+     * 加载字典缓存数据
+     */
+    void loadingDictCache();
+}

+ 55 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/impl/SysConfigVoServiceImpl.java

@@ -0,0 +1,55 @@
+package com.xingxi.web.controller.system.service.impl;
+
+import com.xingxi.common.constant.Constants;
+import com.xingxi.common.core.redis.RedisCache;
+import com.xingxi.system.domain.SysConfig;
+import com.xingxi.system.mapper.SysConfigMapper;
+import com.xingxi.web.controller.system.service.ISysConfigVoService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 参数配置 服务层实现
+ *
+ * @author biandan
+ */
+@Service
+public class SysConfigVoServiceImpl implements ISysConfigVoService {
+    @Resource
+    private SysConfigMapper configMapper;
+
+    @Resource
+    private RedisCache redisCache;
+
+    /**
+     * 项目启动时,初始化参数到缓存
+     */
+    @PostConstruct
+    public void init() {
+        loadingConfigCache();
+    }
+
+    /**
+     * 加载参数缓存数据
+     */
+    @Override
+    public void loadingConfigCache() {
+        List<SysConfig> configsList = configMapper.selectConfigList(new SysConfig());
+        for (SysConfig config : configsList) {
+            redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+        }
+    }
+
+    /**
+     * 设置cache key
+     *
+     * @param configKey 参数键
+     * @return 缓存键key
+     */
+    private String getCacheKey(String configKey) {
+        return Constants.SYS_CONFIG_KEY + configKey;
+    }
+}

+ 46 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/impl/SysDictTypeVoServiceImpl.java

@@ -0,0 +1,46 @@
+package com.xingxi.web.controller.system.service.impl;
+
+import com.xingxi.common.core.domain.entity.SysDictData;
+import com.xingxi.common.utils.DictUtils;
+import com.xingxi.system.mapper.SysDictDataMapper;
+import com.xingxi.web.controller.system.service.ISysDictTypeVoService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 字典 业务层处理
+ *
+ * @author xingxi
+ */
+@Service
+public class SysDictTypeVoServiceImpl implements ISysDictTypeVoService {
+    @Resource
+    private SysDictDataMapper dictDataMapper;
+
+    /**
+     * 项目启动时,初始化字典到缓存
+     */
+    @PostConstruct
+    public void init() {
+        loadingDictCache();
+    }
+
+    /**
+     * 加载字典缓存数据
+     */
+    @Override
+    public void loadingDictCache() {
+        SysDictData dictData = new SysDictData();
+        dictData.setStatus("0");
+        Map<String, List<SysDictData>> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType));
+        for (Map.Entry<String, List<SysDictData>> entry : dictDataMap.entrySet()) {
+            DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList()));
+        }
+    }
+}

+ 13 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/application-local.yml

@@ -66,6 +66,19 @@ spring:
                 wall:
                     config:
                         multi-statement-allow: true
+    # redis配置
+    redis:
+        database: 0
+        host: redis.njnet.vip
+        port: 6379
+        password: Biandan123
+        timeout: 6000ms           # 连接超时时长(毫秒)
+        lettuce:
+            pool:
+                max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
+                max-wait: -1ms    # 连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-idle: 10      # 连接池中的最大空闲连接
+                min-idle: 5       # 连接池中的最小空闲连接
 idworkcfg:
     workerId: "2"
     dataCenterId: "2"

+ 44 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/product/prodAttr/add.html

@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header(#{prodProp.header})" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-prodProp-add">
+            <div class="tabs-container">
+                <ul class="nav nav-tabs">
+                    <li class="active" id="selectProp"><a data-toggle="tab" href="#tab-1" aria-expanded="true"> 选择属性</a>
+                    </li>
+                    <li class="" id="inputProp"><a data-toggle="tab" href="#tab-2" aria-expanded="false"> 手工增加</a>
+                    </li>
+                </ul>
+                <div class="tab-content">
+                    <div id="tab-1" class="tab-pane active">
+                        <div class="panel-body">
+                            <div class="col-sm-12 select-table table-striped">
+                                <table id="bootstrap-table"></table>
+                            </div>
+                        </div>
+                    </div>
+                    <div id="tab-2" class="tab-pane">
+                        <div class="panel-body">
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label is-required">[[#{prop.propName}]]:</label>
+                                <div class="col-sm-8">
+                                    <textarea rows = "6" style="OVERFLOW:visible" class="form-control" id="propName" name="propName" placeholder="属性名称" required></textarea>
+                                    <label class="control-label">如有多个,请每行写一个。请勿输入“/”,“/”会被自动转换为“-”</label>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:src="@{/biandan/product/prodProp/add.js?v=2.0}"></script>
+    <script th:inline="javascript">
+    </script>
+</body>
+</html>

+ 26 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/product/prodAttr/edit.html

@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header(#{prodProp.header.edit})" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-prodProp-edit" th:object="${prodProp}">
+            <input name="propId" th:field="*{propId}" type="hidden">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label is-required">[[#{prodProp.propName}]]:</label>
+                <div class="col-sm-8">
+                    <input name="propName" th:field="*{propName}" class="form-control" type="text" required>
+                </div>
+            </div>
+            <input name="updateTime" th:value="${#dates.format(prodProp.updateTime, 'yyyy-MM-dd HH:mm:ss')}" type="hidden">
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:src="@{/biandan/product/prodProp/edit.js?v=2.0}"></script>
+
+    <script th:inline="javascript">
+
+    </script>
+</body>
+</html>

+ 58 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/product/prodAttr/prodAttr.html

@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header(#{prodProp.header.list})" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>[[#{prodProp.prodId}]]:</label>
+                                <input type="text" name="prodId"/>
+                            </li>
+                            <li>
+                                <label>[[#{prodProp.propName}]]:</label>
+                                <input type="text" name="propName"/>
+                            </li>
+                            <li>
+                                <label>[[#{prodProp.sort}]]:</label>
+                                <input type="text" name="sort"/>
+                            </li>
+                            <li>
+                                <label>[[#{prodProp.delFlag}]]:</label>
+                                <input type="text" name="delFlag"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;[[#{btn.search}]]</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;[[#{btn.reset}]]</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="product:prodProp:add">
+                    <i class="fa fa-plus"></i> [[#{btn.add}]]
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="product:prodProp:edit">
+                    <i class="fa fa-edit"></i> [[#{btn.modify}]]
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('product:prodProp:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('product:prodProp:remove')}]];
+        var prefix = ctx + "master/product/prodAttr";
+    </script>
+</body>
+</html>

+ 5 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/tag/tag.html

@@ -36,8 +36,13 @@
                 removeUrl: prefix + "/remove",
                 exportUrl: prefix + "/export",
                 modalName: "用户避雷标签",
+                showSearch: false,
+                showToggle: false,
                 columns: [
                     {
+                        checkbox: true
+                    },
+                    {
                         field: 'tagName',
                         title: '标签名称'
                     },

+ 20 - 45
08.src/Xingxi/xingxi-framework/src/main/java/com/xingxi/framework/shiro/realm/UserRealm.java

@@ -2,6 +2,7 @@ package com.xingxi.framework.shiro.realm;
 
 import java.util.HashSet;
 import java.util.Set;
+
 import org.apache.shiro.authc.AuthenticationException;
 import org.apache.shiro.authc.AuthenticationInfo;
 import org.apache.shiro.authc.AuthenticationToken;
@@ -34,11 +35,10 @@ import com.xingxi.system.service.ISysRoleService;
 
 /**
  * 自定义Realm 处理登录 权限
- * 
+ *
  * @author ruoyi
  */
-public class UserRealm extends AuthorizingRealm
-{
+public class UserRealm extends AuthorizingRealm {
     private static final Logger log = LoggerFactory.getLogger(UserRealm.class);
 
     @Autowired
@@ -54,8 +54,7 @@ public class UserRealm extends AuthorizingRealm
      * 授权
      */
     @Override
-    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0)
-    {
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
         SysUser user = ShiroUtils.getSysUser();
         // 角色列表
         Set<String> roles = new HashSet<String>();
@@ -63,13 +62,10 @@ public class UserRealm extends AuthorizingRealm
         Set<String> menus = new HashSet<String>();
         SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
         // 管理员拥有所有权限
-        if (user.isAdmin())
-        {
+        if (user.isAdmin()) {
             info.addRole("admin");
             info.addStringPermission("*:*:*");
-        }
-        else
-        {
+        } else {
             roles = roleService.selectRoleKeys(user.getUserId());
             menus = menuService.selectPermsByUserId(user.getUserId());
             // 角色加入AuthorizationInfo认证对象
@@ -84,47 +80,30 @@ public class UserRealm extends AuthorizingRealm
      * 登录认证
      */
     @Override
-    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException
-    {
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
         UsernamePasswordToken upToken = (UsernamePasswordToken) token;
         String username = upToken.getUsername();
         String password = "";
-        if (upToken.getPassword() != null)
-        {
+        if (upToken.getPassword() != null) {
             password = new String(upToken.getPassword());
         }
 
         SysUser user = null;
-        try
-        {
+        try {
             user = loginService.login(username, password);
-        }
-        catch (CaptchaException e)
-        {
+        } catch (CaptchaException e) {
             throw new AuthenticationException(e.getMessage(), e);
-        }
-        catch (UserNotExistsException e)
-        {
+        } catch (UserNotExistsException e) {
             throw new UnknownAccountException(e.getMessage(), e);
-        }
-        catch (UserPasswordNotMatchException e)
-        {
+        } catch (UserPasswordNotMatchException e) {
             throw new IncorrectCredentialsException(e.getMessage(), e);
-        }
-        catch (UserPasswordRetryLimitExceedException e)
-        {
+        } catch (UserPasswordRetryLimitExceedException e) {
             throw new ExcessiveAttemptsException(e.getMessage(), e);
-        }
-        catch (UserBlockedException e)
-        {
+        } catch (UserBlockedException e) {
             throw new LockedAccountException(e.getMessage(), e);
-        }
-        catch (RoleBlockedException e)
-        {
+        } catch (RoleBlockedException e) {
             throw new LockedAccountException(e.getMessage(), e);
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             log.info("对用户[" + username + "]进行登录验证..验证未通过{}", e.getMessage());
             throw new AuthenticationException(e.getMessage(), e);
         }
@@ -135,8 +114,7 @@ public class UserRealm extends AuthorizingRealm
     /**
      * 清理指定用户授权信息缓存
      */
-    public void clearCachedAuthorizationInfo(Object principal)
-    {
+    public void clearCachedAuthorizationInfo(Object principal) {
         SimplePrincipalCollection principals = new SimplePrincipalCollection(principal, getName());
         this.clearCachedAuthorizationInfo(principals);
     }
@@ -144,13 +122,10 @@ public class UserRealm extends AuthorizingRealm
     /**
      * 清理所有用户授权信息缓存
      */
-    public void clearAllCachedAuthorizationInfo()
-    {
+    public void clearAllCachedAuthorizationInfo() {
         Cache<Object, AuthorizationInfo> cache = getAuthorizationCache();
-        if (cache != null)
-        {
-            for (Object key : cache.keys())
-            {
+        if (cache != null) {
+            for (Object key : cache.keys()) {
                 cache.remove(key);
             }
         }

+ 15 - 0
08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/master/tag/service/impl/TagServiceImpl.java

@@ -2,8 +2,11 @@ package com.xingxi.master.tag.service.impl;
 
 import com.xingxi.common.core.text.Convert;
 import com.xingxi.common.enums.EDelFlag;
+import com.xingxi.common.exception.BusinessException;
 import com.xingxi.common.utils.DateUtils;
 import com.xingxi.common.utils.ShiroUtils;
+import com.xingxi.master.product.domain.ProdTag;
+import com.xingxi.master.product.mapper.ProdTagMapper;
 import com.xingxi.master.tag.domain.Tag;
 import com.xingxi.master.tag.mapper.TagMapper;
 import com.xingxi.master.tag.service.ITagService;
@@ -22,6 +25,8 @@ import java.util.List;
 public class TagServiceImpl implements ITagService {
     @Resource
     private TagMapper tagMapper;
+    @Resource
+    private ProdTagMapper prodTagMapper;
 
     /**
      * 查询标签
@@ -125,6 +130,16 @@ public class TagServiceImpl implements ITagService {
      */
     @Override
     public int logicDeleteTagByTagIds(String tagIds) {
+        String[] ids = Convert.toStrArray(tagIds);
+        for (String id : ids) {
+            ProdTag cond = new ProdTag();
+            cond.setTagId(Long.parseLong(id));
+            cond.setDelFlag(EDelFlag.NO.getVal());
+            List<ProdTag> prodTagList = prodTagMapper.selectProdTagList(cond);
+            if (prodTagList.size() > 0) {
+                throw new BusinessException("标签使用中,不能删除");
+            }
+        }
         return tagMapper.logicDeleteTagByTagIds(Convert.toStrArray(tagIds));
     }