Browse Source

Merge branch '20250428首页' into prd

zxfqwert 6 months ago
parent
commit
f175fd87af
19 changed files with 1386 additions and 29 deletions
  1. 4 3
      suishenbang-admin/src/main/resources/application-uat.yml
  2. 1 1
      suishenbang-admin/src/main/resources/application.yml
  3. 790 0
      suishenbang-admin/src/main/resources/static/ajax/libs/colorpicker/colorpicker.js
  4. 2 0
      suishenbang-admin/src/main/resources/static/ajax/libs/colorpicker/layui.css
  5. 2 0
      suishenbang-admin/src/main/resources/static/ajax/libs/colorpicker/layui.js
  6. 8 0
      suishenbang-admin/src/main/resources/templates/include.html
  7. 3 2
      suishenbang-admin/src/main/resources/templates/system/alertConfiguration/add.html
  8. 3 3
      suishenbang-admin/src/main/resources/templates/system/alertConfiguration/edit.html
  9. 3 2
      suishenbang-api/src/main/resources/application-uat.yml
  10. 1 1
      suishenbang-api/src/main/resources/application.yml
  11. 27 12
      suishenbang-system/src/main/java/com/dgtly/system/service/impl/AlertConfigurationServiceImpl.java
  12. 8 0
      suishenbang-wxportal/suishenbang-wxportal-api/src/main/java/com/dgtly/wxportal/controller/WxPortalController.java
  13. 10 0
      suishenbang-wxportal/suishenbang-wxportal-common/pom.xml
  14. 17 0
      suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/domain/HomeIconConfig.java
  15. 6 0
      suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/service/IWxMagnetService.java
  16. 74 2
      suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/service/impl/WxMagnetServiceImpl.java
  17. 39 0
      suishenbang-wxportal/suishenbang-wxportal-manager/src/main/java/com/dgtly/wxportal/controller/WxMagnetController.java
  18. 381 0
      suishenbang-wxportal/suishenbang-wxportal-manager/src/main/resources/templates/wxportal/magnet/themeAdd.html
  19. 7 3
      suishenbang-wxportal/suishenbang-wxportal-manager/src/main/resources/templates/wxportal/magnet/wxMagnet.html

+ 4 - 3
suishenbang-admin/src/main/resources/application-uat.yml

@@ -9,7 +9,8 @@ ruoyi:
   # 实例演示开关
   demoEnabled: true
   # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
-  profile: /home/admin/project/file
+#  profile: /home/admin/project/file
+  profile: D:/ruoyi/uploadPath
   # 获取ip地址开关
   addressEnabled: false
   cloudPath: http://127.0.0.1:8000/
@@ -47,7 +48,7 @@ qiyeweixin:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为80
-  port: 10000
+  port: 10002
   servlet:
     # 应用的访问路径
     context-path: /oneportal
@@ -57,7 +58,7 @@ server:
     # tomcat最大线程数,默认为200
     max-threads: 800
     # Tomcat启动初始化的线程数,默认值25
-    min-spare-threads: 30
+    min-spare-threads: 50
     basedir: /tmp/tomcat
 
 # 日志配置

+ 1 - 1
suishenbang-admin/src/main/resources/application.yml

@@ -1,5 +1,5 @@
 spring:
   profiles: 
-    active: dev
+    active: uat
 
 #开发环境dev 测试环境test 正式环境prod  启动时可以设置参数Java -jar xxxxxx.jar spring.profiles.actiove=prod

+ 790 - 0
suishenbang-admin/src/main/resources/static/ajax/libs/colorpicker/colorpicker.js

