提交 1297991f authored 作者: 潘鹏's avatar 潘鹏

Merge remote-tracking branch 'origin/master'

...@@ -150,4 +150,30 @@ public class AdvertisementItemController { ...@@ -150,4 +150,30 @@ public class AdvertisementItemController {
} }
return R.error("操作失败"); return R.error("操作失败");
} }
/**
* 修改广告页商品
*/
@RequestMapping("/updateAdvertisementItem")
@ResponseBody
public R updateAdvertisementItem(@RequestParam Map<String, Object> map) {
int res = advertisementItemService.updateAdvertisementItem(map);
if (res > 0) {
return R.ok();
} else if (res == -1) {
return R.error("参数不能为空");
} else if (res == -2) {
return R.error("序号不能跟原来相同");
} else if (res == -3) {
return R.error("序号必须是正整数");
}
return R.error("操作失败");
}
@RequestMapping("/getAdSort")
@ResponseBody
public R getAdSort(@RequestParam Map<String, Object> map) {
Integer sort = advertisementItemService.getAdSort(map);
return R.ok().put("sort", sort);
}
} }
...@@ -12,6 +12,7 @@ import javax.servlet.http.HttpServletRequest; ...@@ -12,6 +12,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import com.platform.utils.OssUtil; import com.platform.utils.OssUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
...@@ -30,244 +31,248 @@ import com.platform.utils.util.UuidUtil; ...@@ -30,244 +31,248 @@ import com.platform.utils.util.UuidUtil;
@Controller @Controller
@RequestMapping(value="/api/osstest",produces="application/json;charset=UTF-8") @RequestMapping(value = "/api/osstest", produces = "application/json;charset=UTF-8")
public class OssTestApi { public class OssTestApi {
@IgnoreAuth @IgnoreAuth
@RequestMapping("/createfolder") @RequestMapping("/createfolder")
@ResponseBody @ResponseBody
public String createFolder() { public String createFolder() {
try { try {
OSSClient client= OssUtil.getOSSClient(); OSSClient client = OssUtil.getOSSClient();
String fileDir=OssUtil.createFolder(client, "diaosaas-prod", "xinlizixun/"); String fileDir = OssUtil.createFolder(client, "diaosaas-prod", "xinlizixun/");
return fileDir; return fileDir;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return "error"; return "error";
} }
} }
@IgnoreAuth
@RequestMapping(value="/uploadtest",produces="application/json;charset=UTF-8") @IgnoreAuth
@ResponseBody @RequestMapping(value = "/uploadtest", produces = "application/json;charset=UTF-8")
public String upload(MultipartFile file,String secondaryFolderName) { @ResponseBody
try { public String upload(MultipartFile file, String secondaryFolderName) {
// 获取文件名 try {
String fileName = file.getOriginalFilename(); // 获取文件名
// 获取文件后缀 String fileName = file.getOriginalFilename();
String prefix=fileName.substring(fileName.lastIndexOf(".")); // 获取文件后缀
// 用uuid作为文件名,防止生成的文件重复 String prefix = fileName.substring(fileName.lastIndexOf("."));
final File mfile = File.createTempFile(UuidUtil.get32UUID(), prefix); // 用uuid作为文件名,防止生成的文件重复
final File mfile = File.createTempFile(UuidUtil.get32UUID(), prefix);
// MultipartFile to File
file.transferTo(mfile); // MultipartFile to File
file.transferTo(mfile);
String url=OssUtil.uploadObject2OSS(mfile,secondaryFolderName); if (StringUtils.isBlank(secondaryFolderName)) {
System.out.println(mfile.getName()); secondaryFolderName = "afrishop";
System.out.println(url); }
return url; String url = OssUtil.uploadObject2OSS(mfile, secondaryFolderName);
} catch (Exception e) { System.out.println(mfile.getName());
e.printStackTrace(); System.out.println(url);
return "err"; return url;
} } catch (Exception e) {
} e.printStackTrace();
return "err";
@IgnoreAuth }
@RequestMapping(value="/uploadfile",produces="application/json;charset=UTF-8") }
@ResponseBody
public String uploadfile(MultipartFile file,String secondaryFolderName) { @IgnoreAuth
try { @RequestMapping(value = "/uploadfile", produces = "application/json;charset=UTF-8")
// 获取文件名 @ResponseBody
String fileName = file.getOriginalFilename(); public String uploadfile(MultipartFile file, String secondaryFolderName) {
// 获取文件后缀 try {
String prefix=fileName.substring(fileName.lastIndexOf(".")); // 获取文件名
// 用uuid作为文件名,防止生成的文件重复 String fileName = file.getOriginalFilename();
final File mfile = File.createTempFile(UuidUtil.get32UUID(), prefix); // 获取文件后缀
String prefix = fileName.substring(fileName.lastIndexOf("."));
// MultipartFile to File // 用uuid作为文件名,防止生成的文件重复
file.transferTo(mfile); final File mfile = File.createTempFile(UuidUtil.get32UUID(), prefix);
String url=OssUtil.uploadObject2OSS(mfile,secondaryFolderName); // MultipartFile to File
System.out.println(mfile.getName()); file.transferTo(mfile);
System.out.println(url);
return url +" "+fileName; String url = OssUtil.uploadObject2OSS(mfile, secondaryFolderName);
//return ""; System.out.println(mfile.getName());
} catch (Exception e) { System.out.println(url);
e.printStackTrace(); return url + " " + fileName;
return "err"; //return "";
} } catch (Exception e) {
} e.printStackTrace();
return "err";
}
/** }
*
* @Function: uploadfileVideo
* @Description: (此方法只用于[课程管理模块]上传课程宣传视频和课程视频) /**
* @param: * @Function: uploadfileVideo
* @return: * @Description: (此方法只用于[课程管理模块]上传课程宣传视频和课程视频)
* @since JDK 1.8 * @param:
* @return:
@IgnoreAuth * @IgnoreAuth
@RequestMapping(value="/uploadfileVideo",produces="application/json;charset=UTF-8") * @RequestMapping(value="/uploadfileVideo",produces="application/json;charset=UTF-8")
@ResponseBody * @ResponseBody public Map<String, Object> uploadfileVideo(HttpServletRequest request,MultipartFile[] files) {
public Map<String, Object> uploadfileVideo(HttpServletRequest request,MultipartFile[] files) { * <p>
* Map<String, Object> map = new HashMap<>();
Map<String, Object> map = new HashMap<>(); * List<String> urlList = new ArrayList<>();
List<String> urlList = new ArrayList<>(); * try {
try { * for (int i = 0; i < files.length; i++) {
for (int i = 0; i < files.length; i++) { * // 获取文件名
// 获取文件名 * String fileName = files[i].getOriginalFilename();
String fileName = files[i].getOriginalFilename(); * // 获取文件后缀
// 获取文件后缀 * String prefix=fileName.substring(fileName.lastIndexOf("."));
String prefix=fileName.substring(fileName.lastIndexOf(".")); * System.out.println(UuidUtil.get32UUID()+"-"+fileName.substring(0,fileName.lastIndexOf(".")));
System.out.println(UuidUtil.get32UUID()+"-"+fileName.substring(0,fileName.lastIndexOf("."))); * final File mfile = File.createTempFile(UuidUtil.get32UUID(), prefix);
final File mfile = File.createTempFile(UuidUtil.get32UUID(), prefix); * // MultipartFile to File
// MultipartFile to File * files[i].transferTo(mfile);
files[i].transferTo(mfile); * String url=OssUtil.uploadObject3OSS(mfile,fileName);
String url=OssUtil.uploadObject3OSS(mfile,fileName); * // String fileUpload = OssUtil.fileUpload(mfile, fileName, request);
// String fileUpload = OssUtil.fileUpload(mfile, fileName, request); * System.out.println(mfile.getName());
System.out.println(mfile.getName()); * urlList.add(url);
urlList.add(url); * // urlList.add(fileUpload);
// urlList.add(fileUpload); * }
} * map.put("urlList", urlList);
map.put("urlList", urlList); * return map;
return map; * } catch (Exception e) {
} catch (Exception e) { * e.printStackTrace();
e.printStackTrace(); * return map;
return map; * }
} * }
} */ * @since JDK 1.8
*/
@IgnoreAuth
@RequestMapping("/deletetest") @IgnoreAuth
@ResponseBody @RequestMapping("/deletetest")
public R delete(String url) { @ResponseBody
try { public R delete(String url) {
// http://diaosaas-prod.oss-cn-shenzhen.aliyuncs.com/education/155771122620710111.jpg try {
url = url.substring(url.lastIndexOf("/")+1); // http://diaosaas-prod.oss-cn-shenzhen.aliyuncs.com/education/155771122620710111.jpg
OssUtil.deleteFile("diaosaas-prod", "education/", url); url = url.substring(url.lastIndexOf("/") + 1);
return R.ok().put("success", "删除成功"); OssUtil.deleteFile("diaosaas-prod", "education/", url);
} catch (Exception e) { return R.ok().put("success", "删除成功");
e.printStackTrace(); } catch (Exception e) {
return R.error().put("fail", "删除失败"); e.printStackTrace();
} return R.error().put("fail", "删除失败");
} }
}
/** /**
* 富文本图片自定义上传 * 富文本图片自定义上传
*/ */
@IgnoreAuth @IgnoreAuth
@RequestMapping(value="/uploaditemimage",produces="application/json;charset=UTF-8") @RequestMapping(value = "/uploaditemimage", produces = "application/json;charset=UTF-8")
@ResponseBody @ResponseBody
public Object uploadItemImage(HttpServletRequest request) throws Exception { public Object uploadItemImage(HttpServletRequest request) throws Exception {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile photo = multipartRequest.getFile("upfile"); MultipartFile photo = multipartRequest.getFile("upfile");
String url = ""; String url = "";
if (photo.getSize() > 0) { if (photo.getSize() > 0) {
String result =OssUtil.upload(photo); String result = OssUtil.upload(photo);
if (result.equals("fail")) { if (result.equals("fail")) {
} else { } else {
url = result; url = result;
} }
} }
// 这里获取到文件 处理上传后返回路径 // 这里获取到文件 处理上传后返回路径
ImageUploadResult result = new ImageUploadResult(); ImageUploadResult result = new ImageUploadResult();
result.setState("SUCCESS"); result.setState("SUCCESS");
result.setUrl(url); result.setUrl(url);
result.setOriginal(System.currentTimeMillis() + "/" + photo.getOriginalFilename()); result.setOriginal(System.currentTimeMillis() + "/" + photo.getOriginalFilename());
result.setTitle(photo.getOriginalFilename()); result.setTitle(photo.getOriginalFilename());
return result; return result;
} }
// 删除富文本的图片
//content 需要更新的内容 // 删除富文本的图片
//pd 没更新的数据 //content 需要更新的内容
public void deleteUeditorImg( String content,PageData pd) { //pd 没更新的数据
if(pd.get("describes")!=null&&pd.get("describes").toString().trim().length()>0 ){ public void deleteUeditorImg(String content, PageData pd) {
String dbContent = pd.getString("describes"); if (pd.get("describes") != null && pd.get("describes").toString().trim().length() > 0) {
List<String> list = StringUtil.getImgStr(dbContent); String dbContent = pd.getString("describes");
String[] a = new String[list.size()]; List<String> list = StringUtil.getImgStr(dbContent);
for (int i = 0; i < list.size(); i++) { String[] a = new String[list.size()];
a[i] = list.get(i); for (int i = 0; i < list.size(); i++) {
} a[i] = list.get(i);
}
List<String> list1 = StringUtil.getImgStr(content);
String[] b = new String[list1.size()]; List<String> list1 = StringUtil.getImgStr(content);
for (int i = 0; i < list1.size(); i++) { String[] b = new String[list1.size()];
b[i] = list1.get(i); for (int i = 0; i < list1.size(); i++) {
} b[i] = list1.get(i);
}
List<String> list2 = StringUtil.compare(b, a);
List<String> list2 = StringUtil.compare(b, a);
for (int i = 0; i < list2.size(); i++) {
String path = list2.get(i); for (int i = 0; i < list2.size(); i++) {
path.substring(path.lastIndexOf("/")+1, path.length()); String path = list2.get(i);
OssUtil.deleteFile("diaosaas-prod", "education/", path); path.substring(path.lastIndexOf("/") + 1, path.length());
} OssUtil.deleteFile("diaosaas-prod", "education/", path);
} }
} }
}
/**
/**
* 获取实时长传进度 * 获取实时长传进度
*
* @param request * @param request
* @return * @return
*/ */
@RequestMapping ("/item/percent") @RequestMapping("/item/percent")
@ResponseBody @ResponseBody
public int getUploadPercent(HttpServletRequest request){ public int getUploadPercent(HttpServletRequest request) {
HttpSession session = request.getSession(); HttpSession session = request.getSession();
int percent = session.getAttribute("upload_percent") == null ? 0: (Integer)session.getAttribute("upload_percent"); int percent = session.getAttribute("upload_percent") == null ? 0 : (Integer) session.getAttribute("upload_percent");
return percent; return percent;
} }
/** /**
* 重置上传进度 * 重置上传进度
*
* @param request * @param request
* @return * @return
*/ */
@RequestMapping ("/percent/reset") @RequestMapping("/percent/reset")
public void resetPercent(HttpServletRequest request){ public void resetPercent(HttpServletRequest request) {
HttpSession session = request.getSession(); HttpSession session = request.getSession();
session.setAttribute("upload_percent",0); session.setAttribute("upload_percent", 0);
} }
/**
/**多线程分片文件上传**/ * 多线程分片文件上传
**/
@RequestMapping("uploadFile") @RequestMapping("uploadFile")
public String uploadBlog(@RequestParam("file")MultipartFile file,HttpServletRequest request){//MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。 logger.info("文件上传"); public String uploadBlog(@RequestParam("file") MultipartFile file, HttpServletRequest request) {//MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。 logger.info("文件上传");
HttpSession session=request.getSession(); HttpSession session = request.getSession();
String filename=file.getOriginalFilename(); String filename = file.getOriginalFilename();
session.setAttribute("fileName",filename); session.setAttribute("fileName", filename);
System.out.println(filename); System.out.println(filename);
long fileLength=file.getSize(); long fileLength = file.getSize();
DecimalFormat df=new DecimalFormat(".00"); DecimalFormat df = new DecimalFormat(".00");
if(fileLength<1024){ if (fileLength < 1024) {
session.setAttribute("fileSize","1KB"); session.setAttribute("fileSize", "1KB");
}else if(fileLength>=1024 && fileLength<1024*1024){ } else if (fileLength >= 1024 && fileLength < 1024 * 1024) {
session.setAttribute("fileSize",df.format(fileLength/1024.0)+"KB"); session.setAttribute("fileSize", df.format(fileLength / 1024.0) + "KB");
}else { } else {
session.setAttribute("fileSize",df.format(fileLength/(1024.0*1024.0))+"MB"); session.setAttribute("fileSize", df.format(fileLength / (1024.0 * 1024.0)) + "MB");
} }
try { try {
if(file!=null){ if (file != null) {
if (!"".equals(filename.trim())){ if (!"".equals(filename.trim())) {
//MultipartFile转File //MultipartFile转File
File newFile=new File(filename); File newFile = new File(filename);
FileOutputStream os=new FileOutputStream(newFile); FileOutputStream os = new FileOutputStream(newFile);
os.write(file.getBytes()); os.write(file.getBytes());
os.close(); os.close();
file.transferTo(newFile);//将上传文件写入目标文件 file.transferTo(newFile);//将上传文件写入目标文件
//上传到OSS //上传到OSS
String key="time1128"; String key = "time1128";
// String url=OssUtil.upLoad(newFile,session,key); // String url=OssUtil.upLoad(newFile,session,key);
//删除临时文件 //删除临时文件
newFile.delete(); newFile.delete();
} }
...@@ -279,5 +284,5 @@ public class OssTestApi { ...@@ -279,5 +284,5 @@ public class OssTestApi {
return "upload_success";//上传成功页面 return "upload_success";//上传成功页面
} }
} }
...@@ -29,7 +29,7 @@ public class uploadController { ...@@ -29,7 +29,7 @@ public class uploadController {
@RequestMapping(value = "/uploadFile", produces = "application/json;charset=UTF-8") @RequestMapping(value = "/uploadFile", produces = "application/json;charset=UTF-8")
public String upload(MultipartFile file) { public String upload(MultipartFile file) {
try { try {
String secondaryFolderName = "Afrishop"; String secondaryFolderName = "afrishop";
// 获取文件名 // 获取文件名
String fileName = file.getOriginalFilename(); String fileName = file.getOriginalFilename();
// 获取文件后缀 // 获取文件后缀
...@@ -87,4 +87,4 @@ public class uploadController { ...@@ -87,4 +87,4 @@ public class uploadController {
/** /**
* data:image/jpg;base64,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 * data:image/jpg;base64,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
*/ */
} }
\ No newline at end of file
...@@ -3,6 +3,7 @@ package com.platform.dao; ...@@ -3,6 +3,7 @@ package com.platform.dao;
import com.platform.entity.AdvertisementItemEntity; import com.platform.entity.AdvertisementItemEntity;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
...@@ -17,11 +18,18 @@ public interface AdvertisementItemDao extends BaseDao<AdvertisementItemEntity> { ...@@ -17,11 +18,18 @@ public interface AdvertisementItemDao extends BaseDao<AdvertisementItemEntity> {
int deleteByItem(@Param("itemId") String itemId, @Param("adId") String adId); int deleteByItem(@Param("itemId") String itemId, @Param("adId") String adId);
int getMaxSort(); int getMaxSort(@Param("adId") String adId);
int setItemTop(@Param("top") Integer top, @Param("itemId") String itemId, @Param("adId") String adId); int setItemTop(@Param("top") Integer top, @Param("itemId") String itemId, @Param("adId") String adId);
AdvertisementItemEntity getAdItemById(@Param("itemId") String itemId, @Param("adId") String adId); AdvertisementItemEntity getAdItemById(@Param("itemId") String itemId, @Param("adId") String adId);
int updateAdItem(AdvertisementItemEntity advertisementItemEntity); int updateAdItem(AdvertisementItemEntity advertisementItemEntity);
int existItemSort(@Param("adId") String adId, @Param("sort") Integer sort);
List<AdvertisementItemEntity> changeSortBack(@Param("firstSort") Integer firstSort, @Param("endSort") Integer endSort, @Param("adId") String adId);
List<AdvertisementItemEntity> changeSortFront(@Param("firstSort") Integer firstSort, @Param("endSort") Integer endSort, @Param("adId") String adId);
} }
...@@ -8,7 +8,7 @@ import java.util.Date; ...@@ -8,7 +8,7 @@ import java.util.Date;
* 表名 advertisement_item * 表名 advertisement_item
* *
* @author lipengjun * @author lipengjun
* @date 2020-10-07 15:50:04 * @date 2020-10-13 17:30:21
*/ */
public class AdvertisementItemEntity implements Serializable { public class AdvertisementItemEntity implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
...@@ -22,13 +22,17 @@ public class AdvertisementItemEntity implements Serializable { ...@@ -22,13 +22,17 @@ public class AdvertisementItemEntity implements Serializable {
*/ */
private String itemId; private String itemId;
/** /**
* 置顶 * 是否置顶 0: 不置顶 1:置顶
*/ */
private Integer isTop; private Integer isTop;
/** /**
* 排序 * 排序
*/ */
private Integer sort; private Integer sort;
/**
* 商品添加时间
*/
private Date createTime;
/** /**
* 设置:广告投放ID * 设置:广告投放ID
...@@ -57,14 +61,14 @@ public class AdvertisementItemEntity implements Serializable { ...@@ -57,14 +61,14 @@ public class AdvertisementItemEntity implements Serializable {
return itemId; return itemId;
} }
/** /**
* 设置:置顶 * 设置:是否置顶 0: 不置顶 1:置顶
*/ */
public void setIsTop(Integer isTop) { public void setIsTop(Integer isTop) {
this.isTop = isTop; this.isTop = isTop;
} }
/** /**
* 获取:置顶 * 获取:是否置顶 0: 不置顶 1:置顶
*/ */
public Integer getIsTop() { public Integer getIsTop() {
return isTop; return isTop;
...@@ -82,4 +86,17 @@ public class AdvertisementItemEntity implements Serializable { ...@@ -82,4 +86,17 @@ public class AdvertisementItemEntity implements Serializable {
public Integer getSort() { public Integer getSort() {
return sort; return sort;
} }
/**
* 设置:商品添加时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:商品添加时间
*/
public Date getCreateTime() {
return createTime;
}
} }
...@@ -14,6 +14,15 @@ public class TbCfStationItemEntityExtends extends TbCfStationItemEntity implemen ...@@ -14,6 +14,15 @@ public class TbCfStationItemEntityExtends extends TbCfStationItemEntity implemen
private String uname; private String uname;
private Integer isTop; private Integer isTop;
private Integer sort; private Integer sort;
private Integer itemSort;
public Integer getItemSort() {
return itemSort;
}
public void setItemSort(Integer itemSort) {
this.itemSort = itemSort;
}
public String getUname() { public String getUname() {
return uname; return uname;
......
package com.platform.service; package com.platform.service;
import com.platform.entity.AdvertisementItemEntity; import com.platform.entity.AdvertisementItemEntity;
import io.swagger.models.auth.In;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import java.util.List; import java.util.List;
...@@ -75,4 +76,8 @@ public interface AdvertisementItemService { ...@@ -75,4 +76,8 @@ public interface AdvertisementItemService {
int deleteByItem(String itemId, String adId); int deleteByItem(String itemId, String adId);
int setItemTop(String itemId, String adId); int setItemTop(String itemId, String adId);
int updateAdvertisementItem(@RequestParam Map<String, Object> map);
Integer getAdSort(Map<String, Object> map);
} }
...@@ -4,13 +4,18 @@ import com.platform.dao.AdvertisementItemDao; ...@@ -4,13 +4,18 @@ import com.platform.dao.AdvertisementItemDao;
import com.platform.entity.AdvertisementItemEntity; import com.platform.entity.AdvertisementItemEntity;
import com.platform.service.AdvertisementItemService; import com.platform.service.AdvertisementItemService;
import com.platform.utils.IdUtil; import com.platform.utils.IdUtil;
import io.swagger.models.auth.In;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* Service实现类 * Service实现类
...@@ -23,6 +28,8 @@ public class AdvertisementItemServiceImpl implements AdvertisementItemService { ...@@ -23,6 +28,8 @@ public class AdvertisementItemServiceImpl implements AdvertisementItemService {
@Autowired @Autowired
private AdvertisementItemDao advertisementItemDao; private AdvertisementItemDao advertisementItemDao;
final ReentrantLock lock = new ReentrantLock();
@Override @Override
public AdvertisementItemEntity queryObject(String adId) { public AdvertisementItemEntity queryObject(String adId) {
return advertisementItemDao.queryObject(adId); return advertisementItemDao.queryObject(adId);
...@@ -40,9 +47,14 @@ public class AdvertisementItemServiceImpl implements AdvertisementItemService { ...@@ -40,9 +47,14 @@ public class AdvertisementItemServiceImpl implements AdvertisementItemService {
@Override @Override
public int save(AdvertisementItemEntity advertisementItem) { public int save(AdvertisementItemEntity advertisementItem) {
advertisementItem.setIsTop(0); // advertisementItem.setIsTop(0);
advertisementItem.setSort(0); lock.lock();
return advertisementItemDao.save(advertisementItem); int maxSort = advertisementItemDao.getMaxSort(advertisementItem.getAdId());
advertisementItem.setSort(++maxSort);
advertisementItem.setCreateTime(new Date());
int res = advertisementItemDao.save(advertisementItem);
lock.unlock();
return res;
} }
@Override @Override
...@@ -90,7 +102,7 @@ public class AdvertisementItemServiceImpl implements AdvertisementItemService { ...@@ -90,7 +102,7 @@ public class AdvertisementItemServiceImpl implements AdvertisementItemService {
if (count >= 60) { if (count >= 60) {
return -1; return -1;
} }
int maxSort = advertisementItemDao.getMaxSort(); int maxSort = advertisementItemDao.getMaxSort(null);
byId.setSort(++maxSort); byId.setSort(++maxSort);
byId.setIsTop(1); byId.setIsTop(1);
} else { } else {
...@@ -100,4 +112,96 @@ public class AdvertisementItemServiceImpl implements AdvertisementItemService { ...@@ -100,4 +112,96 @@ public class AdvertisementItemServiceImpl implements AdvertisementItemService {
} }
return advertisementItemDao.updateAdItem(byId); return advertisementItemDao.updateAdItem(byId);
} }
//商品排序需求
//1、要更改的序号与原序号相同,不做处理
//2、要更改的序号没被商品占有,直接修改序号
//3、将序号调至后面
//4、将序号调至前面
@Override
public int updateAdvertisementItem(Map<String, Object> map) {
int res = 0;
String itemId = map.get("itemId").toString();
String adId = map.get("adId").toString();
String sort = map.get("sort").toString();
if (!StringUtils.isNumeric(sort)) {
return -3;
}
Integer itemSort = Integer.parseInt(sort);
String regex = "^[1-9]+[0-9]*$";
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(sort);
if (!matcher.matches()) {
return -3;
}
if (itemId == null || itemId == "") {
return -1;
}
if (adId == null || adId == "") {
return -1;
}
if (sort == null || sort == "") {
return -1;
}
AdvertisementItemEntity byId = advertisementItemDao.getAdItemById(itemId, adId);
if (byId == null) {
return res;
}
//情况1
String firstSort = String.valueOf(byId.getSort());
if (sort.equals(firstSort)) {
return -2;
}
//情况2
int count = advertisementItemDao.existItemSort(adId, itemSort);
if (count == 0) {
byId.setSort(itemSort);
res = advertisementItemDao.updateAdItem(byId);
} else {
//要更换的序号被占有
//情况3 (2-->8)
Integer sort1 = byId.getSort();
if (sort1 < itemSort) {
List<AdvertisementItemEntity> list = advertisementItemDao.changeSortBack(sort1 + 1, itemSort, adId);
for (AdvertisementItemEntity ad : list) {
ad.setSort(ad.getSort() - 1);
advertisementItemDao.updateAdItem(ad);
}
} else {
//情况4 (8-->2)
List<AdvertisementItemEntity> list = advertisementItemDao.changeSortFront(itemSort, sort1 - 1, adId);
for (AdvertisementItemEntity ad : list) {
ad.setSort(ad.getSort() + 1);
advertisementItemDao.updateAdItem(ad);
}
}
byId.setSort(itemSort);
res = advertisementItemDao.updateAdItem(byId);
}
return res;
}
@Override
public Integer getAdSort(Map<String, Object> map) {
String itemId = map.get("itemId").toString();
String adId = map.get("adId").toString();
if (itemId == null || itemId == "") {
return null;
}
if (adId == null || adId == "") {
return null;
}
AdvertisementItemEntity byId = advertisementItemDao.getAdItemById(itemId, adId);
if (byId != null) {
Integer sort = byId.getSort();
if (sort != null) {
return byId.getSort();
}
}
return 0;
}
} }
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
<result property="itemId" column="item_id"/> <result property="itemId" column="item_id"/>
<result property="isTop" column="is_top"/> <result property="isTop" column="is_top"/>
<result property="sort" column="sort"/> <result property="sort" column="sort"/>
<result property="createTime" column="create_time"/>
</resultMap> </resultMap>
<select id="queryObject" resultType="com.platform.entity.AdvertisementItemEntity"> <select id="queryObject" resultType="com.platform.entity.AdvertisementItemEntity">
...@@ -15,7 +16,8 @@ ...@@ -15,7 +16,8 @@
`ad_id`, `ad_id`,
`item_id`, `item_id`,
`is_top`, `is_top`,
`sort` `sort`,
`create_time`
from advertisement_item from advertisement_item
where ad_id = #{id} where ad_id = #{id}
</select> </select>
...@@ -25,12 +27,18 @@ ...@@ -25,12 +27,18 @@
`ad_id`, `ad_id`,
`item_id`, `item_id`,
`is_top`, `is_top`,
`sort` `sort`,
`create_time`
from advertisement_item from advertisement_item
where ad_id = #{adId} where ad_id = #{adId}
and item_id=#{itemId} and item_id=#{itemId}
</select> </select>
<select id="existItemSort" resultType="int">
select count(1) from advertisement_item where ad_id = #{adId} and sort=#{sort}
</select>
<select id="getAdItemCount" resultType="int"> <select id="getAdItemCount" resultType="int">
select count(1) from advertisement_item where ad_id = #{adId} select count(1) from advertisement_item where ad_id = #{adId}
<if test="itemId != null and itemId.trim() != ''"> <if test="itemId != null and itemId.trim() != ''">
...@@ -43,7 +51,30 @@ ...@@ -43,7 +51,30 @@
</update> </update>
<select id="getMaxSort" resultType="int"> <select id="getMaxSort" resultType="int">
select max(sort) from advertisement_item select IFNULL(max(sort),0) from advertisement_item
<if test="adId != null and adId.trim() != ''">
where ad_id=#{adId}
</if>
</select>
<select id="changeSortBack" resultType="com.platform.entity.AdvertisementItemEntity">
select
`ad_id`,
`item_id`,
`is_top`,
`sort`,
`create_time`
from advertisement_item where sort BETWEEN #{firstSort} AND #{endSort} and ad_id=#{adId}
</select>
<select id="changeSortFront" resultType="com.platform.entity.AdvertisementItemEntity">
select
`ad_id`,
`item_id`,
`is_top`,
`sort`,
`create_time`
from advertisement_item where sort BETWEEN #{firstSort} AND #{endSort} and ad_id=#{adId}
</select> </select>
<delete id="deleteByItem"> <delete id="deleteByItem">
...@@ -55,7 +86,8 @@ ...@@ -55,7 +86,8 @@
`ad_id`, `ad_id`,
`item_id`, `item_id`,
`is_top`, `is_top`,
`sort` `sort`,
`create_time`
from advertisement_item from advertisement_item
WHERE 1=1 WHERE 1=1
<if test="name != null and name.trim() != ''"> <if test="name != null and name.trim() != ''">
...@@ -87,12 +119,14 @@ ...@@ -87,12 +119,14 @@
`ad_id`, `ad_id`,
`item_id`, `item_id`,
`is_top`, `is_top`,
`sort`) `sort`,
`create_time`)
values( values(
#{adId}, #{adId},
#{itemId}, #{itemId},
#{isTop}, #{isTop},
#{sort}) #{sort},
#{createTime})
</insert> </insert>
<update id="update" parameterType="com.platform.entity.AdvertisementItemEntity"> <update id="update" parameterType="com.platform.entity.AdvertisementItemEntity">
...@@ -100,7 +134,8 @@ ...@@ -100,7 +134,8 @@
<set> <set>
<if test="itemId != null">`item_id` = #{itemId},</if> <if test="itemId != null">`item_id` = #{itemId},</if>
<if test="isTop != null">`is_top` = #{isTop},</if> <if test="isTop != null">`is_top` = #{isTop},</if>
<if test="sort != null">`sort` = #{sort}</if> <if test="sort != null">`sort` = #{sort},</if>
<if test="createTime != null">`create_time` = #{createTime}</if>
</set> </set>
where ad_id = #{adId} where ad_id = #{adId}
</update> </update>
......
...@@ -95,14 +95,14 @@ ...@@ -95,14 +95,14 @@
t.goodstwotype_title title, t.goodstwotype_title title,
o.goodstype_title goodtype, o.goodstype_title goodtype,
a.is_top, a.is_top,
a.sort a.sort itemSort
from advertisement_item a from advertisement_item a
left join tb_cf_station_item i on i.item_id=a.item_id left join tb_cf_station_item i on i.item_id=a.item_id
left JOIN tb_cf_goodstype o ON o.goodstype_id = i.item_category left JOIN tb_cf_goodstype o ON o.goodstype_id = i.item_category
left JOIN tb_cf_goodstwotype t ON i.item_categorytwo=t.goodstwotype_id left JOIN tb_cf_goodstwotype t ON i.item_categorytwo=t.goodstwotype_id
left JOIN tb_cf_descripiton d ON i.item_descrition_id=d.descripition_id left JOIN tb_cf_descripiton d ON i.item_descrition_id=d.descripition_id
where a.ad_id=#{adId} and i.enable_flag!=0 where a.ad_id=#{adId}
order by a.is_top desc,a.sort desc,i.create_time desc order by itemSort asc
<if test="offset != null and limit != null"> <if test="offset != null and limit != null">
limit #{offset}, #{limit} limit #{offset}, #{limit}
</if> </if>
......
...@@ -2,13 +2,13 @@ ...@@ -2,13 +2,13 @@
#jdbc.username=root #jdbc.username=root
#jdbc.password=root #jdbc.password=root
jdbc.url=jdbc:mysql://47.106.242.175:3306/chinafrica?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8 #jdbc.url=jdbc:mysql://47.106.242.175:3306/chinafrica?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8
jdbc.username=root #jdbc.username=root
jdbc.password=diaoyun666 #jdbc.password=diaoyun666
#jdbc.url: jdbc:mysql://159.138.48.71:3306/chinafrica?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&useSSL=false jdbc.url: jdbc:mysql://159.138.48.71:3306/chinafrica?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&useSSL=false
#jdbc.username: root jdbc.username: root
#jdbc.password: Diaoyunnuli.8 jdbc.password: Diaoyunnuli.8
jdbc.initialSize=5 jdbc.initialSize=5
jdbc.maxActive=30 jdbc.maxActive=30
......
...@@ -2,13 +2,13 @@ ...@@ -2,13 +2,13 @@
#jdbc.username=root #jdbc.username=root
#jdbc.password=root #jdbc.password=root
jdbc.url=jdbc:mysql://47.106.242.175:3306/chinafrica?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8 #jdbc.url=jdbc:mysql://47.106.242.175:3306/chinafrica?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8
jdbc.username=root #jdbc.username=root
jdbc.password=diaoyun666 #jdbc.password=diaoyun666
#jdbc.url: jdbc:mysql://159.138.48.71:3306/chinafrica?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&useSSL=false jdbc.url: jdbc:mysql://159.138.48.71:3306/chinafrica?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&useSSL=false
#jdbc.username: root jdbc.username: root
#jdbc.password: Diaoyunnuli.8 jdbc.password: Diaoyunnuli.8
jdbc.initialSize=5 jdbc.initialSize=5
jdbc.maxActive=30 jdbc.maxActive=30
......
...@@ -24,6 +24,8 @@ import java.util.Date; ...@@ -24,6 +24,8 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* 商品导入功能 * 商品导入功能
...@@ -481,4 +483,6 @@ public class ImpartCode { ...@@ -481,4 +483,6 @@ public class ImpartCode {
return output.toByteArray(); return output.toByteArray();
} }
} }
...@@ -125,7 +125,7 @@ ...@@ -125,7 +125,7 @@
<Form-item label="状态" prop="status"> <Form-item label="状态" prop="status">
<!--<i-input v-model="advertisement.status" placeholder="状态" style="width: 800px"/>--> <!--<i-input v-model="advertisement.status" placeholder="状态" style="width: 800px"/>-->
<i-select v-model="advertisement.status" placeholder="请选择" style="width: 800px"/> <i-select v-model="advertisement.status" placeholder="请选择" style="width: 800px"/>
<i-option v-for="v in versionList" :value="v.value">{{v.label}}</i-option> <i-option v-for="v in versionList" :value="v.value">{{v.label}}</i-option>
</i-select> </i-select>
</Form-item> </Form-item>
<!--<Form-item label="banner图" prop="picture"> <!--<Form-item label="banner图" prop="picture">
...@@ -288,6 +288,18 @@ ...@@ -288,6 +288,18 @@
</Form-item> </Form-item>
</i-form> </i-form>
</Card> </Card>
<Modal
v-model="modal1"
title="商品排序"
@on-ok="deal"
width="600px"
@on-cancel="cancel">
<i-form ref="formValidate" :model="advertisement" :rules="ruleValidate" :label-width="80">
<Form-item label="序号" prop="sort">
<i-input v-model="sort" placeholder="序号" style="width: 160px"/>
</Form-item>
</i-form>
</Modal>
</div> </div>
<script src="${rc.contextPath}/js/sys/advertisement.js?_${date.systemTime}"></script> <script src="${rc.contextPath}/js/sys/advertisement.js?_${date.systemTime}"></script>
......
...@@ -52,9 +52,10 @@ ...@@ -52,9 +52,10 @@
<br/> <br/>
<Form-item label="答案" prop="answer" style="width: 800px"> <Form-item label="答案" prop="answer" style="width: 800px">
<!-- 加载编辑器的容器 --> <!-- 加载编辑器的容器 -->
<script id="container" name="content" type="text/plain"> <!-- <script id="container" name="content" type="text/plain">-->
</script> <!-- </script>-->
<!--<i-input v-model="tbCfProblem.answer" placeholder="答案"/>--> <!--<i-input v-model="tbCfProblem.answer" placeholder="答案"/>-->
<textarea v-model="tbCfProblem.answer" style="width: 600px;height: 300px;"></textarea>
</Form-item> </Form-item>
<Form-item label="是否展示" prop="enableFlag" style="width: 800px"> <Form-item label="是否展示" prop="enableFlag" style="width: 800px">
<i-select placeholder="请选择" v-model="tbCfProblem.enableFlag"> <i-select placeholder="请选择" v-model="tbCfProblem.enableFlag">
......
...@@ -18,6 +18,9 @@ $(function () { ...@@ -18,6 +18,9 @@ $(function () {
let vm = new Vue({ let vm = new Vue({
el: '#rrapp', el: '#rrapp',
data: { data: {
itemId: 0,
modal1: false,
sort: '',
versionList: [ versionList: [
{ {
value: 1, value: 1,
...@@ -130,8 +133,97 @@ let vm = new Vue({ ...@@ -130,8 +133,97 @@ let vm = new Vue({
} }
}, },
methods: { methods: {
add: function () {
vm.tempId = this.guid();
vm.showList = false;
vm.title = "新增";
vm.advertisement = {};
console.log('add-->tempId', vm.tempId)
$("#adItemjqGrid").jqGrid("clearGridData");
$("#searchjqGrid").jqGrid("clearGridData");
$("#adItemjqGrid").Grid({
url: '../advertisement/getAdvertisementItem?adId=' + vm.tempId,
colModel: [
{label: 'itemId', name: 'itemId', key: true, index: 'item_id', hidden: true},
{label: '序号', name: 'itemSort', index: 'itemSort', width: 100},
{label: '商品图片', name: 'itemImg', index: 'item_img', width: 100, formatter: imageFormat},
{label: '商品编号', name: 'itemCode', index: 'item_code', width: 160},
{label: '商品名称', name: 'itemName', index: 'item_name', width: 160},
/* {label: '商品标题', name: 'itemBrief', index: 'item_brief', width: 120},*/
/*{label: '商品链接', name: 'itemUrl', index: 'item_url', width: 80,formatter:linkFormat},*/
{label: '商品原价', name: 'itemPrice', index: 'item_price', width: 100},
{label: '商品现价', name: 'discountPrice', index: 'discount_price', width: 100},
/*{label: '所属平台', name: 'platformCode', index: 'platform_code', width: 80},
{label: '平台名', name: 'platformName', index: 'platform_name', width: 80},*/
{label: '供应商', name: 'supplier', index: 'supplier', width: 120},
{label: '商品一级分类', name: 'goodtype', index: 'goodtype', width: 120},
{label: '商品二级分类', name: 'title', index: 'title', width: 120},
{label: '商品品名', name: 'dname', index: 'itemDescritionId', width: 120},
{
label: '操作', index: 'operate', width: 160, formatter: function (value, grid, rows) {
return '<span class="label label-info pointer" onclick="vm.delItem(\'' + rows.itemId + '\')">移除</span>&nbsp;&nbsp;' +
'<span class="label label-info pointer" onclick="vm.sortItem(\'' + rows.itemId + '\')">排序</span>&nbsp;&nbsp;'
}
} // beforeSelectRow: beforeSelectRow,
],
multiboxonly: true
// beforeSelectRow: beforeSelectRow,
});
},
sortItem(e) {
let id = $("#jqGrid").getGridParam("selrow");
if (id == '' || id == null) {
id = vm.tempId;
}
vm.modal1 = true;
vm.itemId = e;
console.log('vm.tempId', vm.tempId)
console.log('sortItem-->adId', id)
console.log('sortItem-->itemId', e)
Ajax.request({
url: "../advertisementitem/getAdSort?itemId=" + e + '&adId=' + id,
type: "POST",
contentType: "application/json",
successCallback: function (res) {
vm.sort = res.sort
}
});
},
deal() {
let id = $("#jqGrid").getGridParam("selrow");
if (id == '' || id == null) {
id = vm.tempId;
}
console.log('deal-->adId', id)
console.log('deal-->itemId', vm.itemId)
let itemSort;
itemSort = parseInt(vm.sort);
Ajax.request({
url: "../advertisementitem/updateAdvertisementItem?itemId=" + vm.itemId + '&adId=' + id + '&sort=' + vm.sort,
type: "POST",
contentType: "application/json",
successCallback: function () {
alert('操作成功', function (index) {
vm.btn_Search(id);
vm.modal1 = false;
});
}
});
},
cancel() {
vm.modal1 = false;
},
delItem(itemId) { delItem(itemId) {
let id = getSelectedRow("#jqGrid"); let id = $("#jqGrid").getGridParam("selrow");
if (id == '' || id == null) {
id = vm.tempId;
}
confirm('确定要删除选中的记录?', function () { confirm('确定要删除选中的记录?', function () {
Ajax.request({ Ajax.request({
url: "../advertisementitem/deleteByItem?itemId=" + itemId + '&adId=' + id, url: "../advertisementitem/deleteByItem?itemId=" + itemId + '&adId=' + id,
...@@ -155,8 +247,6 @@ let vm = new Vue({ ...@@ -155,8 +247,6 @@ let vm = new Vue({
if (id == null || id == '' || id == 'undefined') { if (id == null || id == '' || id == 'undefined') {
id = vm.tempId; id = vm.tempId;
} }
console.log('vm.advertisement.id', vm.advertisement.id)
console.log('vm.tempId', vm.tempId)
Ajax.request({ Ajax.request({
url: "../advertisementitem/saveBatch?aId=" + id + '&itemIds=' + ids, url: "../advertisementitem/saveBatch?aId=" + id + '&itemIds=' + ids,
type: "POST", type: "POST",
...@@ -207,40 +297,7 @@ let vm = new Vue({ ...@@ -207,40 +297,7 @@ let vm = new Vue({
return v.toString(32); return v.toString(32);
}); });
}, },
add: function () {
vm.tempId = this.guid();
vm.showList = false;
vm.title = "新增";
vm.advertisement = {};
$("#adItemjqGrid").jqGrid("clearGridData");
$("#searchjqGrid").jqGrid("clearGridData");
$("#adItemjqGrid").Grid({
url: '../advertisement/getAdvertisementItem?adId=' + vm.tempId,
colModel: [
{label: 'itemId', name: 'itemId', key: true, index: 'item_id', hidden: true},
{label: '商品图片', name: 'itemImg', index: 'item_img', width: 100, formatter: imageFormat},
{label: '商品编号', name: 'itemCode', index: 'item_code', width: 160},
{label: '商品名称', name: 'itemName', index: 'item_name', width: 160},
/* {label: '商品标题', name: 'itemBrief', index: 'item_brief', width: 120},*/
/*{label: '商品链接', name: 'itemUrl', index: 'item_url', width: 80,formatter:linkFormat},*/
{label: '商品原价', name: 'itemPrice', index: 'item_price', width: 100},
{label: '商品现价', name: 'discountPrice', index: 'discount_price', width: 100},
/*{label: '所属平台', name: 'platformCode', index: 'platform_code', width: 80},
{label: '平台名', name: 'platformName', index: 'platform_name', width: 80},*/
{label: '供应商', name: 'supplier', index: 'supplier', width: 120},
{label: '商品一级分类', name: 'goodtype', index: 'goodtype', width: 120},
{label: '商品二级分类', name: 'title', index: 'title', width: 120},
{label: '商品品名', name: 'dname', index: 'itemDescritionId', width: 120},
{
label: '操作', index: 'operate', width: 120, formatter: function (value, grid, rows) {
return '<span class="label label-info pointer" onclick="vm.delItem(\'' + rows.itemId + '\')">移除</span>&nbsp;&nbsp;'
}
}
],
// beforeSelectRow: beforeSelectRow,
});
},
update: function (event) { update: function (event) {
$("#searchjqGrid").jqGrid("clearGridData"); $("#searchjqGrid").jqGrid("clearGridData");
$("#adItemjqGrid").jqGrid("clearGridData"); $("#adItemjqGrid").jqGrid("clearGridData");
...@@ -255,6 +312,7 @@ let vm = new Vue({ ...@@ -255,6 +312,7 @@ let vm = new Vue({
url: '../advertisement/getAdvertisementItem?adId=' + id, url: '../advertisement/getAdvertisementItem?adId=' + id,
colModel: [ colModel: [
{label: 'itemId', name: 'itemId', key: true, index: 'item_id', hidden: true}, {label: 'itemId', name: 'itemId', key: true, index: 'item_id', hidden: true},
{label: '序号', name: 'itemSort', index: 'itemSort', width: 100},
{label: '商品图片', name: 'itemImg', index: 'item_img', width: 100, formatter: imageFormat}, {label: '商品图片', name: 'itemImg', index: 'item_img', width: 100, formatter: imageFormat},
{label: '商品编号', name: 'itemCode', index: 'item_code', width: 160}, {label: '商品编号', name: 'itemCode', index: 'item_code', width: 160},
{label: '商品名称', name: 'itemName', index: 'item_name', width: 160}, {label: '商品名称', name: 'itemName', index: 'item_name', width: 160},
...@@ -269,18 +327,16 @@ let vm = new Vue({ ...@@ -269,18 +327,16 @@ let vm = new Vue({
{label: '商品二级分类', name: 'title', index: 'title', width: 120}, {label: '商品二级分类', name: 'title', index: 'title', width: 120},
{label: '商品品名', name: 'dname', index: 'itemDescritionId', width: 120}, {label: '商品品名', name: 'dname', index: 'itemDescritionId', width: 120},
{ {
label: '操作', index: 'operate', width: 120, formatter: function (value, grid, rows) { label: '操作', index: 'operate', width: 160, formatter: function (value, grid, rows) {
if (rows.isTop == 1) { return '<span class="label label-info pointer" onclick="vm.delItem(\'' + rows.itemId + '\')">移除</span>&nbsp;&nbsp;' +
return '<span class="label label-danger pointer" onclick="vm.itemTop(\'' + rows.itemId + '\')">取消置顶</span>&nbsp;&nbsp;' + '<span class="label label-info pointer" onclick="vm.sortItem(\'' + rows.itemId + '\')">排序</span>&nbsp;&nbsp;'
'<span class="label label-info pointer" onclick="vm.delItem(\'' + rows.itemId + '\')">移除</span>&nbsp;&nbsp;'
}
return '<span class="label label-info pointer" onclick="vm.itemTop(\'' + rows.itemId + '\')">置顶</span>&nbsp;&nbsp;' +
'<span class="label label-info pointer" onclick="vm.delItem(\'' + rows.itemId + '\')">移除</span>&nbsp;&nbsp;'
} }
} } // beforeSelectRow: beforeSelectRow,
], ],
// beforeSelectRow: beforeSelectRow, multiboxonly: true
}); });
}); });
vm.btn_Search(id); vm.btn_Search(id);
......
...@@ -5,7 +5,7 @@ $(function () { ...@@ -5,7 +5,7 @@ $(function () {
{label: 'problemId', name: 'problemId', index: 'problem_id', key: true, hidden: true}, {label: 'problemId', name: 'problemId', index: 'problem_id', key: true, hidden: true},
{label: '问题明细', name: 'question', index: 'question', width: 80}, {label: '问题明细', name: 'question', index: 'question', width: 80},
{label: '类型 ', name: 'type', index: 'type', width: 80, formatter: typeFormat}, {label: '类型 ', name: 'type', index: 'type', width: 80, formatter: typeFormat},
{label: '答案', name: 'answer', index: 'answer', width: 80, formatter: contentFormat}, // {label: '答案', name: 'answer', index: 'answer', width: 80, formatter: contentFormat},
{label: '是否展示', name: 'enableFlag', index: 'enable_flag', width: 80, formatter: validFormat}, {label: '是否展示', name: 'enableFlag', index: 'enable_flag', width: 80, formatter: validFormat},
{label: '排序', name: 'sort', index: 'sort', width: 80}, {label: '排序', name: 'sort', index: 'sort', width: 80},
{label: '创建时间', name: 'createTime', index: 'create_time', width: 80}], {label: '创建时间', name: 'createTime', index: 'create_time', width: 80}],
...@@ -17,25 +17,25 @@ $(function () { ...@@ -17,25 +17,25 @@ $(function () {
* 增加修改的编辑器 * 增加修改的编辑器
* @type {UE.ui.Editor|*} * @type {UE.ui.Editor|*}
*/ */
var ue = UE.getEditor('container'); // var ue = UE.getEditor('container');
//
/** // /**
* 获取文本框内容 // * 获取文本框内容
* @returns {*|String|void} // * @returns {*|String|void}
*/ // */
function getContent() { // function getContent() {
var htmlContent = ue.getContent(); // var htmlContent = ue.getContent();
return htmlContent; // return htmlContent;
} // }
//
/** // /**
* 显示内容 // * 显示内容
* @param content // * @param content
*/ // */
function showContent(problemId) { // function showContent(problemId) {
$('#contentModal').modal('show'); // $('#contentModal').modal('show');
vm.getInfo(problemId, true); // vm.getInfo(problemId, true);
}; // };
let vm = new Vue({ let vm = new Vue({
...@@ -93,8 +93,8 @@ let vm = new Vue({ ...@@ -93,8 +93,8 @@ let vm = new Vue({
vm.getInfo(problemId); vm.getInfo(problemId);
}, },
saveOrUpdate: function (event) { saveOrUpdate: function (event) {
var answer = getContent(); // var answer = getContent();
vm.tbCfProblem.answer = encodeURI(answer); // vm.tbCfProblem.answer = encodeURI(answer);
let url = vm.tbCfProblem.problemId == null ? "../tbcfproblem/save" : "../tbcfproblem/update"; let url = vm.tbCfProblem.problemId == null ? "../tbcfproblem/save" : "../tbcfproblem/update";
Ajax.request({ Ajax.request({
url: url, url: url,
...@@ -103,7 +103,7 @@ let vm = new Vue({ ...@@ -103,7 +103,7 @@ let vm = new Vue({
contentType: "application/json", contentType: "application/json",
successCallback: function (r) { successCallback: function (r) {
alert('操作成功', function (index) { alert('操作成功', function (index) {
ue.setContent(""); // ue.setContent("");
vm.reload(); vm.reload();
}); });
} }
...@@ -135,9 +135,9 @@ let vm = new Vue({ ...@@ -135,9 +135,9 @@ let vm = new Vue({
async: true, async: true,
successCallback: function (r) { successCallback: function (r) {
console.log(r) console.log(r)
r.tbCfProblem.answer = decodeURI(r.tbCfProblem.answer); // r.tbCfProblem.answer = decodeURI(r.tbCfProblem.answer);
vm.tbCfProblem = r.tbCfProblem; vm.tbCfProblem = r.tbCfProblem;
ue.setContent(vm.tbCfProblem.answer); // ue.setContent(vm.tbCfProblem.answer);
if (!!isShowDetail) { if (!!isShowDetail) {
var answer = "无内容,请点击修改,添加内容"; var answer = "无内容,请点击修改,添加内容";
if (!!vm.tbCfProblem.answer) { if (!!vm.tbCfProblem.answer) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论