diff --git a/ruoyi-content/src/main/java/com/ruoyi/content/controller/AdvertisementController.java b/ruoyi-content/src/main/java/com/ruoyi/content/controller/AdvertisementController.java index 5e514be86..4d1dc1447 100644 --- a/ruoyi-content/src/main/java/com/ruoyi/content/controller/AdvertisementController.java +++ b/ruoyi-content/src/main/java/com/ruoyi/content/controller/AdvertisementController.java @@ -1,22 +1,21 @@ package com.ruoyi.content.controller; -import java.util.List; - -import org.apache.shiro.authz.annotation.RequiresPermissions; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.content.domain.CmsArticleAdInfo; +import com.ruoyi.content.service.ICmsArticleAdInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.*; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.content.domain.CmsArticleAdInfo; -import com.ruoyi.content.service.ICmsArticleAdInfoService; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.common.core.page.TableDataInfo; import org.springframework.web.multipart.MultipartFile; +import java.util.List; + /** * 文章广告Controller * @@ -72,7 +71,7 @@ public class AdvertisementController extends BaseController { * 新增保存文章广告 */ @Log(title = "文章广告", businessType = BusinessType.INSERT) - @RequestMapping("/add") + @PostMapping("/add") @ResponseBody public AjaxResult addSave(@RequestParam("addImg") MultipartFile[] files, CmsArticleAdInfo cmsArticleAdInfo) { MultipartFile file = files[0]; @@ -95,8 +94,12 @@ public class AdvertisementController extends BaseController { @Log(title = "文章广告", businessType = BusinessType.UPDATE) @PostMapping("/edit") @ResponseBody - public AjaxResult editSave(CmsArticleAdInfo cmsArticleAdInfo) { - return toAjax(cmsArticleAdInfoService.updateCmsArticleAdInfo(cmsArticleAdInfo)); + public AjaxResult editSave(@RequestParam("addImg") MultipartFile[] files, CmsArticleAdInfo cmsArticleAdInfo) { + MultipartFile file = null; + if (files != null && files.length > 0) { + file = files[0]; + } + return toAjax(cmsArticleAdInfoService.updateCmsArticleAdInfo(file, cmsArticleAdInfo)); } /** diff --git a/ruoyi-content/src/main/java/com/ruoyi/content/exception/BusinessException.java b/ruoyi-content/src/main/java/com/ruoyi/content/exception/BusinessException.java new file mode 100644 index 000000000..bff35ff0c --- /dev/null +++ b/ruoyi-content/src/main/java/com/ruoyi/content/exception/BusinessException.java @@ -0,0 +1,20 @@ +package com.ruoyi.content.exception; + +/** + * 业务异常 + * + * @author zhanghe + */ +public class BusinessException extends RuntimeException { + + private static final long serialVersionUID = -717870860504034613L; + + public BusinessException(String message) { + super(message); + } + + public BusinessException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/ruoyi-content/src/main/java/com/ruoyi/content/exception/ParameterException.java b/ruoyi-content/src/main/java/com/ruoyi/content/exception/ParameterException.java new file mode 100644 index 000000000..40cfae381 --- /dev/null +++ b/ruoyi-content/src/main/java/com/ruoyi/content/exception/ParameterException.java @@ -0,0 +1,20 @@ +package com.ruoyi.content.exception; + +/** + * 参数异常 + * + * @author zhanghe + * + */ +public class ParameterException extends RuntimeException { + + private static final long serialVersionUID = -796008340044578794L; + + public ParameterException(String message) { + super(message); + } + + public ParameterException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/ruoyi-content/src/main/java/com/ruoyi/content/mapper/CmsArticleAdInfoMapper.java b/ruoyi-content/src/main/java/com/ruoyi/content/mapper/CmsArticleAdInfoMapper.java index f3af767b5..d0771ad14 100644 --- a/ruoyi-content/src/main/java/com/ruoyi/content/mapper/CmsArticleAdInfoMapper.java +++ b/ruoyi-content/src/main/java/com/ruoyi/content/mapper/CmsArticleAdInfoMapper.java @@ -61,4 +61,6 @@ public interface CmsArticleAdInfoMapper { * @return 结果 */ public int deleteCmsArticleAdInfoByIds(String[] adIds); + + CmsArticleAdInfo selectByPrimaryKey(Integer adId); } diff --git a/ruoyi-content/src/main/java/com/ruoyi/content/redis/RedisManager.java b/ruoyi-content/src/main/java/com/ruoyi/content/redis/RedisManager.java new file mode 100644 index 000000000..f0bf02ff1 --- /dev/null +++ b/ruoyi-content/src/main/java/com/ruoyi/content/redis/RedisManager.java @@ -0,0 +1,784 @@ +package com.ruoyi.content.redis; + +import com.ruoyi.content.exception.ParameterException; +import com.ruoyi.content.utils.JsonUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.core.BoundValueOperations; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import java.io.UnsupportedEncodingException; +import java.util.*; + +/** + * redis操作类 + * + * @author Administrator + */ +@Component +public class RedisManager { + + private final static Logger logger = LoggerFactory.getLogger(RedisManager.class); + + private static String DEFAULT_CHARSET = "UTF-8"; + + @Autowired + private StringRedisTemplate redisTemplate; + + /** + * 获取过期时间 + * + * @param key + * @return + */ + public long ttl(String key) { + return redisTemplate.getExpire(key); + } + + /** + * 存放set集合 + * + * @param key 存放key + * @param value 存放集合内容(字符串数组) + */ + public Long saveSet(String key, String... value) { + try { + + return redisTemplate.opsForSet().add(key, value); + } catch (Exception e) { + logger.info("操作redis的saveSet方法出现异常!"); + e.printStackTrace(); + } + return 0L; + } + + /** + * 存放Zset集合 + * + * @param key 存放key + * @param value 存放集合内容(字符串数组) + */ + public boolean saveZSet(String key, String value) { + try { + double score = System.currentTimeMillis(); + return redisTemplate.opsForZSet().add(key, value, score); + } catch (Exception e) { + logger.info("操作redis的savezSet方法出现异常!"); + e.printStackTrace(); + } + return false; + } + + /** + * 删除在Redis中的值 + * + * @param key 存放key + * @param value 要删除的set集合中的值 + * @return + */ + public Long deleteSet(String key, String value) { + try { + return redisTemplate.opsForSet().remove(key, value); + } catch (Exception e) { + logger.info("操作redis的deleteSet方法出现异常!"); + e.printStackTrace(); + } + return 0L; + } + + /** + * 删除在Redis中的值 + * + * @param key 存放key + * @param value 要删除的set集合中的值 + * @return + */ + public Long deleteZSet(String key, String value) { + try { + return redisTemplate.opsForZSet().remove(key, value); + } catch (Exception e) { + logger.info("操作redis的deleteSet方法出现异常!"); + e.printStackTrace(); + } + return 0L; + } + + /** + * 获取存放在redis中的set集合 + * + * @param key 存放key + * @return + */ + public Set querySet(String key) { + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e) { + logger.info("操作redis的querySet方法出现异常!"); + e.printStackTrace(); + } + return null; + } + + /** + * 获取存放在redis中的ZSet集合 + * + * @param key 存放key + * @param min 最小分 + * @param max 最大分 + * @param offset 开始坐标 + * @param count 显示长度 + * @return + */ + public Set queryZSet(String key, double min, double max, long offset, long count) { + try { + return redisTemplate.opsForZSet().rangeByScore(key, min, max, offset, count); + } catch (Exception e) { + logger.info("操作redis的querySet方法出现异常!"); + e.printStackTrace(); + } + return null; + } + + /** + * 倒序获取存放在redis中的ZSet集合 + * + * @param key 存放key + * @param min 最小分 + * @param max 最大分 + * @param offset 开始坐标 + * @param count 显示长度 + * @return + */ + public Set reverseQueryZSet(String key, double min, double max, long offset, long count) { + try { + return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max, offset, count); + } catch (Exception e) { + logger.info("操作redis的querySet方法出现异常!"); + e.printStackTrace(); + } + return null; + } + + /** + * 获取存放在redis中的zSet集合的成员数 + * + * @param key 存放key + * @return + */ + public Long zSetCount(String key) { + try { + return redisTemplate.opsForZSet().size(key); + } catch (Exception e) { + logger.info("操作redis的zSetCount方法出现异常!"); + e.printStackTrace(); + } + return null; + } + + /** + * 存放信息,支持覆盖 + * + * @param key 存放key + * @param value 存放值 + * @return + */ + public boolean save(String key, String value) { + return save(key, value, 0); + } + + /** + * 存放信息,支持覆盖 + * + * @param key 存放key + * @param value 存放值 + * @param time 过期时间,单位秒 + * @return + */ + public boolean save(String key, String value, long time) { + byte[] values = null; + try { + values = value.getBytes(DEFAULT_CHARSET); + } catch (UnsupportedEncodingException e) { + logger.info("保存时,value转换utf-8编码异常,key【{}】,value【{}】", key, value); + throw new ParameterException("保存时,value转换utf-8编码异常,key{" + key + "},value{" + value + "}"); + } + return save(key.getBytes(), values, time); + } + + /** + * 存放信息,支持覆盖、过期时间 + * + * @param key 存放key + * @param value 存放值 + * @param time 过期时间,单位秒 + * @return + */ + public boolean save(final byte[] key, final byte[] value, final long time) { + try { + return redisTemplate.execute(new RedisCallback() { + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + connection.set(key, value); + if (time > 0) { + connection.expire(key, time); + } + return true; + } + }); + } catch (Exception e) { + logger.info("操作Redis的save方法出现异常!"); + e.printStackTrace(); + } + return false; + } + + /** + * 获取存放在redis中的值 + * + * @param key 存放key + * @return + */ + public String query(String key) { + byte[] value = qurey(key.getBytes()); + if (value == null) { + logger.info("根据【{}】获取值【{}】", key, value); + return ""; + } else { + try { + return new String(value, DEFAULT_CHARSET); + } catch (UnsupportedEncodingException e) { + logger.info("操作Redis的query方法出现异常!,value转换utf-8编码异常,key【{}】,value【{}】", key, value); + return ""; + } + } + } + + /** + * 获取存放在redis中的值 + * + * @param key 存放key + * @return + */ + public byte[] qurey(final byte[] key) { + try { + return redisTemplate.execute(new RedisCallback() { + @Override + public byte[] doInRedis(RedisConnection connection) throws DataAccessException { + return connection.get(key); + } + }); + } catch (Exception e) { + logger.info("操作Redis的qurey方法出现异常!"); + e.printStackTrace(); + } + return null; + } + + /** + * 获取与字段中存储的键哈希相关联的值 + * + * @param key + * @param field + * @return + */ + public String hQuery(String key, String field) { + try { + return redisTemplate.execute(new RedisCallback() { + @Override + public String doInRedis(RedisConnection connection) throws DataAccessException { + byte[] value = connection.hGet(key.getBytes(), field.getBytes()); + return value.toString(); + } + }); + } catch (Exception e) { + logger.info("操作Redis的queryKeys方法出现异常!"); + e.printStackTrace(); + } + return ""; + } + + /** + * 查询匹配的所有KEY + * + * @param pattern + * @return + */ + public List queryKeys(String pattern) { + try { + return redisTemplate.execute(new RedisCallback>() { + @Override + public List doInRedis(RedisConnection connection) throws DataAccessException { + Set value = connection.keys(pattern.getBytes()); + if (value != null && !value.isEmpty()) { + List values = new ArrayList(); + for (byte[] v : value) { + try { + values.add(new String(v, DEFAULT_CHARSET)); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + return values; + } + return null; + } + }); + } catch (Exception e) { + logger.info("操作Redis的queryKeys方法出现异常!"); + e.printStackTrace(); + } + return null; + } + + /** + * 判断键值是否存在 + * + * @param key + * @return + */ + public boolean exists(String key) { + try { + return redisTemplate.execute(new RedisCallback() { + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + return connection.exists(key.getBytes()); + } + }); + } catch (Exception e) { + logger.info("操作Redis的exists方法出现异常!"); + e.printStackTrace(); + } + return false; + } + + /** + * 判断键值是否存在 + * + * @param key + * @return + */ + public boolean exists(final byte[] key) { + try { + return redisTemplate.execute(new RedisCallback() { + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + return connection.exists(key); + } + }); + } catch (Exception e) { + logger.info("操作Redis的exists方法出现异常!"); + e.printStackTrace(); + } + return false; + } + + /** + * 模糊查詢所有的key,模糊查询 (key*) + * + * @param keys + * @return + */ + public Set queryByVague(final String keys) { + try { + return redisTemplate.execute(new RedisCallback>() { + @Override + public Set doInRedis(RedisConnection connection) throws DataAccessException { + return connection.keys(keys.getBytes()); + } + }); + } catch (Exception e) { + logger.info("操作Redis的queryByVague方法出现异常!"); + e.printStackTrace(); + } + return null; + } + + /** + * 删除在redis中的值 + * + * @param key 存放key + * @return + */ + public Long delete(final String key) { + try { + return redisTemplate.execute(new RedisCallback() { + @Override + public Long doInRedis(RedisConnection connection) throws DataAccessException { + return connection.del(key.getBytes()); + } + }); + } catch (Exception e) { + logger.info("操作Redis的delete方法出现异常!"); + e.printStackTrace(); + } + return 0L; + } + + /** + * 删除在redis中的值 + * + * @param key 存放key + * @return + */ + public Long delete(final byte[] key) { + try { + return redisTemplate.execute(new RedisCallback() { + @Override + public Long doInRedis(RedisConnection connection) throws DataAccessException { + return connection.del(key); + } + }); + } catch (Exception e) { + logger.info("操作Redis的delete方法出现异常!"); + e.printStackTrace(); + } + return 0L; + } + + /** + * 删除在redis中的值 + * + * @param keys 存放key + * @return + */ + public Long delete(final Set keys) { + long count = 0; + for (byte[] key : keys) { + count = count + delete(key); + } + return count; + } + + /** + * 增量获取redis中的值,支持数字 + * + * @param key 存放key + * @param incrementValue 增量值 + * @return + */ + public Long increment(String key, long incrementValue) { + try { + BoundValueOperations bo = redisTemplate.boundValueOps(key); + if (bo == null) { + return 0L; + } else { + return bo.increment(incrementValue); + } + } catch (Exception e) { + logger.info("操作Redis的increment方法出现异常!"); + e.printStackTrace(); + } + return 0L; + } + + /** + * 增量获取redis中的值,每次增长1 + * + * @param key 存放key + * @return + */ + public Long increment(String key) { + try { + BoundValueOperations bo = redisTemplate.boundValueOps(key); + if (bo == null) { + return 0L; + } else { + return bo.increment(1); + } + } catch (Exception e) { + logger.info("操作Redis的increment方法出现异常!"); + e.printStackTrace(); + } + return 0L; + } + + /** + * 清空redis 所有数据 + * + * @return + */ + public boolean flushDB() { + try { + return redisTemplate.execute(new RedisCallback() { + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + connection.flushDb(); + return true; + } + }); + } catch (Exception e) { + logger.info("操作Redis的flushDB方法出现异常!"); + e.printStackTrace(); + } + return false; + } + + /** + * Redis从List头部存储数据 + * + * @param key + * @param value + * @return 当前List的长度 + */ + public Long lpush(String key, String value) { + try { + return redisTemplate.execute(new RedisCallback() { + @Override + public Long doInRedis(RedisConnection connection) throws DataAccessException { + return connection.lPush(key.getBytes(), value.getBytes()); + } + }); + } catch (Exception e) { + logger.info("操作Redis的lpush方法出现异常!"); + e.printStackTrace(); + } + return 0L; + } + + /** + * Redis从List尾部提取数据 + * + * @param key + * @return value + */ + public String rPop(String key) { + try { + return redisTemplate.execute(new RedisCallback() { + @Override + public String doInRedis(RedisConnection connection) throws DataAccessException { + byte[] re = connection.rPop(key.getBytes()); + String value = ""; + if (re != null && re.length > 0) { + try { + value = new String(re, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + return value; + } + }); + } catch (Exception e) { + logger.info("操作Redis的rPop方法出现异常!"); + e.printStackTrace(); + } + return ""; + } + + /** + * 获取List的长度 + * + * @param key + * @return + */ + public Long lLen(String key) { + try { + return redisTemplate.execute(new RedisCallback() { + @Override + public Long doInRedis(RedisConnection connection) throws DataAccessException { + return connection.lLen(key.getBytes()); + } + }); + } catch (Exception e) { + logger.info("操作Redis的lLen方法出现异常!"); + e.printStackTrace(); + } + return 0L; + } + + /** + * 获取存储在哈希表中指定字段的值 + * + * @param key + * @param field 哈希表的字段名 + * @return + */ + public String hGet(String key, String field) { + try { + return redisTemplate.execute(new RedisCallback() { + @Override + public String doInRedis(RedisConnection connection) throws DataAccessException { + String result = ""; + byte[] values = connection.hGet(key.getBytes(), field.getBytes()); + if (values == null) { + return result; + } else { + try { + result = new String(values, DEFAULT_CHARSET); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + return result; + } + }); + } catch (Exception e) { + logger.info("操作Redis的hGet方法出现异常!"); + e.printStackTrace(); + } + return ""; + } + + /** + * 存储在哈希表中指定字段的值加上增量 + * + * @param key + * @param field 哈希表的字段名 + * @param delta 增量 + * @return + */ + public Long updateHset(String key, String field, Long delta) { + try { + return redisTemplate.execute(new RedisCallback() { + @Override + public Long doInRedis(RedisConnection connection) throws DataAccessException { + Long hLong = 0L; + try { + hLong = connection.hIncrBy(key.getBytes(), field.getBytes(DEFAULT_CHARSET), delta); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return hLong; + } + }); + } catch (Exception e) { + logger.info("操作Redis的updateHset方法出现异常!"); + e.printStackTrace(); + } + return 0L; + } + + /** + * 获取在哈希表中指定 KEY的所有字段和值 + * + * @param key + * @return + */ + public Map hGetAll(String key) { + try { + return redisTemplate.execute(new RedisCallback>() { + @Override + public Map doInRedis(RedisConnection connection) throws DataAccessException { + Map values = connection.hGetAll(key.getBytes()); + Map map = new HashMap(); + if (values != null && !values.isEmpty()) { + Set keys = values.keySet(); + if (keys != null && !keys.isEmpty()) { + for (byte[] key : keys) { + try { + map.put(new String(key, DEFAULT_CHARSET), new String(values.get(key), DEFAULT_CHARSET)); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + } + } + logger.info("Redis提取哈希表, key【{}】, value【{}】", key, JsonUtil.objectToJackson(map)); + return map; + } + }); + } catch (Exception e) { + logger.info("操作Redis的hGetAll方法出现异常!"); + e.printStackTrace(); + } + return null; + } + + /** + * 将哈希表 key 中的字段 field 的值设为 value + * + * @param key 键 + * @param field 哈希的字段名 + * @param value 哈希的值 + * @return + */ + public Boolean hSet(String key, String field, String value, Long time) { + try { + return redisTemplate.execute(new RedisCallback() { + @Override + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + try { + connection.hSet(key.getBytes(), field.getBytes(DEFAULT_CHARSET), value.getBytes(DEFAULT_CHARSET)); + if (time > 0) { + connection.expire(key.getBytes(), time); + } + return true; + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return false; + } + }); + } catch (Exception e) { + logger.info("操作Redis的hSet方法出现异常!"); + e.printStackTrace(); + } + return false; + } + + /** + * 同时将多个 field-value (域-值)对设置到哈希表 key 中 + * + * @param key + * @param map + * @return + */ + public Boolean hMSet(String key, Map map, long time) { + try { + return redisTemplate.execute(new RedisCallback() { + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + Boolean result = false; + try { + Map hashes = new HashMap(); + if (map != null && !map.isEmpty()) { + Set setKeys = map.keySet(); + if (setKeys != null && !setKeys.isEmpty()) { + for (String skey : setKeys) { + hashes.put(skey.getBytes(DEFAULT_CHARSET), map.get(skey).getBytes(DEFAULT_CHARSET)); + } + } + } + connection.hMSet(key.getBytes(), hashes); + if (time > 0) { + connection.expire(key.getBytes(), time); + } + result = true; + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + logger.info("插入哈希表,key【{}】, value【{}】, 操作结果【{}】", key, JsonUtil.objectToJackson(map), result); + return result; + } + }); + } catch (Exception e) { + logger.info("操作Redis的hMSet方法出现异常!"); + e.printStackTrace(); + } + return false; + } + + /** + * 删除一个哈希表字段 + * + * @param key + * @param field 哈希表字段 + * @return + */ + public Long hDel(String key, String field) { + try { + return redisTemplate.execute(new RedisCallback() { + @Override + public Long doInRedis(RedisConnection connection) throws DataAccessException { + return connection.hDel(key.getBytes(), field.getBytes()); + } + }); + } catch (Exception e) { + logger.info("操作Redis的hDel方法出现异常!"); + e.printStackTrace(); + } + return 0L; + } + +} diff --git a/ruoyi-content/src/main/java/com/ruoyi/content/service/ICmsArticleAdInfoService.java b/ruoyi-content/src/main/java/com/ruoyi/content/service/ICmsArticleAdInfoService.java index 3ec547fc5..2246f7991 100644 --- a/ruoyi-content/src/main/java/com/ruoyi/content/service/ICmsArticleAdInfoService.java +++ b/ruoyi-content/src/main/java/com/ruoyi/content/service/ICmsArticleAdInfoService.java @@ -40,10 +40,11 @@ public interface ICmsArticleAdInfoService { /** * 修改文章广告 * + * @param file 广告图片 * @param cmsArticleAdInfo 文章广告 * @return 结果 */ - public int updateCmsArticleAdInfo(CmsArticleAdInfo cmsArticleAdInfo); + public int updateCmsArticleAdInfo(MultipartFile file, CmsArticleAdInfo cmsArticleAdInfo); /** * 批量删除文章广告 diff --git a/ruoyi-content/src/main/java/com/ruoyi/content/service/impl/CmsArticleAdInfoServiceImpl.java b/ruoyi-content/src/main/java/com/ruoyi/content/service/impl/CmsArticleAdInfoServiceImpl.java index b3f2f3b67..4e58f9c17 100644 --- a/ruoyi-content/src/main/java/com/ruoyi/content/service/impl/CmsArticleAdInfoServiceImpl.java +++ b/ruoyi-content/src/main/java/com/ruoyi/content/service/impl/CmsArticleAdInfoServiceImpl.java @@ -5,6 +5,7 @@ import com.ruoyi.common.utils.DateUtils; import com.ruoyi.content.constants.PropertiesConstants; import com.ruoyi.content.domain.CmsArticleAdInfo; import com.ruoyi.content.mapper.CmsArticleAdInfoMapper; +import com.ruoyi.content.redis.RedisManager; import com.ruoyi.content.service.ICmsArticleAdInfoService; import com.ruoyi.content.utils.OSSUtil; import org.slf4j.Logger; @@ -29,6 +30,8 @@ public class CmsArticleAdInfoServiceImpl implements ICmsArticleAdInfoService { @Autowired private CmsArticleAdInfoMapper cmsArticleAdInfoMapper; + @Autowired + private RedisManager redisManager; /** * 查询文章广告 @@ -99,13 +102,44 @@ public class CmsArticleAdInfoServiceImpl implements ICmsArticleAdInfoService { /** * 修改文章广告 * + * @param file 广告图片 * @param cmsArticleAdInfo 文章广告 * @return 结果 */ @Override - public int updateCmsArticleAdInfo(CmsArticleAdInfo cmsArticleAdInfo) { - cmsArticleAdInfo.setUpdateTime(DateUtils.getDate()); - return cmsArticleAdInfoMapper.updateCmsArticleAdInfo(cmsArticleAdInfo); + public int updateCmsArticleAdInfo(MultipartFile file, CmsArticleAdInfo cmsArticleAdInfo) { + if (!file.isEmpty()) { + String fileName = file.getOriginalFilename();// 文件名 + String ext = fileName.substring(fileName.lastIndexOf("."), fileName.length());// 文件后缀 + String fileTime = DateUtils.getMillisecond(); + fileName = PropertiesConstants.AD_IMG_PATH + fileTime + ext;// OSS保存路径 + String flag = null; + try { + flag = OSSUtil.uploadFileByInputStream(PropertiesConstants.OSSENDPOINT, PropertiesConstants.OSSID, PropertiesConstants.OSSKEY, + PropertiesConstants.BUCKETNAME, file.getInputStream(), PropertiesConstants.OSSPATH + fileName); + } catch (IOException e) { + LOGGER.error("上传阿里云失败!", e); + } + if (null == flag || flag.equals("false")) { + LOGGER.info("广告图片上传oss失败"); + return 0; + } else { + cmsArticleAdInfo.setAdImageUrl(PropertiesConstants.OSS_URL + PropertiesConstants.OSSPATH + fileName); + } + } + String date = DateUtils.getDate(); + String time = DateUtils.getTimeNow(); + cmsArticleAdInfo.setAdLinkUrl(cmsArticleAdInfo.getAdLinkUrl() + "("); + cmsArticleAdInfo.setUpdateDate(date); + cmsArticleAdInfo.setUpdateTime(time); + cmsArticleAdInfo.setUpdateUser("company"); + if (cmsArticleAdInfoMapper.updateCmsArticleAdInfo(cmsArticleAdInfo) > 0) { + redisManager.delete("articleAdInfo_id" + cmsArticleAdInfo.getAdId()); + } else { + LOGGER.info("编辑广告失败"); + return 0; + } + return 1; } /** @@ -116,7 +150,16 @@ public class CmsArticleAdInfoServiceImpl implements ICmsArticleAdInfoService { */ @Override public int deleteCmsArticleAdInfoByIds(String ids) { - return cmsArticleAdInfoMapper.deleteCmsArticleAdInfoByIds(Convert.toStrArray(ids)); + String[] arrId = ids.split(","); + for (String id : arrId) { + CmsArticleAdInfo delType = cmsArticleAdInfoMapper.selectByPrimaryKey(Integer.valueOf(id)); + if (delType != null) { + redisManager.delete("articleAdInfo_id" + id); + redisManager.delete("article_ad_typeList_" + delType.getAdType()); + cmsArticleAdInfoMapper.deleteCmsArticleAdInfoById(Long.valueOf(id)); + } + } + return 1; } /** diff --git a/ruoyi-content/src/main/java/com/ruoyi/content/utils/JsonUtil.java b/ruoyi-content/src/main/java/com/ruoyi/content/utils/JsonUtil.java new file mode 100644 index 000000000..292e6051c --- /dev/null +++ b/ruoyi-content/src/main/java/com/ruoyi/content/utils/JsonUtil.java @@ -0,0 +1,291 @@ +package com.ruoyi.content.utils; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser.Feature; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; +import com.ruoyi.content.exception.BusinessException; +import com.ruoyi.content.exception.ParameterException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +public class JsonUtil { + + private final static Logger logger = LoggerFactory.getLogger(JsonUtil.class); + + private static ObjectMapper jacksonMapper = new ObjectMapper(); + + /** + * 把json字符串转换为JavaBean (1)普通对象转换:toJson(Student) (2)List转换:toJson(List) + * (3)Map转换:toJson(Map) 我们发现不管什么类型,都可以直接传入这个方法 + *

+ * /** 将Object对象转换成json串,原始方法 + * + * @param object Java对象 + * @return + */ + public static String objectToJson(Object object) { + try { + if (jacksonMapper == null) { + jacksonMapper = new ObjectMapper(); + } + return jacksonMapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 将Object对象转换成json串,把null换成"" + * + * @param object Java对象 + * @return + */ + public static String objectToJackson(Object object) { + ObjectMappingCustomer jacksonMapper = new ObjectMappingCustomer(); + try { + return jacksonMapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 将Object对象转换成json串,自动去掉null和""的字段 + * + * @param object + * @return + */ + public static String objectToJacksonNotNull(Object object) { + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_NULL); + try { + return jacksonMapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 把json字符串转换为JavaBean对象 + * + * @param json 字符串 + * @param object Java对象类型 + * @return + */ + @SuppressWarnings("unchecked") + public static T jackson2Object(String json, Class object) { + T t = null; + if (jacksonMapper == null) { + jacksonMapper = new ObjectMapper(); + } + try { + jacksonMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + t = (T) jacksonMapper.readValue(json, object); + } catch (JsonParseException e) { + logger.error("把json字符串转换为JavaBean对象异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("jackson转化对象失败"); + } catch (JsonMappingException e) { + logger.error("把json字符串转换为JavaBean对象异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("jackson转化对象失败"); + } catch (IOException e) { + logger.error("把json字符串转换为JavaBean对象异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("jackson转化对象失败"); + } + return t; + } + + /** + * 把Json转成Map + * + * @param json JSON字符串 + * @return + */ + @SuppressWarnings("rawtypes") + public static Map jackson2Map(String json) { + if (jacksonMapper == null) { + jacksonMapper = new ObjectMapper(); + } + try { + jacksonMapper.configure(Feature.ALLOW_SINGLE_QUOTES, true); + jacksonMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + return jacksonMapper.readValue(json, Map.class); + } catch (JsonParseException e) { + logger.error("把Json转成Map异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("把Json转成Map失败"); + } catch (JsonMappingException e) { + logger.error("把Json转成Map异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("把Json转成Map失败"); + } catch (IOException e) { + logger.error("把Json转成Map异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("把Json转成Map失败"); + } + } + + /** + * 转换集合对象 + * + * @param json json数据 + * @param obj java对象类型 + * @return + */ + @SuppressWarnings("unchecked") + public static T JsonToList(String json, Class obj) { + if (jacksonMapper == null) { + jacksonMapper = new ObjectMapper(); + } + List lst = null; + try { + jacksonMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + lst = (List) jacksonMapper.readValue(json, getCollectionType(List.class, obj)); + } catch (JsonParseException e) { + logger.error("转换集合对象异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("转换集合对象失败"); + } catch (JsonMappingException e) { + logger.error("转换集合对象异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("转换集合对象失败"); + } catch (IOException e) { + logger.error("转换集合对象异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("转换集合对象失败"); + } + return (T) lst; + } + + /** + * 转换集合对象 + * + * @param json + * @param objectList 集合类型 + * @param obj java对象类型 + * @return + */ + @SuppressWarnings("unchecked") + public static T JsonToCollectionType(String json, Class objectList, Class obj) { + if (jacksonMapper == null) { + jacksonMapper = new ObjectMapper(); + } + List lst = null; + try { + jacksonMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + lst = (List) jacksonMapper.readValue(json, getCollectionType(objectList, obj)); + } catch (JsonParseException e) { + logger.error("转换集合对象异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("转换集合对象失败"); + } catch (JsonMappingException e) { + logger.error("转换集合对象异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("转换集合对象失败"); + } catch (IOException e) { + logger.error("转换集合对象异常", e); + logger.info("传入JSON:" + json); + throw new ParameterException("转换集合对象失败"); + } + return (T) lst; + } + + /** + * 获取泛型的Collection Type + * + * @param collectionClass 泛型的Collection + * @param elementClasses 元素类 + * @return JavaType Java类型 + * @since 1.0 + */ + public static JavaType getCollectionType(Class collectionClass, Class... elementClasses) { + if (jacksonMapper == null) { + jacksonMapper = new ObjectMapper(); + } + return jacksonMapper.getTypeFactory().constructParametricType(collectionClass, elementClasses); + } + + /** + * 方法json节点 + * + * @return + * @throws Exception + */ + public static JsonNode createJsonNode() throws Exception { + if (jacksonMapper == null) { + jacksonMapper = new ObjectMapper(); + } + return jacksonMapper.createObjectNode(); + } + + /** + * 方法json节点 + * + * @param data + * @return + * @throws IOException + * @throws @throws Exception + */ + public static JsonNode getJsonNode(String data) throws IOException { + if (jacksonMapper == null) { + jacksonMapper = new ObjectMapper(); + } + return jacksonMapper.readTree(data); + } + + /** + * 对象转换位Json + * + * @param object + * @param properties + * @return + * @throws BusinessException + */ + public static String objectToJackson(Object object, Set properties) throws BusinessException { + ObjectMapper mapper = new ObjectMapper(); + FilterProvider filters = new SimpleFilterProvider().addFilter("headFilter", + SimpleBeanPropertyFilter.serializeAllExcept(properties)); + mapper.setFilterProvider(filters); + mapper.addMixIn(object.getClass(), HeadFilterMixIn.class); + try { + return mapper.writeValueAsString(object); + } catch (JsonProcessingException ex) { + throw new BusinessException("jackson转化异常"); + } + } + + public static String jsonNode2String(Map map) throws IOException { + if (jacksonMapper == null) { + jacksonMapper = new ObjectMapper(); + } + JsonNodeFactory factory = new JsonNodeFactory(false); + ObjectNode objectNode = factory.objectNode(); + for (Entry entry : map.entrySet()) { + objectNode.put(entry.getKey(), entry.getValue()); + } + return jacksonMapper.writeValueAsString(objectNode); + } + + @JsonFilter("headFilter") + private static interface HeadFilterMixIn { + } +} diff --git a/ruoyi-content/src/main/java/com/ruoyi/content/utils/ObjectMappingCustomer.java b/ruoyi-content/src/main/java/com/ruoyi/content/utils/ObjectMappingCustomer.java new file mode 100644 index 000000000..dfa0d9777 --- /dev/null +++ b/ruoyi-content/src/main/java/com/ruoyi/content/utils/ObjectMappingCustomer.java @@ -0,0 +1,33 @@ +package com.ruoyi.content.utils; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; + +/** + * Jackson处理类,处理null字符串 + * + * @author zhanghe + */ +public class ObjectMappingCustomer extends ObjectMapper { + + private static final long serialVersionUID = -1066355039918898238L; + + public ObjectMappingCustomer() { + super(); + // 空值处理为空串 + this.getSerializerProvider().setNullValueSerializer(new JsonSerializer() { + @Override + public void serialize(Object value, JsonGenerator jg, SerializerProvider sp) + throws IOException, JsonProcessingException { + jg.writeString(""); + + } + }); + } + +} \ No newline at end of file diff --git a/ruoyi-content/src/main/resources/mapper/content/CmsArticleAdInfoMapper.xml b/ruoyi-content/src/main/resources/mapper/content/CmsArticleAdInfoMapper.xml index c56322d90..0a6b0034f 100644 --- a/ruoyi-content/src/main/resources/mapper/content/CmsArticleAdInfoMapper.xml +++ b/ruoyi-content/src/main/resources/mapper/content/CmsArticleAdInfoMapper.xml @@ -1,27 +1,27 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -30,32 +30,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + insert into cms_article_ad_info @@ -75,7 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" UPDATE_USER, UPDATE_DATE, UPDATE_TIME, - + #{companyId}, #{adType}, @@ -93,7 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{updateUser}, #{updateDate}, #{updateTime}, - + @@ -124,10 +125,43 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from cms_article_ad_info where AD_ID in + delete from cms_article_ad_info where AD_ID in #{adId} + + + + + + + + + + + + + + + + + + + + + + AD_ID, COMPANY_ID, AD_TYPE, AD_TYPE_NAME, AD_LINK_URL, AD_TITLE, AD_NAME, AD_SUMMARY, + AD_COLOR_TYPE, AD_IMAGE_URL, AD_STATE, CREATE_DATE, CREATE_TIME, CREATE_USER, UPDATE_USER, + UPDATE_DATE, UPDATE_TIME + + + + \ No newline at end of file diff --git a/ruoyi-content/src/main/resources/templates/content/adverts/add.html b/ruoyi-content/src/main/resources/templates/content/adverts/add.html index eb6cb0e26..823093020 100644 --- a/ruoyi-content/src/main/resources/templates/content/adverts/add.html +++ b/ruoyi-content/src/main/resources/templates/content/adverts/add.html @@ -98,18 +98,18 @@ } var fileoptions = { - showUpload : false, - showRemove : true, - language : 'zh', - allowedPreviewTypes : [ 'image' ], - allowedFileExtensions : [ 'jpg', 'png', 'gif' ], - maxFileSize : 0, - autoReplace : true,// 是否自动替换图片 - uploadAsync : false,// 异步上传 - maxFileCount : 1, - maxFilesNum : 1, - dropZoneEnabled : false, - showPreview : true, + showUpload: false, + showRemove: true, + language: 'zh', + allowedPreviewTypes: ['image'], + allowedFileExtensions: ['jpg', 'png', 'gif'], + maxFileSize: 0, + autoReplace: true,// 是否自动替换图片 + uploadAsync: false,// 异步上传 + maxFileCount: 1, + maxFilesNum: 1, + dropZoneEnabled: false, + showPreview: true, msgUploadThreshold : '上传中', msgUploadEnd : '完成' } diff --git a/ruoyi-content/src/main/resources/templates/content/adverts/adverts.html b/ruoyi-content/src/main/resources/templates/content/adverts/adverts.html index 1c702ea07..669943484 100644 --- a/ruoyi-content/src/main/resources/templates/content/adverts/adverts.html +++ b/ruoyi-content/src/main/resources/templates/content/adverts/adverts.html @@ -1,7 +1,7 @@ - + -
-
-
-
-
- -
-
-
+
+
+
+
+
+ +
+
+
- -
-
-
+ +
+
- - + }; + $.table.init(options); + }); + \ No newline at end of file diff --git a/ruoyi-content/src/main/resources/templates/content/adverts/edit.html b/ruoyi-content/src/main/resources/templates/content/adverts/edit.html index ce97d35b3..86cf17431 100644 --- a/ruoyi-content/src/main/resources/templates/content/adverts/edit.html +++ b/ruoyi-content/src/main/resources/templates/content/adverts/edit.html @@ -1,116 +1,172 @@ - + - + - -
-
- -
- -
- -
-
-
- -
- - 代码生成请选择字典属性 -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- - 代码生成请选择字典属性 -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
- - + + + } + + \ No newline at end of file