@@ -0,0 +1,790 @@
+/**
+ * colorpicker
+ * 颜色选择组件
+ */
+
+layui.define(['jquery', 'lay'], function(exports) {
+  "use strict";
+
+  var $ = layui.$;
+  var lay = layui.lay;
+  var hint = layui.hint();
+  var device = layui.device();
+  var clickOrMousedown = (device.mobile ? 'click' : 'mousedown');
+
+  // 外部接口
+  var colorpicker = {
+    config: {},
+    index: layui.colorpicker ? (layui.colorpicker.index + 10000) : 0,
+
+    // 设置全局项
+    set: function(options) {
+      var that = this;
+      that.config = $.extend({}, that.config, options);
+      return that;
+    },
+
+    // 事件
+    on: function(events, callback) {
+      return layui.onevent.call(this, 'colorpicker', events, callback);
+    }
+  };
+
+  // 操作当前实例
+  var thisModule = function() {
+    var that = this;
+    var options = that.config;
+    var id = options.id;
+
+    thisModule.that[id] = that; // 记录当前实例对象
+
+    return {
+      config: options
+    };
+  }
+
+  //字符常量
+  ,MOD_NAME = 'colorpicker', SHOW = 'layui-show', THIS = 'layui-this', ELEM = 'layui-colorpicker'
+
+  ,ELEM_MAIN = '.layui-colorpicker-main', ICON_PICKER_DOWN = 'layui-icon-down', ICON_PICKER_CLOSE = 'layui-icon-close'
+  ,PICKER_TRIG_SPAN = 'layui-colorpicker-trigger-span', PICKER_TRIG_I = 'layui-colorpicker-trigger-i', PICKER_SIDE = 'layui-colorpicker-side', PICKER_SIDE_SLIDER = 'layui-colorpicker-side-slider'
+  ,PICKER_BASIS = 'layui-colorpicker-basis', PICKER_ALPHA_BG = 'layui-colorpicker-alpha-bgcolor', PICKER_ALPHA_SLIDER = 'layui-colorpicker-alpha-slider', PICKER_BASIS_CUR = 'layui-colorpicker-basis-cursor', PICKER_INPUT = 'layui-colorpicker-main-input'
+
+  //RGB转HSB
+  ,RGBToHSB = function(rgb){
+    var hsb = {h:0, s:0, b:0};
+    var min = Math.min(rgb.r, rgb.g, rgb.b);
+    var max = Math.max(rgb.r, rgb.g, rgb.b);
+    var delta = max - min;
+    hsb.b = max;
+    hsb.s = max !== 0 ? 255*delta/max : 0;
+    if(hsb.s !== 0){
+      if(rgb.r == max){ // 因 rgb 中返回的数字为 string 类型
+        hsb.h = (rgb.g - rgb.b) / delta;
+      }else if(rgb.g == max){
+        hsb.h = 2 + (rgb.b - rgb.r) / delta;
+      }else{
+        hsb.h = 4 + (rgb.r - rgb.g) / delta;
+      }
+    }else{
+      hsb.h = -1;
+    }
+    if(max === min){
+      hsb.h = 0;
+    }
+    hsb.h *= 60;
+    if(hsb.h < 0) {
+      hsb.h += 360;
+    }
+    hsb.s *= 100/255;
+    hsb.b *= 100/255;
+    return hsb;
+  }
+
+  //HEX转HSB
+  ,HEXToHSB = function(hex){
+    hex = hex.indexOf('#') > -1 ? hex.substring(1) : hex;
+    if(hex.length === 3){
+      var num = hex.split("");
+      hex = num[0]+num[0]+num[1]+num[1]+num[2]+num[2]
+    }
+    hex = parseInt(hex, 16);
+    var rgb = {r:hex >> 16, g:(hex & 0x00FF00) >> 8, b:(hex & 0x0000FF)};
+    return RGBToHSB(rgb);
+  }
+
+  //HSB转RGB
+  ,HSBToRGB = function(hsb){
+    var rgb = {};
+    var h = hsb.h;
+    var s = hsb.s*255/100;
+    var b = hsb.b*255/100;
+    if(s === 0){
+      rgb.r = rgb.g = rgb.b = b;
+    }else{
+      var t1 = b;
+      var t2 = (255 - s) * b /255;
+      var t3 = (t1 - t2) * (h % 60) /60;
+      if(h === 360) h = 0;
+      if(h < 60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3}
+      else if(h < 120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3}
+      else if(h < 180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3}
+      else if(h < 240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3}
+      else if(h < 300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3}
+      else if(h < 360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3}
+      else {rgb.r=0; rgb.g=0; rgb.b=0}
+    }
+    return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
+  }
+
+  //HSB转HEX
+  ,HSBToHEX = function(hsb){
+    var rgb = HSBToRGB(hsb);
+    var hex = [
+      rgb.r.toString(16)
+      ,rgb.g.toString(16)
+      ,rgb.b.toString(16)
+    ];
+    $.each(hex, function(nr, val){
+      if(val.length === 1){
+        hex[nr] = '0' + val;
+      }
+    });
+    return hex.join('');
+  }
+
+  //转化成所需rgb格式
+  ,RGBSTo = function(rgbs){
+    var regexp = /[0-9]{1,3}/g;
+    var re = rgbs.match(regexp) || [];
+    return {r:re[0], g:re[1], b:re[2]};
+  }
+
+  ,$win = $(window)
+  ,$doc = $(document)
+
+  //构造器
+  ,Class = function(options){
+    var that = this;
+    that.index = ++colorpicker.index;
+    that.config = $.extend({}, that.config, colorpicker.config, options);
+    that.render();
+  };
+
+  //默认配置
+  Class.prototype.config = {
+    color: ''  //默认颜色,默认没有
+    ,size: null  //选择器大小
+    ,alpha: false  //是否开启透明度
+    ,format: 'hex'  //颜色显示/输入格式,可选 rgb,hex
+    ,predefine: false //预定义颜色是否开启
+    ,colors: [ //默认预定义颜色列表
+      '#16baaa', '#16b777', '#1E9FFF', '#FF5722', '#FFB800', '#01AAED', '#999', '#c00', '#ff8c00','#ffd700'
+      ,'#90ee90', '#00ced1', '#1e90ff', '#c71585', 'rgb(0, 186, 189)', 'rgb(255, 120, 0)', 'rgb(250, 212, 0)', '#393D49', 'rgba(0,0,0,.5)', 'rgba(255, 69, 0, 0.68)', 'rgba(144, 240, 144, 0.5)', 'rgba(31, 147, 255, 0.73)'
+    ]
+  };
+
+  //初始颜色选择框
+  Class.prototype.render = function(){
+    var that = this;
+    var options = that.config;
+
+    // 若 elem 非唯一,则拆分为多个实例
+    var elem = $(options.elem);
+    if(elem.length > 1){
+      layui.each(elem, function(){
+        colorpicker.render($.extend({}, options, {
+          elem: this
+        }));
+      });
+      return that;
+    }
+
+    // 合并 lay-options 属性上的配置信息
+    $.extend(options, lay.options(elem[0]));
+
+    //颜色选择框对象
+    var elemColorBox = $(['<div class="layui-unselect layui-colorpicker">'
+      ,'<span '+ (options.format == 'rgb' && options.alpha
+          ? 'class="layui-colorpicker-trigger-bgcolor"'
+        : '') +'>'
+        ,'<span class="layui-colorpicker-trigger-span" '
+          ,'lay-type="'+ (options.format == 'rgb' ? (options.alpha ? 'rgba' : 'torgb') : '') +'" '
+          ,'style="'+ function(){
+            var bgstr = '';
+            if(options.color){
+              bgstr = options.color;
+
+              if((options.color.match(/[0-9]{1,3}/g) || []).length > 3){ //需要优化
+                if(!(options.alpha && options.format == 'rgb')){
+                  bgstr = '#' + HSBToHEX(RGBToHSB(RGBSTo(options.color)))
+                }
+              }
+
+              return 'background: '+ bgstr;
+            }
+
+            return bgstr;
+          }() +'">'
+          ,'<i class="layui-icon layui-colorpicker-trigger-i '+ (options.color
+            ? ICON_PICKER_DOWN
+          : ICON_PICKER_CLOSE) +'"></i>'
+        ,'</span>'
+      ,'</span>'
+    ,'</div>'].join(''))
+
+    //初始化颜色选择框
+    elem = options.elem = $(options.elem);
+    options.size && elemColorBox.addClass('layui-colorpicker-'+ options.size); //初始化颜色选择框尺寸
+
+    // 插入颜色选择框
+    elem.addClass('layui-inline').html(
+      that.elemColorBox = elemColorBox
+    );
+
+    // 初始化 id 属性 - 优先取 options > 元素 id > 自增索引
+    options.id = 'id' in options ? options.id : (
+      elem.attr('id') || that.index
+    );
+
+    // 获取背景色值
+    that.color = that.elemColorBox.find('.'+ PICKER_TRIG_SPAN)[0].style.background;
+
+    // 相关事件
+    that.events();
+  };
+
+  //渲染颜色选择器
+  Class.prototype.renderPicker = function(){
+    var that = this
+    ,options = that.config
+    ,elemColorBox = that.elemColorBox[0]
+
+    //颜色选择器对象
+    ,elemPicker = that.elemPicker = $(['<div id="layui-colorpicker'+ that.index +'" data-index="'+ that.index +'" class="layui-anim layui-anim-downbit layui-colorpicker-main">'
+      //颜色面板
+      ,'<div class="layui-colorpicker-main-wrapper">'
+        ,'<div class="layui-colorpicker-basis">'
+          ,'<div class="layui-colorpicker-basis-white"></div>'
+          ,'<div class="layui-colorpicker-basis-black"></div>'
+          ,'<div class="layui-colorpicker-basis-cursor"></div>'
+        ,'</div>'
+        ,'<div class="layui-colorpicker-side">'
+          ,'<div class="layui-colorpicker-side-slider"></div>'
+        ,'</div>'
+      ,'</div>'
+
+      //透明度条块
+      ,'<div class="layui-colorpicker-main-alpha '+ (options.alpha ? SHOW : '') +'">'
+        ,'<div class="layui-colorpicker-alpha-bgcolor">'
+          ,'<div class="layui-colorpicker-alpha-slider"></div>'
+        ,'</div>'
+      ,'</div>'
+
+      //预设颜色列表
+      ,function(){
+        if(options.predefine){
+          var list = ['<div class="layui-colorpicker-main-pre">'];
+          layui.each(options.colors, function(i, v){
+            list.push(['<div class="layui-colorpicker-pre'+ ((v.match(/[0-9]{1,3}/g) || []).length > 3
+              ? ' layui-colorpicker-pre-isalpha'
+            : '') +'">'
+              ,'<div style="background:'+ v +'"></div>'
+            ,'</div>'].join(''));
+          });
+          list.push('</div>');
+          return list.join('');
+        } else {
+          return '';
+        }
+      }()
+
+      //底部表单元素区域
+      ,'<div class="layui-colorpicker-main-input">'
+        ,'<div class="layui-inline">'
+          ,'<input type="text" class="layui-input">'
+        ,'</div>'
+        ,'<div class="layui-btn-container">'
+          ,'<button class="layui-btn layui-btn-primary layui-btn-sm" colorpicker-events="clear">清空</button>'
+          ,'<button class="layui-btn layui-btn-sm" colorpicker-events="confirm">确定</button>'
+        ,'</div'
+      ,'</div>'
+    ,'</div>'].join(''))
+
+    ,elemColorBoxSpan = that.elemColorBox.find('.' + PICKER_TRIG_SPAN)[0];
+
+    //如果当前点击的颜色盒子已经存在选择器,则关闭
+    if($(ELEM_MAIN)[0] && $(ELEM_MAIN).data('index') == that.index){
+      that.removePicker(Class.thisElemInd);
+    } else { //插入颜色选择器
+      that.removePicker(Class.thisElemInd);
+      $('body').append(elemPicker);
+    }
+
+    // 记录当前执行的实例索引
+    colorpicker.thisId = options.id;
+
+    Class.thisElemInd = that.index; //记录最新打开的选择器索引
+    Class.thisColor =  elemColorBox.style.background //记录最新打开的选择器颜色选中值
+
+    that.position();
+    that.pickerEvents();
+  };
+
+  //颜色选择器移除
+  Class.prototype.removePicker = function(index){
+    var that = this;
+    var options = that.config;
+    var elem = $('#layui-colorpicker'+ (index || that.index));
+
+    if(elem[0]){
+      elem.remove();
+      delete colorpicker.thisId;
+
+      // 面板关闭后的回调
+      typeof options.close === 'function' && options.close(that.color);
+    }
+
+    return that;
+  };
+
+  //定位算法
+  Class.prototype.position = function(){
+    var that = this
+    ,options = that.config;
+    lay.position(that.bindElem || that.elemColorBox[0], that.elemPicker[0], {
+      position: options.position
+      ,align: 'center'
+    });
+    return that;
+  };
+
+  //颜色选择器赋值
+  Class.prototype.val = function(){
+    var that = this
+    ,options = that.config
+
+    ,elemColorBox = that.elemColorBox.find('.' + PICKER_TRIG_SPAN)
+    ,elemPickerInput = that.elemPicker.find('.' + PICKER_INPUT)
+    ,e = elemColorBox[0]
+    ,bgcolor = e.style.backgroundColor;
+
+    //判断是否有背景颜色
+    if(bgcolor){
+
+      //转化成hsb格式
+      var hsb = RGBToHSB(RGBSTo(bgcolor))
+      ,type = elemColorBox.attr('lay-type');
+
+      //同步滑块的位置及颜色选择器的选择
+      that.select(hsb.h, hsb.s, hsb.b);
+
+      // 若格式要求为rgb
+      if(type === 'torgb'){
+        elemPickerInput.find('input').val(bgcolor);
+      } else if(type === 'rgba'){ // 若格式要求为 rgba
+        var rgb = RGBSTo(bgcolor);
+
+        // 若开启透明度而没有设置,则给默认值
+        if((bgcolor.match(/[0-9]{1,3}/g) || []).length === 3){
+          elemPickerInput.find('input').val('rgba('+ rgb.r +', '+ rgb.g +', '+ rgb.b +', 1)');
+          that.elemPicker.find('.'+ PICKER_ALPHA_SLIDER).css("left", 280);
+        } else {
+          elemPickerInput.find('input').val(bgcolor);
+          var left = bgcolor.slice(bgcolor.lastIndexOf(",") + 1, bgcolor.length - 1) * 280;
+          that.elemPicker.find('.'+ PICKER_ALPHA_SLIDER).css("left", left);
+        }
+
+        // 设置 span 背景色
+        that.elemPicker.find('.'+ PICKER_ALPHA_BG)[0].style.background = 'linear-gradient(to right, rgba('+ rgb.r +', '+ rgb.g +', '+ rgb.b +', 0), rgb('+ rgb.r +', '+ rgb.g +', '+ rgb.b +'))';
+      } else {
+        elemPickerInput.find('input').val('#'+ HSBToHEX(hsb));
+      }
+    } else {
+      // 若没有背景颜色则默认到最初始的状态
+      that.select(0,100,100);
+      elemPickerInput.find('input').val("");
+      that.elemPicker.find('.'+ PICKER_ALPHA_BG)[0].style.background = '';
+      that.elemPicker.find('.'+ PICKER_ALPHA_SLIDER).css("left", 280);
+    }
+  };
+
+  //颜色选择器滑动 / 点击
+  Class.prototype.side = function(){
+    var that = this
+    ,options = that.config
+
+    ,span = that.elemColorBox.find('.' + PICKER_TRIG_SPAN)
+    ,type = span.attr('lay-type')
+
+    ,side = that.elemPicker.find('.' + PICKER_SIDE)
+    ,slider = that.elemPicker.find('.' + PICKER_SIDE_SLIDER)
+    ,basis = that.elemPicker.find('.' + PICKER_BASIS)
+    ,choose = that.elemPicker.find('.' + PICKER_BASIS_CUR)
+    ,alphacolor = that.elemPicker.find('.' + PICKER_ALPHA_BG)
+    ,alphaslider = that.elemPicker.find('.' + PICKER_ALPHA_SLIDER)
+
+    ,_h = slider[0].offsetTop/180*360
+    ,_b = 100 - (choose[0].offsetTop)/180*100
+    ,_s = (choose[0].offsetLeft)/260*100
+    ,_a = Math.round(alphaslider[0].offsetLeft/280*100)/100
+
+    ,i = that.elemColorBox.find('.' + PICKER_TRIG_I)
+    ,pre = that.elemPicker.find('.layui-colorpicker-pre').children('div')
+
+    ,change = function(x,y,z,a){
+      that.select(x, y, z);
+      var rgb = HSBToRGB({h:x, s:y, b:z});
+      var color = HSBToHEX({h:x, s:y, b:z});
+      var elemInput = that.elemPicker.find('.' + PICKER_INPUT).find('input');
+
+      i.addClass(ICON_PICKER_DOWN).removeClass(ICON_PICKER_CLOSE);
+      span[0].style.background = 'rgb('+ rgb.r +', '+ rgb.g +', '+ rgb.b +')';
+
+      if(type === 'torgb'){
+        elemInput.val('rgb('+ rgb.r +', '+ rgb.g +', '+ rgb.b +')');
+      } else if(type  === 'rgba'){
+        var left = a * 280;
+        alphaslider.css("left", left);
+        elemInput.val('rgba('+ rgb.r +', '+ rgb.g +', '+ rgb.b +', '+ a +')');
+        span[0].style.background = 'rgba('+ rgb.r +', '+ rgb.g +', '+ rgb.b +', '+ a +')';
+        alphacolor[0].style.background = 'linear-gradient(to right, rgba('+ rgb.r +', '+ rgb.g +', '+ rgb.b +', 0), rgb('+ rgb.r +', '+ rgb.g +', '+ rgb.b +'))'
+      } else {
+        elemInput.val('#'+ color);
+      }
+
+      //回调更改的颜色
+      options.change && options.change($.trim(that.elemPicker.find('.' + PICKER_INPUT).find('input').val()));
+    }
+
+    //拖拽元素
+    ,elemMove = $(['<div class="layui-auxiliar-moving" id="LAY-colorpicker-moving"></div>'].join(''))
+    ,createMoveElem = function(call){
+      $('#LAY-colorpicker-moving')[0] || $('body').append(elemMove);
+      elemMove.on('mousemove', call);
+      elemMove.on('mouseup', function(){
+        elemMove.remove();
+      }).on('mouseleave', function(){
+        elemMove.remove();
+      });
+    };
+    // 移动端滑动模拟事件中
+    // 1. 不触发游标上绑定的事件,以提高性能,使滑动更流畅
+    // 2. 游标上的事件需要冒泡到颜色拾取区域,用来模拟拖动游标的效果
+    var needTrigger = true;
+    var needStopPropagation = true;
+
+    //右侧主色选择
+    slider.on('mousedown', function(e, triggerEvent){
+      var oldtop = this.offsetTop;
+      var oldy = e.clientY === undefined ? triggerEvent.clientY : e.clientY;
+      var move = function(e){
+        var top = oldtop + (e.clientY - oldy)
+        ,maxh = side[0].offsetHeight;
+        if(top < 0)top = 0;
+        if(top > maxh)top = maxh;
+        var h = top/180*360;
+        _h = h;
+        change(h, _s, _b, _a);
+        e.preventDefault();
+      };
+      needStopPropagation && layui.stope(e);
+      createMoveElem(move);
+      e.preventDefault();
+    });
+
+    side.on('mousedown', function(e){
+      var top = e.clientY - $(this).offset().top + $win.scrollTop();
+      if(top < 0)top = 0;
+      if(top > this.offsetHeight) top = this.offsetHeight;
+      var h = top/180*360;
+      _h = h;
+      change(h, _s, _b, _a);
+      e.preventDefault();
+      needTrigger && slider.trigger('mousedown', e);
+    });
+
+    //中间小圆点颜色选择
+    choose.on('mousedown', function(e, triggerEvent){
+      var oldtop = this.offsetTop;
+      var oldleft = this.offsetLeft;
+      var oldy = e.clientY === undefined ? triggerEvent.clientY : e.clientY;
+      var oldx = e.clientX === undefined ?  triggerEvent.clientX : e.clientX;
+      var move = function(e){
+        var top = oldtop + (e.clientY - oldy)
+        ,left = oldleft + (e.clientX - oldx)
+        ,maxh = basis[0].offsetHeight
+        ,maxw = basis[0].offsetWidth;
+        if(top < 0)top = 0;
+        if(top > maxh)top = maxh;
+        if(left < 0)left = 0;
+        if(left > maxw)left = maxw;
+        var s = left/260*100
+        ,b = 100 - top/180*100;
+        _b = b;
+        _s = s;
+        change(_h, s, b, _a);
+        e.preventDefault();
+      };
+      needStopPropagation && layui.stope(e);
+      createMoveElem(move);
+      e.preventDefault();
+    });
+
+    basis.on('mousedown', function(e){
+      var top = e.clientY - $(this).offset().top + $win.scrollTop()
+      ,left = e.clientX - $(this).offset().left + $win.scrollLeft()
+      if(top < 0)top = 0;
+      if(top > this.offsetHeight)top = this.offsetHeight;
+      if(left < 0)left = 0;
+      if(left > this.offsetWidth)left = this.offsetWidth;
+      var s = left/260*100
+      ,b = 100 - top/180*100;
+      _b = b;
+      _s = s;
+      change(_h, s, b, _a);
+      layui.stope(e);
+      e.preventDefault();
+      needTrigger && choose.trigger('mousedown', e);
+    });
+
+    //底部透明度选择
+    alphaslider.on('mousedown', function(e, triggerEvent){
+      var oldleft = this.offsetLeft;
+      var oldx = e.clientX === undefined ? triggerEvent.clientX : e.clientX;
+      var move = function(e){
+        var left = oldleft + (e.clientX - oldx)
+        ,maxw = alphacolor[0].offsetWidth;
+        if(left < 0)left = 0;
+        if(left > maxw)left = maxw;
+        var a = Math.round(left /280*100) /100;
+        _a = a;
+        change(_h, _s, _b, a);
+        e.preventDefault();
+      };
+
+      needStopPropagation && layui.stope(e);
+      createMoveElem(move);
+      e.preventDefault();
+    });
+    alphacolor.on('mousedown', function(e){
+      var left = e.clientX - $(this).offset().left
+      if(left < 0)left = 0;
+      if(left > this.offsetWidth)left = this.offsetWidth;
+      var a = Math.round(left /280*100) /100;
+      _a = a;
+      change(_h, _s, _b, a);
+      e.preventDefault();
+      needTrigger && alphaslider.trigger('mousedown', e);
+    });
+
+    //预定义颜色选择
+    pre.each(function(){
+      $(this).on('click', function(){
+        $(this).parent('.layui-colorpicker-pre').addClass('selected').siblings().removeClass('selected');
+        var color = this.style.backgroundColor
+        ,hsb = RGBToHSB(RGBSTo(color))
+        ,a = color.slice(color.lastIndexOf(",") + 1, color.length - 1),left;
+        _h = hsb.h;
+        _s = hsb.s;
+        _b = hsb.b;
+        if((color.match(/[0-9]{1,3}/g) || []).length === 3) a = 1;
+        _a = a;
+        left = a * 280;
+        change(hsb.h, hsb.s, hsb.b, a);
+      })
+    });
+
+    if(!lay.touchEventsSupported()) return;
+    // 触摸事件模拟
+    layui.each([
+      {elem: side, eventType: 'mousedown'},
+      {elem: alphacolor, eventType: 'mousedown'},
+      {elem: basis, eventType: 'mousedown'}
+    ], function(i, obj){
+      lay.touchSwipe(obj.elem, {
+        onTouchStart: function(){
+          needTrigger = false;
+          needStopPropagation = false;
+        },
+        onTouchMove: function(e){
+          touchHandler(e, obj.eventType)
+        },
+        onTouchEnd: function(){
+          elemMove.remove();
+          needTrigger = true;
+          needStopPropagation = true;
+        }
+      })
+    })
+
+    function touchHandler(event, eventType) {
+      var pointer = event.touches[0];
+      var simulatedEvent = document.createEvent("MouseEvent");
+
+      simulatedEvent.initMouseEvent(eventType,
+        true, true, window, 1,
+        pointer.screenX, pointer.screenY,pointer.clientX, pointer.clientY,
+        false, false, false, false, 0, null
+      );
+      pointer.target.dispatchEvent(simulatedEvent);
+    }
+  };
+
+  //颜色选择器hsb转换
+  Class.prototype.select = function(h, s, b, type){
+    var that = this;
+    var options = that.config;
+    var hex = HSBToHEX({h:h, s:100, b:100});
+    var color = HSBToHEX({h:h, s:s, b:b});
+    var sidetop = h/360*180;
+    var top = 180 - b/100*180;
+    var left = s/100*260;
+    var basisElem = that.elemPicker.find('.' + PICKER_BASIS)[0];
+
+    that.elemPicker.find('.' + PICKER_SIDE_SLIDER).css("top", sidetop); //滑块的top
+    basisElem.style.background = '#' + hex; //颜色选择器的背景
+
+    //选择器的top left
+    that.elemPicker.find('.' + PICKER_BASIS_CUR).css({
+      "top": top / basisElem.offsetHeight * 100 + '%',
+      "left": left / basisElem.offsetWidth * 100 + '%'
+    });
+
+    // if(type === 'change') return;
+
+    // 选中的颜色
+    // that.elemPicker.find('.' + PICKER_INPUT).find('input').val('#'+ color);
+  };
+
+  Class.prototype.pickerEvents = function(){
+    var that = this
+    ,options = that.config
+
+    ,elemColorBoxSpan = that.elemColorBox.find('.' + PICKER_TRIG_SPAN) //颜色盒子
+    ,elemPickerInput = that.elemPicker.find('.' + PICKER_INPUT + ' input') //颜色选择器表单
+
+    ,pickerEvents = {
+      //清空
+      clear: function(othis){
+        elemColorBoxSpan[0].style.background ='';
+        that.elemColorBox.find('.' + PICKER_TRIG_I).removeClass(ICON_PICKER_DOWN).addClass(ICON_PICKER_CLOSE);
+        that.color = '';
+
+        options.done && options.done('');
+        that.removePicker();
+      }
+
+      //确认
+      ,confirm: function(othis, change){
+        var value =  $.trim(elemPickerInput.val())
+        ,colorValue
+        ,hsb;
+
+        if(value.indexOf(',') > -1){
+          hsb = RGBToHSB(RGBSTo(value));
+          that.select(hsb.h, hsb.s, hsb.b);
+          elemColorBoxSpan[0].style.background = (colorValue = '#' + HSBToHEX(hsb));
+
+          if((value.match(/[0-9]{1,3}/g) || []).length > 3 && elemColorBoxSpan.attr('lay-type') === 'rgba'){
+            var left = value.slice(value.lastIndexOf(",") + 1, value.length - 1) * 280;
+            that.elemPicker.find('.' + PICKER_ALPHA_SLIDER).css("left", left);
+            elemColorBoxSpan[0].style.background = value;
+            colorValue = value;
+          }
+        } else {
+          hsb = HEXToHSB(value);
+          elemColorBoxSpan[0].style.background = (colorValue = '#' + HSBToHEX(hsb));
+          that.elemColorBox.find('.' + PICKER_TRIG_I).removeClass(ICON_PICKER_CLOSE).addClass(ICON_PICKER_DOWN);
+        }
+
+        if(change === 'change'){
+          that.select(hsb.h, hsb.s, hsb.b, change);
+          options.change && options.change(colorValue);
+          return;
+        }
+        that.color = value;
+
+        options.done && options.done(value);
+        that.removePicker();
+      }
+    };
+
+    //选择器面板点击事件
+    that.elemPicker.on('click', '*[colorpicker-events]', function(){
+      var othis = $(this)
+      ,attrEvent = othis.attr('colorpicker-events');
+      pickerEvents[attrEvent] && pickerEvents[attrEvent].call(this, othis);
+    });
+
+    //输入框事件
+    elemPickerInput.on('keyup', function(e){
+      var othis = $(this);
+      pickerEvents.confirm.call(this, othis, e.keyCode === 13 ?  null : 'change');
+    });
+  }
+
+  // 颜色选择器输入
+  Class.prototype.events = function(){
+    var that = this;
+    var options = that.config;
+
+    // 弹出颜色选择器
+    that.elemColorBox.on('click' , function(){
+      that.renderPicker();
+      if($(ELEM_MAIN)[0]){
+        that.val();
+        that.side();
+      }
+    });
+  };
+
+  //全局事件
+  (function(){
+    //绑定关闭控件事件
+    $doc.on(clickOrMousedown, function(e){
+      if(!colorpicker.thisId) return;
+      var that = thisModule.getThis(colorpicker.thisId);
+      if(!that) return;
+
+      var options = that.config;
+      var elemColorBoxSpan = that.elemColorBox.find('.' + PICKER_TRIG_SPAN);
+
+      //如果点击的元素是颜色框
+      if($(e.target).hasClass(ELEM)
+        || $(e.target).parents('.'+ELEM)[0]
+      ) return;
+
+      //如果点击的元素是选择器
+      if($(e.target).hasClass(ELEM_MAIN.replace(/\./g, ''))
+        || $(e.target).parents(ELEM_MAIN)[0]
+      ) return;
+
+      if(!that.elemPicker) return;
+
+      if(that.color){
+        var hsb = RGBToHSB(RGBSTo(that.color));
+        that.select(hsb.h, hsb.s, hsb.b);
+      } else {
+        that.elemColorBox.find('.' + PICKER_TRIG_I).removeClass(ICON_PICKER_DOWN).addClass(ICON_PICKER_CLOSE);
+      }
+      elemColorBoxSpan[0].style.background = that.color || '';
+
+      // 取消选择的回调
+      typeof options.cancel === 'function' && options.cancel(that.color);
+
+      // 移除面板
+      that.removePicker();
+    });
+
+    //自适应定位
+    $win.on('resize', function(){
+      if(!colorpicker.thisId) return;
+      var that = thisModule.getThis(colorpicker.thisId);
+      if(!that) return;
+
+      if(!that.elemPicker ||  !$(ELEM_MAIN)[0]){
+        return false;
+      }
+      that.position();
+    });
+  })();
+
+  // 记录所有实例
+  thisModule.that = {}; // 记录所有实例对象
+
+  // 获取当前实例对象
+  thisModule.getThis = function(id){
+    var that = thisModule.that[id];
+    if(!that) hint.error(id ? (MOD_NAME +' instance with ID \''+ id +'\' not found') : 'ID argument required');
+    return that;
+  };
+
+  //核心入口
+  colorpicker.render = function(options){
+    var inst = new Class(options);
+    return thisModule.call(inst);
+  };
+
+  exports(MOD_NAME, colorpicker);
+});

