文章广告

This commit is contained in:
zkr_liushenlu 2021-03-25 09:36:22 +08:00
parent bdd597895e
commit ed4113968c
13 changed files with 1526 additions and 236 deletions

View File

@ -1,22 +1,21 @@
package com.ruoyi.content.controller; package com.ruoyi.content.controller;
import java.util.List; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import org.apache.shiro.authz.annotation.RequiresPermissions; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*; 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 org.springframework.web.multipart.MultipartFile;
import java.util.List;
/** /**
* 文章广告Controller * 文章广告Controller
* *
@ -72,7 +71,7 @@ public class AdvertisementController extends BaseController {
* 新增保存文章广告 * 新增保存文章广告
*/ */
@Log(title = "文章广告", businessType = BusinessType.INSERT) @Log(title = "文章广告", businessType = BusinessType.INSERT)
@RequestMapping("/add") @PostMapping("/add")
@ResponseBody @ResponseBody
public AjaxResult addSave(@RequestParam("addImg") MultipartFile[] files, CmsArticleAdInfo cmsArticleAdInfo) { public AjaxResult addSave(@RequestParam("addImg") MultipartFile[] files, CmsArticleAdInfo cmsArticleAdInfo) {
MultipartFile file = files[0]; MultipartFile file = files[0];
@ -95,8 +94,12 @@ public class AdvertisementController extends BaseController {
@Log(title = "文章广告", businessType = BusinessType.UPDATE) @Log(title = "文章广告", businessType = BusinessType.UPDATE)
@PostMapping("/edit") @PostMapping("/edit")
@ResponseBody @ResponseBody
public AjaxResult editSave(CmsArticleAdInfo cmsArticleAdInfo) { public AjaxResult editSave(@RequestParam("addImg") MultipartFile[] files, CmsArticleAdInfo cmsArticleAdInfo) {
return toAjax(cmsArticleAdInfoService.updateCmsArticleAdInfo(cmsArticleAdInfo)); MultipartFile file = null;
if (files != null && files.length > 0) {
file = files[0];
}
return toAjax(cmsArticleAdInfoService.updateCmsArticleAdInfo(file, cmsArticleAdInfo));
} }
/** /**

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -61,4 +61,6 @@ public interface CmsArticleAdInfoMapper {
* @return 结果 * @return 结果
*/ */
public int deleteCmsArticleAdInfoByIds(String[] adIds); public int deleteCmsArticleAdInfoByIds(String[] adIds);
CmsArticleAdInfo selectByPrimaryKey(Integer adId);
} }

View File

@ -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<String> 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<String> 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<String> 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<Boolean>() {
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<byte[]>() {
@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<String>() {
@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<String> queryKeys(String pattern) {
try {
return redisTemplate.execute(new RedisCallback<List<String>>() {
@Override
public List<String> doInRedis(RedisConnection connection) throws DataAccessException {
Set<byte[]> value = connection.keys(pattern.getBytes());
if (value != null && !value.isEmpty()) {
List<String> values = new ArrayList<String>();
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<Boolean>() {
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<Boolean>() {
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<byte[]> queryByVague(final String keys) {
try {
return redisTemplate.execute(new RedisCallback<Set<byte[]>>() {
@Override
public Set<byte[]> 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<Long>() {
@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<Long>() {
@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<byte[]> 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<String, String> 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<String, String> 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<Boolean>() {
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<Long>() {
@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<String>() {
@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<Long>() {
@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<String>() {
@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<Long>() {
@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<String, String> hGetAll(String key) {
try {
return redisTemplate.execute(new RedisCallback<Map<String, String>>() {
@Override
public Map<String, String> doInRedis(RedisConnection connection) throws DataAccessException {
Map<byte[], byte[]> values = connection.hGetAll(key.getBytes());
Map<String, String> map = new HashMap<String, String>();
if (values != null && !values.isEmpty()) {
Set<byte[]> 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<Boolean>() {
@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<String, String> map, long time) {
try {
return redisTemplate.execute(new RedisCallback<Boolean>() {
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
Boolean result = false;
try {
Map<byte[], byte[]> hashes = new HashMap<byte[], byte[]>();
if (map != null && !map.isEmpty()) {
Set<String> 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<Long>() {
@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;
}
}

View File

@ -40,10 +40,11 @@ public interface ICmsArticleAdInfoService {
/** /**
* 修改文章广告 * 修改文章广告
* *
* @param file 广告图片
* @param cmsArticleAdInfo 文章广告 * @param cmsArticleAdInfo 文章广告
* @return 结果 * @return 结果
*/ */
public int updateCmsArticleAdInfo(CmsArticleAdInfo cmsArticleAdInfo); public int updateCmsArticleAdInfo(MultipartFile file, CmsArticleAdInfo cmsArticleAdInfo);
/** /**
* 批量删除文章广告 * 批量删除文章广告

View File

@ -5,6 +5,7 @@ import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.content.constants.PropertiesConstants; import com.ruoyi.content.constants.PropertiesConstants;
import com.ruoyi.content.domain.CmsArticleAdInfo; import com.ruoyi.content.domain.CmsArticleAdInfo;
import com.ruoyi.content.mapper.CmsArticleAdInfoMapper; import com.ruoyi.content.mapper.CmsArticleAdInfoMapper;
import com.ruoyi.content.redis.RedisManager;
import com.ruoyi.content.service.ICmsArticleAdInfoService; import com.ruoyi.content.service.ICmsArticleAdInfoService;
import com.ruoyi.content.utils.OSSUtil; import com.ruoyi.content.utils.OSSUtil;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -29,6 +30,8 @@ public class CmsArticleAdInfoServiceImpl implements ICmsArticleAdInfoService {
@Autowired @Autowired
private CmsArticleAdInfoMapper cmsArticleAdInfoMapper; private CmsArticleAdInfoMapper cmsArticleAdInfoMapper;
@Autowired
private RedisManager redisManager;
/** /**
* 查询文章广告 * 查询文章广告
@ -99,13 +102,44 @@ public class CmsArticleAdInfoServiceImpl implements ICmsArticleAdInfoService {
/** /**
* 修改文章广告 * 修改文章广告
* *
* @param file 广告图片
* @param cmsArticleAdInfo 文章广告 * @param cmsArticleAdInfo 文章广告
* @return 结果 * @return 结果
*/ */
@Override @Override
public int updateCmsArticleAdInfo(CmsArticleAdInfo cmsArticleAdInfo) { public int updateCmsArticleAdInfo(MultipartFile file, CmsArticleAdInfo cmsArticleAdInfo) {
cmsArticleAdInfo.setUpdateTime(DateUtils.getDate()); if (!file.isEmpty()) {
return cmsArticleAdInfoMapper.updateCmsArticleAdInfo(cmsArticleAdInfo); 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 @Override
public int deleteCmsArticleAdInfoByIds(String ids) { 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;
} }
/** /**

View File

@ -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) 我们发现不管什么类型都可以直接传入这个方法
* <p>
* /** 将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> 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> T JsonToList(String json, Class<?> obj) {
if (jacksonMapper == null) {
jacksonMapper = new ObjectMapper();
}
List<T> lst = null;
try {
jacksonMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
lst = (List<T>) 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> T JsonToCollectionType(String json, Class<?> objectList, Class<?> obj) {
if (jacksonMapper == null) {
jacksonMapper = new ObjectMapper();
}
List<T> lst = null;
try {
jacksonMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
lst = (List<T>) 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<String> 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<String, String> map) throws IOException {
if (jacksonMapper == null) {
jacksonMapper = new ObjectMapper();
}
JsonNodeFactory factory = new JsonNodeFactory(false);
ObjectNode objectNode = factory.objectNode();
for (Entry<String, String> entry : map.entrySet()) {
objectNode.put(entry.getKey(), entry.getValue());
}
return jacksonMapper.writeValueAsString(objectNode);
}
@JsonFilter("headFilter")
private static interface HeadFilterMixIn {
}
}

View File

@ -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<Object>() {
@Override
public void serialize(Object value, JsonGenerator jg, SerializerProvider sp)
throws IOException, JsonProcessingException {
jg.writeString("");
}
});
}
}

View File

@ -1,27 +1,27 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper <!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.content.mapper.CmsArticleAdInfoMapper"> <mapper namespace="com.ruoyi.content.mapper.CmsArticleAdInfoMapper">
<resultMap type="CmsArticleAdInfo" id="CmsArticleAdInfoResult"> <resultMap type="CmsArticleAdInfo" id="CmsArticleAdInfoResult">
<result property="adId" column="AD_ID" /> <result property="adId" column="AD_ID"/>
<result property="companyId" column="COMPANY_ID" /> <result property="companyId" column="COMPANY_ID"/>
<result property="adType" column="AD_TYPE" /> <result property="adType" column="AD_TYPE"/>
<result property="adTypeName" column="AD_TYPE_NAME" /> <result property="adTypeName" column="AD_TYPE_NAME"/>
<result property="adLinkUrl" column="AD_LINK_URL" /> <result property="adLinkUrl" column="AD_LINK_URL"/>
<result property="adTitle" column="AD_TITLE" /> <result property="adTitle" column="AD_TITLE"/>
<result property="adName" column="AD_NAME" /> <result property="adName" column="AD_NAME"/>
<result property="adSummary" column="AD_SUMMARY" /> <result property="adSummary" column="AD_SUMMARY"/>
<result property="adColorType" column="AD_COLOR_TYPE" /> <result property="adColorType" column="AD_COLOR_TYPE"/>
<result property="adImageUrl" column="AD_IMAGE_URL" /> <result property="adImageUrl" column="AD_IMAGE_URL"/>
<result property="adState" column="AD_STATE" /> <result property="adState" column="AD_STATE"/>
<result property="createDate" column="CREATE_DATE" /> <result property="createDate" column="CREATE_DATE"/>
<result property="createTime" column="CREATE_TIME" /> <result property="createTime" column="CREATE_TIME"/>
<result property="createUser" column="CREATE_USER" /> <result property="createUser" column="CREATE_USER"/>
<result property="updateUser" column="UPDATE_USER" /> <result property="updateUser" column="UPDATE_USER"/>
<result property="updateDate" column="UPDATE_DATE" /> <result property="updateDate" column="UPDATE_DATE"/>
<result property="updateTime" column="UPDATE_TIME" /> <result property="updateTime" column="UPDATE_TIME"/>
</resultMap> </resultMap>
<sql id="selectCmsArticleAdInfoVo"> <sql id="selectCmsArticleAdInfoVo">
@ -31,22 +31,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectCmsArticleAdInfoList" parameterType="CmsArticleAdInfo" resultMap="CmsArticleAdInfoResult"> <select id="selectCmsArticleAdInfoList" parameterType="CmsArticleAdInfo" resultMap="CmsArticleAdInfoResult">
<include refid="selectCmsArticleAdInfoVo"/> <include refid="selectCmsArticleAdInfoVo"/>
<where> <where>
<if test="companyId != null and companyId != ''"> and COMPANY_ID = #{companyId}</if> <if test="companyId != null and companyId != ''">and COMPANY_ID = #{companyId}</if>
<if test="adType != null and adType != ''"> and AD_TYPE = #{adType}</if> <if test="adType != null and adType != ''">and AD_TYPE = #{adType}</if>
<if test="adTypeName != null and adTypeName != ''"> and AD_TYPE_NAME like concat('%', #{adTypeName}, '%')</if> <if test="adTypeName != null and adTypeName != ''">and AD_TYPE_NAME like concat('%', #{adTypeName}, '%')
<if test="adLinkUrl != null and adLinkUrl != ''"> and AD_LINK_URL = #{adLinkUrl}</if> </if>
<if test="adTitle != null and adTitle != ''"> and AD_TITLE like concat('%', #{adTitle}, '%')</if> <if test="adLinkUrl != null and adLinkUrl != ''">and AD_LINK_URL = #{adLinkUrl}</if>
<if test="adName != null and adName != ''"> and AD_NAME like concat('%', #{adName}, '%')</if> <if test="adTitle != null and adTitle != ''">and AD_TITLE like concat('%', #{adTitle}, '%')</if>
<if test="adSummary != null and adSummary != ''"> and AD_SUMMARY = #{adSummary}</if> <if test="adName != null and adName != ''">and AD_NAME like concat('%', #{adName}, '%')</if>
<if test="adColorType != null and adColorType != ''"> and AD_COLOR_TYPE = #{adColorType}</if> <if test="adSummary != null and adSummary != ''">and AD_SUMMARY = #{adSummary}</if>
<if test="adImageUrl != null and adImageUrl != ''"> and AD_IMAGE_URL = #{adImageUrl}</if> <if test="adColorType != null and adColorType != ''">and AD_COLOR_TYPE = #{adColorType}</if>
<if test="adState != null and adState != ''"> and AD_STATE = #{adState}</if> <if test="adImageUrl != null and adImageUrl != ''">and AD_IMAGE_URL = #{adImageUrl}</if>
<if test="createDate != null and createDate != ''"> and CREATE_DATE = #{createDate}</if> <if test="adState != null and adState != ''">and AD_STATE = #{adState}</if>
<if test="createTime != null and createTime != ''"> and CREATE_TIME = #{createTime}</if> <if test="createDate != null and createDate != ''">and CREATE_DATE = #{createDate}</if>
<if test="createUser != null and createUser != ''"> and CREATE_USER = #{createUser}</if> <if test="createTime != null and createTime != ''">and CREATE_TIME = #{createTime}</if>
<if test="updateUser != null and updateUser != ''"> and UPDATE_USER = #{updateUser}</if> <if test="createUser != null and createUser != ''">and CREATE_USER = #{createUser}</if>
<if test="updateDate != null and updateDate != ''"> and UPDATE_DATE = #{updateDate}</if> <if test="updateUser != null and updateUser != ''">and UPDATE_USER = #{updateUser}</if>
<if test="updateTime != null and updateTime != ''"> and UPDATE_TIME = #{updateTime}</if> <if test="updateDate != null and updateDate != ''">and UPDATE_DATE = #{updateDate}</if>
<if test="updateTime != null and updateTime != ''">and UPDATE_TIME = #{updateTime}</if>
</where> </where>
order by CREATE_DATE DESC,CREATE_TIME DESC, UPDATE_DATE DESC,UPDATE_TIME DESC order by CREATE_DATE DESC,CREATE_TIME DESC, UPDATE_DATE DESC,UPDATE_TIME DESC
</select> </select>
@ -75,7 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateUser != null">UPDATE_USER,</if> <if test="updateUser != null">UPDATE_USER,</if>
<if test="updateDate != null">UPDATE_DATE,</if> <if test="updateDate != null">UPDATE_DATE,</if>
<if test="updateTime != null">UPDATE_TIME,</if> <if test="updateTime != null">UPDATE_TIME,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="companyId != null">#{companyId},</if> <if test="companyId != null">#{companyId},</if>
<if test="adType != null">#{adType},</if> <if test="adType != null">#{adType},</if>
@ -93,7 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateUser != null">#{updateUser},</if> <if test="updateUser != null">#{updateUser},</if>
<if test="updateDate != null">#{updateDate},</if> <if test="updateDate != null">#{updateDate},</if>
<if test="updateTime != null">#{updateTime},</if> <if test="updateTime != null">#{updateTime},</if>
</trim> </trim>
</insert> </insert>
<update id="updateCmsArticleAdInfo" parameterType="CmsArticleAdInfo"> <update id="updateCmsArticleAdInfo" parameterType="CmsArticleAdInfo">
@ -130,4 +131,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach> </foreach>
</delete> </delete>
<resultMap id="BaseResultMap" type="com.ruoyi.content.domain.CmsArticleAdInfo">
<id column="AD_ID" property="adId" jdbcType="INTEGER"/>
<result column="COMPANY_ID" property="companyId" jdbcType="VARCHAR"/>
<result column="AD_TYPE" property="adType" jdbcType="VARCHAR"/>
<result column="AD_TYPE_NAME" property="adTypeName" jdbcType="VARCHAR"/>
<result column="AD_LINK_URL" property="adLinkUrl" jdbcType="VARCHAR"/>
<result column="AD_TITLE" property="adTitle" jdbcType="VARCHAR"/>
<result column="AD_NAME" property="adName" jdbcType="VARCHAR"/>
<result column="AD_SUMMARY" property="adSummary" jdbcType="VARCHAR"/>
<result column="AD_COLOR_TYPE" property="adColorType" jdbcType="VARCHAR"/>
<result column="AD_IMAGE_URL" property="adImageUrl" jdbcType="VARCHAR"/>
<result column="AD_STATE" property="adState" jdbcType="VARCHAR"/>
<result column="CREATE_DATE" property="createDate" jdbcType="VARCHAR"/>
<result column="CREATE_TIME" property="createTime" jdbcType="VARCHAR"/>
<result column="CREATE_USER" property="createUser" jdbcType="VARCHAR"/>
<result column="UPDATE_USER" property="updateUser" jdbcType="VARCHAR"/>
<result column="UPDATE_DATE" property="updateDate" jdbcType="VARCHAR"/>
<result column="UPDATE_TIME" property="updateTime" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
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
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
select
<include refid="Base_Column_List"/>
from article_ad_info
where AD_ID = #{adId,jdbcType=INTEGER}
</select>
</mapper> </mapper>

View File

@ -98,18 +98,18 @@
} }
var fileoptions = { var fileoptions = {
showUpload : false, showUpload: false,
showRemove : true, showRemove: true,
language : 'zh', language: 'zh',
allowedPreviewTypes : [ 'image' ], allowedPreviewTypes: ['image'],
allowedFileExtensions : [ 'jpg', 'png', 'gif' ], allowedFileExtensions: ['jpg', 'png', 'gif'],
maxFileSize : 0, maxFileSize: 0,
autoReplace : true,// 是否自动替换图片 autoReplace: true,// 是否自动替换图片
uploadAsync : false,// 异步上传 uploadAsync: false,// 异步上传
maxFileCount : 1, maxFileCount: 1,
maxFilesNum : 1, maxFilesNum: 1,
dropZoneEnabled : false, dropZoneEnabled: false,
showPreview : true, showPreview: true,
msgUploadThreshold : '上传中', msgUploadThreshold : '上传中',
msgUploadEnd : '完成' msgUploadEnd : '完成'
} }

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> <html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head> <head>
<th:block th:include="include :: header('文章广告列表')" /> <th:block th:include="include :: header('文章广告列表')"/>
</head> </head>
<style> <style>
.article-table-img { .article-table-img {
@ -10,6 +10,7 @@
display: block; display: block;
border-style: none; border-style: none;
} }
.article-color { .article-color {
width: 40px; width: 40px;
height: 40px; height: 40px;
@ -18,53 +19,55 @@
} }
</style> </style>
<body class="gray-bg"> <body class="gray-bg">
<div class="container-div"> <div class="container-div">
<div class="row"> <div class="row">
<div class="col-sm-12 search-collapse"> <div class="col-sm-12 search-collapse">
<form id="formId"> <form id="formId">
<div class="select-list"> <div class="select-list">
<ul> <ul>
<li> <li>
<label>广告标题:</label> <label>广告标题:</label>
<input type="text" name="adTitle"/> <input type="text" name="adTitle"/>
</li> </li>
<li> <li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a> <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a> class="fa fa-search"></i>&nbsp;搜索</a>
</li> <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i
</ul> class="fa fa-refresh"></i>&nbsp;重置</a>
</div> </li>
</form> </ul>
</div> </div>
</form>
</div>
<div class="btn-group-sm" id="toolbar" role="group"> <div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-success" onclick="$.operate.add()"> <a class="btn btn-success" onclick="$.operate.add()">
<i class="fa fa-plus"></i> 添加 <i class="fa fa-plus"></i> 添加
</a> </a>
<a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()"> <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()">
<i class="fa fa-remove"></i> 删除 <i class="fa fa-remove"></i> 删除
</a> </a>
</div> </div>
<div class="col-sm-12 select-table table-striped"> <div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table> <table id="bootstrap-table"></table>
</div>
</div> </div>
</div> </div>
<th:block th:include="include :: footer" /> </div>
<script th:inline="javascript"> <th:block th:include="include :: footer"/>
var prefix = ctx + "content/adverts"; <script th:inline="javascript">
var prefix = ctx + "content/adverts";
$(function() { $(function () {
var options = { var options = {
url: prefix + "/list", url: prefix + "/list",
createUrl: prefix + "/add", createUrl: prefix + "/add",
updateUrl: prefix + "/edit/{id}", updateUrl: prefix + "/edit/{id}",
removeUrl: prefix + "/remove", removeUrl: prefix + "/remove",
exportUrl: prefix + "/export", exportUrl: prefix + "/export",
modalName: "文章广告", modalName: "文章广告",
columns: [{ columns: [{
checkbox: true checkbox: true
}, },
{ {
field: 'adId', field: 'adId',
title: '', title: '',
@ -85,9 +88,9 @@
{ {
field: 'adLinkUrl', field: 'adLinkUrl',
title: '跳转地址', title: '跳转地址',
formatter: function(value, row, index) { formatter: function (value, row, index) {
var actions = []; var actions = [];
actions.push('<a class="btn btn-xs" href="javascript:void(0)" onclick="$.modal.msg(\''+row.adLinkUrl+'\');" ><i class="fa"></i>展示</a> '); actions.push('<a class="btn btn-xs" href="javascript:void(0)" onclick="$.modal.msg(\'' + row.adLinkUrl + '\');" ><i class="fa"></i>展示</a> ');
return actions.join(''); return actions.join('');
} }
}, },
@ -100,7 +103,7 @@
{ {
field: 'adColorType', field: 'adColorType',
title: '背景颜色', title: '背景颜色',
formatter: function(value, row, index) { formatter: function (value, row, index) {
var actions = []; var actions = [];
if (row.adColorType === '1') { if (row.adColorType === '1') {
actions.push('<div class="article-color" style="background-color: #67c5ab"></div>'); actions.push('<div class="article-color" style="background-color: #67c5ab"></div>');
@ -119,25 +122,25 @@
title: '广告图片', title: '广告图片',
width: '10', width: '10',
widthUnit: 'px', widthUnit: 'px',
formatter: function(value, row, index) { formatter: function (value, row, index) {
var actions = []; var actions = [];
actions.push('<img class="article-table-img" src="'+row.adImageUrl+'" ></img> '); actions.push('<img class="article-table-img" src="' + row.adImageUrl + '" ></img> ');
return actions.join(''); return actions.join('');
} }
}, },
{ {
title: '操作', title: '操作',
align: 'center', align: 'center',
formatter: function(value, row, index) { formatter: function (value, row, index) {
var actions = []; var actions = [];
actions.push('<a class="btn btn-success btn-xs " href="javascript:void(0)" onclick="$.operate.edit(\'' + row.adId + '\')"><i class="fa fa-edit"></i>编辑</a> '); actions.push('<a class="btn btn-success btn-xs " href="javascript:void(0)" onclick="$.operate.edit(\'' + row.adId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
actions.push('<a class="btn btn-danger btn-xs " href="javascript:void(0)" onclick="$.operate.remove(\'' + row.adId + '\')"><i class="fa fa-remove"></i>删除</a>'); actions.push('<a class="btn btn-danger btn-xs " href="javascript:void(0)" onclick="$.operate.remove(\'' + row.adId + '\')"><i class="fa fa-remove"></i>删除</a>');
return actions.join(''); return actions.join('');
} }
}] }]
}; };
$.table.init(options); $.table.init(options);
}); });
</script> </script>
</body> </body>
</html> </html>

View File

@ -1,116 +1,172 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" > <html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head> <head>
<th:block th:include="include :: header('修改文章广告')" /> <th:block th:include="include :: header('修改文章广告')"/>
</head> </head>
<body class="white-bg"> <style>
<div class="wrapper wrapper-content animated fadeInRight ibox-content"> .lab {
<form class="form-horizontal m" id="form-adverts-edit" th:object="${cmsArticleAdInfo}"> height: 20px;
<input name="adId" th:field="*{adId}" type="hidden"> width: 20px;
<div class="form-group"> display: inline-block;
<label class="col-sm-3 control-label">公司id</label> border-radius: 20%;
<div class="col-sm-8"> margin-bottom: 0px;
<input name="companyId" th:field="*{companyId}" class="form-control" type="text"> margin-left: 5px;
</div> margin-right: 5px;
</div> }
<div class="form-group">
<label class="col-sm-3 control-label">广告类型:</label>
<div class="col-sm-8">
<select name="adType" class="form-control m-b">
<option value="">所有</option>
</select>
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 代码生成请选择字典属性</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">广告类型名:</label>
<div class="col-sm-8">
<input name="adTypeName" th:field="*{adTypeName}" 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 name="adLinkUrl" th:field="*{adLinkUrl}" 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 name="adTitle" th:field="*{adTitle}" 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 name="adName" th:field="*{adName}" 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 name="adSummary" th:field="*{adSummary}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">广告背景颜色:</label>
<div class="col-sm-8">
<select name="adColorType" class="form-control m-b">
<option value="">所有</option>
</select>
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 代码生成请选择字典属性</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">广告图片地址:</label>
<div class="col-sm-8">
<input name="adImageUrl" th:field="*{adImageUrl}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">广告状态 0展示 1不可用</label>
<div class="col-sm-8">
<input name="adState" th:field="*{adState}" 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 name="createDate" th:field="*{createDate}" 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 name="createUser" th:field="*{createUser}" 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 name="updateUser" th:field="*{updateUser}" 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 name="updateDate" th:field="*{updateDate}" class="form-control" type="text">
</div>
</div>
</form>
</div>
<th:block th:include="include :: footer" />
<script th:inline="javascript">
var prefix = ctx + "content/adverts";
$("#form-adverts-edit").validate({
focusCleanup: true
});
function submitHandler() { .addColor {
if ($.validate.form()) {
$.operate.save(prefix + "/edit", $('#form-adverts-edit').serialize()); }
} </style>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-adverts-edit" th:object="${cmsArticleAdInfo}">
<input name="adId" th:id="adId" th:field="*{adId}" type="hidden">
<div class="form-group">
<label class="col-sm-3 control-label is-required">广告标题:</label>
<div class="col-sm-8">
<input name="adTitle" th:field="*{adTitle}" th:id="adTitle" class="form-control" type="text" required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">广告名称:</label>
<div class="col-sm-8">
<input name="adName" th:field="*{adName}" th:id="adName" class="form-control" type="text" required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">广告类型:</label>
<div class="col-sm-8">
<select name="adType" th:field="*{adType}" th:id="adType" class="form-control" onchange="chooseAdType()"
required>
<option value="1">名片</option>
<option value="2">招募</option>
<option value="3">增员</option>
<option value="4">产品</option>
</select>
</div>
</div>
<div class="form-group" th:hidden="true">
<input name="adTypeName" th:field="*{adTypeName}" th:id="adTypeName" class="form-control" type="text">
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">跳转地址:</label>
<div class="col-sm-8">
<input name="adLinkUrl" th:field="*{adLinkUrl}" th:id="adLinkUrl" class="form-control" type="text"
required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">简介:</label>
<div class="col-sm-8">
<input name="adSummary" th:field="*{adSummary}" th:id="adSummary" class="form-control" type="text"
required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">广告背景颜色:</label>
<div class="col-sm-8">
<input type="radio" class="addColor" id="addColor_a" th:name="adColorType" value="1"
th:checked="*{adColorType} eq '1'">
<label class="lab" style="background-color: #67c5ab"></label>
<input type="radio" class="addColor" id="addColor_b" th:name="adColorType" value="2"
th:checked="*{adColorType} eq '2'">
<label class="lab" style="background-color: #b6d882"></label>
<input type="radio" class="addColor" id="addColor_c" th:name="adColorType" value="3"
th:checked="*{adColorType} eq '3'">
<label class="lab" style="background-color: #f88f81"></label>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">广告图片地址:</label>
<div class="col-sm-1">
<img id="imgContent" th:src="*{adImageUrl}" style="width: 50px;height: 50px;">
</div>
<label class="col-sm-3 control-label">新图片:</label>
<div class="col-sm-1">
<img id="editImgContent" style="width: 50px;height: 50px;">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">上传新图:</label>
<div class="col-sm-7">
<input type="file" class="file projectfile" id="editImg" name="editImg">
</div>
</div>
</form>
</div>
<th:block th:include="include :: footer"/>
<link th:href="@{/css/fileinput.min.css}" rel="stylesheet"/>
<script th:src="@{/js/fileinput.min.js}"></script>
<script th:src="@{/js/fileinput_locale_zh.js}"></script>
<script th:inline="javascript">
var prefix = ctx + "content/adverts";
function chooseAdType() {
$('#adTypeName').val($("#adType option:selected").text());
}
$("#form-adverts-edit").validate({
focusCleanup: true
});
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,
msgUploadThreshold: '上传中',
msgUploadEnd: '完成'
}
$("#editImg").fileinput(fileoptions).on("change", function (event) {
$(".file-preview").css("display", "none");
}).on("filebatchselected", function (event, files) {
$("#editImgContent").attr("src", $(".file-preview-image.kv-preview-data").attr('src'));
}).on("filecleared", function (event) {
$("#editImgContent").removeAttr("src");
});
function submitHandler() {
if ($.validate.form()) {
var data = new FormData();
data.append('adId', $("#adId").val());
data.append('adTitle', $("#adTitle").val());
data.append('adName', $("#adName").val());
data.append('adType', $("#adType").val());
data.append('adTypeName', $("#adTypeName").val());
data.append('adLinkUrl', $("#adLinkUrl").val());
data.append('adSummary', $("#adSummary").val());
data.append('adColorType',$("input[name='adColorType']:checked").val());
data.append('addImg', $("#editImg")[0].files[0]);
$.ajax({
url : prefix + "/edit",
data : data,
dataType : "json",
type : "post",
processData: false,//不需要对数据进行处理
contentType:false,
cache : false,
success : function(result) {
$.operate.successCallback(result);
},
error : function(textStatus, e) {
}
});
} }
</script> }
</script>
</body> </body>
</html> </html>