File diff suppressed because it is too large
+ 2 - 0
suishenbang-admin/src/main/resources/static/ajax/libs/colorpicker/layui.css


File diff suppressed because it is too large
+ 2 - 0
suishenbang-admin/src/main/resources/static/ajax/libs/colorpicker/layui.js


+ 8 - 0
suishenbang-admin/src/main/resources/templates/include.html

@@ -74,6 +74,14 @@
     <script th:src="@{/ajax/libs/bootstrap-select/bootstrap-select.js}"></script>
 </div>
 
+<!-- colorpicker取色器 -->
+<div th:fragment="colorpicker-css">
+	<link th:href="@{/ajax/libs/colorpicker/layui.css}" rel="stylesheet"/>
+</div>
+<div th:fragment="colorpicker-js">
+	<script th:src="@{/ajax/libs/colorpicker/layui.js}"></script>
+</div>
+
 <!-- datetimepicker日期和时间插件 -->
 <div th:fragment="datetimepicker-css">
     <link th:href="@{/ajax/libs/datapicker/bootstrap-datetimepicker.min.css}" rel="stylesheet"/>

+ 3 - 2
suishenbang-admin/src/main/resources/templates/system/alertConfiguration/add.html

@@ -113,8 +113,9 @@
 <th:block th:include="include :: cropbox-js"/>
 <script type="text/javascript">
     var prefix = ctx + "system/configuration"
-    // var getCompanyListPrefix = "http://localhost:10001/wxportal-api/sysuser/searchOrg";
-    var getCompanyListPrefix = "https://suishenbangtest.nipponpaint.com.cn/wxportal-api/sysuser/searchOrg";
+    var domain = window.location.host;
+    var ht = domain.indexOf('localhost') != -1 ? 'http://' : 'https://';
+    var getCompanyListPrefix = ht + domain + "/wxportal-api/sysuser/searchOrg";
 
     var photoUrl;
     var options = {

+ 3 - 3
suishenbang-admin/src/main/resources/templates/system/alertConfiguration/edit.html

@@ -122,9 +122,9 @@
     <th:block th:include="include :: bootstrap-select-js" />
     <script type="text/javascript">
         var prefix = ctx + "system/configuration";
-        // var getCompanyListPrefix = "http://localhost:10001/wxportal-api/sysuser/searchOrg";
-        var getCompanyListPrefix = "https://suishenbangtest.nipponpaint.com.cn/wxportal-api/sysuser/searchOrg";
-
+        var domain = window.location.host;
+        var ht = domain.indexOf('localhost') != -1 ? 'http://' : 'https://';
+        var getCompanyListPrefix = ht + domain + "/wxportal-api/sysuser/searchOrg";
         var photoUrl;
         var options = {
             thumbBox: '.thumbBox',

+ 3 - 2
suishenbang-api/src/main/resources/application-uat.yml

@@ -7,7 +7,8 @@ ruoyi:
   # 版权年份
   copyrightYear: 2020
   # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
-  profile: /home/admin/project/file
+#  profile: /home/admin/project/file
+  profile: D:/ruoyi/uploadPath
   # 获取ip地址开关
   addressEnabled: false
   #是否开启swagger
@@ -30,7 +31,7 @@ libang:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为80
-  port: 10001
+  port: 10003
   servlet:
     # 应用的访问路径
     context-path: /wxportal-api

+ 1 - 1
suishenbang-api/src/main/resources/application.yml

@@ -1,5 +1,5 @@
 spring:
   profiles:
-    active: dev
+    active: uat
 
 #开发环境dev 测试环境test 正式环境prod  启动时可以设置参数Java -jar xxxxxx.jar spring.profiles.actiove=prod

+ 27 - 12
suishenbang-system/src/main/java/com/dgtly/system/service/impl/AlertConfigurationServiceImpl.java

@@ -101,34 +101,49 @@ public class AlertConfigurationServiceImpl implements IAlertConfigurationService
                         if(orgCodes.contains(alert.getOrgCode())){
                             Date start2 = alert.getAlertStartTime();
                             Date end2 = alert.getAlertEndTime();
-                            if ((start1.after(start2) && start1.before(end2)) ||
-                                    (end1.after(start2) && end1.before(end2)) ||
-                                    (start2.after(start1) && start2.before(end1)) ||
-                                    (end2.after(start1) && end2.before(end1))) {
+//
+                            if(isOverlap(start1, end1, start2, end2)){
                                return 1;
-                            } else {
-                               return 0;
                             }
                         }
                 }else{
                         Date start2 = alert.getAlertStartTime();
                         Date end2 = alert.getAlertEndTime();
-                        if ((start1.after(start2) && start1.before(end2)) ||
-                                (end1.after(start2) && end1.before(end2)) ||
-                                (start2.after(start1) && start2.before(end1)) ||
-                                (end2.after(start1) && end2.before(end1))) {
+//                        if ((start1.after(start2) && start1.before(end2)) ||
+//                                (end1.after(start2) && end1.before(end2)) ||
+//                                (start2.after(start1) && start2.before(end1)) ||
+//                                (end2.after(start1) && end2.before(end1))) {
+//                            return 1;
+//                        }
+                        if(isOverlap(start1, end1, start2, end2)){
                             return 1;
-                        } else {
-                            return 0;
                         }
                     }
+
             }
         }else{
                     return 0;
         }
+
         return 0;
     }
 
+
+
+
+    public static boolean isOverlap(Date start1, Date end1, Date start2, Date end2) {
+        // 判断时间段1是否在时间段2之前
+        if (end1.before(start2)) {
+            return false;
+        }
+        // 判断时间段2是否在时间段1之前
+        if (end2.before(start1)) {
+            return false;
+        }
+        // 如果以上两个条件都不满足,则时间段重叠
+        return true;
+    }
+
     /**
      * 新增弹框配置
      * 

+ 8 - 0
suishenbang-wxportal/suishenbang-wxportal-api/src/main/java/com/dgtly/wxportal/controller/WxPortalController.java

@@ -1,5 +1,6 @@
 package com.dgtly.wxportal.controller;
 
+import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -396,4 +397,11 @@ public class WxPortalController extends ApiBaseController {
         List<HelpCenter> list = helpCenterService.selectHelpCenterList(helpCenter);
         return AjaxResult.success().putKV("helpList",list);
     }
+
+
+    @PostMapping("/getHomeIconInfo")
+    public AjaxResult getHoemIconCongif() throws IOException {
+        Map<String,Object> iconInfo= wxMagnetService.selectHomeIconInfoById();
+        return  AjaxResult.success(iconInfo);
+    }
 }

+ 10 - 0
suishenbang-wxportal/suishenbang-wxportal-common/pom.xml

@@ -27,6 +27,16 @@
             <artifactId>itextpdf</artifactId>
             <version>5.5.13</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.12.3</version> <!-- 请根据需要更换版本号 -->
+        </dependency>
+
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>

+ 17 - 0
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/domain/HomeIconConfig.java

@@ -0,0 +1,17 @@
+package com.dgtly.wxportal.domain;
+import com.dgtly.common.core.domain.BaseEntity;
+import lombok.Data;
+import java.util.List;
+@Data
+public class HomeIconConfig extends BaseEntity
+{
+    private  Long id;
+    private  String portal_background;
+    private  String small_icon_extra;
+    private  String activity_icon_starttime;
+    private  String activity_icon_endtime;
+    private  String bottom_prompt_text;
+    private  String prompt_text_color;
+    private  String  activity_icon_extra;
+
+}

+ 6 - 0
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/service/IWxMagnetService.java

@@ -4,7 +4,9 @@ import com.dgtly.common.core.domain.Ztree;
 import com.dgtly.system.domain.SysMenu;
 import com.dgtly.system.domain.SysRole;
 import com.dgtly.system.domain.SysUser;
+import com.dgtly.wxportal.domain.HomeIconConfig;
 import com.dgtly.wxportal.domain.WxMagnet;
+import com.fasterxml.jackson.core.JsonProcessingException;
 
 import java.awt.*;
 import java.util.List;
@@ -111,4 +113,8 @@ public interface IWxMagnetService
     List<WxMagnet> selectMagnetByUserId(String userId, String cw, String salesLevel);
 
     List<WxMagnet> selectWxMagnetRoleByUserId(Long userId,String magnetName);
+
+    void updateHomeIcon(HomeIconConfig homeIconConfig);
+
+    Map<String, Object> selectHomeIconInfoById() throws JsonProcessingException;
 }

+ 74 - 2
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/service/impl/WxMagnetServiceImpl.java

@@ -1,20 +1,26 @@
 package com.dgtly.wxportal.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.dgtly.common.constant.UserConstants;
-import com.dgtly.common.core.controller.ApiBaseController;
 import com.dgtly.common.core.domain.Ztree;
 import com.dgtly.common.utils.StringUtils;
 import com.dgtly.system.domain.SysRole;
 import com.dgtly.system.domain.SysUser;
 import com.dgtly.system.mapper.SysRoleMenuMapper;
 import com.dgtly.system.service.ISysConfigService;
+import com.dgtly.wxportal.domain.HomeIconConfig;
 import com.dgtly.wxportal.domain.RoleMagnet;
 import com.dgtly.wxportal.domain.WxMagnet;
 import com.dgtly.wxportal.mapper.WxMagnetMapper;
 import com.dgtly.wxportal.service.IWxMagnetService;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -28,7 +34,8 @@ import java.util.*;
 public class WxMagnetServiceImpl implements IWxMagnetService
 {
     public static final String PREMISSION_STRING = "perms[\"{0}\"]";
-
+    @Autowired
+    JdbcTemplate jdbcTemplate;
     @Autowired
     private WxMagnetMapper wxMagnetMapper;
 
@@ -242,6 +249,7 @@ public class WxMagnetServiceImpl implements IWxMagnetService
     }
 
 
+
     public static String KL(String inStr) {
         char[] a = inStr.toCharArray();
         for (int i = 0; i < a.length; i++) {
@@ -280,4 +288,68 @@ public class WxMagnetServiceImpl implements IWxMagnetService
         return ztrees;
     }
 
+
+    public static boolean isValidJson(String jsonStr) {
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            JsonNode node = mapper.readTree(jsonStr);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+
+
+    }
+    /*保存首页图标配置*/
+    @Override
+    public void updateHomeIcon(HomeIconConfig homeIconConfig) {
+       //校验json字符串是否正确
+       if(StringUtils.isNotBlank(homeIconConfig.getSmall_icon_extra())){
+           if(!isValidJson(homeIconConfig.getSmall_icon_extra())){
+              throw new RuntimeException("小图标json数据格式错误!");
+           }
+       }
+        if(StringUtils.isNotBlank(homeIconConfig.getActivity_icon_extra())){
+            if(!isValidJson(homeIconConfig.getActivity_icon_extra())){
+                throw new RuntimeException("活动图标json数据格式错误!");
+            }
+        }
+        if(homeIconConfig.getId()==null) {
+            String insertSql = "INSERT INTO system_home_config (portal_background,small_icon_extra,activity_icon_extra,activity_icon_starttime,activity_icon_endtime,bottom_prompt_text,prompt_text_color,create_by,create_time) VALUES (?,?,?,?,?,?,?,?,now());";
+            Object[] args = new Object[]{homeIconConfig.getPortal_background(), homeIconConfig.getSmall_icon_extra(), homeIconConfig.getActivity_icon_extra(), homeIconConfig.getActivity_icon_starttime(), homeIconConfig.getActivity_icon_endtime(), homeIconConfig.getBottom_prompt_text(), homeIconConfig.getPrompt_text_color(),homeIconConfig.getCreateBy()};
+            jdbcTemplate.update(insertSql, args);
+        }else {
+            String updateSql = "update  system_home_config  set portal_background=?,small_icon_extra=?,activity_icon_extra=?,activity_icon_starttime=?,activity_icon_endtime=?,bottom_prompt_text=?,prompt_text_color=?,update_by=?,update_time=now() where id=?;";
+            Object[] args = new Object[]{homeIconConfig.getPortal_background(), homeIconConfig.getSmall_icon_extra(), homeIconConfig.getActivity_icon_extra(), homeIconConfig.getActivity_icon_starttime(), homeIconConfig.getActivity_icon_endtime(), homeIconConfig.getBottom_prompt_text(), homeIconConfig.getPrompt_text_color(), homeIconConfig.getUpdateBy(), homeIconConfig.getId()};
+            jdbcTemplate.update(updateSql, args);
+        }
+    }
+
+    @Override
+    public Map<String, Object> selectHomeIconInfoById() throws JsonProcessingException {
+        List<Map<String,Object>> iconInfos=jdbcTemplate.queryForList("select * from system_home_config ");
+        Map<String,Object> iconInfo= iconInfos.size()!=0?iconInfos.get(0):null;
+        if(iconInfo!=null) {
+            String smallIconString = iconInfo.get("small_icon_extra")!=null?iconInfo.get("small_icon_extra").toString():"";
+            String activityIconString = iconInfo.get("activity_icon_extra")!=null?iconInfo.get("activity_icon_extra").toString():"";
+            if (StringUtils.isNotBlank(smallIconString)) {
+                Map mapType = JSON.parseObject(smallIconString, Map.class);
+                iconInfo.put("smallIconObject", mapType);
+                iconInfo.remove("small_icon_extra");
+            }
+            if (StringUtils.isNotBlank(activityIconString)) {
+
+                ObjectMapper mapper = new ObjectMapper();
+
+                    String[] array = mapper.readValue(activityIconString, String[].class);
+
+                iconInfo.put("activityIconObject", array);
+                iconInfo.remove("activity_icon_extra");
+            }
+            return iconInfo;
+        }
+        return null;
+    }
+
+
 }

+ 39 - 0
suishenbang-wxportal/suishenbang-wxportal-manager/src/main/java/com/dgtly/wxportal/controller/WxMagnetController.java

@@ -1,5 +1,7 @@
 package com.dgtly.wxportal.controller;
 
+import com.dgtly.common.annotation.ApiNoCheckSign;
+import com.dgtly.common.annotation.ApiPassToken;
 import com.dgtly.common.annotation.Log;
 import com.dgtly.common.constant.UserConstants;
 import com.dgtly.common.core.controller.BaseController;
@@ -11,6 +13,7 @@ import com.dgtly.common.exception.BusinessException;
 import com.dgtly.framework.util.ShiroUtils;
 import com.dgtly.system.domain.SysRole;
 import com.dgtly.system.domain.SysUser;
+import com.dgtly.wxportal.domain.HomeIconConfig;
 import com.dgtly.wxportal.domain.WxMagnet;
 import com.dgtly.wxportal.service.IWxMagnetService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -20,7 +23,9 @@ import org.springframework.ui.ModelMap;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -74,6 +79,16 @@ public class WxMagnetController extends BaseController
         return prefix + "/add";
     }
 
+    /**
+     * 新增主题
+     */
+    @GetMapping("/themeAdd")
+    public String themeAdd()
+    {
+
+        return prefix + "/themeAdd";
+    }
+
     /**
      * 新增保存磁贴
      */
@@ -166,6 +181,30 @@ public class WxMagnetController extends BaseController
         return getDataTable(magnetList);
     }
 
+    /**
+     * 配置首页新增图标配置
+     */
+
+    @Log(title = "首页图标配置", businessType = BusinessType.UPDATE)
+    @PostMapping("/editHome")
+    @ResponseBody
+    public AjaxResult editHomeSave(HomeIconConfig homeIconConfig)
+    {
+
+        SysUser user = ShiroUtils.getSysUser();
+        homeIconConfig.setCreateBy(user.getUserName());
+        homeIconConfig.setUpdateBy(user.getUserName());
+        wxMagnetService.updateHomeIcon(homeIconConfig);
+       return  AjaxResult.success("保存成功!");
+    }
+
+    @PostMapping("/getHomeIconInfo")
+    @ResponseBody
+    public AjaxResult getHoemIconCongif() throws IOException {
+        Map<String,Object> iconInfo= wxMagnetService.selectHomeIconInfoById();
+        return  AjaxResult.success(iconInfo);
+    }
+
 
     /**
      * 加载角色磁贴列表树

+ 381 - 0
suishenbang-wxportal/suishenbang-wxportal-manager/src/main/resources/templates/wxportal/magnet/themeAdd.html

@@ -0,0 +1,381 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('主题配置')" />
+    <th:block th:include="include :: datetimepicker-css" />
+    <th:block th:include="include :: bootstrap-select-css" />
+    <th:block th:include="include :: cropbox-css"/>
+    <th:block th:include="include :: colorpicker-css"/>
+    <style>
+        .file-wraps{
+            width: 80px;
+            height: 80px;
+            flex-direction: row;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            background-color: #ffffff;
+            border: 1px solid #f5f5f5;
+            position: relative;
+            cursor: pointer;
+        }
+        .file-wraps input{
+            position: absolute;
+            top: 0;
+            bottom: 0;
+            left: 0;
+            right: 0;
+            opacity: 0;
+        }
+        .file-wraps-small-icon{
+            width: 50px;
+            height: 50px;
+            flex-direction: row;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            background-color: #ffffff;
+            border: 1px solid #f5f5f5;
+            position: relative;
+            cursor: pointer;
+        }
+        .file-wraps-small-icon input{
+            position: absolute;
+            top: 0;
+            bottom: 0;
+            left: 0;
+            right: 0;
+            opacity: 0;
+        }
+        .smallIconBox{
+            flex-direction: row;
+            display: flex;
+            align-items: center;
+            position: relative;
+        }
+        .smallIconItem{
+            width: 80px;
+            height: 80px;
+            flex-direction: column;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+        }
+        .activityIconBox{
+            flex-direction: row;
+            display: flex;
+            align-items: center;
+            position: relative;
+        }
+        .activityIconItem{
+            width: 50px;
+            height: 50px;
+            flex-direction: column;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            margin-right: 10px;
+            position: relative;
+        }
+        .activityIconItemClear{
+            position: absolute;
+            top: -8px;
+            right: 0px;
+            font-size: 20px;
+            z-index: 100;
+            cursor: pointer;
+        }
+        .uploadImage{
+            cursor: pointer;
+        }
+    </style>
+</head>
+<body class="white-bg">
+<div class="wrapper wrapper-content animated fadeInRight ibox-content">
+    <form class="form-horizontal m" id="form-configuration-add">
+        <div class="form-group" id="bgImageItem">
+            <label class="col-sm-3 control-label">门户背景:</label>
+            <div class="col-sm-8">
+                <div class="file-wraps">
+                    <div id="bgImageDiv" style="width: 80px;height: 80px;display: none;"></div>
+                    <i id="bgImageIcon" class="fa fa-plus" style="font-size: 40px"></i>
+                    <input type="file" class="uploadImage" id="bgImage" name="bgImage" accept="image/*"/>
+                </div>
+                <div style="font-size: 12px;color: #999999;margin-top: 10px;">建议图片宽度640px,高度800px</div>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label">小图标设置:</label>
+            <div class="col-sm-8">
+                <div class="smallIconBox">
+                    <div class="smallIconItem" th:each="dict : ${@dict.getType('home_icon_type')}">
+                        <div class="file-wraps-small-icon">
+                            <div th:id="${dict.dictValue}" style="width: 50px;height: 50px;display: none;"></div>
+                            <i th:id="${dict.dictValue}+'Icon'" class="fa fa-plus" style="font-size: 30px"></i>
+                            <input type="file" class="uploadImage" th:id="${dict.dictCode}" th:name="${dict.dictValue}" accept="image/*"/>
+                        </div>
+                        <span th:text="${dict.dictLabel}" style="margin-top: 10px;"></span>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label">活动图标设置:</label>
+            <div class="col-sm-8" style="flex-direction: row;display: flex;">
+                <div class="activityIconBox" id="activityIconBox"></div>
+                <div class="file-wraps-small-icon">
+                    <i id="activityImageIcon" class="fa fa-plus" style="font-size: 30px"></i>
+                    <input type="file" class="uploadImage" id="activityImage" name="activityImage" accept="image/*"/>
+                </div>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label">活动图标开始时间:</label>
+            <div class="col-sm-8">
+                <input id="alertStartTime" name="alertStartTime" class="form-control" type="datetime-local">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label">活动图标结束时间:</label>
+            <div class="col-sm-8">
+                <input id="alertEndTime" name="alertEndTime" class="form-control" type="datetime-local">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label">提示文字:</label>
+            <div class="col-sm-8">
+                <input id="alertTitle" name="alertTitle" class="form-control" type="text">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label">提示文字颜色:</label>
+            <div class="col-sm-8">
+                <input id="alertTitleColor" name="alertTitleColor" class="form-control" type="text">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label"></label>
+            <div class="col-sm-8">
+                <input type="color" name="color" id="color" onchange="changeColor()">
+            </div>
+        </div>
+    </form>
+</div>
+<th:block th:include="include :: footer" />
+<th:block th:include="include :: datetimepicker-js" />
+<th:block th:include="include :: bootstrap-select-js" />
+<th:block th:include="include :: cropbox-js"/>
+<th:block th:include="include :: colorpicker-js"/>
+<script type="text/javascript">
+    var prefix = ctx + "system/configuration"
+    var domain = window.location.host;
+    var ht = domain.indexOf('localhost') != -1 ? 'http://' : 'https://';
+    var prefixEdit = ht + domain + "/oneportal/wxportal/magnet";
+
+    var bgImageUrl = '';
+    var smallImageUrlArray = {};
+    var activityImageUrlArray = [];
+    var options = {
+        thumbBox: '.thumbBox',
+        spinner: '.spinner',
+        imgSrc: ctx + 'img/profile.jpg'
+    }
+
+    $(document).ready(function () {
+        getThemeInfo();
+    })
+
+    var color = document.getElementById("color");
+    var colorInfo = document.getElementById("alertTitleColor");
+    colorInfo.value = color.value;
+    function changeColor(){
+        colorInfo.value = color.value;
+    }
+
+    $('.activityIconBox').on('click','.activityIconItemClear', function (res) {
+        activityImageUrlArray.splice(res.currentTarget.dataset.index,1);
+        document.getElementById('activityIconBox').innerHTML = '';
+        activityImageUrlArray.forEach((item,index)=>{
+            $(".activityIconBox").append("<div class='activityIconItem'><img src='" + item + "' style='width: 50px;height: 50px;'><div class='activityIconItemClear'data-index='" + index + "'>×</div></div>")
+        })
+    })
+
+    $('.uploadImage').on('change', function (res) {
+        var reader = new FileReader();
+        reader.onload = function (e) {
+            options.imgSrc = e.target.result;
+            //根据MIME判断上传的文件是不是图片类型
+            if ((options.imgSrc).indexOf("image/") == -1) {
+                $.modal.alertWarning("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
+            }
+        }
+        reader.readAsDataURL(this.files[0]);
+        upBg(this.files[0],res.currentTarget.name);
+    })
+
+    $("#alertStartTime").on('change',function () {
+        if ($(this).val() != -1){
+            var startTimeChange1 = $('#alertStartTime').val().replace('T',' ');
+            var endTimeChange1 = $('#alertEndTime').val().replace('T',' ');
+            if (new Date(startTimeChange1).getTime() - new Date(endTimeChange1).getTime() >= 0){
+                $.modal.alertWarning("弹框结束时间不能小于开始时间");
+            }
+        }
+    })
+
+    $("#alertEndTime").on('change',function () {
+        if ($(this).val() != -1){
+            var startTimeChange2 = $('#alertStartTime').val().replace('T',' ');
+            var endTimeChange2 = $('#alertEndTime').val().replace('T',' ');
+            if (new Date(startTimeChange2).getTime() - new Date(endTimeChange2).getTime() >= 0){
+                $.modal.alertWarning("弹框结束时间不能小于开始时间");
+            }
+        }
+    })
+
+    $("#form-configuration-add").validate({
+        focusCleanup: true,
+        // rules:{
+        //     alertStartTime:{
+        //         required:true
+        //     },
+        //     alertEndTime:{
+        //         required:true
+        //     }
+        // },
+    });
+
+    function upBg(imgFile,imgType) {
+        var formdata = new FormData();
+        formdata.append("file", imgFile);
+        $.ajax({
+            url: ctx + "common/upload",
+            data: formdata,
+            type: "post",
+            processData: false,
+            contentType: false,
+            success: function (result) {
+                if (result.code == 0) {
+                    if (imgType == 'bgImage'){
+                        bgImageUrl = result.data.url;
+                        $("#bgImageDiv").html("<img src='" + result.data.url + "' style='width:100%;height:100%;'>");
+                        document.getElementById("bgImageDiv").style.display = 'block';
+                        document.getElementById("bgImageIcon").style.display = 'none';
+                    } else if (imgType == 'activityImage'){
+                        activityImageUrlArray.push(result.data.url);
+                        document.getElementById('activityIconBox').innerHTML = '';
+                        activityImageUrlArray.forEach((item,index)=>{
+                            $(".activityIconBox").append("<div class='activityIconItem'><img src='" + item + "' style='width: 50px;height: 50px;'><div class='activityIconItemClear'data-index='" + index + "'>×</div></div>")
+                    })
+                    } else {
+                        smallImageUrlArray[imgType] = result.data.url;
+                        $("#"+imgType).html("<img src='" + result.data.url + "' style='width:100%;height:100%;'>");
+                        document.getElementById(imgType).style.display = 'block';
+                        document.getElementById(imgType+'Icon').style.display = 'none';
+                    }
+                } else {
+                    $.modal.alertWarning(result.msg);
+                }
+            }
+        })
+    }
+
+    function getThemeInfo() {
+        var config = {
+            url: prefixEdit + '/getHomeIconInfo',
+            type: "post",
+            dataType: "json",
+            data: {},
+            beforeSend: function () {
+                $.modal.loading("正在处理中,请稍后...");
+            },
+            success: function(result) {
+                $.modal.closeLoading();
+                console.log('result',result);
+                if (result.data.portal_background != ''){
+                    bgImageUrl = result.data.portal_background;
+                    $("#bgImageDiv").html("<img src='" + result.data.portal_background + "' style='width:100%;height:100%;'>");
+                    document.getElementById("bgImageDiv").style.display = 'block';
+                    document.getElementById("bgImageIcon").style.display = 'none';
+                }
+                if (Object.keys(result.data.smallIconObject).length > 0){
+                    var keyArray = Object.keys(result.data.smallIconObject);
+                    keyArray.forEach(item => {
+                        smallImageUrlArray[item] = result.data.smallIconObject[item];
+                        $("#"+item).html("<img src='" + result.data.smallIconObject[item] + "' style='width:100%;height:100%;'>");
+                        document.getElementById(item).style.display = 'block';
+                        document.getElementById(item+'Icon').style.display = 'none';
+                    })
+                }
+                if (result.data.activityIconObject.length > 0){
+                    activityImageUrlArray = result.data.activityIconObject;
+                    activityImageUrlArray.forEach((item,index)=>{
+                        $(".activityIconBox").append("<div class='activityIconItem'><img src='" + item + "' style='width: 50px;height: 50px;'><div class='activityIconItemClear'data-index='" + index + "'>×</div></div>")
+                })
+                }
+                if (result.data.bottom_prompt_text != null){
+                    document.getElementById("alertTitle").value = result.data.bottom_prompt_text;
+                }
+                if (result.data.prompt_text_color != null){
+                    document.getElementById("alertTitleColor").value = result.data.prompt_text_color;
+                    document.getElementById("color").value = result.data.prompt_text_color;
+                }
+                if (result.data.activity_icon_starttime != null){
+                    document.getElementById("alertStartTime").value = result.data.activity_icon_starttime;
+                }
+                if (result.data.activity_icon_endtime != null){
+                    document.getElementById("alertEndTime").value = result.data.activity_icon_endtime;
+                }
+            }
+        };
+        $.ajax(config)
+    }
+
+    function submitHandler() {
+        if ($.validate.form()) {
+            var alertTitle = $('#alertTitle').val();
+            var alertTitleColor = $('#alertTitleColor').val();
+            var startTime = $('#alertStartTime').val().replace('T',' ');
+            var endTime = $('#alertEndTime').val().replace('T',' ');
+            if (new Date(startTime).getTime() - new Date(endTime).getTime() >= 0){
+                $.modal.alertWarning("弹框结束时间不能小于开始时间");
+            }else {
+                var objSubmit = {
+                    id:'1',
+                    portal_background:bgImageUrl,
+                    small_icon_extra:JSON.stringify(smallImageUrlArray),
+                    activity_icon_extra:JSON.stringify(activityImageUrlArray)
+                }
+                if (alertTitle != ''){
+                    objSubmit.bottom_prompt_text = alertTitle
+                }
+                if (alertTitleColor != ''){
+                    objSubmit.prompt_text_color = alertTitleColor
+                }
+                if (startTime != ''){
+                    objSubmit.activity_icon_starttime = startTime
+                }
+                if (endTime != ''){
+                    objSubmit.activity_icon_endtime = endTime
+                }
+                console.log('objSubmit', objSubmit);
+                var configSubmit = {
+                    url: prefixEdit + "/editHome",
+                    type: "post",
+                    dataType: "json",
+                    data: objSubmit,
+                    beforeSend: function () {
+                        $.modal.loading("正在处理中,请稍后...");
+                    },
+                    success:function (result) {
+                        $.modal.closeLoading();
+                        $.operate.successCallback(result);
+                    }
+                }
+                $.ajax(configSubmit)
+            }
+        }
+    }
+</script>
+</body>
+</html>

+ 7 - 3
suishenbang-wxportal/suishenbang-wxportal-manager/src/main/resources/templates/wxportal/magnet/wxMagnet.html

@@ -55,6 +55,9 @@
 			<a class="btn btn-success" onclick="addNew()" shiro:hasPermission="wxportal:magnet:add">
 				<i class="fa fa-plus"></i> 新增
 			</a>
+			<a class="btn btn-success" onclick="setTheme()" shiro:hasPermission="wxportal:magnet:themeAdd">
+				主题设置
+			</a>
 			<!--<a class="btn btn-primary" onclick="$.operate.editFull()" shiro:hasPermission="wxportal:magnet:edit">-->
 			<!--<i class="fa fa-edit"></i> 修改-->
 			<!--</a>-->
@@ -183,14 +186,15 @@
 
 	function addNew(){
 		$.modal.openFull("添加" + $.table._option.modalName, $.operate.addUrl(0));
-
 	}
 
 	function editMagnet(id){
-
 		$.modal.openFull("修改" + $.table._option.modalName, $.operate.editUrl(id));
-
 	}
+
+    function setTheme(){
+        $.modal.openFull("主题设置", prefix + '/themeAdd');
+    }
 </script>
 </body>
 </html>