From 7f1a7310b04542cdf2ea97dc9e4f50c9b50626bf Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Tue, 19 Nov 2019 16:23:21 +0800 Subject: [PATCH 01/36] =?UTF-8?q?=E9=85=8D=E7=BD=AElogback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 27 ++++++++ src/main/resources/logback-spring.xml | 93 +++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 src/main/resources/logback-spring.xml diff --git a/pom.xml b/pom.xml index 353222d..130adec 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,8 @@ 2.8.0 1.2.5 2.9.6 + 1.7.25 + 1.2.3 @@ -149,6 +151,31 @@ pom + + + org.slf4j + slf4j-api + ${slf4j.version} + + + + + ch.qos.logback + logback-core + ${logback.version} + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + ch.qos.logback + logback-access + ${logback.version} + diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..5747236 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + ${log.pattern} + + + + + + ${log.filePath}/debug.log + + + DEBUG + ACCEPT + DENY + + + + ${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz + + + ${log.maxHistory} + + + ${log.pattern} + + + + + ${log.filePath}/info.log + + + INFO + ACCEPT + DENY + + + + ${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz + + + ${log.maxHistory} + + + ${log.pattern} + + + + + ${log.filePath}/error.log + + + ERROR + ACCEPT + DENY + + + + ${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz + + + ${log.maxHistory} + + + ${log.pattern} + + + + + + + + + + + \ No newline at end of file -- Gitee From 1ba6ba29cec7d3e5f183d0ba866725873e950852 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Tue, 19 Nov 2019 16:24:22 +0800 Subject: [PATCH 02/36] =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=AD=BB=E9=94=81?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/constant/CommonConstant.java | 10 +++ .../commons/exception/MyExceptionHandler.java | 1 - .../commons/thread/BuildPathRunable.java | 19 +++-- .../controller/CategoryController.java | 2 +- .../polaris/mapper/ShopCategoryMapper.java | 15 ++++ .../service/impl/CategoryServiceImpl.java | 85 +++++++++++++++---- .../resources/mapper/ShopCategoryMapper.xml | 14 ++- .../polaris/service/CategoryServiceTest.java | 14 +++ 8 files changed, 136 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java b/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java index 6b49fe0..1c5b8b5 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java @@ -258,4 +258,14 @@ public interface CommonConstant { */ Integer CAROUSE_COMMON_FAIL_4201 = 4201; String GET_ALL_CAROUSE_NULL = "查询的轮播图列表为空"; + + /** + * 数据库增删改操作pattern + */ + //pattern + String OPREARTION_METHOD_PATTERN = "操作类型:{0};操作结果:成功;操作类名:{1};操作方法:{2};传入参数:{3}"; + String OPREARTION_METHOD_INSERT = "新增"; + String OPREARTION_METHOD_DELETE = "删除"; + String OPREARTION_METHOD_UPDATE = "更新"; + String OPREARTION_METHOD_QUERY = "查询"; } diff --git a/src/main/java/com/hxtec/polaris/commons/exception/MyExceptionHandler.java b/src/main/java/com/hxtec/polaris/commons/exception/MyExceptionHandler.java index 8fbb682..7da68bd 100644 --- a/src/main/java/com/hxtec/polaris/commons/exception/MyExceptionHandler.java +++ b/src/main/java/com/hxtec/polaris/commons/exception/MyExceptionHandler.java @@ -3,7 +3,6 @@ package com.hxtec.polaris.commons.exception; import javax.servlet.http.HttpServletRequest; import com.hxtec.polaris.commons.api.vo.Result; -import com.hxtec.polaris.commons.constant.CommonConstant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; diff --git a/src/main/java/com/hxtec/polaris/commons/thread/BuildPathRunable.java b/src/main/java/com/hxtec/polaris/commons/thread/BuildPathRunable.java index b17f84e..0a70d21 100644 --- a/src/main/java/com/hxtec/polaris/commons/thread/BuildPathRunable.java +++ b/src/main/java/com/hxtec/polaris/commons/thread/BuildPathRunable.java @@ -3,10 +3,13 @@ package com.hxtec.polaris.commons.thread; import com.hxtec.polaris.entity.ShopCategory; import com.hxtec.polaris.mapper.ShopCategoryMapper; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import javax.servlet.ServletContext; +import java.util.Date; import java.util.List; import java.util.concurrent.CountDownLatch; @@ -17,6 +20,8 @@ import java.util.concurrent.CountDownLatch; * @Version 1.0.0 **/ public class BuildPathRunable implements Runnable{ + private final static Long TIME_STAMP = 30000L; + private final static Logger logger = LoggerFactory.getLogger(BuildPathRunable.class); private ServletContext context = null; private final CountDownLatch doneSignal; private ShopCategoryMapper shopCategoryMapper; @@ -34,11 +39,11 @@ public class BuildPathRunable implements Runnable{ synchronized (doneSignal){ doneSignal.countDown(); callBuildPath(); - System.out.println("********分类路径构建成功**********"); + logger.info("********分类路径构建成功**********"); } doneSignal.await(); }catch (Exception e){ - System.out.println("*****发生异常*******,当前指针"+doneSignal); + logger.error("*****发生异常*******,当前指针"+doneSignal); e.printStackTrace(); } } @@ -53,7 +58,7 @@ public class BuildPathRunable implements Runnable{ //获取构建的类别路径 StringBuilder path = new StringBuilder("-"); path.append(shopCategory.getId()); - getPath(shopCategory,path); + getPath(shopCategory,path,new Date()); path.append("-"); shopCategory.setComment1(String.valueOf(path)); shopCategoryMapper.updateCategoryPath(shopCategory.getId(),String.valueOf(path)); @@ -66,7 +71,11 @@ public class BuildPathRunable implements Runnable{ * @param path * @return */ - private StringBuilder getPath(ShopCategory shopCategory,StringBuilder path){ + private StringBuilder getPath(ShopCategory shopCategory, StringBuilder path, Date date){ + if (System.currentTimeMillis()-date.getTime() > TIME_STAMP){ + logger.error("*****操作时间过长,可能陷入死循环*******,当前指针"+doneSignal); + return null; + } if (StringUtils.isNotBlank(shopCategory.getParentId())){ List list= shopCategoryMapper.getCategoryById(shopCategory.getParentId()); if (null != list && list.size()>0){ @@ -74,7 +83,7 @@ public class BuildPathRunable implements Runnable{ path.append("-").append(shopCategory1.getId()); if (StringUtils.isNotBlank(shopCategory1.getParentId())){ - getPath(shopCategory1,path); + getPath(shopCategory1,path,date); } } } diff --git a/src/main/java/com/hxtec/polaris/controller/CategoryController.java b/src/main/java/com/hxtec/polaris/controller/CategoryController.java index 0ddc18c..26b83d7 100644 --- a/src/main/java/com/hxtec/polaris/controller/CategoryController.java +++ b/src/main/java/com/hxtec/polaris/controller/CategoryController.java @@ -74,7 +74,7 @@ public class CategoryController { @ApiImplicitParam(name = "name", value = "当前节点编辑后的节点名", required = false, dataType = "String"), }) @RequestMapping(value = "update", method = RequestMethod.PUT,produces = "application/json;charset=utf-8") - public Object updateCategory(HttpServletRequest request, String pid, String id, String name){ + public Object updateCategory(HttpServletRequest request,String id, String pid, String name){ return categoryService.updateCategory(request,pid,id,name); } } diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java index 345391f..525e96a 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java @@ -53,6 +53,21 @@ public interface ShopCategoryMapper extends MyMapper { */ Integer updateCategoryParentId(@Param("id") String id,@Param("pid") String pid,@Param("name") String name); + /** + * 更新父id + * @param id + * @param pid + * @return + */ + Integer updateCategoryChildParentId(@Param("id") String id,@Param("pid") String pid); + + /** + * 更新父id + * @param pid + * @return + */ + Integer updateCategoryChildNullParentId(@Param("pid") String pid); + /** * 更新父id * @param id diff --git a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java index 5361d89..d7be232 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java @@ -9,18 +9,18 @@ import com.hxtec.polaris.entity.ShopCategory; import com.hxtec.polaris.mapper.ShopCategoryMapper; import com.hxtec.polaris.service.CategoryService; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; +import java.text.MessageFormat; import java.util.Date; import java.util.List; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; /** @@ -33,6 +33,12 @@ import java.util.concurrent.ThreadFactory; @Transactional public class CategoryServiceImpl implements CategoryService { + private final static Logger logger = LoggerFactory.getLogger(CategoryServiceImpl.class); + private static String CLASS_NAME = "CategoryServiceImpl"; + private static String METHOD_ADD_CATORY = "addCategory"; + private static String METHOD_DEL_CATORY = "deleteCategory"; + private static String METHOD_UPDATE_CATORY ="updateCategory"; + @Resource private ShopCategoryMapper shopCategoryMapper; @@ -86,6 +92,9 @@ public class CategoryServiceImpl implements CategoryService { if (updateResult < 0){ throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_UPDATE_FAIL)); } + String params = "pid="+pid+",name="+name; + logger.info(MessageFormat.format(CommonConstant.OPREARTION_METHOD_PATTERN,CommonConstant.OPREARTION_METHOD_INSERT, + CLASS_NAME,METHOD_ADD_CATORY,params)); return Result.ok(CommonConstant.CATEGORY_INSERT_OK); } @@ -112,6 +121,9 @@ public class CategoryServiceImpl implements CategoryService { } } + String params = "ids="+ids; + logger.info(MessageFormat.format(CommonConstant.OPREARTION_METHOD_PATTERN,CommonConstant.OPREARTION_METHOD_DELETE, + CLASS_NAME,METHOD_DEL_CATORY,params)); return Result.ok(CommonConstant.CATEGORY_DELETE_OK); } @@ -126,23 +138,15 @@ public class CategoryServiceImpl implements CategoryService { //如果该父节点对应的分类在数据库中没有记录或者删除状态是空或者已删除,则为故障节点,不能进行更新 throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_UPDATE_PID_EXCEPTION)); } - //将当前分类的父id更新为新的id,名称改为新的名称 - int updateResult = 0; + //执行更新操作 try { - updateResult = shopCategoryMapper.updateCategoryParentId(id,pid,name); + doUpdateShopCategory(request,pid,id,name); }catch (Exception e){ throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_UPDATE_FAIL)); } - if (updateResult < 0){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_UPDATE_FAIL)); - } - //把当前编辑的节点及其所有子节点挂到新的节点下面,更新路径 - // 创建线程池 - ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(CommonConstant.CATEGORY_BUILD_PATH_NAME).build(); - ServletContext context = request.getServletContext(); - // 计数器 - CountDownLatch doneSignal = new CountDownLatch(1); - pool.newThread(new BuildPathRunable(context,doneSignal)).run(); + String params = "pid="+pid+",id="+id+",name="+name; + logger.info(MessageFormat.format(CommonConstant.OPREARTION_METHOD_PATTERN,CommonConstant.OPREARTION_METHOD_UPDATE, + CLASS_NAME,METHOD_UPDATE_CATORY,params)); return Result.ok(); } @@ -162,4 +166,53 @@ public class CategoryServiceImpl implements CategoryService { shopCategory.setUpdateTime(new Date()); return shopCategory; } + + /** + * 执行db层面的分类更新,返回t + * @param pid + * @param id + * @param name + * @return + */ + private void doUpdateShopCategory(HttpServletRequest request,String pid, String id, String name){ + //编辑的节点原来的父节点 + List shopCategorys = shopCategoryMapper.getCategoryById(id); + String oldParentId = shopCategorys.get(0).getParentId(); + + //step1 将当前节点的父节点和名字更新为修改后的值 + shopCategoryMapper.updateCategoryParentId(id,pid,name); + + //如果上级节点没有变动,则不需要变更子节点,业务结束 + if (equalsIgnoreCase(pid,oldParentId)){ + return; + } + + //step2 将节点更新前的下级节点指向的parentId,修改为更新的节点原来指向的parentId,相当于往前移了一位 + if (StringUtils.isBlank(oldParentId)){ + shopCategoryMapper.updateCategoryChildNullParentId(oldParentId); + }else { + shopCategoryMapper.updateCategoryChildParentId(id,oldParentId); + } + + //调用线程,更新path + //把当前编辑的节点及其所有子节点挂到新的节点下面,更新路径 + // 创建线程池 + ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(CommonConstant.CATEGORY_BUILD_PATH_NAME).build(); + ServletContext context = request.getServletContext(); + // 计数器 + CountDownLatch doneSignal = new CountDownLatch(1); + pool.newThread(new BuildPathRunable(context,doneSignal)).start(); + } + + /** + * 判断两个字符串是否相等 将"" 、" "、null相同对待 + * @param str1 + * @param str2 + * @return + */ + private boolean equalsIgnoreCase(String str1,String str2){ + str1 = StringUtils.isBlank(str1)? "":str1; + str2 = StringUtils.isBlank(str2)? "":str2; + return StringUtils.equals(str1, str2); + } } diff --git a/src/main/resources/mapper/ShopCategoryMapper.xml b/src/main/resources/mapper/ShopCategoryMapper.xml index c691de0..f0afeda 100644 --- a/src/main/resources/mapper/ShopCategoryMapper.xml +++ b/src/main/resources/mapper/ShopCategoryMapper.xml @@ -115,10 +115,22 @@ update shop_category - set parent_id = #{pid},name = #{name} + set parent_id = #{pid},name = #{name},is_parent = 'N' where id = #{id} and is_delete = 'N' + + update shop_category + set parent_id = #{pid} + where parent_id = #{id} and is_delete = 'N' + + + + update shop_category + set parent_id = #{pid} + where parent_id is null and is_delete = 'N' + + update shop_category set comment1 = #{path} diff --git a/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java b/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java index 39afdb5..c757e8d 100644 --- a/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java +++ b/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java @@ -10,6 +10,8 @@ import org.springframework.boot.test.context.SpringBootTest; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Date; import java.util.List; /** @@ -40,4 +42,16 @@ public class CategoryServiceTest { } System.out.println(list); } + + @Test + public void test(){ + shopCategoryMapper.updateCategoryChildNullParentId("1111"); + } + + @Test + public void testMessageFormat(){ + String str = "占位1{0},占位2{1},占位3{2}"; + Date date = new Date(); + System.out.println(MessageFormat.format(str,"aaa",true,date)); + } } -- Gitee From 61f107441f8c505f6a85ca2a13e6d393670a6dab Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Tue, 19 Nov 2019 17:24:21 +0800 Subject: [PATCH 03/36] =?UTF-8?q?=E5=B8=B8=E9=87=8F=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/constant/CommonConstant.java | 252 ++++-------------- .../commons/utils/GenerateSequenceUtil.java | 49 ++++ .../service/impl/CarouseServiceImpl.java | 2 +- .../service/impl/CategoryServiceImpl.java | 68 ++--- .../polaris/service/impl/GoodServiceImpl.java | 24 +- .../resources/mapper/ShopCategoryMapper.xml | 4 - .../polaris/service/CategoryServiceTest.java | 2 +- 7 files changed, 146 insertions(+), 255 deletions(-) create mode 100644 src/main/java/com/hxtec/polaris/commons/utils/GenerateSequenceUtil.java diff --git a/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java b/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java index 1c5b8b5..41d5bfa 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java @@ -12,260 +12,104 @@ import java.util.List; * @return **/ public interface CommonConstant { - - /** - * 正常状态 - */ - public static final Integer STATUS_NORMAL = 0; - - /** - * 禁用状态 - */ - public static final Integer STATUS_DISABLE = -1; - - /** - * 删除标志 - */ - public static final Integer DEL_FLAG_1 = 1; - - /** - * 未删除 - */ - public static final Integer DEL_FLAG_0 = 0; - - /** - * 系统日志类型: 登录 - */ - public static final int LOG_TYPE_1 = 1; - - /** - * 系统日志类型: 操作 - */ - public static final int LOG_TYPE_2 = 2; - - /** - * 操作日志类型: 查询 - */ - public static final int OPERATE_TYPE_1 = 1; - - /** - * 操作日志类型: 添加 - */ - public static final int OPERATE_TYPE_2 = 2; - - /** - * 操作日志类型: 更新 - */ - public static final int OPERATE_TYPE_3 = 3; - - /** - * 操作日志类型: 删除 - */ - public static final int OPERATE_TYPE_4 = 4; - - /** - * 操作日志类型: 倒入 - */ - public static final int OPERATE_TYPE_5 = 5; - - /** - * 操作日志类型: 导出 - */ - public static final int OPERATE_TYPE_6 = 6; - - /** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */ - public static final Integer SC_INTERNAL_SERVER_ERROR_500 = 500; + Integer SC_INTERNAL_SERVER_ERROR_500 = 500; /** {@code 200 OK} (HTTP/1.0 - RFC 1945) */ - public static final Integer SC_OK_200 = 200; + Integer SC_OK_200 = 200; /**访问权限认证未通过 510*/ - public static final Integer SC_JEECG_NO_AUTHZ=510; + Integer SC_JEECG_NO_AUTHZ=510; - /** 登录用户Shiro权限缓存KEY前缀 */ - public static String PREFIX_USER_SHIRO_CACHE = "shiro:cache:org.jeecg.modules.shiro.authc.ShiroRealm.authorizationCache:"; - /** 登录用户Token令牌缓存KEY前缀 */ - public static final String PREFIX_USER_TOKEN = "prefix_user_token_"; - /** Token缓存时间:3600秒即一小时 */ - public static final int TOKEN_EXPIRE_TIME = 3600; - /** - * 0:一级菜单 - */ - public static final Integer MENU_TYPE_0 = 0; - /** - * 1:子菜单 - */ - public static final Integer MENU_TYPE_1 = 1; - /** - * 2:按钮权限 - */ - public static final Integer MENU_TYPE_2 = 2; - - /**通告对象类型(USER:指定用户,ALL:全体用户)*/ - public static final String MSG_TYPE_UESR = "USER"; - public static final String MSG_TYPE_ALL = "ALL"; - - /**发布状态(0未发布,1已发布,2已撤销)*/ - public static final String NO_SEND = "0"; - public static final String HAS_SEND = "1"; - public static final String HAS_CANCLE = "2"; - - /**阅读状态(0未读,1已读)*/ - public static final String HAS_READ_FLAG = "1"; - public static final String NO_READ_FLAG = "0"; - - /**优先级(L低,M中,H高)*/ - public static final String PRIORITY_L = "L"; - public static final String PRIORITY_M = "M"; - public static final String PRIORITY_H = "H"; - - /** - * 短信模板方式 0 .登录模板、1.注册模板、2.忘记密码模板 - */ - public static final String SMS_TPL_TYPE_0 = "0"; - public static final String SMS_TPL_TYPE_1 = "1"; - public static final String SMS_TPL_TYPE_2 = "2"; - - /** - * 状态(0无效1有效) - */ - public static final String STATUS_0 = "0"; - public static final String STATUS_1 = "1"; - - /** - * 同步工作流引擎1同步0不同步 - */ - public static final String ACT_SYNC_0 = "0"; - public static final String ACT_SYNC_1 = "1"; - - /** - * 消息类型1:通知公告2:系统消息 - */ - public static final String MSG_CATEGORY_1 = "1"; - public static final String MSG_CATEGORY_2 = "2"; - - /** - * 是否配置菜单的数据权限 1是0否 + * 日志pattern */ - public static final Integer RULE_FLAG_0 = 0; - public static final Integer RULE_FLAG_1 = 1; + //pattern + String LOG_PATTERN = "操作类型:{0};操作类名:{1};操作方法:{2};传入参数:{3}"; + String LOG_TYPE_INSERT = "新增"; + String LOG_TYPE_DELETE = "删除"; + String LOG_TYPE_UPDATE = "更新"; + String LOG_TYPE_QUERY = "查询"; /** - * 是否用户已被冻结 1(解冻)正常 2冻结 + * 符号 */ - public static final Integer USER_UNFREEZE = 1; - public static final Integer USER_FREEZE = 2; - - /**字典翻译文本后缀*/ - public static final String DICT_TEXT_SUFFIX = "_dictText"; + //分隔符 + String CHARACTOR_SEPARATOR = "-"; + String CHARACTOR_NO = "N"; /** - * 表单设计器主表类型 + * 线程池名 */ - public static final Integer DESIGN_FORM_TYPE_MAIN = 1; + //分类构建路径线程 + String THREAD_CATEGORY_BUILD_PATH= "category-path-%d"; /** - * 表单设计器子表表类型 + * 其他 */ - public static final Integer DESIGN_FORM_TYPE_SUB = 2; + //商品排序依据 1 综合排序 2 销量排序 3 价格排序升序 4价格排序降序 + List OTHER_PRUDUCT_ORDER_LIST = Arrays.asList("1","2","3","4"); /** - * 表单设计器URL授权通过 + * code */ - public static final Integer DESIGN_FORM_URL_STATUS_PASSED = 1; + //分类相关失败返回 + Integer CODE_FAIL_4101 = 4101; + //商品相关失败返回 + Integer CODE_FAIL_4301 = 4201; + //轮播图相关失败返回 + Integer CODE_FAIL_4201 = 4201; - /** - * 表单设计器URL授权未通过 - */ - public static final Integer DESIGN_FORM_URL_STATUS_NOT_PASSED = 2; /** - * 表单设计器URL授权未通过 - */ - public static final String DESIGN_FORM_URL_TYPE_ADD = "add"; - /** - * 表单设计器URL授权未通过 + * msg */ - public static final String DESIGN_FORM_URL_TYPE_EDIT = "edit"; - /** - * 表单设计器URL授权未通过 - */ - public static final String DESIGN_FORM_URL_TYPE_DETAIL = "detail"; - /** - * 表单设计器URL授权未通过 - */ - public static final String DESIGN_FORM_URL_TYPE_VIEW = "view"; - /** * 分类相关 */ - //分类线程池名 - String CATEGORY_BUILD_PATH_NAME= "category-path-%d"; - Integer CATEGORY_COMMON_FAIL_4101 = 4101; - //分隔符 - String CATEGORY_PATH_SEPARATOR = "-"; - //非父节点 - String CATEGORY_IS_PARENT_NO = "N"; - //未删除 - String CATEGORY_IS_DELETE_NO = "N"; //查询列表时结果为空 - String CATEGORY_BUILD_TREE_SELECT_NO = "查询的分类表结果为空"; + String MSG_CATEGORY_SELECT_NO = "查询的分类表结果为空"; //没有查询到当前节点的父节点 - String CATEGORY_PARENT_NODE_NO = "没有查询到对应的父节点"; + String MSG_CATEGORY_PNODE_NO = "没有查询到对应的父节点"; //inser 影响条数不为1 - String CATEGORY_INSERT_FAIL = "分类表插入数据失败"; + String MSG_CATEGORY_INSERT_FAIL = "分类表插入数据失败"; //inser 成功 - String CATEGORY_INSERT_OK = "分类表插入数据成功"; + String MSG_CATEGORY_INSERT_OK = "分类表插入数据成功"; //insert 异常 - String CATEGORY_INSERT_EXCEPTION = "分类表插入数据时发生异常"; + String MSG_CATEGORY_INSERT_EXCEPTION = "分类表插入数据时发生异常"; //update 异常 - String CATEGORY_UPDATE_EXCEPTION = "分类表更新数据时发生异常"; + String MSG_CATEGORY_UPDATE_EXCEPTION = "分类表更新数据时发生异常"; //update 影响条数不为1 - String CATEGORY_UPDATE_FAIL = "分类表更新数据失败"; + String MSG_CATEGORY_UPDATE_FAIL = "分类表更新数据失败"; //update 更新成功 - String CATEGORY_UPDATE_OK = "分类表更新数据成功"; + String MSG_CATEGORY_UPDATE_OK = "分类表更新数据成功"; //update 故障节点 - String CATEGORY_UPDATE_PID_EXCEPTION = "父节点故障"; + String MSG_CATEGORY_PID_EXCEPTION = "父节点故障"; //delete 异常 - String CATEGORY_DELETE_EXCEPTION = "分类表删除数据时发生异常"; + String MSG_CATEGORY_DELETE_EXCEPTION = "分类表删除数据时发生异常"; //delete 影响的条数为空 - String CATEGORY_DELETE_FAIL = "分类表删除数据失败"; + String MSG_CATEGORY_DELETE_FAIL = "分类表删除数据失败"; //delete 传的参数为空 - String CATEGORY_DELETE_PARAM_NO = "请至少选择一个节点删除"; + String MSG_CATEGORY_DELETE_NO = "请至少选择一个节点删除"; //delete 成功 - String CATEGORY_DELETE_OK = "删除成功"; + String MSG_CATEGORY_DELETE_OK = "删除成功"; /** * 商品相关 */ - Integer GOODS_COMMON_FAIL_4201 = 4201; //获取所有商品列表(综合排序/销量/价格) - String GET_ALL_GOODS_NULL = "查询的商品列表为空"; + String MSG_GET_ALL_GOODS_NULL = "查询的商品列表为空"; //获取猜你喜欢商品列表 - String GET_GUESS_LIKE_GOODS_NULL = "查询的猜你喜欢商品列表为空"; + String MSG_GET_GUESS_LIKE_GOODS_NULL = "查询的猜你喜欢商品列表为空"; //获取分类精选商品列表 - String GET_CLASSFIED_SELECTED_GOODS_NULL = "查询的分类精选商品列表为空"; + String MSG_GET_CLASSFIED_SELECTED_GOODS_NULL = "查询的分类精选商品列表为空"; //获取某个类别的商品列表 - String GET_GROUP_GOODS_NULL = "查询当前类别的商品列表为空"; - String PARAM_FORMAT_INVALID = "非法的请求参数"; - //商品排序依据 1 综合排序 2 销量排序 3 价格排序升序 4价格排序降序 - List PRUDUCT_ORDER_LIST = Arrays.asList("1","2","3","4"); + String MSG_GET_GROUP_GOODS_NULL = "查询当前类别的商品列表为空"; + String MSG_PARAM_INVALID = "非法的请求参数"; - /** - * 轮播图相关 - */ - Integer CAROUSE_COMMON_FAIL_4201 = 4201; - String GET_ALL_CAROUSE_NULL = "查询的轮播图列表为空"; /** - * 数据库增删改操作pattern + * 轮播图相关 */ - //pattern - String OPREARTION_METHOD_PATTERN = "操作类型:{0};操作结果:成功;操作类名:{1};操作方法:{2};传入参数:{3}"; - String OPREARTION_METHOD_INSERT = "新增"; - String OPREARTION_METHOD_DELETE = "删除"; - String OPREARTION_METHOD_UPDATE = "更新"; - String OPREARTION_METHOD_QUERY = "查询"; + String MSG_GET_CAROUSE_NULL = "查询的轮播图列表为空"; } diff --git a/src/main/java/com/hxtec/polaris/commons/utils/GenerateSequenceUtil.java b/src/main/java/com/hxtec/polaris/commons/utils/GenerateSequenceUtil.java new file mode 100644 index 0000000..ff15dab --- /dev/null +++ b/src/main/java/com/hxtec/polaris/commons/utils/GenerateSequenceUtil.java @@ -0,0 +1,49 @@ +package com.hxtec.polaris.commons.utils; + +import java.text.DecimalFormat; +import java.text.FieldPosition; +import java.text.Format; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; + +/** + * @Author yonyong + * @Description

根据时间生成唯一序列ID
+ * 时间精确到秒,ID最大值为99999且循环使用

+ * @Date 2019/11/19 17:16 + * @Param + * @return + **/ +public class GenerateSequenceUtil { + + private static final FieldPosition HELPER_POSITION = new FieldPosition(0); + + /** 时间:精确到秒 */ + private final static Format dateFormat = new SimpleDateFormat("YYYYMMddHHmmss"); + + private final static NumberFormat numberFormat = new DecimalFormat("00000"); + + private static int seq = 0; + + private static final int MAX = 99999; + + public static synchronized String generateSequenceNo() { + + Calendar rightNow = Calendar.getInstance(); + + StringBuffer sb = new StringBuffer(); + + dateFormat.format(rightNow.getTime(), sb, HELPER_POSITION); + + numberFormat.format(seq, sb, HELPER_POSITION); + + if (seq == MAX) { + seq = 0; + } else { + seq++; + } + + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/service/impl/CarouseServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/CarouseServiceImpl.java index 055f3c4..223950f 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/CarouseServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/CarouseServiceImpl.java @@ -31,7 +31,7 @@ public class CarouseServiceImpl implements CarouseService{ if (null != list && list.size()>0){ return Result.ok(list); }else { - throw new MyException(Result.error(CommonConstant.CAROUSE_COMMON_FAIL_4201,CommonConstant.GET_ALL_CAROUSE_NULL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4201,CommonConstant.MSG_GET_CAROUSE_NULL)); } } } diff --git a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java index d7be232..4b5c10c 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java @@ -5,6 +5,7 @@ import com.hxtec.polaris.commons.api.vo.Result; import com.hxtec.polaris.commons.constant.CommonConstant; import com.hxtec.polaris.commons.exception.MyException; import com.hxtec.polaris.commons.thread.BuildPathRunable; +import com.hxtec.polaris.commons.utils.GenerateSequenceUtil; import com.hxtec.polaris.entity.ShopCategory; import com.hxtec.polaris.mapper.ShopCategoryMapper; import com.hxtec.polaris.service.CategoryService; @@ -34,10 +35,10 @@ import java.util.concurrent.ThreadFactory; public class CategoryServiceImpl implements CategoryService { private final static Logger logger = LoggerFactory.getLogger(CategoryServiceImpl.class); - private static String CLASS_NAME = "CategoryServiceImpl"; - private static String METHOD_ADD_CATORY = "addCategory"; - private static String METHOD_DEL_CATORY = "deleteCategory"; - private static String METHOD_UPDATE_CATORY ="updateCategory"; + private final static String LOG_CLASS_NAME = "CategoryServiceImpl"; + private final static String LOG_METHOD_ADD_CATORY = "addCategory"; + private final static String LOG_METHOD_DEL_CATORY = "deleteCategory"; + private final static String LOG_METHOD_UPDATE_CATORY ="updateCategory"; @Resource private ShopCategoryMapper shopCategoryMapper; @@ -50,7 +51,7 @@ public class CategoryServiceImpl implements CategoryService { return Result.ok(list); }else { //查询失败或查询到的数据为空 - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_BUILD_TREE_SELECT_NO)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_SELECT_NO)); } } @@ -58,28 +59,29 @@ public class CategoryServiceImpl implements CategoryService { public Object addCategory(String pid, String name) { //请求参数不合法 if (!StringUtils.isNumeric(pid)){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.PARAM_FORMAT_INVALID)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID)); } //判断数据库中是否有该父节点 ShopCategory parentObject = shopCategoryMapper.selectByPrimaryKey(pid); if (null == parentObject){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_PARENT_NODE_NO)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_PNODE_NO)); } //实例赋值 ShopCategory shopCategory = setParam(pid,name); - + //生成id + shopCategory.setId(GenerateSequenceUtil.generateSequenceNo()); //数据新增入库 int insertResult = 0; try { insertResult = shopCategoryMapper.insertCategory(shopCategory); }catch (Exception e){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_INSERT_EXCEPTION)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_INSERT_EXCEPTION)); } if (insertResult != 1){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_INSERT_FAIL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_INSERT_FAIL)); } //构建分类路径 - StringBuilder path = new StringBuilder(CommonConstant.CATEGORY_PATH_SEPARATOR + shopCategory.getId()); + StringBuilder path = new StringBuilder(CommonConstant.CHARACTOR_SEPARATOR + shopCategory.getId()); path.append(parentObject.getComment1()); shopCategory.setComment1(String.valueOf(path)); //更新路径 @@ -87,67 +89,67 @@ public class CategoryServiceImpl implements CategoryService { try{ updateResult = shopCategoryMapper.updateCategoryDynamic(shopCategory); }catch (Exception e){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_UPDATE_EXCEPTION)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_UPDATE_EXCEPTION)); } if (updateResult < 0){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_UPDATE_FAIL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_UPDATE_FAIL)); } String params = "pid="+pid+",name="+name; - logger.info(MessageFormat.format(CommonConstant.OPREARTION_METHOD_PATTERN,CommonConstant.OPREARTION_METHOD_INSERT, - CLASS_NAME,METHOD_ADD_CATORY,params)); - return Result.ok(CommonConstant.CATEGORY_INSERT_OK); + logger.info(MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_INSERT, + LOG_CLASS_NAME,LOG_METHOD_ADD_CATORY,params)); + return Result.ok(CommonConstant.MSG_CATEGORY_INSERT_OK); } @Override public Object deleteCategory(List ids) { //参数为空 if (null == ids || ids.size() == 0){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_DELETE_PARAM_NO)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_NO)); } for (String id : ids){ //参数不合法 if (!StringUtils.isNumeric(id)){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.PARAM_FORMAT_INVALID)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID)); } //更新shop_category表 int deletCategoryResult = 0; try{ deletCategoryResult = shopCategoryMapper.deleteCategory(id); }catch (Exception e){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_DELETE_EXCEPTION)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_EXCEPTION)); } if (deletCategoryResult < 0){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_DELETE_FAIL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_FAIL)); } } String params = "ids="+ids; - logger.info(MessageFormat.format(CommonConstant.OPREARTION_METHOD_PATTERN,CommonConstant.OPREARTION_METHOD_DELETE, - CLASS_NAME,METHOD_DEL_CATORY,params)); - return Result.ok(CommonConstant.CATEGORY_DELETE_OK); + logger.info(MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_DELETE, + LOG_CLASS_NAME, LOG_METHOD_DEL_CATORY,params)); + return Result.ok(CommonConstant.MSG_CATEGORY_DELETE_OK); } @Override public Object updateCategory(HttpServletRequest request,String pid, String id, String name) { if (!StringUtils.isNumeric(pid) || !StringUtils.isNumeric(id) || StringUtils.isBlank(name)){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.PARAM_FORMAT_INVALID)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID)); } List tempList = shopCategoryMapper.getCategoryById(pid); - if (null == tempList || tempList.size() ==0 || StringUtils.isBlank(tempList.get(0).getIsDelete()) || !CommonConstant.CATEGORY_IS_DELETE_NO.equals(tempList.get(0).getIsDelete())){ + if (null == tempList || tempList.size() ==0 || StringUtils.isBlank(tempList.get(0).getIsDelete()) || !CommonConstant.CHARACTOR_NO.equals(tempList.get(0).getIsDelete())){ //如果该父节点对应的分类在数据库中没有记录或者删除状态是空或者已删除,则为故障节点,不能进行更新 - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_UPDATE_PID_EXCEPTION)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_PID_EXCEPTION)); } //执行更新操作 try { doUpdateShopCategory(request,pid,id,name); }catch (Exception e){ - throw new MyException(Result.error(CommonConstant.CATEGORY_COMMON_FAIL_4101,CommonConstant.CATEGORY_UPDATE_FAIL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_UPDATE_FAIL)); } String params = "pid="+pid+",id="+id+",name="+name; - logger.info(MessageFormat.format(CommonConstant.OPREARTION_METHOD_PATTERN,CommonConstant.OPREARTION_METHOD_UPDATE, - CLASS_NAME,METHOD_UPDATE_CATORY,params)); - return Result.ok(); + logger.info(MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_UPDATE, + LOG_CLASS_NAME,LOG_METHOD_UPDATE_CATORY,params)); + return Result.ok(CommonConstant.MSG_CATEGORY_UPDATE_OK); } /** @@ -159,9 +161,9 @@ public class CategoryServiceImpl implements CategoryService { private ShopCategory setParam(String pid, String name){ ShopCategory shopCategory = new ShopCategory(); shopCategory.setParentId(pid); - shopCategory.setIsParent(CommonConstant.CATEGORY_IS_PARENT_NO); + shopCategory.setIsParent(CommonConstant.CHARACTOR_NO); shopCategory.setName(name); - shopCategory.setIsDelete(CommonConstant.CATEGORY_IS_DELETE_NO); + shopCategory.setIsDelete(CommonConstant.CHARACTOR_NO); shopCategory.setCreateTime(new Date()); shopCategory.setUpdateTime(new Date()); return shopCategory; @@ -197,7 +199,7 @@ public class CategoryServiceImpl implements CategoryService { //调用线程,更新path //把当前编辑的节点及其所有子节点挂到新的节点下面,更新路径 // 创建线程池 - ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(CommonConstant.CATEGORY_BUILD_PATH_NAME).build(); + ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(CommonConstant.THREAD_CATEGORY_BUILD_PATH).build(); ServletContext context = request.getServletContext(); // 计数器 CountDownLatch doneSignal = new CountDownLatch(1); diff --git a/src/main/java/com/hxtec/polaris/service/impl/GoodServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/GoodServiceImpl.java index bb69428..0e6beb0 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/GoodServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/GoodServiceImpl.java @@ -26,8 +26,8 @@ import java.util.Map; @Service @Transactional public class GoodServiceImpl implements GoodService{ - private static final String TARGET_GROUP_NAME = "getTargrtGroupGoods"; - private static final String GUESS_LIKE_NAME = "getGuessLikeGoods"; + private static final String METHOD_TARGET_GROUP_NAME = "getTargrtGroupGoods"; + private static final String METHOD_GUESS_LIKE_NAME = "getGuessLikeGoods"; @Resource private ShopProductBaseMapper shopProductBaseMapper; @@ -41,7 +41,7 @@ public class GoodServiceImpl implements GoodService{ return Result.ok(mapList); }else { //查询失败或查询到的数据为空 - throw new MyException(Result.error(CommonConstant.GOODS_COMMON_FAIL_4201,CommonConstant.GET_ALL_GOODS_NULL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_GET_ALL_GOODS_NULL)); } } @@ -49,7 +49,7 @@ public class GoodServiceImpl implements GoodService{ public Object getGuessLikeGoods(String page, String rows,String order) { //如果是非法的请求 if (!ifParamsValid(page,rows,null,order)){ - throw new MyException(Result.error(CommonConstant.GOODS_COMMON_FAIL_4201,CommonConstant.PARAM_FORMAT_INVALID)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_PARAM_INVALID)); } Integer start = getFormatInt(page,rows,true); Integer size = getFormatInt(page,rows,false); @@ -58,7 +58,7 @@ public class GoodServiceImpl implements GoodService{ return Result.ok(mapList); }else { //查询失败或查询到的数据为空 - throw new MyException(Result.error(CommonConstant.GOODS_COMMON_FAIL_4201,CommonConstant.GET_GUESS_LIKE_GOODS_NULL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_GET_GUESS_LIKE_GOODS_NULL)); } } @@ -71,7 +71,7 @@ public class GoodServiceImpl implements GoodService{ return Result.ok(mapList); }else { //查询失败或查询到的数据为空 - throw new MyException(Result.error(CommonConstant.GOODS_COMMON_FAIL_4201,CommonConstant.GET_CLASSFIED_SELECTED_GOODS_NULL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_GET_CLASSFIED_SELECTED_GOODS_NULL)); } } @@ -79,7 +79,7 @@ public class GoodServiceImpl implements GoodService{ public Object getTargrtGroupGoods(String page, String rows,String cid,String order) { //如果是非法的请求 if (!ifParamsValid(page,rows,cid,order)){ - throw new MyException(Result.error(CommonConstant.GOODS_COMMON_FAIL_4201,CommonConstant.PARAM_FORMAT_INVALID)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_PARAM_INVALID)); } Integer start = (Integer.valueOf(page)-1)*Integer.valueOf(rows); List> mapList = shopProductBaseMapper.getTargrtGroupGoods(start,Integer.valueOf(rows),cid,order); @@ -90,7 +90,7 @@ public class GoodServiceImpl implements GoodService{ return Result.ok(page1,mapList); }else { //查询失败或查询到的数据为空 - throw new MyException(Result.error(CommonConstant.GOODS_COMMON_FAIL_4201,CommonConstant.GET_GROUP_GOODS_NULL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_GET_GROUP_GOODS_NULL)); } } @@ -126,17 +126,17 @@ public class GoodServiceImpl implements GoodService{ } } //如果是查询某个分类下的方法调用 - if (TARGET_GROUP_NAME.equals(shiftMethod)){ + if (METHOD_TARGET_GROUP_NAME.equals(shiftMethod)){ if (!StringUtils.isNumeric(cid)||!StringUtils.isNumeric(order)){ return false; } - if (CommonConstant.PRUDUCT_ORDER_LIST.indexOf(order)<0){ + if (CommonConstant.OTHER_PRUDUCT_ORDER_LIST.indexOf(order)<0){ return false; } } //如果是猜你喜欢下的方法调用 - if (GUESS_LIKE_NAME.equals(shiftMethod)){ - if (!StringUtils.isNumeric(order) || CommonConstant.PRUDUCT_ORDER_LIST.indexOf(order)<0){ + if (METHOD_GUESS_LIKE_NAME.equals(shiftMethod)){ + if (!StringUtils.isNumeric(order) || CommonConstant.OTHER_PRUDUCT_ORDER_LIST.indexOf(order)<0){ return false; } } diff --git a/src/main/resources/mapper/ShopCategoryMapper.xml b/src/main/resources/mapper/ShopCategoryMapper.xml index f0afeda..ab5837f 100644 --- a/src/main/resources/mapper/ShopCategoryMapper.xml +++ b/src/main/resources/mapper/ShopCategoryMapper.xml @@ -52,10 +52,6 @@ #{isDelete,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{comment1,jdbcType=VARCHAR}, #{comment2,jdbcType=VARCHAR}, #{comment3,jdbcType=VARCHAR} ) - - - SELECT LAST_INSERT_ID() - diff --git a/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java b/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java index c757e8d..4de1e39 100644 --- a/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java +++ b/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java @@ -32,7 +32,7 @@ public class CategoryServiceTest { // Object object = categoryService.buildTree("0","0"); // System.out.println(object); Example shopCategoryExample = new Example(ShopCategory.class); - shopCategoryExample.createCriteria().andEqualTo("isDelete", CommonConstant.CATEGORY_IS_DELETE_NO) + shopCategoryExample.createCriteria().andEqualTo("isDelete", CommonConstant.CHARACTOR_NO) .andEqualTo("parentId",null) .andEqualTo("id",null); //查询表category获取对应的数据 -- Gitee From b617d329b86500d37f4c2cbdf1f2663c668aaa01 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Wed, 20 Nov 2019 16:25:32 +0800 Subject: [PATCH 04/36] =?UTF-8?q?eoor=E7=BB=9F=E4=B8=80=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/exception/MyException.java | 12 +++ .../commons/exception/MyExceptionHandler.java | 9 +- .../service/impl/CategoryServiceImpl.java | 86 ++++++++++--------- 3 files changed, 66 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/hxtec/polaris/commons/exception/MyException.java b/src/main/java/com/hxtec/polaris/commons/exception/MyException.java index 8c64dbc..6c57449 100644 --- a/src/main/java/com/hxtec/polaris/commons/exception/MyException.java +++ b/src/main/java/com/hxtec/polaris/commons/exception/MyException.java @@ -11,10 +11,15 @@ public class MyException extends RuntimeException { * 返回结果 */ private Object result; + private String logMsg; public MyException(Object result) { this.result = result; } + public MyException(Object result,String logMsg) { + this.result = result; + this.logMsg = logMsg; + } public Object getResult() { return result; @@ -23,4 +28,11 @@ public class MyException extends RuntimeException { public void setResult(Object result) { this.result = result; } + + public void setLogMsg(String logMsg){ + this.logMsg = logMsg; + } + public String getLogMsg(){ + return logMsg; + } } \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/commons/exception/MyExceptionHandler.java b/src/main/java/com/hxtec/polaris/commons/exception/MyExceptionHandler.java index 7da68bd..7f5042e 100644 --- a/src/main/java/com/hxtec/polaris/commons/exception/MyExceptionHandler.java +++ b/src/main/java/com/hxtec/polaris/commons/exception/MyExceptionHandler.java @@ -3,6 +3,7 @@ package com.hxtec.polaris.commons.exception; import javax.servlet.http.HttpServletRequest; import com.hxtec.polaris.commons.api.vo.Result; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -26,10 +27,16 @@ public class MyExceptionHandler { public Object handle(Exception e, HttpServletRequest request) { if (e instanceof MyException) { MyException myException = (MyException) e; + if (StringUtils.isNotBlank(myException.getLogMsg())){ + logger.error(myException.getLogMsg()); + Result result = (Result) myException.getResult(); + logger.error(result.getCode()+result.getMessage()); + logger.error(myException.getMessage()+"\n"); + } return myException.getResult(); }else { // 直接将异常对象传入日志接口,保存异常信息到日志文件中 - logger.error("error: {}", e.getMessage(), e); + logger.error("error: {}"+"\n", e.getMessage(), e); return Result.error("服务器异常"); } } diff --git a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java index 4b5c10c..80a63d0 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java @@ -40,6 +40,8 @@ public class CategoryServiceImpl implements CategoryService { private final static String LOG_METHOD_DEL_CATORY = "deleteCategory"; private final static String LOG_METHOD_UPDATE_CATORY ="updateCategory"; + private static String LOG_MSG = null; + @Resource private ShopCategoryMapper shopCategoryMapper; @@ -57,98 +59,83 @@ public class CategoryServiceImpl implements CategoryService { @Override public Object addCategory(String pid, String name) { + String params = "pid="+pid+",name="+name; + LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_INSERT, + LOG_CLASS_NAME,LOG_METHOD_ADD_CATORY,params); + //请求参数不合法 if (!StringUtils.isNumeric(pid)){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID),LOG_MSG); } //判断数据库中是否有该父节点 ShopCategory parentObject = shopCategoryMapper.selectByPrimaryKey(pid); if (null == parentObject){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_PNODE_NO)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_PNODE_NO),LOG_MSG); } //实例赋值 ShopCategory shopCategory = setParam(pid,name); - //生成id - shopCategory.setId(GenerateSequenceUtil.generateSequenceNo()); //数据新增入库 - int insertResult = 0; try { - insertResult = shopCategoryMapper.insertCategory(shopCategory); - }catch (Exception e){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_INSERT_EXCEPTION)); - } - if (insertResult != 1){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_INSERT_FAIL)); - } - //构建分类路径 - StringBuilder path = new StringBuilder(CommonConstant.CHARACTOR_SEPARATOR + shopCategory.getId()); - path.append(parentObject.getComment1()); - shopCategory.setComment1(String.valueOf(path)); - //更新路径 - int updateResult = 0; - try{ - updateResult = shopCategoryMapper.updateCategoryDynamic(shopCategory); + doAddCategory(shopCategory,parentObject); }catch (Exception e){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_UPDATE_EXCEPTION)); - } - if (updateResult < 0){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_UPDATE_FAIL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_INSERT_EXCEPTION),LOG_MSG); } - String params = "pid="+pid+",name="+name; - logger.info(MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_INSERT, - LOG_CLASS_NAME,LOG_METHOD_ADD_CATORY,params)); + logger.info(LOG_MSG); return Result.ok(CommonConstant.MSG_CATEGORY_INSERT_OK); } @Override public Object deleteCategory(List ids) { + String params = "ids="+ids; + LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_DELETE, + LOG_CLASS_NAME, LOG_METHOD_DEL_CATORY,params); + //参数为空 if (null == ids || ids.size() == 0){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_NO)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_NO),LOG_MSG); } for (String id : ids){ //参数不合法 if (!StringUtils.isNumeric(id)){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID),LOG_MSG); } //更新shop_category表 int deletCategoryResult = 0; try{ deletCategoryResult = shopCategoryMapper.deleteCategory(id); }catch (Exception e){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_EXCEPTION)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_EXCEPTION),LOG_MSG); } if (deletCategoryResult < 0){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_FAIL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_FAIL),LOG_MSG); } } - String params = "ids="+ids; - logger.info(MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_DELETE, - LOG_CLASS_NAME, LOG_METHOD_DEL_CATORY,params)); + logger.info(LOG_MSG); return Result.ok(CommonConstant.MSG_CATEGORY_DELETE_OK); } @Override public Object updateCategory(HttpServletRequest request,String pid, String id, String name) { + String params = "pid="+pid+",id="+id+",name="+name; + LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_UPDATE, + LOG_CLASS_NAME,LOG_METHOD_UPDATE_CATORY,params); if (!StringUtils.isNumeric(pid) || !StringUtils.isNumeric(id) || StringUtils.isBlank(name)){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID),LOG_MSG); } List tempList = shopCategoryMapper.getCategoryById(pid); if (null == tempList || tempList.size() ==0 || StringUtils.isBlank(tempList.get(0).getIsDelete()) || !CommonConstant.CHARACTOR_NO.equals(tempList.get(0).getIsDelete())){ //如果该父节点对应的分类在数据库中没有记录或者删除状态是空或者已删除,则为故障节点,不能进行更新 - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_PID_EXCEPTION)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_PID_EXCEPTION),LOG_MSG); } //执行更新操作 try { doUpdateShopCategory(request,pid,id,name); }catch (Exception e){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_UPDATE_FAIL)); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_UPDATE_FAIL),LOG_MSG); } - String params = "pid="+pid+",id="+id+",name="+name; - logger.info(MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_UPDATE, - LOG_CLASS_NAME,LOG_METHOD_UPDATE_CATORY,params)); + logger.info(LOG_MSG); return Result.ok(CommonConstant.MSG_CATEGORY_UPDATE_OK); } @@ -160,6 +147,8 @@ public class CategoryServiceImpl implements CategoryService { */ private ShopCategory setParam(String pid, String name){ ShopCategory shopCategory = new ShopCategory(); + //生成id + shopCategory.setId(GenerateSequenceUtil.generateSequenceNo()); shopCategory.setParentId(pid); shopCategory.setIsParent(CommonConstant.CHARACTOR_NO); shopCategory.setName(name); @@ -206,6 +195,23 @@ public class CategoryServiceImpl implements CategoryService { pool.newThread(new BuildPathRunable(context,doneSignal)).start(); } + /** + * @Author yonyong + * @Description //执行db层面的分类insert,返回t + * @Date 2019/11/20 14:36 + * @Param + * @return + **/ + private void doAddCategory(ShopCategory shopCategory,ShopCategory parentObject){ + shopCategoryMapper.insertCategory(shopCategory); + //构建分类路径 + StringBuilder path = new StringBuilder(CommonConstant.CHARACTOR_SEPARATOR + shopCategory.getId()); + path.append(parentObject.getComment1()); + shopCategory.setComment1(String.valueOf(path)); + //更新路径 + shopCategoryMapper.updateCategoryDynamic(shopCategory); + } + /** * 判断两个字符串是否相等 将"" 、" "、null相同对待 * @param str1 -- Gitee From e5fe850e5e535bf42bc0db80d26f56b59159636f Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Mon, 25 Nov 2019 09:53:26 +0800 Subject: [PATCH 05/36] =?UTF-8?q?=E5=88=86=E7=B1=BB=E3=80=82=E3=80=82?= =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82=E3=80=82=E3=80=82=E3=80=82=E3=80=82?= =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hxtec/polaris/service/impl/CategoryServiceImpl.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java index 80a63d0..743f320 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java @@ -40,8 +40,6 @@ public class CategoryServiceImpl implements CategoryService { private final static String LOG_METHOD_DEL_CATORY = "deleteCategory"; private final static String LOG_METHOD_UPDATE_CATORY ="updateCategory"; - private static String LOG_MSG = null; - @Resource private ShopCategoryMapper shopCategoryMapper; @@ -60,7 +58,7 @@ public class CategoryServiceImpl implements CategoryService { @Override public Object addCategory(String pid, String name) { String params = "pid="+pid+",name="+name; - LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_INSERT, + String LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_INSERT, LOG_CLASS_NAME,LOG_METHOD_ADD_CATORY,params); //请求参数不合法 @@ -87,7 +85,7 @@ public class CategoryServiceImpl implements CategoryService { @Override public Object deleteCategory(List ids) { String params = "ids="+ids; - LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_DELETE, + String LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_DELETE, LOG_CLASS_NAME, LOG_METHOD_DEL_CATORY,params); //参数为空 @@ -118,7 +116,7 @@ public class CategoryServiceImpl implements CategoryService { @Override public Object updateCategory(HttpServletRequest request,String pid, String id, String name) { String params = "pid="+pid+",id="+id+",name="+name; - LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_UPDATE, + String LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_UPDATE, LOG_CLASS_NAME,LOG_METHOD_UPDATE_CATORY,params); if (!StringUtils.isNumeric(pid) || !StringUtils.isNumeric(id) || StringUtils.isBlank(name)){ throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID),LOG_MSG); -- Gitee From a23eb53dba01e2a79c7a174f613fcb68486da1a2 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Mon, 25 Nov 2019 18:02:57 +0800 Subject: [PATCH 06/36] =?UTF-8?q?=E6=B5=8F=E8=A7=88=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/constant/CommonConstant.java | 20 ++- .../commons/thread/HistoryRunable.java | 62 ++++++++ .../polaris/controller/HistoryController.java | 45 ++++++ .../com/hxtec/polaris/entity/ShopHistory.java | 137 ++++++++++++++++++ .../polaris/mapper/ShopHistoryMapper.java | 37 +++++ .../hxtec/polaris/service/HistoryService.java | 41 ++++++ .../service/impl/AddressServiceImpl.java | 2 +- .../service/impl/HistoryServiceImpl.java | 91 ++++++++++++ .../resources/mapper/ShopHistoryMapper.xml | 102 +++++++++++++ 9 files changed, 534 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java create mode 100644 src/main/java/com/hxtec/polaris/controller/HistoryController.java create mode 100644 src/main/java/com/hxtec/polaris/entity/ShopHistory.java create mode 100644 src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java create mode 100644 src/main/java/com/hxtec/polaris/service/HistoryService.java create mode 100644 src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java create mode 100644 src/main/resources/mapper/ShopHistoryMapper.xml diff --git a/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java b/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java index 41d5bfa..cdb9d69 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java @@ -30,6 +30,9 @@ public interface CommonConstant { String LOG_TYPE_DELETE = "删除"; String LOG_TYPE_UPDATE = "更新"; String LOG_TYPE_QUERY = "查询"; + //历史浏览相关 + String PATTERN_HISTORY= "历史浏览记录insert失败!传入参数:{0}"; + String PATTERN_BASE = "操作用户:{0}"; /** * 符号 @@ -43,6 +46,8 @@ public interface CommonConstant { */ //分类构建路径线程 String THREAD_CATEGORY_BUILD_PATH= "category-path-%d"; + //浏览记录入库线程 + String THREAD_HISTORY_INSERT= "history-insert-%d"; /** * 其他 @@ -55,10 +60,12 @@ public interface CommonConstant { */ //分类相关失败返回 Integer CODE_FAIL_4101 = 4101; - //商品相关失败返回 - Integer CODE_FAIL_4301 = 4201; //轮播图相关失败返回 Integer CODE_FAIL_4201 = 4201; + //商品相关失败返回 + Integer CODE_FAIL_4301 = 4301; + //浏览历史相关失败返回 + Integer CODE_FAIL_4401 = 4401; /** @@ -112,4 +119,13 @@ public interface CommonConstant { * 轮播图相关 */ String MSG_GET_CAROUSE_NULL = "查询的轮播图列表为空"; + + /** + * 浏览历史相关 + */ + String MSG_HISTORY_GET_FAIL = "查询所有浏览记录失败"; + String MSG_HISTORY_DELETE_FAIL = "删除指定浏览记录失败"; + String MSG_HISTORY_DELETE_NULL = "删除指定记录成功,影响条数为0"; + String MSG_HISTORY_TRUNK_FAIL = "清空全部浏览浏览记录失败"; + String MSG_HISTORY_TRUNK_NULL = "清空全部浏览记录成功,影响条数为0"; } diff --git a/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java b/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java new file mode 100644 index 0000000..7130b33 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java @@ -0,0 +1,62 @@ +package com.hxtec.polaris.commons.thread; + +import com.hxtec.polaris.commons.constant.CommonConstant; +import com.hxtec.polaris.entity.ShopHistory; +import com.hxtec.polaris.mapper.ShopHistoryMapper; +import com.hxtec.polaris.service.impl.AddressServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import javax.servlet.ServletContext; +import java.text.MessageFormat; +import java.util.concurrent.CountDownLatch; + +/** + * @Describtion 历史浏览记录表 + * @Author yonyong + * @Date 2019/11/25 15:55 + * @Version 1.0.0 + **/ +public class HistoryRunable implements Runnable { + + private final static Logger logger = LoggerFactory.getLogger(BuildPathRunable.class); + private ServletContext context = null; + private final CountDownLatch doneSignal; + private ShopHistory history; + + private ShopHistoryMapper shopHistoryMapper; + private AddressServiceImpl addressServiceImpl; + + public HistoryRunable(ServletContext context,CountDownLatch doneSignal,ShopHistory history){ + this.context = context; + this.doneSignal = doneSignal; + this.history = history; + } + + @Override + public void run() { + initBean(context); + history.setUsername(addressServiceImpl.getUser()); + try{ + synchronized (doneSignal){ + doneSignal.countDown(); + shopHistoryMapper.insert(history); + } + doneSignal.wait(); + }catch (Exception e){ + logger.error(MessageFormat.format(CommonConstant.PATTERN_HISTORY,history.toString())); + } + } + + /** + * 获取bean + * @param context + */ + private void initBean(ServletContext context){ + WebApplicationContext webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context); + this.shopHistoryMapper = webApplicationContext.getBean(ShopHistoryMapper.class); + this.addressServiceImpl = webApplicationContext.getBean(AddressServiceImpl.class); + } +} diff --git a/src/main/java/com/hxtec/polaris/controller/HistoryController.java b/src/main/java/com/hxtec/polaris/controller/HistoryController.java new file mode 100644 index 0000000..80d2690 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/controller/HistoryController.java @@ -0,0 +1,45 @@ +package com.hxtec.polaris.controller; + +import com.hxtec.polaris.entity.ShopHistory; +import com.hxtec.polaris.service.HistoryService; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; + +/** + * @Describtion 历史记录相关 + * @Author yonyong + * @Date 2019/11/25 16:38 + * @Version 1.0.0 + **/ +@RestController +@RequestMapping(value = "history",produces = "application/json;charset=utf-8") +@CrossOrigin +@Api(value = "/history", tags = "历史记录相关") +public class HistoryController { + + @Autowired + private HistoryService historyService; + + @GetMapping("get") + public Object getAll(){ + return historyService.getAll(); + } + + @PostMapping("insert") + public Object insert(HttpServletRequest request,ShopHistory shopHistory){ + return historyService.insert(request,shopHistory); + } + + @DeleteMapping("del") + public Object del(ShopHistory shopHistory){ + return historyService.delete(shopHistory); + } + + @DeleteMapping("delAll") + public Object delAll(){ + return historyService.deleteAll(); + } +} diff --git a/src/main/java/com/hxtec/polaris/entity/ShopHistory.java b/src/main/java/com/hxtec/polaris/entity/ShopHistory.java new file mode 100644 index 0000000..793a017 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/entity/ShopHistory.java @@ -0,0 +1,137 @@ +package com.hxtec.polaris.entity; + +import java.util.Date; + +public class ShopHistory { + /** + * 浏览历史表id + */ + private Integer id; + + /** + * 用户账号 + */ + private String username; + + /** + * 商品id + */ + private String spu; + + /** + * sku + */ + private String sku; + + /** + * 图片地址 + */ + private String img; + + /** + * 浏览时间 + */ + private Date time; + + /** + * 备用字段1 + */ + private String comment1; + + /** + * 备用字段2 + */ + private String comment2; + + /** + * 备用字段3 + */ + private String comment3; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getSpu() { + return spu; + } + + public void setSpu(String spu) { + this.spu = spu; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public Date getTime() { + return time; + } + + public void setTime(Date time) { + this.time = time; + } + + public String getComment1() { + return comment1; + } + + public void setComment1(String comment1) { + this.comment1 = comment1; + } + + public String getComment2() { + return comment2; + } + + public void setComment2(String comment2) { + this.comment2 = comment2; + } + + public String getComment3() { + return comment3; + } + + public void setComment3(String comment3) { + this.comment3 = comment3; + } + + @Override + public String toString() { + return "ShopHistory{" + + "id=" + id + + ", username='" + username + '\'' + + ", spu='" + spu + '\'' + + ", sku='" + sku + '\'' + + ", img='" + img + '\'' + + ", time=" + time + + ", comment1='" + comment1 + '\'' + + ", comment2='" + comment2 + '\'' + + ", comment3='" + comment3 + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java new file mode 100644 index 0000000..f5aaa54 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java @@ -0,0 +1,37 @@ +package com.hxtec.polaris.mapper; + +import com.hxtec.polaris.entity.ShopHistory; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface ShopHistoryMapper { + /** + * 删除一条浏览记录 + * @param id + * @return + */ + int delete(Integer id); + + /** + * 删除所有浏览记录 + * @param username + * @return + */ + int deleteAll(String username); + + /** + * 添加浏览记录 + * @param shopHistory + * @return + */ + int insert(ShopHistory shopHistory); + + /** + * 获取所有浏览历史记录,默认查询最新记录前十条 + * @param username + * @return + */ + List> getAllHistory(@Param("username") String username); +} \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/service/HistoryService.java b/src/main/java/com/hxtec/polaris/service/HistoryService.java new file mode 100644 index 0000000..4f1e6f4 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/service/HistoryService.java @@ -0,0 +1,41 @@ +package com.hxtec.polaris.service; + +import com.hxtec.polaris.entity.ShopHistory; + +import javax.servlet.http.HttpServletRequest; + +/** + * @Author yonyong + * @Description //历史记录相关 + * @Date 2019/11/25 16:43 + * @Param + * @return + **/ +public interface HistoryService { + /** + * 获取所有浏览历史记录,默认取最新记录前十条 + * @return + */ + Object getAll(); + + /** + * 添加浏览历史记录,走线程 + * @param request + * @param shopHistory + * @return + */ + Object insert(HttpServletRequest request,ShopHistory shopHistory); + + /** + * 删除一条浏览记录 + * @param shopHistory + * @return + */ + Object delete(ShopHistory shopHistory); + + /** + * 清空浏览记录 + * @return + */ + Object deleteAll(); +} diff --git a/src/main/java/com/hxtec/polaris/service/impl/AddressServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/AddressServiceImpl.java index 4d8b370..d53b546 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/AddressServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/AddressServiceImpl.java @@ -52,7 +52,7 @@ public class AddressServiceImpl implements AddressService { return addressMapper.deleteByPrimaryKey(id); } - private String getUser(){ + public String getUser(){ return SecurityContextHolder.getContext().getAuthentication().getName(); } } diff --git a/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java new file mode 100644 index 0000000..647a6e6 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java @@ -0,0 +1,91 @@ +package com.hxtec.polaris.service.impl; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.hxtec.polaris.commons.api.vo.Result; +import com.hxtec.polaris.commons.constant.CommonConstant; +import com.hxtec.polaris.commons.exception.MyException; +import com.hxtec.polaris.commons.thread.HistoryRunable; +import com.hxtec.polaris.entity.ShopHistory; +import com.hxtec.polaris.mapper.ShopHistoryMapper; +import com.hxtec.polaris.service.HistoryService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import java.text.MessageFormat; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ThreadFactory; + +/** + * @Describtion 历史记录相关 + * @Author yonyong + * @Date 2019/11/25 16:45 + * @Version 1.0.0 + **/ +@Service +@Transactional +public class HistoryServiceImpl implements HistoryService{ + + @Resource + private ShopHistoryMapper shopHistoryMapper; + @Resource + private AddressServiceImpl addressService; + + @Override + public Object getAll() { + try { + List> mapList = shopHistoryMapper.getAllHistory(addressService.getUser()); + return Result.ok(mapList); + }catch (Exception e){ + String LOG_MSG = MessageFormat.format(CommonConstant.PATTERN_BASE,addressService.getUser()); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4401,CommonConstant.MSG_HISTORY_GET_FAIL),LOG_MSG); + } + } + + @Override + public Object insert(HttpServletRequest request, ShopHistory shopHistory) { + //调用线程,更新path + //把当前编辑的节点及其所有子节点挂到新的节点下面,更新路径 + // 创建线程池 + ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(CommonConstant.THREAD_HISTORY_INSERT).build(); + ServletContext context = request.getServletContext(); + // 计数器 + CountDownLatch doneSignal = new CountDownLatch(1); + pool.newThread(new HistoryRunable(context,doneSignal,shopHistory)).start(); + return Result.ok(); + } + + @Override + public Object delete(ShopHistory shopHistory) { + try { + int result = shopHistoryMapper.delete(shopHistory.getId()); + if (1 != result){ + String LOG_MSG = MessageFormat.format(CommonConstant.PATTERN_BASE,addressService.getUser()); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4401,CommonConstant.MSG_HISTORY_DELETE_NULL),LOG_MSG); + } + return Result.ok(); + }catch (Exception e){ + String LOG_MSG = MessageFormat.format(CommonConstant.PATTERN_BASE,addressService.getUser()); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4401,CommonConstant.MSG_HISTORY_DELETE_FAIL),LOG_MSG); + } + } + + @Override + public Object deleteAll() { + try { + int result = shopHistoryMapper.deleteAll(addressService.getUser()); + if (1 != result){ + String LOG_MSG = MessageFormat.format(CommonConstant.PATTERN_BASE,addressService.getUser()); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4401,CommonConstant.MSG_HISTORY_TRUNK_NULL),LOG_MSG); + } + return Result.ok(); + }catch (Exception e){ + String LOG_MSG = MessageFormat.format(CommonConstant.PATTERN_BASE,addressService.getUser()); + throw new MyException(Result.error(CommonConstant.CODE_FAIL_4401,CommonConstant.MSG_HISTORY_TRUNK_FAIL),LOG_MSG); + } + } +} diff --git a/src/main/resources/mapper/ShopHistoryMapper.xml b/src/main/resources/mapper/ShopHistoryMapper.xml new file mode 100644 index 0000000..c0faac2 --- /dev/null +++ b/src/main/resources/mapper/ShopHistoryMapper.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + id, spu, sku, img + + + + + + delete from shop_history + where id = #{id,jdbcType=INTEGER} + + + + delete from shop_history + where username = #{username,jdbcType=VARCHAR} + + + + insert into shop_history + + + id, + + + username, + + + spu, + + + sku, + + + img, + + + time, + + + comment1, + + + comment2, + + + comment3, + + + + + #{id,jdbcType=INTEGER}, + + + #{username,jdbcType=VARCHAR}, + + + #{spu,jdbcType=VARCHAR}, + + + #{sku,jdbcType=VARCHAR}, + + + #{img,jdbcType=VARCHAR}, + + + #{time,jdbcType=TIMESTAMP}, + + + #{comment1,jdbcType=VARCHAR}, + + + #{comment2,jdbcType=VARCHAR}, + + + #{comment3,jdbcType=VARCHAR}, + + + + + \ No newline at end of file -- Gitee From a511d43981bc48c2dc462cb31636072197eb67cc Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Tue, 26 Nov 2019 11:42:41 +0800 Subject: [PATCH 07/36] =?UTF-8?q?=E5=B8=B8=E9=87=8F=E5=88=86=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hxtec/polaris/commons/constant/Code.java | 23 ++++ .../commons/constant/CommonConstant.java | 113 ------------------ .../polaris/commons/constant/GlobalVar.java | 39 ++++++ .../hxtec/polaris/commons/constant/Log.java | 28 +++++ .../hxtec/polaris/commons/constant/Msg.java | 72 +++++++++++ .../commons/thread/HistoryRunable.java | 11 +- .../service/impl/CarouseServiceImpl.java | 7 +- .../service/impl/CategoryServiceImpl.java | 49 ++++---- .../polaris/service/impl/GoodServiceImpl.java | 23 ++-- .../service/impl/HistoryServiceImpl.java | 29 ++--- .../polaris/service/CategoryServiceTest.java | 4 +- 11 files changed, 222 insertions(+), 176 deletions(-) create mode 100644 src/main/java/com/hxtec/polaris/commons/constant/Code.java create mode 100644 src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java create mode 100644 src/main/java/com/hxtec/polaris/commons/constant/Log.java create mode 100644 src/main/java/com/hxtec/polaris/commons/constant/Msg.java diff --git a/src/main/java/com/hxtec/polaris/commons/constant/Code.java b/src/main/java/com/hxtec/polaris/commons/constant/Code.java new file mode 100644 index 0000000..348653c --- /dev/null +++ b/src/main/java/com/hxtec/polaris/commons/constant/Code.java @@ -0,0 +1,23 @@ +package com.hxtec.polaris.commons.constant; + +/** + * @Describtion 返回code,禁止继承 + * @Author yonyong + * @Date 2019/11/26 9:41 + * @Version 1.0.0 + **/ +public final class Code { + /** + * 禁止实例化 + */ + private Code(){} + + //分类相关失败返回 + public final static Integer FAIL_4101 = 4101; + //轮播图相关失败返回 + public final static Integer FAIL_4201 = 4201; + //商品相关失败返回 + public final static Integer FAIL_4301 = 4301; + //浏览历史相关失败返回 + public final static Integer FAIL_4401 = 4401; +} diff --git a/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java b/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java index cdb9d69..8425c53 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/CommonConstant.java @@ -1,9 +1,5 @@ package com.hxtec.polaris.commons.constant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - /** * @Author yonyong * @Description //常量 @@ -19,113 +15,4 @@ public interface CommonConstant { /**访问权限认证未通过 510*/ Integer SC_JEECG_NO_AUTHZ=510; - - - /** - * 日志pattern - */ - //pattern - String LOG_PATTERN = "操作类型:{0};操作类名:{1};操作方法:{2};传入参数:{3}"; - String LOG_TYPE_INSERT = "新增"; - String LOG_TYPE_DELETE = "删除"; - String LOG_TYPE_UPDATE = "更新"; - String LOG_TYPE_QUERY = "查询"; - //历史浏览相关 - String PATTERN_HISTORY= "历史浏览记录insert失败!传入参数:{0}"; - String PATTERN_BASE = "操作用户:{0}"; - - /** - * 符号 - */ - //分隔符 - String CHARACTOR_SEPARATOR = "-"; - String CHARACTOR_NO = "N"; - - /** - * 线程池名 - */ - //分类构建路径线程 - String THREAD_CATEGORY_BUILD_PATH= "category-path-%d"; - //浏览记录入库线程 - String THREAD_HISTORY_INSERT= "history-insert-%d"; - - /** - * 其他 - */ - //商品排序依据 1 综合排序 2 销量排序 3 价格排序升序 4价格排序降序 - List OTHER_PRUDUCT_ORDER_LIST = Arrays.asList("1","2","3","4"); - - /** - * code - */ - //分类相关失败返回 - Integer CODE_FAIL_4101 = 4101; - //轮播图相关失败返回 - Integer CODE_FAIL_4201 = 4201; - //商品相关失败返回 - Integer CODE_FAIL_4301 = 4301; - //浏览历史相关失败返回 - Integer CODE_FAIL_4401 = 4401; - - - /** - * msg - */ - /** - * 分类相关 - */ - //查询列表时结果为空 - String MSG_CATEGORY_SELECT_NO = "查询的分类表结果为空"; - //没有查询到当前节点的父节点 - String MSG_CATEGORY_PNODE_NO = "没有查询到对应的父节点"; - //inser 影响条数不为1 - String MSG_CATEGORY_INSERT_FAIL = "分类表插入数据失败"; - //inser 成功 - String MSG_CATEGORY_INSERT_OK = "分类表插入数据成功"; - //insert 异常 - String MSG_CATEGORY_INSERT_EXCEPTION = "分类表插入数据时发生异常"; - //update 异常 - String MSG_CATEGORY_UPDATE_EXCEPTION = "分类表更新数据时发生异常"; - //update 影响条数不为1 - String MSG_CATEGORY_UPDATE_FAIL = "分类表更新数据失败"; - //update 更新成功 - String MSG_CATEGORY_UPDATE_OK = "分类表更新数据成功"; - //update 故障节点 - String MSG_CATEGORY_PID_EXCEPTION = "父节点故障"; - //delete 异常 - String MSG_CATEGORY_DELETE_EXCEPTION = "分类表删除数据时发生异常"; - //delete 影响的条数为空 - String MSG_CATEGORY_DELETE_FAIL = "分类表删除数据失败"; - //delete 传的参数为空 - String MSG_CATEGORY_DELETE_NO = "请至少选择一个节点删除"; - //delete 成功 - String MSG_CATEGORY_DELETE_OK = "删除成功"; - - /** - * 商品相关 - */ - //获取所有商品列表(综合排序/销量/价格) - String MSG_GET_ALL_GOODS_NULL = "查询的商品列表为空"; - //获取猜你喜欢商品列表 - String MSG_GET_GUESS_LIKE_GOODS_NULL = "查询的猜你喜欢商品列表为空"; - //获取分类精选商品列表 - String MSG_GET_CLASSFIED_SELECTED_GOODS_NULL = "查询的分类精选商品列表为空"; - //获取某个类别的商品列表 - String MSG_GET_GROUP_GOODS_NULL = "查询当前类别的商品列表为空"; - String MSG_PARAM_INVALID = "非法的请求参数"; - - - /** - * 轮播图相关 - */ - String MSG_GET_CAROUSE_NULL = "查询的轮播图列表为空"; - - /** - * 浏览历史相关 - */ - String MSG_HISTORY_GET_FAIL = "查询所有浏览记录失败"; - String MSG_HISTORY_DELETE_FAIL = "删除指定浏览记录失败"; - String MSG_HISTORY_DELETE_NULL = "删除指定记录成功,影响条数为0"; - String MSG_HISTORY_TRUNK_FAIL = "清空全部浏览浏览记录失败"; - String MSG_HISTORY_TRUNK_NULL = "清空全部浏览记录成功,影响条数为0"; } diff --git a/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java new file mode 100644 index 0000000..998a357 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java @@ -0,0 +1,39 @@ +package com.hxtec.polaris.commons.constant; + +import java.util.Arrays; +import java.util.List; + +/** + * @Describtion 通用的常量,禁止继承 + * @Author yonyong + * @Date 2019/11/26 9:58 + * @Version 1.0.0 + **/ +public final class GlobalVar { + /** + * 禁止实例化 + */ + private GlobalVar(){} + + /** + * 符号 + */ + //分隔符 + public final static String SEPARATOR = "-"; + public final static String NO = "N"; + + /** + * 线程池名 + */ + //分类构建路径线程 + public final static String THREAD_CATEGORY_BUILD_PATH= "category-path-%d"; + //浏览记录入库线程 + public final static String THREAD_HISTORY_INSERT= "history-insert-%d"; + + /** + * 其他 + */ + //商品排序依据 1 综合排序 2 销量排序 3 价格排序升序 4价格排序降序 + public final static List PRUDUCT_ORDER_LIST = Arrays.asList("1","2","3","4"); + public final static String TOURIST = "tourist"; +} diff --git a/src/main/java/com/hxtec/polaris/commons/constant/Log.java b/src/main/java/com/hxtec/polaris/commons/constant/Log.java new file mode 100644 index 0000000..1db48f9 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/commons/constant/Log.java @@ -0,0 +1,28 @@ +package com.hxtec.polaris.commons.constant; + +/** + * @Describtion 日志相关 + * @Author yonyong + * @Date 2019/11/26 9:30 + * @Version 1.0.0 + **/ +public final class Log { + /** + * 禁止实例化 + */ + private Log(){} + /** + * 日志pattern + */ + //pattern + public static final String PATTERN_LOG = "操作类型:{0};操作类名:{1};操作方法:{2};传入参数:{3}"; + //历史浏览相关 + public static final String PATTERN_HISTORY= "历史浏览记录insert失败!传入参数:{0}"; + public static final String PATTERN_BASE = "操作用户:{0}"; + + //type + public static final String INSERT = "新增"; + public static final String DELETE = "删除"; + public static final String UPDATE = "更新"; + public static final String QUERY = "查询"; +} diff --git a/src/main/java/com/hxtec/polaris/commons/constant/Msg.java b/src/main/java/com/hxtec/polaris/commons/constant/Msg.java new file mode 100644 index 0000000..3af11bb --- /dev/null +++ b/src/main/java/com/hxtec/polaris/commons/constant/Msg.java @@ -0,0 +1,72 @@ +package com.hxtec.polaris.commons.constant; + +/** + * @Describtion 消息常量,禁止继承 + * @Author yonyong + * @Date 2019/11/26 9:22 + * @Version 1.0.0 + **/ +public final class Msg { + /** + * 禁止实例化 + */ + private Msg (){} + + /** + * 分类相关 + */ + //查询列表时结果为空 + public static final String CATEGORY_SELECT_NO = "查询的分类表结果为空"; + //没有查询到当前节点的父节点 + public static final String CATEGORY_PNODE_NO = "没有查询到对应的父节点"; + //inser 影响条数不为1 + public static final String CATEGORY_INSERT_FAIL = "分类表插入数据失败"; + //inser 成功 + public static final String CATEGORY_INSERT_OK = "分类表插入数据成功"; + //insert 异常 + public static final String CATEGORY_INSERT_EXCEPTION = "分类表插入数据时发生异常"; + //update 异常 + public static final String CATEGORY_UPDATE_EXCEPTION = "分类表更新数据时发生异常"; + //update 影响条数不为1 + public static final String CATEGORY_UPDATE_FAIL = "分类表更新数据失败"; + //update 更新成功 + public static final String CATEGORY_UPDATE_OK = "分类表更新数据成功"; + //update 故障节点 + public static final String CATEGORY_PID_EXCEPTION = "父节点故障"; + //delete 异常 + public static final String CATEGORY_DELETE_EXCEPTION = "分类表删除数据时发生异常"; + //delete 影响的条数为空 + public static final String CATEGORY_DELETE_FAIL = "分类表删除数据失败"; + //delete 传的参数为空 + public static final String CATEGORY_DELETE_NO = "请至少选择一个节点删除"; + //delete 成功 + public static final String CATEGORY_DELETE_OK = "删除成功"; + + /** + * 商品相关 + */ + //获取所有商品列表(综合排序/销量/价格) + public static final String GET_ALL_GOODS_NULL = "查询的商品列表为空"; + //获取猜你喜欢商品列表 + public static final String GET_GUESS_LIKE_GOODS_NULL = "查询的猜你喜欢商品列表为空"; + //获取分类精选商品列表 + public static final String GET_CLASSFIED_SELECTED_GOODS_NULL = "查询的分类精选商品列表为空"; + //获取某个类别的商品列表 + public static final String GET_GROUP_GOODS_NULL = "查询当前类别的商品列表为空"; + public static final String PARAM_INVALID = "非法的请求参数"; + + + /** + * 轮播图相关 + */ + public static final String GET_CAROUSE_NULL = "查询的轮播图列表为空"; + + /** + * 浏览历史相关 + */ + public static final String HISTORY_GET_FAIL = "查询所有浏览记录失败"; + public static final String HISTORY_DELETE_FAIL = "删除指定浏览记录失败"; + public static final String HISTORY_DELETE_NULL = "删除指定记录成功,影响条数为0"; + public static final String HISTORY_TRUNK_FAIL = "清空全部浏览浏览记录失败"; + public static final String HISTORY_TRUNK_NULL = "清空全部浏览记录成功,影响条数为0"; +} diff --git a/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java b/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java index 7130b33..4e76a0c 100644 --- a/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java +++ b/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java @@ -1,6 +1,6 @@ package com.hxtec.polaris.commons.thread; -import com.hxtec.polaris.commons.constant.CommonConstant; +import com.hxtec.polaris.commons.constant.Log; import com.hxtec.polaris.entity.ShopHistory; import com.hxtec.polaris.mapper.ShopHistoryMapper; import com.hxtec.polaris.service.impl.AddressServiceImpl; @@ -11,6 +11,7 @@ import org.springframework.web.context.support.WebApplicationContextUtils; import javax.servlet.ServletContext; import java.text.MessageFormat; +import java.util.Date; import java.util.concurrent.CountDownLatch; /** @@ -27,7 +28,6 @@ public class HistoryRunable implements Runnable { private ShopHistory history; private ShopHistoryMapper shopHistoryMapper; - private AddressServiceImpl addressServiceImpl; public HistoryRunable(ServletContext context,CountDownLatch doneSignal,ShopHistory history){ this.context = context; @@ -38,15 +38,15 @@ public class HistoryRunable implements Runnable { @Override public void run() { initBean(context); - history.setUsername(addressServiceImpl.getUser()); + history.setTime(new Date()); try{ synchronized (doneSignal){ doneSignal.countDown(); shopHistoryMapper.insert(history); } - doneSignal.wait(); + doneSignal.await(); }catch (Exception e){ - logger.error(MessageFormat.format(CommonConstant.PATTERN_HISTORY,history.toString())); + logger.error(MessageFormat.format(Log.PATTERN_HISTORY,history.toString())); } } @@ -57,6 +57,5 @@ public class HistoryRunable implements Runnable { private void initBean(ServletContext context){ WebApplicationContext webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context); this.shopHistoryMapper = webApplicationContext.getBean(ShopHistoryMapper.class); - this.addressServiceImpl = webApplicationContext.getBean(AddressServiceImpl.class); } } diff --git a/src/main/java/com/hxtec/polaris/service/impl/CarouseServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/CarouseServiceImpl.java index 223950f..bd9e749 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/CarouseServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/CarouseServiceImpl.java @@ -1,7 +1,8 @@ package com.hxtec.polaris.service.impl; import com.hxtec.polaris.commons.api.vo.Result; -import com.hxtec.polaris.commons.constant.CommonConstant; +import com.hxtec.polaris.commons.constant.Code; +import com.hxtec.polaris.commons.constant.Msg; import com.hxtec.polaris.commons.exception.MyException; import com.hxtec.polaris.entity.ShopCarouse; import com.hxtec.polaris.mapper.ShopCarouseMapper; @@ -13,7 +14,7 @@ import javax.annotation.Resource; import java.util.List; /** - * @Describtion Todo + * @Describtion 轮播图相关service * @Author yonyong * @Date 2019/11/14 11:01 * @Version 1.0.0 @@ -31,7 +32,7 @@ public class CarouseServiceImpl implements CarouseService{ if (null != list && list.size()>0){ return Result.ok(list); }else { - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4201,CommonConstant.MSG_GET_CAROUSE_NULL)); + throw new MyException(Result.error(Code.FAIL_4201, Msg.GET_CAROUSE_NULL)); } } } diff --git a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java index 743f320..2e99cd9 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java @@ -2,7 +2,7 @@ package com.hxtec.polaris.service.impl; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.hxtec.polaris.commons.api.vo.Result; -import com.hxtec.polaris.commons.constant.CommonConstant; +import com.hxtec.polaris.commons.constant.*; import com.hxtec.polaris.commons.exception.MyException; import com.hxtec.polaris.commons.thread.BuildPathRunable; import com.hxtec.polaris.commons.utils.GenerateSequenceUtil; @@ -51,24 +51,23 @@ public class CategoryServiceImpl implements CategoryService { return Result.ok(list); }else { //查询失败或查询到的数据为空 - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_SELECT_NO)); + throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_SELECT_NO)); } } @Override public Object addCategory(String pid, String name) { String params = "pid="+pid+",name="+name; - String LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_INSERT, - LOG_CLASS_NAME,LOG_METHOD_ADD_CATORY,params); + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.INSERT,LOG_CLASS_NAME,LOG_METHOD_ADD_CATORY,params); //请求参数不合法 if (!StringUtils.isNumeric(pid)){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID),LOG_MSG); + throw new MyException(Result.error(Code.FAIL_4101,Msg.PARAM_INVALID),LOG_MSG); } //判断数据库中是否有该父节点 ShopCategory parentObject = shopCategoryMapper.selectByPrimaryKey(pid); if (null == parentObject){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_PNODE_NO),LOG_MSG); + throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_PNODE_NO),LOG_MSG); } //实例赋值 ShopCategory shopCategory = setParam(pid,name); @@ -76,65 +75,63 @@ public class CategoryServiceImpl implements CategoryService { try { doAddCategory(shopCategory,parentObject); }catch (Exception e){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_INSERT_EXCEPTION),LOG_MSG); + throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_INSERT_EXCEPTION),LOG_MSG); } logger.info(LOG_MSG); - return Result.ok(CommonConstant.MSG_CATEGORY_INSERT_OK); + return Result.ok(Msg.CATEGORY_INSERT_OK); } @Override public Object deleteCategory(List ids) { String params = "ids="+ids; - String LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_DELETE, - LOG_CLASS_NAME, LOG_METHOD_DEL_CATORY,params); + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.DELETE,LOG_CLASS_NAME, LOG_METHOD_DEL_CATORY,params); //参数为空 if (null == ids || ids.size() == 0){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_NO),LOG_MSG); + throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_DELETE_NO),LOG_MSG); } for (String id : ids){ //参数不合法 if (!StringUtils.isNumeric(id)){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID),LOG_MSG); + throw new MyException(Result.error(Code.FAIL_4101,Msg.PARAM_INVALID),LOG_MSG); } //更新shop_category表 int deletCategoryResult = 0; try{ deletCategoryResult = shopCategoryMapper.deleteCategory(id); }catch (Exception e){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_EXCEPTION),LOG_MSG); + throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_DELETE_EXCEPTION),LOG_MSG); } if (deletCategoryResult < 0){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_DELETE_FAIL),LOG_MSG); + throw new MyException(Result.error(Code.FAIL_4101, Msg.CATEGORY_DELETE_FAIL),LOG_MSG); } } logger.info(LOG_MSG); - return Result.ok(CommonConstant.MSG_CATEGORY_DELETE_OK); + return Result.ok(Msg.CATEGORY_DELETE_OK); } @Override public Object updateCategory(HttpServletRequest request,String pid, String id, String name) { String params = "pid="+pid+",id="+id+",name="+name; - String LOG_MSG = MessageFormat.format(CommonConstant.LOG_PATTERN,CommonConstant.LOG_TYPE_UPDATE, - LOG_CLASS_NAME,LOG_METHOD_UPDATE_CATORY,params); + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.UPDATE,LOG_CLASS_NAME,LOG_METHOD_UPDATE_CATORY,params); if (!StringUtils.isNumeric(pid) || !StringUtils.isNumeric(id) || StringUtils.isBlank(name)){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_PARAM_INVALID),LOG_MSG); + throw new MyException(Result.error(Code.FAIL_4101,Msg.PARAM_INVALID),LOG_MSG); } List tempList = shopCategoryMapper.getCategoryById(pid); - if (null == tempList || tempList.size() ==0 || StringUtils.isBlank(tempList.get(0).getIsDelete()) || !CommonConstant.CHARACTOR_NO.equals(tempList.get(0).getIsDelete())){ + if (null == tempList || tempList.size() ==0 || StringUtils.isBlank(tempList.get(0).getIsDelete()) || !GlobalVar.NO.equals(tempList.get(0).getIsDelete())){ //如果该父节点对应的分类在数据库中没有记录或者删除状态是空或者已删除,则为故障节点,不能进行更新 - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_PID_EXCEPTION),LOG_MSG); + throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_PID_EXCEPTION),LOG_MSG); } //执行更新操作 try { doUpdateShopCategory(request,pid,id,name); }catch (Exception e){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4101,CommonConstant.MSG_CATEGORY_UPDATE_FAIL),LOG_MSG); + throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_UPDATE_FAIL),LOG_MSG); } logger.info(LOG_MSG); - return Result.ok(CommonConstant.MSG_CATEGORY_UPDATE_OK); + return Result.ok(Msg.CATEGORY_UPDATE_OK); } /** @@ -148,9 +145,9 @@ public class CategoryServiceImpl implements CategoryService { //生成id shopCategory.setId(GenerateSequenceUtil.generateSequenceNo()); shopCategory.setParentId(pid); - shopCategory.setIsParent(CommonConstant.CHARACTOR_NO); + shopCategory.setIsParent(GlobalVar.NO); shopCategory.setName(name); - shopCategory.setIsDelete(CommonConstant.CHARACTOR_NO); + shopCategory.setIsDelete(GlobalVar.NO); shopCategory.setCreateTime(new Date()); shopCategory.setUpdateTime(new Date()); return shopCategory; @@ -186,7 +183,7 @@ public class CategoryServiceImpl implements CategoryService { //调用线程,更新path //把当前编辑的节点及其所有子节点挂到新的节点下面,更新路径 // 创建线程池 - ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(CommonConstant.THREAD_CATEGORY_BUILD_PATH).build(); + ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(GlobalVar.THREAD_CATEGORY_BUILD_PATH).build(); ServletContext context = request.getServletContext(); // 计数器 CountDownLatch doneSignal = new CountDownLatch(1); @@ -203,7 +200,7 @@ public class CategoryServiceImpl implements CategoryService { private void doAddCategory(ShopCategory shopCategory,ShopCategory parentObject){ shopCategoryMapper.insertCategory(shopCategory); //构建分类路径 - StringBuilder path = new StringBuilder(CommonConstant.CHARACTOR_SEPARATOR + shopCategory.getId()); + StringBuilder path = new StringBuilder(GlobalVar.SEPARATOR + shopCategory.getId()); path.append(parentObject.getComment1()); shopCategory.setComment1(String.valueOf(path)); //更新路径 diff --git a/src/main/java/com/hxtec/polaris/service/impl/GoodServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/GoodServiceImpl.java index 0e6beb0..f15c5ec 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/GoodServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/GoodServiceImpl.java @@ -1,19 +1,18 @@ package com.hxtec.polaris.service.impl; import com.hxtec.polaris.commons.api.vo.Result; -import com.hxtec.polaris.commons.constant.CommonConstant; +import com.hxtec.polaris.commons.constant.Code; +import com.hxtec.polaris.commons.constant.GlobalVar; +import com.hxtec.polaris.commons.constant.Msg; import com.hxtec.polaris.commons.dto.Page; import com.hxtec.polaris.commons.exception.MyException; import com.hxtec.polaris.mapper.ShopProductBaseMapper; import com.hxtec.polaris.service.GoodService; import org.apache.commons.lang3.StringUtils; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.lang.reflect.Method; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -41,7 +40,7 @@ public class GoodServiceImpl implements GoodService{ return Result.ok(mapList); }else { //查询失败或查询到的数据为空 - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_GET_ALL_GOODS_NULL)); + throw new MyException(Result.error(Code.FAIL_4301, Msg.GET_ALL_GOODS_NULL)); } } @@ -49,7 +48,7 @@ public class GoodServiceImpl implements GoodService{ public Object getGuessLikeGoods(String page, String rows,String order) { //如果是非法的请求 if (!ifParamsValid(page,rows,null,order)){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_PARAM_INVALID)); + throw new MyException(Result.error(Code.FAIL_4301,Msg.PARAM_INVALID)); } Integer start = getFormatInt(page,rows,true); Integer size = getFormatInt(page,rows,false); @@ -58,7 +57,7 @@ public class GoodServiceImpl implements GoodService{ return Result.ok(mapList); }else { //查询失败或查询到的数据为空 - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_GET_GUESS_LIKE_GOODS_NULL)); + throw new MyException(Result.error(Code.FAIL_4301,Msg.GET_GUESS_LIKE_GOODS_NULL)); } } @@ -71,7 +70,7 @@ public class GoodServiceImpl implements GoodService{ return Result.ok(mapList); }else { //查询失败或查询到的数据为空 - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_GET_CLASSFIED_SELECTED_GOODS_NULL)); + throw new MyException(Result.error(Code.FAIL_4301,Msg.GET_CLASSFIED_SELECTED_GOODS_NULL)); } } @@ -79,7 +78,7 @@ public class GoodServiceImpl implements GoodService{ public Object getTargrtGroupGoods(String page, String rows,String cid,String order) { //如果是非法的请求 if (!ifParamsValid(page,rows,cid,order)){ - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_PARAM_INVALID)); + throw new MyException(Result.error(Code.FAIL_4301,Msg.PARAM_INVALID)); } Integer start = (Integer.valueOf(page)-1)*Integer.valueOf(rows); List> mapList = shopProductBaseMapper.getTargrtGroupGoods(start,Integer.valueOf(rows),cid,order); @@ -90,7 +89,7 @@ public class GoodServiceImpl implements GoodService{ return Result.ok(page1,mapList); }else { //查询失败或查询到的数据为空 - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4301,CommonConstant.MSG_GET_GROUP_GOODS_NULL)); + throw new MyException(Result.error(Code.FAIL_4301,Msg.GET_GROUP_GOODS_NULL)); } } @@ -130,13 +129,13 @@ public class GoodServiceImpl implements GoodService{ if (!StringUtils.isNumeric(cid)||!StringUtils.isNumeric(order)){ return false; } - if (CommonConstant.OTHER_PRUDUCT_ORDER_LIST.indexOf(order)<0){ + if (GlobalVar.PRUDUCT_ORDER_LIST.indexOf(order)<0){ return false; } } //如果是猜你喜欢下的方法调用 if (METHOD_GUESS_LIKE_NAME.equals(shiftMethod)){ - if (!StringUtils.isNumeric(order) || CommonConstant.OTHER_PRUDUCT_ORDER_LIST.indexOf(order)<0){ + if (!StringUtils.isNumeric(order) || GlobalVar.PRUDUCT_ORDER_LIST.indexOf(order)<0){ return false; } } diff --git a/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java index 647a6e6..a946c47 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java @@ -2,7 +2,7 @@ package com.hxtec.polaris.service.impl; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.hxtec.polaris.commons.api.vo.Result; -import com.hxtec.polaris.commons.constant.CommonConstant; +import com.hxtec.polaris.commons.constant.*; import com.hxtec.polaris.commons.exception.MyException; import com.hxtec.polaris.commons.thread.HistoryRunable; import com.hxtec.polaris.entity.ShopHistory; @@ -21,7 +21,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadFactory; /** - * @Describtion 历史记录相关 + * @Describtion 历史记录相关service * @Author yonyong * @Date 2019/11/25 16:45 * @Version 1.0.0 @@ -41,8 +41,8 @@ public class HistoryServiceImpl implements HistoryService{ List> mapList = shopHistoryMapper.getAllHistory(addressService.getUser()); return Result.ok(mapList); }catch (Exception e){ - String LOG_MSG = MessageFormat.format(CommonConstant.PATTERN_BASE,addressService.getUser()); - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4401,CommonConstant.MSG_HISTORY_GET_FAIL),LOG_MSG); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,addressService.getUser()); + throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_GET_FAIL),LOG_MSG); } } @@ -51,7 +51,8 @@ public class HistoryServiceImpl implements HistoryService{ //调用线程,更新path //把当前编辑的节点及其所有子节点挂到新的节点下面,更新路径 // 创建线程池 - ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(CommonConstant.THREAD_HISTORY_INSERT).build(); + shopHistory.setUsername(addressService.getUser()); + ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(GlobalVar.THREAD_HISTORY_INSERT).build(); ServletContext context = request.getServletContext(); // 计数器 CountDownLatch doneSignal = new CountDownLatch(1); @@ -64,13 +65,13 @@ public class HistoryServiceImpl implements HistoryService{ try { int result = shopHistoryMapper.delete(shopHistory.getId()); if (1 != result){ - String LOG_MSG = MessageFormat.format(CommonConstant.PATTERN_BASE,addressService.getUser()); - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4401,CommonConstant.MSG_HISTORY_DELETE_NULL),LOG_MSG); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,addressService.getUser()); + throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_DELETE_NULL),LOG_MSG); } return Result.ok(); }catch (Exception e){ - String LOG_MSG = MessageFormat.format(CommonConstant.PATTERN_BASE,addressService.getUser()); - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4401,CommonConstant.MSG_HISTORY_DELETE_FAIL),LOG_MSG); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,addressService.getUser()); + throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_DELETE_FAIL),LOG_MSG); } } @@ -78,14 +79,14 @@ public class HistoryServiceImpl implements HistoryService{ public Object deleteAll() { try { int result = shopHistoryMapper.deleteAll(addressService.getUser()); - if (1 != result){ - String LOG_MSG = MessageFormat.format(CommonConstant.PATTERN_BASE,addressService.getUser()); - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4401,CommonConstant.MSG_HISTORY_TRUNK_NULL),LOG_MSG); + if (1 > result){ + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,addressService.getUser()); + throw new MyException(Result.error(Code.FAIL_4401, Msg.HISTORY_TRUNK_NULL),LOG_MSG); } return Result.ok(); }catch (Exception e){ - String LOG_MSG = MessageFormat.format(CommonConstant.PATTERN_BASE,addressService.getUser()); - throw new MyException(Result.error(CommonConstant.CODE_FAIL_4401,CommonConstant.MSG_HISTORY_TRUNK_FAIL),LOG_MSG); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,addressService.getUser()); + throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_TRUNK_FAIL),LOG_MSG); } } } diff --git a/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java b/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java index 4de1e39..a4ed7ae 100644 --- a/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java +++ b/src/test/java/com/hxtec/polaris/com/hxtec/polaris/service/CategoryServiceTest.java @@ -1,6 +1,6 @@ package com.hxtec.polaris.com.hxtec.polaris.service; -import com.hxtec.polaris.commons.constant.CommonConstant; +import com.hxtec.polaris.commons.constant.GlobalVar; import com.hxtec.polaris.entity.ShopCategory; import com.hxtec.polaris.mapper.ShopCategoryMapper; import com.hxtec.polaris.service.CategoryService; @@ -32,7 +32,7 @@ public class CategoryServiceTest { // Object object = categoryService.buildTree("0","0"); // System.out.println(object); Example shopCategoryExample = new Example(ShopCategory.class); - shopCategoryExample.createCriteria().andEqualTo("isDelete", CommonConstant.CHARACTOR_NO) + shopCategoryExample.createCriteria().andEqualTo("isDelete", GlobalVar.NO) .andEqualTo("parentId",null) .andEqualTo("id",null); //查询表category获取对应的数据 -- Gitee From a6d47e2ee4b2d2f4334b16da6ff7d73edfe99e86 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Wed, 27 Nov 2019 18:00:59 +0800 Subject: [PATCH 08/36] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E3=80=82=E3=80=82?= =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82=E3=80=82=E3=80=82=E3=80=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/thread/HistoryRunable.java | 1 - .../polaris/controller/OrderController.java | 62 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/hxtec/polaris/controller/OrderController.java diff --git a/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java b/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java index 4e76a0c..06dfbdf 100644 --- a/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java +++ b/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java @@ -3,7 +3,6 @@ package com.hxtec.polaris.commons.thread; import com.hxtec.polaris.commons.constant.Log; import com.hxtec.polaris.entity.ShopHistory; import com.hxtec.polaris.mapper.ShopHistoryMapper; -import com.hxtec.polaris.service.impl.AddressServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.context.WebApplicationContext; diff --git a/src/main/java/com/hxtec/polaris/controller/OrderController.java b/src/main/java/com/hxtec/polaris/controller/OrderController.java new file mode 100644 index 0000000..492990a --- /dev/null +++ b/src/main/java/com/hxtec/polaris/controller/OrderController.java @@ -0,0 +1,62 @@ +package com.hxtec.polaris.controller; + +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +/** + * @Describtion 订单相关 + * @Author yonyong + * @Date 2019/11/27 9:24 + * @Version 1.0.0 + **/ +@RestController +@RequestMapping(value = "order",produces = "application/json;charset=utf-8") +@CrossOrigin +@Api(value = "/order", tags = "订单相关") +public class OrderController { + + @GetMapping("getAll") + public Object getAll(){ + return null; + } + + @GetMapping("getToPay") + public Object getToPay(){ + return null; + } + + @GetMapping("getToTransport") + public Object getToTransport(){ + return null; + } + + @GetMapping("getToRate") + public Object getToRate(){ + return null; + } + + @GetMapping("getAfterSale") + public Object getAfterSale(){ + return null; + } + + @PostMapping("cancel") + public Object cancelOrder(){ + return null; + } + + @DeleteMapping("delete") + public Object deleteOrder(){ + return null; + } + + @PostMapping("pay") + public Object payOrder(){ + return null; + } + + @PostMapping("receive") + public Object confirmReceive(){ + return null; + } +} -- Gitee From 599819ebe24e1d37270d409673ae6797052502db Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Mon, 2 Dec 2019 19:12:27 +0800 Subject: [PATCH 09/36] =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82=E3=80=82?= =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82=E3=80=82=E3=80=82=E3=80=82=E3=80=82?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../polaris/controller/CarouseController.java | 11 ++++----- .../controller/CategoryController.java | 18 +++++++-------- .../polaris/controller/GoodsController.java | 23 ++++++++----------- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/hxtec/polaris/controller/CarouseController.java b/src/main/java/com/hxtec/polaris/controller/CarouseController.java index 1e36b7c..e32ecf2 100644 --- a/src/main/java/com/hxtec/polaris/controller/CarouseController.java +++ b/src/main/java/com/hxtec/polaris/controller/CarouseController.java @@ -4,10 +4,7 @@ import com.hxtec.polaris.service.CarouseService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * @Describtion 轮播图相关 @@ -16,7 +13,7 @@ import org.springframework.web.bind.annotation.RestController; * @Version 1.0.0 **/ @RestController -@RequestMapping("carouse") +@RequestMapping(value = "carouse",produces = "application/json;charset=utf-8") @CrossOrigin @Api(value = "/carouse", tags = "轮播图") public class CarouseController { @@ -28,8 +25,8 @@ public class CarouseController { * 首页页面 获取轮播图数据 * @return */ - @ApiOperation(value = "获取轮播图列表") - @RequestMapping(value = "getAll", method = RequestMethod.GET,produces = "application/json;charset=utf-8") + @ApiOperation("获取轮播图列表") + @GetMapping("getAll") public Object getAll(){ return carouseService.getAll(); } diff --git a/src/main/java/com/hxtec/polaris/controller/CategoryController.java b/src/main/java/com/hxtec/polaris/controller/CategoryController.java index 26b83d7..dbfd53e 100644 --- a/src/main/java/com/hxtec/polaris/controller/CategoryController.java +++ b/src/main/java/com/hxtec/polaris/controller/CategoryController.java @@ -18,7 +18,7 @@ import java.util.List; * @Version 1.0.0 **/ @RestController -@RequestMapping("category") +@RequestMapping(value = "category",produces = "application/json;charset=utf-8") @CrossOrigin @Api(value = "/category", tags = "分类相关") public class CategoryController { @@ -30,8 +30,8 @@ public class CategoryController { * 分类页面 获取所有分类数据 * @return */ - @ApiOperation(value = "获取商品分类列表") - @RequestMapping(value = "getAll", method = RequestMethod.GET,produces = "application/json;charset=utf-8") + @ApiOperation("获取商品分类列表") + @GetMapping("getAll") public Object getAllCategory(){ return categoryService.getAllCategory(); } @@ -40,12 +40,12 @@ public class CategoryController { * 分类相关 添加分类节点 * @return */ - @ApiOperation(value = "添加商品分类") + @ApiOperation("添加商品分类") @ApiImplicitParams({ @ApiImplicitParam(name = "pid", value = "父节点id", required = false, dataType = "String"), @ApiImplicitParam(name = "name", value = "添加的节点名", required = false, dataType = "String") }) - @RequestMapping(value = "add", method = RequestMethod.POST,produces = "application/json;charset=utf-8") + @PostMapping("add") public Object addCategory(String pid,String name){ return categoryService.addCategory(pid,name); } @@ -54,11 +54,11 @@ public class CategoryController { * 分类相关 删除分类节点 * @return */ - @ApiOperation(value = "删除商品分类") + @ApiOperation("删除商品分类") @ApiImplicitParams({ @ApiImplicitParam(name = "ids[]", value = "删除的节点集合", required = false,allowMultiple=true, dataType = "String") }) - @RequestMapping(value = "delete", method = RequestMethod.DELETE,produces = "application/json;charset=utf-8") + @DeleteMapping("delete") public Object deleteCategory(@RequestParam("ids[]") List ids){ return categoryService.deleteCategory(ids); } @@ -67,13 +67,13 @@ public class CategoryController { * 分类相关 更新分类节点 * @return */ - @ApiOperation(value = "更新商品分类") + @ApiOperation("更新商品分类") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "编辑的节点id", required = false, dataType = "String"), @ApiImplicitParam(name = "pid", value = "当前节点编辑后的父节点id", required = false, dataType = "String"), @ApiImplicitParam(name = "name", value = "当前节点编辑后的节点名", required = false, dataType = "String"), }) - @RequestMapping(value = "update", method = RequestMethod.PUT,produces = "application/json;charset=utf-8") + @PutMapping("update") public Object updateCategory(HttpServletRequest request,String id, String pid, String name){ return categoryService.updateCategory(request,pid,id,name); } diff --git a/src/main/java/com/hxtec/polaris/controller/GoodsController.java b/src/main/java/com/hxtec/polaris/controller/GoodsController.java index 1e13235..79c22af 100644 --- a/src/main/java/com/hxtec/polaris/controller/GoodsController.java +++ b/src/main/java/com/hxtec/polaris/controller/GoodsController.java @@ -6,10 +6,7 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * @Describtion 商品相关 @@ -18,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController; * @Version 1.0.0 **/ @RestController -@RequestMapping("goods") +@RequestMapping(value = "goods",produces = "application/json;charset=utf-8") @CrossOrigin @Api(value = "/goods", tags = "商品相关") public class GoodsController { @@ -30,13 +27,13 @@ public class GoodsController { * 获取商品列表 * @return */ - @ApiOperation(value = "获取商品列表") + @ApiOperation("获取商品列表") @ApiImplicitParams({ @ApiImplicitParam(name = "page", value = "起始页", required = false, dataType = "String"), @ApiImplicitParam(name = "rows", value = "查询条数", required = false, dataType = "String"), @ApiImplicitParam(name = "order", value = "排序条件", required = false, dataType = "String"), }) - @RequestMapping(value = "getAll", method = RequestMethod.GET,produces = "application/json;charset=utf-8") + @GetMapping("getAll") public Object getAllGoods(String page,String rows,String order){ return goodService.getAllGoods(page,rows,order); } @@ -45,13 +42,13 @@ public class GoodsController { * 获取猜你喜欢数据 * @return */ - @ApiOperation(value = "获取猜你喜欢商品列表") + @ApiOperation("获取猜你喜欢商品列表") @ApiImplicitParams({ @ApiImplicitParam(name = "page", value = "起始页", required = false, dataType = "String"), @ApiImplicitParam(name = "rows", value = "查询条数", required = false, dataType = "String"), @ApiImplicitParam(name = "order", value = "排序条件", required = false, dataType = "String"), }) - @RequestMapping(value = "getLike", method = RequestMethod.GET,produces = "application/json;charset=utf-8") + @GetMapping("getLike") public Object getLikeGoods(String page,String rows,String order){ return goodService.getGuessLikeGoods(page,rows,order); } @@ -60,12 +57,12 @@ public class GoodsController { * 获取分类精选数据 * @return */ - @ApiOperation(value = "获取分类精选商品列表") + @ApiOperation("获取分类精选商品列表") @ApiImplicitParams({ @ApiImplicitParam(name = "page", value = "起始页", required = false, dataType = "String"), @ApiImplicitParam(name = "rows", value = "查询条数", required = false, dataType = "String") }) - @RequestMapping(value = "getGroupSelect", method = RequestMethod.GET,produces = "application/json;charset=utf-8") + @GetMapping("getGroupSelect") public Object getGroupSelect(String page,String rows){ return goodService.getClassifiedSelectGoods(page,rows); } @@ -74,14 +71,14 @@ public class GoodsController { * 获取某个分类下的商品列表 * @return */ - @ApiOperation(value = "获取某个分类下的商品列表") + @ApiOperation("获取某个分类下的商品列表") @ApiImplicitParams({ @ApiImplicitParam(name = "page", value = "起始页", required = false, dataType = "String"), @ApiImplicitParam(name = "rows", value = "查询条数", required = false, dataType = "String"), @ApiImplicitParam(name = "cid", value = "分类id", required = false, dataType = "String"), @ApiImplicitParam(name = "order", value = "排序条件", required = false, dataType = "String"), }) - @RequestMapping(value = "getGroup", method = RequestMethod.GET,produces = "application/json;charset=utf-8") + @GetMapping("getGroup") public Object getGroup(String page,String rows,String cid,String order){ return goodService.getTargrtGroupGoods(page,rows,cid,order); } -- Gitee From d2b40ee5f92d6a8919fe7e02d2b051a7d1369bf1 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Tue, 3 Dec 2019 11:49:46 +0800 Subject: [PATCH 10/36] =?UTF-8?q?=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../polaris/commons/constant/GlobalVar.java | 2 + .../commons/thread/HistoryRunable.java | 38 ++++++++++++++++++- .../polaris/controller/HistoryController.java | 4 ++ .../polaris/mapper/ShopHistoryMapper.java | 28 ++++++++++++++ .../resources/mapper/ShopHistoryMapper.xml | 29 ++++++++++++++ 5 files changed, 99 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java index 998a357..b778e80 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java @@ -36,4 +36,6 @@ public final class GlobalVar { //商品排序依据 1 综合排序 2 销量排序 3 价格排序升序 4价格排序降序 public final static List PRUDUCT_ORDER_LIST = Arrays.asList("1","2","3","4"); public final static String TOURIST = "tourist"; + //历史记录保存条数 + public final static int HISTORY_ROWS = 30; } diff --git a/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java b/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java index 06dfbdf..9ab6866 100644 --- a/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java +++ b/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java @@ -1,16 +1,21 @@ package com.hxtec.polaris.commons.thread; +import com.hxtec.polaris.commons.api.vo.Result; +import com.hxtec.polaris.commons.constant.GlobalVar; import com.hxtec.polaris.commons.constant.Log; +import com.hxtec.polaris.commons.exception.MyException; import com.hxtec.polaris.entity.ShopHistory; import com.hxtec.polaris.mapper.ShopHistoryMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import javax.servlet.ServletContext; import java.text.MessageFormat; import java.util.Date; +import java.util.List; import java.util.concurrent.CountDownLatch; /** @@ -19,6 +24,7 @@ import java.util.concurrent.CountDownLatch; * @Date 2019/11/25 15:55 * @Version 1.0.0 **/ +@Transactional public class HistoryRunable implements Runnable { private final static Logger logger = LoggerFactory.getLogger(BuildPathRunable.class); @@ -41,11 +47,14 @@ public class HistoryRunable implements Runnable { try{ synchronized (doneSignal){ doneSignal.countDown(); - shopHistoryMapper.insert(history); + //执行新增,判断库中是否已存在当前用户对应商品的记录 + doInsert(); + //如果历史记录超过30,删除该用户的30条之前的历史记录 + doDelete(); } doneSignal.await(); }catch (Exception e){ - logger.error(MessageFormat.format(Log.PATTERN_HISTORY,history.toString())); + throw new MyException(Result.error(MessageFormat.format(Log.PATTERN_HISTORY,history.toString()))); } } @@ -57,4 +66,29 @@ public class HistoryRunable implements Runnable { WebApplicationContext webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context); this.shopHistoryMapper = webApplicationContext.getBean(ShopHistoryMapper.class); } + + /** + * 执行insert + */ + private void doInsert(){ + int count = shopHistoryMapper.getCountBySkuAndUserName(history.getSku(),history.getUsername()); + if (count > 0){ + //如果数据库中对应用户已经有该条记录,将该浏览记录的时间和图片更新 + shopHistoryMapper.updateRows(history); + }else { + //如果数据库中对应用户没有该浏览记录,执行新增 + shopHistoryMapper.insert(history); + } + } + + /** + * 如果历史记录超过30,删除该用户的30条之前的历史记录 + */ + private void doDelete(){ + int count = shopHistoryMapper.getCountByUsername(history.getUsername()); + if (count > GlobalVar.HISTORY_ROWS){ + //如果历史记录超过30,删除该用户的30条之前的历史记录 + shopHistoryMapper.deleteOverRowsByUsername(GlobalVar.HISTORY_ROWS,history.getUsername()); + } + } } diff --git a/src/main/java/com/hxtec/polaris/controller/HistoryController.java b/src/main/java/com/hxtec/polaris/controller/HistoryController.java index 80d2690..e927fb6 100644 --- a/src/main/java/com/hxtec/polaris/controller/HistoryController.java +++ b/src/main/java/com/hxtec/polaris/controller/HistoryController.java @@ -23,6 +23,10 @@ public class HistoryController { @Autowired private HistoryService historyService; + /** + * 上限30条,只取最新10条 + * @return + */ @GetMapping("get") public Object getAll(){ return historyService.getAll(); diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java index f5aaa54..7d53b7e 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java @@ -34,4 +34,32 @@ public interface ShopHistoryMapper { * @return */ List> getAllHistory(@Param("username") String username); + + /** + * 根据用户名获取数据库中的历史记录条数 + */ + int getCountByUsername(@Param("username") String username); + + /** + * 如果库中当前用户的历史记录超过指定的条数,删除该用户的30条之前的历史记录 + * @param max + * @param username + * @return + */ + int deleteOverRowsByUsername(@Param("max")int max,@Param("username") String username); + + /** + * 判断数据库中当前用户是否已经有过该sku的浏览记录 + * @param sku + * @param username + * @return + */ + int getCountBySkuAndUserName(@Param("sku")String sku,@Param("username") String username); + + /** + * 如果已经有该sku的记录,则不再执行insert,执行uppdate,更新时间和图片 + * @param shopHistory + * @return + */ + int updateRows(ShopHistory shopHistory); } \ No newline at end of file diff --git a/src/main/resources/mapper/ShopHistoryMapper.xml b/src/main/resources/mapper/ShopHistoryMapper.xml index c0faac2..800d1d4 100644 --- a/src/main/resources/mapper/ShopHistoryMapper.xml +++ b/src/main/resources/mapper/ShopHistoryMapper.xml @@ -23,10 +23,25 @@ from shop_history WHERE username = #{username} + group by sku ORDER BY time DESC limit 0,10 + + + + delete from shop_history where id = #{id,jdbcType=INTEGER} @@ -99,4 +114,18 @@ + + DELETE + FROM + shop_history + WHERE + id IN ( SELECT id FROM ( SELECT id FROM shop_history WHERE username = #{username} ORDER BY time DESC LIMIT #{max}, 100 ) a ) + + + + update shop_history + set time = #{time,jdbcType=TIMESTAMP},img = #{img,jdbcType=VARCHAR} + where username = #{username} and sku = #{sku} + + \ No newline at end of file -- Gitee From 21b177668cec84d804d3507a32ed5a379a139ad1 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Tue, 3 Dec 2019 17:54:20 +0800 Subject: [PATCH 11/36] =?UTF-8?q?=E5=9C=B0=E5=9D=80=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=EF=BC=9B=E9=BB=98=E8=AE=A4=E6=94=B6=E8=B4=A7=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 + .../hxtec/polaris/commons/constant/Code.java | 2 + .../hxtec/polaris/commons/constant/Msg.java | 8 + .../commons/thread/HistoryRunable.java | 4 +- .../controller/LocationController.java | 50 ++++++ .../polaris/controller/OrderController.java | 15 +- .../com/hxtec/polaris/entity/ShopAddress.java | 18 ++ .../polaris/mapper/ShopAddressMapper.java | 80 +++++++++ .../polaris/service/LocationService.java | 38 +++++ .../hxtec/polaris/service/OrderService.java | 40 +++++ .../service/impl/LocationServiceImpl.java | 160 ++++++++++++++++++ .../service/impl/OrderServiceImpl.java | 40 +++++ .../resources/mapper/ShopAddressMapper.xml | 70 ++++++++ .../resources/mapper/ShopCategoryMapper.xml | 4 +- 14 files changed, 526 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/hxtec/polaris/controller/LocationController.java create mode 100644 src/main/java/com/hxtec/polaris/service/LocationService.java create mode 100644 src/main/java/com/hxtec/polaris/service/OrderService.java create mode 100644 src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java create mode 100644 src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java diff --git a/README.md b/README.md index 93ad7ee..a1894d5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,9 @@ shop_category comment1字段用作当前分类的路径 shop_carouse comment字段用作当前轮播图绑定的商品spu 123231231412 ``` +##### 2019/12/3 16:42 by yonyong +``` +shop_category 主键改为int,自增 +shop_address 表comment1字段用作收货地址联系人,comment2字段用作收货地址联系电话 +shop_address weight字段用作判断收货地址是否为默认收货地址,1为是,其他则不是 +``` diff --git a/src/main/java/com/hxtec/polaris/commons/constant/Code.java b/src/main/java/com/hxtec/polaris/commons/constant/Code.java index 348653c..07d10d5 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/Code.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/Code.java @@ -20,4 +20,6 @@ public final class Code { public final static Integer FAIL_4301 = 4301; //浏览历史相关失败返回 public final static Integer FAIL_4401 = 4401; + //地址相关失败返回 + public final static Integer FAIL_4501 = 4501; } diff --git a/src/main/java/com/hxtec/polaris/commons/constant/Msg.java b/src/main/java/com/hxtec/polaris/commons/constant/Msg.java index 3af11bb..9c81cfe 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/Msg.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/Msg.java @@ -69,4 +69,12 @@ public final class Msg { public static final String HISTORY_DELETE_NULL = "删除指定记录成功,影响条数为0"; public static final String HISTORY_TRUNK_FAIL = "清空全部浏览浏览记录失败"; public static final String HISTORY_TRUNK_NULL = "清空全部浏览记录成功,影响条数为0"; + + /** + * 通用 + */ + public static final String COMMON_FAIL = "操作失败"; + public static final String COMMON_QUERY_NULL = "查询结果为空"; + public static final String COMMON_OK = "操作成功"; + } diff --git a/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java b/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java index 9ab6866..223eaad 100644 --- a/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java +++ b/src/main/java/com/hxtec/polaris/commons/thread/HistoryRunable.java @@ -3,6 +3,7 @@ package com.hxtec.polaris.commons.thread; import com.hxtec.polaris.commons.api.vo.Result; import com.hxtec.polaris.commons.constant.GlobalVar; import com.hxtec.polaris.commons.constant.Log; +import com.hxtec.polaris.commons.constant.Msg; import com.hxtec.polaris.commons.exception.MyException; import com.hxtec.polaris.entity.ShopHistory; import com.hxtec.polaris.mapper.ShopHistoryMapper; @@ -15,7 +16,6 @@ import org.springframework.web.context.support.WebApplicationContextUtils; import javax.servlet.ServletContext; import java.text.MessageFormat; import java.util.Date; -import java.util.List; import java.util.concurrent.CountDownLatch; /** @@ -54,7 +54,7 @@ public class HistoryRunable implements Runnable { } doneSignal.await(); }catch (Exception e){ - throw new MyException(Result.error(MessageFormat.format(Log.PATTERN_HISTORY,history.toString()))); + throw new MyException(Result.error(Msg.COMMON_FAIL),MessageFormat.format(Log.PATTERN_HISTORY,history.toString())); } } diff --git a/src/main/java/com/hxtec/polaris/controller/LocationController.java b/src/main/java/com/hxtec/polaris/controller/LocationController.java new file mode 100644 index 0000000..fe113ec --- /dev/null +++ b/src/main/java/com/hxtec/polaris/controller/LocationController.java @@ -0,0 +1,50 @@ +package com.hxtec.polaris.controller; + +import com.hxtec.polaris.entity.ShopAddress; +import com.hxtec.polaris.service.LocationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @Describtion 地址相关 + * @Author yonyong + * @Date 2019/12/3 15:25 + * @Version 1.0.0 + **/ +@RestController +@RequestMapping(value = "location",produces = "application/json;charset=utf-8") +@CrossOrigin +@Api(value = "/location", tags = "地址相关") +public class LocationController { + + @Autowired + private LocationService locationService; + + @GetMapping("get") + public Object getLoaction(){ + return locationService.getLoaction(); + } + + @PostMapping("add") + public Object addLoaction(ShopAddress shopAddress){ + return locationService.addLoaction(shopAddress); + } + + @PutMapping("update") + public Object updateLoaction(ShopAddress shopAddress){ + return locationService.updateLoaction(shopAddress); + } + + @ApiImplicitParams({ + @ApiImplicitParam(name = "ids[]", value = "删除的地址集合",allowMultiple=true, dataType = "String") + }) + @DeleteMapping("delete") + public Object deleteLoaction(@RequestParam("ids[]") List ids){ + return locationService.deleteLoaction(ids); + } +} diff --git a/src/main/java/com/hxtec/polaris/controller/OrderController.java b/src/main/java/com/hxtec/polaris/controller/OrderController.java index 492990a..f1369f7 100644 --- a/src/main/java/com/hxtec/polaris/controller/OrderController.java +++ b/src/main/java/com/hxtec/polaris/controller/OrderController.java @@ -1,6 +1,8 @@ package com.hxtec.polaris.controller; +import com.hxtec.polaris.service.OrderService; import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** @@ -15,29 +17,32 @@ import org.springframework.web.bind.annotation.*; @Api(value = "/order", tags = "订单相关") public class OrderController { + @Autowired + private OrderService orderService; + @GetMapping("getAll") public Object getAll(){ - return null; + return orderService.getAll(); } @GetMapping("getToPay") public Object getToPay(){ - return null; + return orderService.getToPay(); } @GetMapping("getToTransport") public Object getToTransport(){ - return null; + return orderService.getToTransport(); } @GetMapping("getToRate") public Object getToRate(){ - return null; + return orderService.getToRate(); } @GetMapping("getAfterSale") public Object getAfterSale(){ - return null; + return orderService.getAfterSale(); } @PostMapping("cancel") diff --git a/src/main/java/com/hxtec/polaris/entity/ShopAddress.java b/src/main/java/com/hxtec/polaris/entity/ShopAddress.java index 0668cf6..090d777 100644 --- a/src/main/java/com/hxtec/polaris/entity/ShopAddress.java +++ b/src/main/java/com/hxtec/polaris/entity/ShopAddress.java @@ -285,4 +285,22 @@ public class ShopAddress { public void setComment3(String comment3) { this.comment3 = comment3; } + + @Override + public String toString() { + return "ShopAddress{" + + "id=" + id + + ", userId='" + userId + '\'' + + ", province='" + province + '\'' + + ", city='" + city + '\'' + + ", region='" + region + '\'' + + ", detail='" + detail + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", weight=" + weight + + ", comment1='" + comment1 + '\'' + + ", comment2='" + comment2 + '\'' + + ", comment3='" + comment3 + '\'' + + '}'; + } } \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java index 0885a85..08df527 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java @@ -1,7 +1,87 @@ package com.hxtec.polaris.mapper; import com.hxtec.polaris.entity.ShopAddress; +import org.apache.ibatis.annotations.Param; import tk.mybatis.mapper.MyMapper; +import java.util.List; +import java.util.Map; +/** + * @Author yonyong + * @Description //TODO + * @Date 2019/12/3 16:30 + * @Param + * @return + **/ public interface ShopAddressMapper extends MyMapper { + + /** + * 根据手机号获取用户的所有收获地址 + * @param username + * @return + */ + List> getLocationByUsername(@Param("username") String username); + + /** + * 根据手机号获取用户的userid + * @param username + * @return + */ + String getUserIdByUsername(@Param("username") String username); + + /** + * 添加收货地址 + * @param shopAddress + * @return + */ + int insertLocation(ShopAddress shopAddress); + + /** + * 更新收货地址 + * @param shopAddress + * @return + */ + int updateLocation(ShopAddress shopAddress); + + /** + * 删除一条收货地址 + * @param id + * @return + */ + int deleteLocation(@Param("id") String id); + + /** + * 将当前用户的其他的收货地址改为非默认状态 + * @param username + * @param id + */ + void updateDefaultLocation(@Param("username")String username, @Param("id")Integer id); + + /** + * 根据手机号获取用户的所有收获地址的个数 + * @param username + * @return + */ + int selectCountByUsername(@Param("username")String username); + + /** + * 根据手机号获取用户的默认收获地址的个数 + * @param username + * @return + */ + int selectDefaultCountByUsername(@Param("username")String username); + + /** + * 根据手机号获取用户最新的收货地址 + * @param username + * @return + */ + ShopAddress getFrstLocationByUsername(@Param("username")String username); + + /** + * 更新指定id的收货地址的默认状态 1 为默认其他为非默认收货地址 + * @param shopAddress + * @return + */ + int updateDefaultState(ShopAddress shopAddress); } \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/service/LocationService.java b/src/main/java/com/hxtec/polaris/service/LocationService.java new file mode 100644 index 0000000..427dba7 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/service/LocationService.java @@ -0,0 +1,38 @@ +package com.hxtec.polaris.service; + +import com.hxtec.polaris.entity.ShopAddress; + +import java.util.List; + +/** + * @Author yonyong + * @Description //地址相关service + * @Date 2019/12/3 15:33 + * @Param + * @return + **/ +public interface LocationService { + /** + * 获取对应用户的配置地址 + * @return + */ + Object getLoaction(); + + /** + * 添加对应用户的配置地址 + * @return + */ + Object addLoaction(ShopAddress shopAddress); + + /** + * 更新对应用户的配置地址 + * @return + */ + Object updateLoaction(ShopAddress shopAddress); + + /** + * 删除对应用户的配置地址 + * @return + */ + Object deleteLoaction(List ids); +} diff --git a/src/main/java/com/hxtec/polaris/service/OrderService.java b/src/main/java/com/hxtec/polaris/service/OrderService.java new file mode 100644 index 0000000..547ddde --- /dev/null +++ b/src/main/java/com/hxtec/polaris/service/OrderService.java @@ -0,0 +1,40 @@ +package com.hxtec.polaris.service; + +/** + * @Author yonyong + * @Description //订单相关service + * @Date 2019/12/3 14:49 + * @Param + * @return + **/ +public interface OrderService { + /** + * 获取所有订单 + * @return + */ + Object getAll(); + + /** + * 获取待付款订单 + * @return + */ + Object getToPay(); + + /** + * 获取待收获订单 + * @return + */ + Object getToTransport(); + + /** + * 获取待评价订单 + * @return + */ + Object getToRate(); + + /** + * 获取售后订单 + * @return + */ + Object getAfterSale(); +} diff --git a/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java new file mode 100644 index 0000000..45d239c --- /dev/null +++ b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java @@ -0,0 +1,160 @@ +package com.hxtec.polaris.service.impl; + +import com.hxtec.polaris.commons.api.vo.Result; +import com.hxtec.polaris.commons.constant.Code; +import com.hxtec.polaris.commons.constant.Log; +import com.hxtec.polaris.commons.constant.Msg; +import com.hxtec.polaris.commons.exception.MyException; +import com.hxtec.polaris.entity.ShopAddress; +import com.hxtec.polaris.mapper.ShopAddressMapper; +import com.hxtec.polaris.service.LocationService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * @Describtion 地址相关service + * @Author yonyong + * @Date 2019/12/3 15:32 + * @Version 1.0.0 + **/ +@Service +@Transactional +public class LocationServiceImpl implements LocationService { + + private final static Logger logger = LoggerFactory.getLogger(LocationServiceImpl.class); + private final static String LOG_CLASS_NAME = "LocationServiceImpl"; + private final static String LOG_METHOD_ADD_LOCATION = "addLoaction"; + private final static String LOG_METHOD_DEL_LOCATION = "deleteLoaction"; + private final static String LOG_METHOD_UPDATE_LOCATION ="updateLoaction"; + + @Resource + private ShopAddressMapper shopAddressMapper; + @Resource + private AddressServiceImpl addressService; + + @Override + public Object getLoaction() { + List> mapList = shopAddressMapper.getLocationByUsername( addressService.getUser()); + if (mapList.size()>0){ + return Result.ok(mapList); + }else { + throw new MyException(Result.error(Code.FAIL_4501, Msg.COMMON_QUERY_NULL)); + } + } + + @Override + public Object addLoaction(ShopAddress shopAddress) { + try { + doInsert(shopAddress); + }catch (Exception e){ + String params = "shopAddress="+shopAddress.toString(); + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.INSERT,LOG_CLASS_NAME,LOG_METHOD_ADD_LOCATION,params); + throw new MyException(Result.error(Code.FAIL_4501,Msg.COMMON_FAIL),LOG_MSG); + } + return Result.ok(Msg.COMMON_OK); + } + + @Override + public Object updateLoaction(ShopAddress shopAddress) { + try { + doUpdate(shopAddress); + }catch (Exception e){ + String params = "shopAddress="+shopAddress.toString(); + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.UPDATE,LOG_CLASS_NAME,LOG_METHOD_UPDATE_LOCATION,params); + throw new MyException(Result.error(Code.FAIL_4501,Msg.COMMON_FAIL),LOG_MSG); + } + return Result.ok(Msg.COMMON_OK); + } + + @Override + public Object deleteLoaction(List ids) { + try { + doDelete(ids); + }catch (Exception e){ + String params = "ids="+ids; + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.DELETE,LOG_CLASS_NAME,LOG_METHOD_DEL_LOCATION,params); + throw new MyException(Result.error(Code.FAIL_4501,Msg.COMMON_FAIL),LOG_MSG); + } + return Result.ok(Msg.COMMON_OK); + } + + /** + * 执行添加收货地址业务 + * @param shopAddress + */ + private void doInsert(ShopAddress shopAddress) { + //查询数据库中当前用户设置了几条收货地址,如果是第一次添加收货地址,则该地址为默认收货地址 + int count = shopAddressMapper.selectCountByUsername(addressService.getUser()); + if (count == 0){ + shopAddress.setWeight(1.0); + } + String userId = shopAddressMapper.getUserIdByUsername(addressService.getUser()); + shopAddress.setUserId(userId); + shopAddress.setCreateTime(new Date()); + shopAddress.setUpdateTime(new Date()); + shopAddressMapper.insertLocation(shopAddress); + + if (count > 0){ + //修正默认状态 + updateDefaultAddress(shopAddress); + } + } + + /** + * 执行更新收货地址业务 + * @param shopAddress + */ + private void doUpdate(ShopAddress shopAddress) { + //查询数据库中当前用户设置了几条收货地址,如果是第一次添加收货地址,即使用户取消修改了默认地址,该地址仍然为默认收货地址 + int count = shopAddressMapper.selectCountByUsername(addressService.getUser()); + if (count == 1){ + shopAddress.setWeight(1.0); + } + shopAddress.setUpdateTime(new Date()); + shopAddressMapper.updateLocation(shopAddress); + + if (count > 1){ + //修正默认状态 + updateDefaultAddress(shopAddress); + } + } + + /** + * 执行删除收货地址业务 + * @param ids + */ + private void doDelete(List ids) { + for (String id: ids) { + shopAddressMapper.deleteLocation(id); + } + //如果把默认地址删除掉了,则默认第一条为默认收货地址 + int count = shopAddressMapper.selectDefaultCountByUsername(addressService.getUser()); + if (count !=1){ + ShopAddress shopAddress = shopAddressMapper.getFrstLocationByUsername(addressService.getUser()); + //如果shopAddress不为空,则表明数据库中还有当前用户的收货地址,将查询出的这个地址设置为默认收货地址 + if (null != shopAddress){ + shopAddress.setWeight(1.0); + shopAddressMapper.updateDefaultState(shopAddress); + } + } + } + + /** + * 如果当前操作的的收货地址状态为默认的,则将当前用户的其他地址状态改为非默认,改为0 + * @param shopAddress + */ + private void updateDefaultAddress(ShopAddress shopAddress){ + String username =addressService.getUser(); + if (null != shopAddress.getWeight() && shopAddress.getWeight() == 1){ + shopAddressMapper.updateDefaultLocation(username,shopAddress.getId()); + } + } +} diff --git a/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..2e6c147 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java @@ -0,0 +1,40 @@ +package com.hxtec.polaris.service.impl; + +import com.hxtec.polaris.service.OrderService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @Describtion 订单相关service + * @Author yonyong + * @Date 2019/12/3 14:48 + * @Version 1.0.0 + **/ +@Service +@Transactional +public class OrderServiceImpl implements OrderService{ + @Override + public Object getAll() { + return null; + } + + @Override + public Object getToPay() { + return null; + } + + @Override + public Object getToTransport() { + return null; + } + + @Override + public Object getToRate() { + return null; + } + + @Override + public Object getAfterSale() { + return null; + } +} diff --git a/src/main/resources/mapper/ShopAddressMapper.xml b/src/main/resources/mapper/ShopAddressMapper.xml index 32fa12e..10b0c37 100644 --- a/src/main/resources/mapper/ShopAddressMapper.xml +++ b/src/main/resources/mapper/ShopAddressMapper.xml @@ -18,4 +18,74 @@ + + a.id, a.user_id,a.region, a.detail,a.weight,a.comment1,a.comment2 + + + + + + + + + + + + insert into shop_address (user_id, region, detail,create_time, update_time, weight,comment1,comment2) + values (#{userId,jdbcType=VARCHAR}, #{region,jdbcType=VARCHAR}, #{detail,jdbcType=VARCHAR}, + #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{weight,jdbcType=VARCHAR}, + #{comment1,jdbcType=VARCHAR},#{comment2,jdbcType=VARCHAR} + ) + + + + update shop_address set comment1=#{comment1,jdbcType=VARCHAR}, comment2=#{comment2,jdbcType=VARCHAR},region =#{region,jdbcType=VARCHAR}, + detail = #{detail,jdbcType=VARCHAR},update_time = #{updateTime,jdbcType=TIMESTAMP},weight = #{weight,jdbcType=VARCHAR} + where id = #{id,jdbcType=INTEGER} + + + + UPDATE shop_address set weight = 0 + WHERE id != #{id} and user_id in ( + select id from shop_user where mobile = #{username} + ) + + + + delete from shop_address where id = #{id} + + + + + + UPDATE set weight = #{weight,jdbcType=VARCHAR} + where id = #{id,jdbcType=INTEGER} + \ No newline at end of file diff --git a/src/main/resources/mapper/ShopCategoryMapper.xml b/src/main/resources/mapper/ShopCategoryMapper.xml index d988283..f0deae7 100644 --- a/src/main/resources/mapper/ShopCategoryMapper.xml +++ b/src/main/resources/mapper/ShopCategoryMapper.xml @@ -40,13 +40,13 @@ - insert into shop_category (id, parent_id, is_parent, + insert into shop_category (parent_id, is_parent, name, decriptsion, image, weight, goods_count, state, is_delete, create_time, update_time, comment1, comment2, comment3 ) - values (#{id,jdbcType=VARCHAR}, #{parentId,jdbcType=VARCHAR}, #{isParent,jdbcType=VARCHAR}, + values (#{parentId,jdbcType=VARCHAR}, #{isParent,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{decriptsion,jdbcType=VARCHAR}, #{image,jdbcType=VARCHAR}, #{weight,jdbcType=DOUBLE}, #{goodsCount,jdbcType=INTEGER}, #{state,jdbcType=VARCHAR}, #{isDelete,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, -- Gitee From 6f1acc07d5d58d5c61bf6d2976d5b500552888c1 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Wed, 4 Dec 2019 15:50:23 +0800 Subject: [PATCH 12/36] =?UTF-8?q?=E5=8F=96=E6=B6=88=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E4=BF=AE=E6=AD=A3=E9=BB=98=E8=AE=A4=E6=94=B6?= =?UTF-8?q?=E8=B4=A7=E5=9C=B0=E5=9D=80=EF=BC=8C=E7=94=B1=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=87=AA=E5=B7=B1=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/LocationController.java | 6 ++-- .../service/impl/LocationServiceImpl.java | 31 +++---------------- .../resources/mapper/ShopAddressMapper.xml | 2 +- 3 files changed, 9 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/hxtec/polaris/controller/LocationController.java b/src/main/java/com/hxtec/polaris/controller/LocationController.java index fe113ec..9ee9b0c 100644 --- a/src/main/java/com/hxtec/polaris/controller/LocationController.java +++ b/src/main/java/com/hxtec/polaris/controller/LocationController.java @@ -8,6 +8,7 @@ import io.swagger.annotations.ApiImplicitParams; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; import java.util.List; /** @@ -44,7 +45,8 @@ public class LocationController { @ApiImplicitParam(name = "ids[]", value = "删除的地址集合",allowMultiple=true, dataType = "String") }) @DeleteMapping("delete") - public Object deleteLoaction(@RequestParam("ids[]") List ids){ - return locationService.deleteLoaction(ids); + public Object deleteLoaction(String ids){ + List list = Arrays.asList(ids.split(",")); + return locationService.deleteLoaction(list); } } diff --git a/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java index 45d239c..50cd217 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java @@ -92,20 +92,14 @@ public class LocationServiceImpl implements LocationService { */ private void doInsert(ShopAddress shopAddress) { //查询数据库中当前用户设置了几条收货地址,如果是第一次添加收货地址,则该地址为默认收货地址 - int count = shopAddressMapper.selectCountByUsername(addressService.getUser()); - if (count == 0){ - shopAddress.setWeight(1.0); - } String userId = shopAddressMapper.getUserIdByUsername(addressService.getUser()); shopAddress.setUserId(userId); shopAddress.setCreateTime(new Date()); shopAddress.setUpdateTime(new Date()); shopAddressMapper.insertLocation(shopAddress); - if (count > 0){ - //修正默认状态 - updateDefaultAddress(shopAddress); - } + //修正默认状态 + updateDefaultAddress(shopAddress); } /** @@ -113,18 +107,11 @@ public class LocationServiceImpl implements LocationService { * @param shopAddress */ private void doUpdate(ShopAddress shopAddress) { - //查询数据库中当前用户设置了几条收货地址,如果是第一次添加收货地址,即使用户取消修改了默认地址,该地址仍然为默认收货地址 - int count = shopAddressMapper.selectCountByUsername(addressService.getUser()); - if (count == 1){ - shopAddress.setWeight(1.0); - } shopAddress.setUpdateTime(new Date()); shopAddressMapper.updateLocation(shopAddress); - if (count > 1){ - //修正默认状态 - updateDefaultAddress(shopAddress); - } + //修正默认状态 + updateDefaultAddress(shopAddress); } /** @@ -135,16 +122,6 @@ public class LocationServiceImpl implements LocationService { for (String id: ids) { shopAddressMapper.deleteLocation(id); } - //如果把默认地址删除掉了,则默认第一条为默认收货地址 - int count = shopAddressMapper.selectDefaultCountByUsername(addressService.getUser()); - if (count !=1){ - ShopAddress shopAddress = shopAddressMapper.getFrstLocationByUsername(addressService.getUser()); - //如果shopAddress不为空,则表明数据库中还有当前用户的收货地址,将查询出的这个地址设置为默认收货地址 - if (null != shopAddress){ - shopAddress.setWeight(1.0); - shopAddressMapper.updateDefaultState(shopAddress); - } - } } /** diff --git a/src/main/resources/mapper/ShopAddressMapper.xml b/src/main/resources/mapper/ShopAddressMapper.xml index 10b0c37..45b44b2 100644 --- a/src/main/resources/mapper/ShopAddressMapper.xml +++ b/src/main/resources/mapper/ShopAddressMapper.xml @@ -85,7 +85,7 @@ - UPDATE set weight = #{weight,jdbcType=VARCHAR} + UPDATE shop_address set weight = #{weight,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} \ No newline at end of file -- Gitee From 2fb47fce251f2058f789399da8b1a8346f7bfae3 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Wed, 4 Dec 2019 17:24:27 +0800 Subject: [PATCH 13/36] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=94=B6=E8=B4=A7=E5=9C=B0=E5=9D=80=EF=BC=8C=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=EF=BC=8C=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=A1=B5=E7=94=A8=E6=88=B7=E8=87=AA=E8=A1=8C=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../polaris/controller/LocationController.java | 5 +++++ .../polaris/mapper/ShopAddressMapper.java | 14 ++++++++++++++ .../hxtec/polaris/service/LocationService.java | 6 ++++++ .../service/impl/LocationServiceImpl.java | 18 ++++++++++++++++++ .../resources/mapper/ShopAddressMapper.xml | 18 ++++++++++++++++++ 5 files changed, 61 insertions(+) diff --git a/src/main/java/com/hxtec/polaris/controller/LocationController.java b/src/main/java/com/hxtec/polaris/controller/LocationController.java index 9ee9b0c..56ce09a 100644 --- a/src/main/java/com/hxtec/polaris/controller/LocationController.java +++ b/src/main/java/com/hxtec/polaris/controller/LocationController.java @@ -49,4 +49,9 @@ public class LocationController { List list = Arrays.asList(ids.split(",")); return locationService.deleteLoaction(list); } + + @GetMapping("getDefault") + public Object getDefaultLocation(){ + return locationService.getDefaultLocation(); + } } diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java index 08df527..3a95089 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java @@ -84,4 +84,18 @@ public interface ShopAddressMapper extends MyMapper { * @return */ int updateDefaultState(ShopAddress shopAddress); + + /** + * 根据用户名获取默认收货地址 + * @param username + * @return + */ + Map selectDefaultByUsername(@Param("username") String username); + + /** + * 根据用户名获取默认收货地址,当没有默认地址的情况下 + * @param username + * @return + */ + Map getDefaultWhenNoDefaultByUsername(@Param("username") String username); } \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/service/LocationService.java b/src/main/java/com/hxtec/polaris/service/LocationService.java index 427dba7..8f1059d 100644 --- a/src/main/java/com/hxtec/polaris/service/LocationService.java +++ b/src/main/java/com/hxtec/polaris/service/LocationService.java @@ -35,4 +35,10 @@ public interface LocationService { * @return */ Object deleteLoaction(List ids); + + /** + * 获取当前用户的默认收货地址 + * @return + */ + Object getDefaultLocation(); } diff --git a/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java index 50cd217..dc60875 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.text.MessageFormat; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -86,6 +87,23 @@ public class LocationServiceImpl implements LocationService { return Result.ok(Msg.COMMON_OK); } + @Override + public Object getDefaultLocation() { + Map map = new HashMap<>(16); + try { + int count = shopAddressMapper.selectDefaultCountByUsername(addressService.getUser()); + if (count > 0){ + map = shopAddressMapper.selectDefaultByUsername(addressService.getUser()); + }else { + //没有设置默认地址让用户自己设置 + //map = shopAddressMapper.getDefaultWhenNoDefaultByUsername(addressService.getUser()); + } + }catch (Exception e){ + throw new MyException(Result.error(Code.FAIL_4501,Msg.COMMON_QUERY_NULL)); + } + return Result.ok(map); + } + /** * 执行添加收货地址业务 * @param shopAddress diff --git a/src/main/resources/mapper/ShopAddressMapper.xml b/src/main/resources/mapper/ShopAddressMapper.xml index 45b44b2..23c5079 100644 --- a/src/main/resources/mapper/ShopAddressMapper.xml +++ b/src/main/resources/mapper/ShopAddressMapper.xml @@ -43,6 +43,15 @@ WHERE u.mobile = #{username} and a.weight = 1 + + + select + + from shop_address a left join shop_user u on a.user_id = u.id + WHERE u.mobile = #{username} + order by a.update_time desc + limit 0,1 + \ No newline at end of file -- Gitee From cf3f1122514dddaa69bb45d5aa9f08f32dbf519c Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Wed, 4 Dec 2019 22:06:49 +0800 Subject: [PATCH 14/36] =?UTF-8?q?=E6=B2=A1=E6=9C=89=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=9C=B0=E5=9D=80=E9=BB=98=E8=AE=A4=E5=8F=96?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E4=B8=80=E6=9D=A1=E4=BD=9C=E4=B8=BA=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=B1=95=E7=A4=BA=E7=9A=84=E6=94=B6=E8=B4=A7=E5=9C=B0?= =?UTF-8?q?=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hxtec/polaris/service/impl/LocationServiceImpl.java | 4 ++-- src/main/resources/mapper/ShopAddressMapper.xml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java index dc60875..f101549 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java @@ -95,8 +95,8 @@ public class LocationServiceImpl implements LocationService { if (count > 0){ map = shopAddressMapper.selectDefaultByUsername(addressService.getUser()); }else { - //没有设置默认地址让用户自己设置 - //map = shopAddressMapper.getDefaultWhenNoDefaultByUsername(addressService.getUser()); + //没有设置默认地址默认取最新一条作为订单展示的收货地址 + map = shopAddressMapper.getDefaultWhenNoDefaultByUsername(addressService.getUser()); } }catch (Exception e){ throw new MyException(Result.error(Code.FAIL_4501,Msg.COMMON_QUERY_NULL)); diff --git a/src/main/resources/mapper/ShopAddressMapper.xml b/src/main/resources/mapper/ShopAddressMapper.xml index 23c5079..42f0e98 100644 --- a/src/main/resources/mapper/ShopAddressMapper.xml +++ b/src/main/resources/mapper/ShopAddressMapper.xml @@ -27,6 +27,7 @@ from shop_address a left join shop_user u on a.user_id = u.id WHERE u.mobile = #{username} + order by a.update_time desc + + + + \ No newline at end of file -- Gitee From 05a58cfdfb5f2e6ee2b0a2306a31cc359b7f0c09 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Fri, 13 Dec 2019 11:54:32 +0800 Subject: [PATCH 16/36] =?UTF-8?q?=E5=8E=BB=E9=99=A4addressController?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=EF=BC=8C=E8=AE=A2=E5=8D=95=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++ .../hxtec/polaris/commons/constant/Code.java | 2 + .../controller/AddredssController.java | 47 -------------- .../polaris/controller/OrderController.java | 26 +------- .../hxtec/polaris/mapper/ShopOrderMapper.java | 31 +++++++++ .../hxtec/polaris/service/AddressService.java | 15 ----- .../hxtec/polaris/service/OrderService.java | 30 ++------- .../hxtec/polaris/service/UserService.java | 6 ++ .../service/impl/AddressServiceImpl.java | 57 ----------------- .../service/impl/HistoryServiceImpl.java | 19 +++--- .../service/impl/LocationServiceImpl.java | 19 +++--- .../service/impl/OrderServiceImpl.java | 63 +++++++++++++------ .../service/impl/PaymentServiceImpl.java | 3 +- .../polaris/service/impl/UserServiceImpl.java | 5 ++ src/main/resources/mapper/ShopOrderMapper.xml | 12 ++++ 15 files changed, 133 insertions(+), 207 deletions(-) delete mode 100644 src/main/java/com/hxtec/polaris/controller/AddredssController.java delete mode 100644 src/main/java/com/hxtec/polaris/service/AddressService.java delete mode 100644 src/main/java/com/hxtec/polaris/service/impl/AddressServiceImpl.java diff --git a/README.md b/README.md index a1894d5..c2f39b6 100644 --- a/README.md +++ b/README.md @@ -15,3 +15,8 @@ shop_category 主键改为int,自增 shop_address 表comment1字段用作收货地址联系人,comment2字段用作收货地址联系电话 shop_address weight字段用作判断收货地址是否为默认收货地址,1为是,其他则不是 ``` +##### 2019/12/13 09:39 by yonyong +```html +订单状态 order表state字段 +state 0 全部订单 1 待付款订单 2待收货订单 3待评价订单 4 售后订单 +``` diff --git a/src/main/java/com/hxtec/polaris/commons/constant/Code.java b/src/main/java/com/hxtec/polaris/commons/constant/Code.java index 07d10d5..1ef134f 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/Code.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/Code.java @@ -22,4 +22,6 @@ public final class Code { public final static Integer FAIL_4401 = 4401; //地址相关失败返回 public final static Integer FAIL_4501 = 4501; + //订单相关失败返回 + public final static Integer FAIL_4601 = 4601; } diff --git a/src/main/java/com/hxtec/polaris/controller/AddredssController.java b/src/main/java/com/hxtec/polaris/controller/AddredssController.java deleted file mode 100644 index 3ccd6a7..0000000 --- a/src/main/java/com/hxtec/polaris/controller/AddredssController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.hxtec.polaris.controller; - -import com.hxtec.polaris.entity.ShopAddress; -import com.hxtec.polaris.service.AddressService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * @Author Marcus lv - * @create 2019/11/17 5:23 下午 - */ -@RestController -@RequestMapping("address") -@Api(value = "/address", tags = "地址") -public class AddredssController { - @Autowired - private AddressService addressService; - - - @GetMapping - @ApiOperation(value = "获取当前用户收货地址") - public List get(){ - return addressService.getOne(); - } - - @PostMapping - @ApiOperation(value = "修改收货地址") - public int modify(@RequestBody ShopAddress address){ - return addressService.modify(address); - } - - - @PutMapping - @ApiOperation(value = "增加收货地址") - public int create(@RequestBody ShopAddress address){ - return addressService.create(address); - } - @DeleteMapping - @ApiOperation(value = "删除收获地址") - public int delete(int id){ - return addressService.delete(id); - } -} diff --git a/src/main/java/com/hxtec/polaris/controller/OrderController.java b/src/main/java/com/hxtec/polaris/controller/OrderController.java index 6c9ce4e..31c1310 100644 --- a/src/main/java/com/hxtec/polaris/controller/OrderController.java +++ b/src/main/java/com/hxtec/polaris/controller/OrderController.java @@ -30,30 +30,8 @@ public class OrderController { @Autowired private OrderService orderService; - @GetMapping("getAll") - public Object getAll(){ - return orderService.getAll(); - } - - @GetMapping("getToPay") - public Object getToPay(){ - return orderService.getToPay(); - } - - @GetMapping("getToTransport") - public Object getToTransport(){ - return orderService.getToTransport(); - } - - @GetMapping("getToRate") - public Object getToRate(){ - return orderService.getToRate(); - } - - @GetMapping("getAfterSale") - public Object getAfterSale(){ - return orderService.getAfterSale(); - } + @GetMapping("getOrder") + public Object getOrder(Integer state, Integer pageNow, Integer rows){ return orderService.getOrder(state,pageNow,rows); } @PostMapping("cancel") public Object cancelOrder(){ diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java index c40ac54..63bb0c5 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java @@ -1,7 +1,38 @@ package com.hxtec.polaris.mapper; import com.hxtec.polaris.entity.ShopOrder; +import org.apache.ibatis.annotations.Param; import tk.mybatis.mapper.MyMapper; +import java.util.List; +import java.util.Map; + public interface ShopOrderMapper extends MyMapper { + + /** + * 获取订单数量 + * @param userAccount + * @param state + * @return + */ + Integer getOrderCount(@Param("phone") String userAccount,@Param("state") Integer state); + + /** + * 获取订单信息 + * @param userAccount + * @param state + * @param start + * @param rows + * @return + */ + List> getOrder(@Param("phone") String userAccount,@Param("state") Integer state, @Param("start") Integer start, @Param("rows") Integer rows); + + /** + * 获取一条订单对应的商品详情信息 + * @param userAccount + * @param orderId + * @return + */ + List> getOrderItemsByOneOrder(@Param("phone") String userAccount,@Param("orderId") Integer orderId); + } \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/service/AddressService.java b/src/main/java/com/hxtec/polaris/service/AddressService.java deleted file mode 100644 index 18a15af..0000000 --- a/src/main/java/com/hxtec/polaris/service/AddressService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.hxtec.polaris.service; - -import com.hxtec.polaris.entity.ShopAddress; - -import java.util.List; - -public interface AddressService { - int modify(ShopAddress address); - - int create(ShopAddress address); - - List getOne(); - - int delete(int id); -} diff --git a/src/main/java/com/hxtec/polaris/service/OrderService.java b/src/main/java/com/hxtec/polaris/service/OrderService.java index ce0569b..f757741 100644 --- a/src/main/java/com/hxtec/polaris/service/OrderService.java +++ b/src/main/java/com/hxtec/polaris/service/OrderService.java @@ -14,35 +14,13 @@ import java.util.Optional; * @return **/ public interface OrderService { - /** - * 获取所有订单 - * @return - */ - Object getAll(); - - /** - * 获取待付款订单 - * @return - */ - Object getToPay(); - - /** - * 获取待收获订单 - * @return - */ - Object getToTransport(); - - /** - * 获取待评价订单 - * @return - */ - Object getToRate(); /** - * 获取售后订单 + * 根据条件获取订单 + * state 0 全部订单 1 待付款订单 2待收货订单 3待评价订单 4 售后订单 * @return */ - Object getAfterSale(); + Object getOrder(Integer state, Integer pageNow, Integer rows); /** * 提交订单 @@ -51,5 +29,5 @@ public interface OrderService { */ Map submitOrder(ShopAddress shopAddress); - Optional getOne(String orderId); +// Optional getOne(String orderId); } diff --git a/src/main/java/com/hxtec/polaris/service/UserService.java b/src/main/java/com/hxtec/polaris/service/UserService.java index b4496c0..3caf7ac 100644 --- a/src/main/java/com/hxtec/polaris/service/UserService.java +++ b/src/main/java/com/hxtec/polaris/service/UserService.java @@ -13,4 +13,10 @@ public interface UserService { void bind(String openid); ShopUser getUserInfoByPhone(String phone); + + /** + * 获取当前登录用户手机号 + * @return + */ + String getUserPhonenumber(); } diff --git a/src/main/java/com/hxtec/polaris/service/impl/AddressServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/AddressServiceImpl.java deleted file mode 100644 index 005b755..0000000 --- a/src/main/java/com/hxtec/polaris/service/impl/AddressServiceImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.hxtec.polaris.service.impl; - -import com.hxtec.polaris.entity.ShopAddress; -import com.hxtec.polaris.mapper.ShopAddressMapper; -import com.hxtec.polaris.mapper.ShopUserMapper; -import com.hxtec.polaris.service.AddressService; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Service; -import tk.mybatis.mapper.entity.Example; - -import javax.annotation.Resource; -import java.util.Calendar; -import java.util.List; - -/** - * @author C - */ -@Service -public class AddressServiceImpl implements AddressService { - @Resource - private ShopAddressMapper addressMapper; - @Resource - private ShopUserMapper shopUserMapper; - private Calendar calendar= Calendar.getInstance(); - @Override - public int modify(ShopAddress address) { - address.setUpdateTime(calendar.getTime()); - address.setUserId(null); - return addressMapper.updateByPrimaryKeySelective(address); - } - - @Override - public int create(ShopAddress address) { - String user=getUser(); - address.setUserId(user); - address.setCreateTime(calendar.getTime()); - address.setUpdateTime(calendar.getTime()); - return addressMapper.insert(address); - } - - @Override - public List getOne() { - String user=getUser(); - Example example=new Example(ShopAddress.class); - example.createCriteria().andEqualTo("userId",user); - return addressMapper.selectByExample(example); - } - - @Override - public int delete(int id) { - return addressMapper.deleteByPrimaryKey(id); - } - - public String getUser(){ - return SecurityContextHolder.getContext().getAuthentication().getName(); - } -} diff --git a/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java index a946c47..061b3c4 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java @@ -8,6 +8,7 @@ import com.hxtec.polaris.commons.thread.HistoryRunable; import com.hxtec.polaris.entity.ShopHistory; import com.hxtec.polaris.mapper.ShopHistoryMapper; import com.hxtec.polaris.service.HistoryService; +import com.hxtec.polaris.service.UserService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -33,15 +34,15 @@ public class HistoryServiceImpl implements HistoryService{ @Resource private ShopHistoryMapper shopHistoryMapper; @Resource - private AddressServiceImpl addressService; + private UserService userService; @Override public Object getAll() { try { - List> mapList = shopHistoryMapper.getAllHistory(addressService.getUser()); + List> mapList = shopHistoryMapper.getAllHistory(userService.getUserPhonenumber()); return Result.ok(mapList); }catch (Exception e){ - String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,addressService.getUser()); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserPhonenumber()); throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_GET_FAIL),LOG_MSG); } } @@ -51,7 +52,7 @@ public class HistoryServiceImpl implements HistoryService{ //调用线程,更新path //把当前编辑的节点及其所有子节点挂到新的节点下面,更新路径 // 创建线程池 - shopHistory.setUsername(addressService.getUser()); + shopHistory.setUsername(userService.getUserPhonenumber()); ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(GlobalVar.THREAD_HISTORY_INSERT).build(); ServletContext context = request.getServletContext(); // 计数器 @@ -65,12 +66,12 @@ public class HistoryServiceImpl implements HistoryService{ try { int result = shopHistoryMapper.delete(shopHistory.getId()); if (1 != result){ - String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,addressService.getUser()); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserPhonenumber()); throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_DELETE_NULL),LOG_MSG); } return Result.ok(); }catch (Exception e){ - String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,addressService.getUser()); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserPhonenumber()); throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_DELETE_FAIL),LOG_MSG); } } @@ -78,14 +79,14 @@ public class HistoryServiceImpl implements HistoryService{ @Override public Object deleteAll() { try { - int result = shopHistoryMapper.deleteAll(addressService.getUser()); + int result = shopHistoryMapper.deleteAll(userService.getUserPhonenumber()); if (1 > result){ - String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,addressService.getUser()); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserPhonenumber()); throw new MyException(Result.error(Code.FAIL_4401, Msg.HISTORY_TRUNK_NULL),LOG_MSG); } return Result.ok(); }catch (Exception e){ - String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,addressService.getUser()); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserPhonenumber()); throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_TRUNK_FAIL),LOG_MSG); } } diff --git a/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java index 2e8be0d..990f6cf 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java @@ -8,6 +8,7 @@ import com.hxtec.polaris.commons.exception.MyException; import com.hxtec.polaris.entity.ShopAddress; import com.hxtec.polaris.mapper.ShopAddressMapper; import com.hxtec.polaris.service.LocationService; +import com.hxtec.polaris.service.UserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -39,11 +40,11 @@ public class LocationServiceImpl implements LocationService { @Resource private ShopAddressMapper shopAddressMapper; @Resource - private AddressServiceImpl addressService; + private UserService userService; @Override public Object getLoaction() { - List> mapList = shopAddressMapper.getLocationByUsername( addressService.getUser()); + List> mapList = shopAddressMapper.getLocationByUsername( userService.getUserPhonenumber()); if (mapList.size()>0){ return Result.ok(mapList); }else { @@ -91,12 +92,12 @@ public class LocationServiceImpl implements LocationService { public Object getDefaultLocation() { Map map = new HashMap<>(16); try { - int count = shopAddressMapper.selectDefaultCountByUsername(addressService.getUser()); + int count = shopAddressMapper.selectDefaultCountByUsername(userService.getUserPhonenumber()); if (count > 0){ - map = shopAddressMapper.selectDefaultByUsername(addressService.getUser()); + map = shopAddressMapper.selectDefaultByUsername(userService.getUserPhonenumber()); }else { //没有设置默认地址默认取最新一条作为订单展示的收货地址 - map = shopAddressMapper.getDefaultWhenNoDefaultByUsername(addressService.getUser()); + map = shopAddressMapper.getDefaultWhenNoDefaultByUsername(userService.getUserPhonenumber()); } }catch (Exception e){ throw new MyException(Result.error(Code.FAIL_4501,Msg.COMMON_QUERY_NULL)); @@ -107,10 +108,10 @@ public class LocationServiceImpl implements LocationService { @Override public Object checkLocation(ShopAddress shopAddress) { try{ - int count = shopAddressMapper.getLocationCountByIdAndUserName(shopAddress.getId(),addressService.getUser()); + int count = shopAddressMapper.getLocationCountByIdAndUserName(shopAddress.getId(),userService.getUserPhonenumber()); if (count>0){ //如果数据库中有该id,以防被编辑,从数据库中查出该记录到页面展示 - Map map = shopAddressMapper.getLocationByIdAndUserName(shopAddress.getId(),addressService.getUser()); + Map map = shopAddressMapper.getLocationByIdAndUserName(shopAddress.getId(),userService.getUserPhonenumber()); return Result.ok(map); }else { //如果数据库中没有该id则证明已被删除,展示最新的一条 @@ -127,7 +128,7 @@ public class LocationServiceImpl implements LocationService { */ private void doInsert(ShopAddress shopAddress) { //查询数据库中当前用户设置了几条收货地址,如果是第一次添加收货地址,则该地址为默认收货地址 - String userId = shopAddressMapper.getUserIdByUsername(addressService.getUser()); + String userId = shopAddressMapper.getUserIdByUsername(userService.getUserPhonenumber()); shopAddress.setUserId(userId); shopAddress.setCreateTime(new Date()); shopAddress.setUpdateTime(new Date()); @@ -164,7 +165,7 @@ public class LocationServiceImpl implements LocationService { * @param shopAddress */ private void updateDefaultAddress(ShopAddress shopAddress){ - String username =addressService.getUser(); + String username =userService.getUserPhonenumber(); if (null != shopAddress.getWeight() && shopAddress.getWeight() == 1){ shopAddressMapper.updateDefaultLocation(username,shopAddress.getId()); } diff --git a/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java index 3bdc7b1..b1fe7db 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java @@ -1,6 +1,12 @@ package com.hxtec.polaris.service.impl; +import com.hxtec.polaris.commons.api.vo.Result; +import com.hxtec.polaris.commons.constant.Code; +import com.hxtec.polaris.commons.constant.Log; +import com.hxtec.polaris.commons.constant.Msg; import com.hxtec.polaris.commons.contants.CommonContants; +import com.hxtec.polaris.commons.dto.Page; +import com.hxtec.polaris.commons.exception.MyException; import com.hxtec.polaris.entity.ShopAddress; import com.hxtec.polaris.entity.ShopCartItem; import com.hxtec.polaris.entity.ShopOrder; @@ -22,6 +28,7 @@ import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; import java.math.BigDecimal; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -37,6 +44,10 @@ import java.util.Map; @Service @Transactional public class OrderServiceImpl implements OrderService{ + + private final static String LOG_CLASS_NAME = "OrderServiceImpl"; + private final static String LOG_METHOD_GET_ORDER = "getOrder"; + @Resource private ShopOrderItemMapper shopOrderItemMapper; @Resource @@ -54,28 +65,42 @@ public class OrderServiceImpl implements OrderService{ private ShopProductVariantMapper productVariantMapper; @Override - public Object getAll() { - return null; - } - - @Override - public Object getToPay() { - return null; - } - - @Override - public Object getToTransport() { - return null; + public Object getOrder(Integer state, Integer pageNow, Integer rows) { + //state 0 全部订单 1 待付款订单 2待收货订单 3待评价订单 4 售后订单 + try { + return doGetOrder(state,pageNow,rows); + }catch (Exception e){ + String params = "state="+state+";pageNow="+pageNow+";rows="+rows; + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.DELETE,LOG_CLASS_NAME,LOG_METHOD_GET_ORDER,params); + throw new MyException(Result.error(Code.FAIL_4601, Msg.COMMON_FAIL),LOG_MSG); + } } - @Override - public Object getToRate() { - return null; - } - @Override - public Object getAfterSale() { - return null; + /** + * 执行查询订单 state 0 全部订单 1 待付款订单 2待收货订单 3待评价订单 4 售后订单 + * @param state + * @param pageNow + * @param rows + * @return + */ + private Result doGetOrder(Integer state, Integer pageNow, Integer rows) { + //分页信息 + int count = shopOrderMapper.getOrderCount(userService.getUserPhonenumber(),state); + Page page = new Page(count,pageNow,rows); + + //数据信息 + //分页查出订单信息 + List> list = shopOrderMapper.getOrder(userService.getUserPhonenumber(),state,(pageNow-1)*rows,rows); + if (null!=list && list.size()>0){ + for (Map map1 : list){ + //将查询出的每个订单的商品信息查出放到订单的map里 + Integer orderId = (Integer) map1.get("orderId"); + List> itemList = shopOrderMapper.getOrderItemsByOneOrder(userService.getUserPhonenumber(),orderId); + map1.put("goods",itemList); + } + } + return Result.ok(page,list); } @Override diff --git a/src/main/java/com/hxtec/polaris/service/impl/PaymentServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/PaymentServiceImpl.java index b2744f2..194a984 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/PaymentServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/PaymentServiceImpl.java @@ -61,7 +61,8 @@ public class PaymentServiceImpl implements PaymentService { private Object miniWx(PayForm form) throws Exception { WXPay pay = new WXPay(config, "??????"); - Optional orderOptional = orderService.getOne(form.getOrderId()); +// Optional orderOptional = orderService.getOne(form.getOrderId()); + Optional orderOptional = null; if (orderOptional.isPresent()) { ShopOrder order = orderOptional.get(); Map pam = new HashMap<>(); diff --git a/src/main/java/com/hxtec/polaris/service/impl/UserServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/UserServiceImpl.java index 218b9ee..61e8196 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/UserServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/UserServiceImpl.java @@ -70,4 +70,9 @@ public class UserServiceImpl implements UserService { one.setWxId(openid); userRepository.save(one); } + + @Override + public String getUserPhonenumber(){ + return SecurityContextHolder.getContext().getAuthentication().getName(); + } } diff --git a/src/main/resources/mapper/ShopOrderMapper.xml b/src/main/resources/mapper/ShopOrderMapper.xml index a3c0299..55d0739 100644 --- a/src/main/resources/mapper/ShopOrderMapper.xml +++ b/src/main/resources/mapper/ShopOrderMapper.xml @@ -28,4 +28,16 @@ + + + + + + \ No newline at end of file -- Gitee From 13d1b6eea0d013e4108cd9b74f20c692c00e937a Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Fri, 13 Dec 2019 11:57:45 +0800 Subject: [PATCH 17/36] =?UTF-8?q?getOne=E5=8F=96=E6=B6=88=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hxtec/polaris/service/OrderService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hxtec/polaris/service/OrderService.java b/src/main/java/com/hxtec/polaris/service/OrderService.java index f757741..7779346 100644 --- a/src/main/java/com/hxtec/polaris/service/OrderService.java +++ b/src/main/java/com/hxtec/polaris/service/OrderService.java @@ -29,5 +29,5 @@ public interface OrderService { */ Map submitOrder(ShopAddress shopAddress); -// Optional getOne(String orderId); + Optional getOne(String orderId); } -- Gitee From 40ca03667391153790083304e861aedb7ff5706e Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Sun, 15 Dec 2019 15:51:25 +0800 Subject: [PATCH 18/36] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E6=89=8B=E6=9C=BA?= =?UTF-8?q?=E5=8F=B7=E7=A0=81=E5=8F=96=E7=94=A8=E6=88=B7=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=94=B9=E4=B8=BA=E6=A0=B9=E6=8D=AEuserid?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++++ .../hxtec/polaris/commons/constant/Log.java | 2 +- .../com/hxtec/polaris/entity/ShopUser.java | 19 +++++++++++++++++++ .../polaris/mapper/ShopAddressMapper.java | 4 ++-- .../polaris/mapper/ShopHistoryMapper.java | 4 ++-- .../hxtec/polaris/mapper/ShopUserMapper.java | 3 +++ .../hxtec/polaris/service/UserService.java | 6 ++++++ .../service/impl/HistoryServiceImpl.java | 16 ++++++++-------- .../service/impl/LocationServiceImpl.java | 8 ++++---- .../polaris/service/impl/UserServiceImpl.java | 6 ++++++ .../resources/mapper/ShopAddressMapper.xml | 6 ++---- .../resources/mapper/ShopHistoryMapper.xml | 2 +- src/main/resources/mapper/ShopUserMapper.xml | 10 ++++++++++ 13 files changed, 69 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index c2f39b6..aa6131c 100644 --- a/README.md +++ b/README.md @@ -20,3 +20,8 @@ shop_address weight字段用作判断收货地址是否为默认收货地址,1 订单状态 order表state字段 state 0 全部订单 1 待付款订单 2待收货订单 3待评价订单 4 售后订单 ``` +##### 2019/12/15 09:39 by yonyong +```html +历史记录 shop_history表usrname字段由手机号变更为userid +state 0 全部订单 1 待付款订单 2待收货订单 3待评价订单 4 售后订单 +``` diff --git a/src/main/java/com/hxtec/polaris/commons/constant/Log.java b/src/main/java/com/hxtec/polaris/commons/constant/Log.java index 1db48f9..6d0a521 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/Log.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/Log.java @@ -18,7 +18,7 @@ public final class Log { public static final String PATTERN_LOG = "操作类型:{0};操作类名:{1};操作方法:{2};传入参数:{3}"; //历史浏览相关 public static final String PATTERN_HISTORY= "历史浏览记录insert失败!传入参数:{0}"; - public static final String PATTERN_BASE = "操作用户:{0}"; + public static final String PATTERN_BASE = "操作用户信息:{0}"; //type public static final String INSERT = "新增"; diff --git a/src/main/java/com/hxtec/polaris/entity/ShopUser.java b/src/main/java/com/hxtec/polaris/entity/ShopUser.java index d946a55..d8f2b9b 100644 --- a/src/main/java/com/hxtec/polaris/entity/ShopUser.java +++ b/src/main/java/com/hxtec/polaris/entity/ShopUser.java @@ -387,4 +387,23 @@ public class ShopUser { public void setComment3(String comment3) { this.comment3 = comment3; } + + @Override + public String toString() { + return "ShopUser{" + + "id=" + id + + ", wxId='" + wxId + '\'' + + ", mobile='" + mobile + '\'' + + ", username='" + username + '\'' + + ", nickname='" + nickname + '\'' + + ", portrait='" + portrait + '\'' + + ", password='" + password + '\'' + + ", gender='" + gender + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", birthday=" + birthday + + ", state='" + state + '\'' + + ", isDelete='" + isDelete + '\'' + + '}'; + } } \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java index 6de4f6b..dc904f5 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopAddressMapper.java @@ -52,10 +52,10 @@ public interface ShopAddressMapper extends MyMapper { /** * 将当前用户的其他的收货地址改为非默认状态 - * @param username + * @param uid * @param id */ - void updateDefaultLocation(@Param("username")String username, @Param("id")Integer id); + void updateDefaultLocation(@Param("uid")String uid, @Param("id")Integer id); /** * 根据手机号获取用户的所有收获地址的个数 diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java index 7d53b7e..da7d51a 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopHistoryMapper.java @@ -30,10 +30,10 @@ public interface ShopHistoryMapper { /** * 获取所有浏览历史记录,默认查询最新记录前十条 - * @param username + * @param userId * @return */ - List> getAllHistory(@Param("username") String username); + List> getAllHistory(@Param("uid") int userId); /** * 根据用户名获取数据库中的历史记录条数 diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopUserMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopUserMapper.java index 46c4766..d767659 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopUserMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopUserMapper.java @@ -1,6 +1,7 @@ package com.hxtec.polaris.mapper; import com.hxtec.polaris.entity.ShopUser; +import org.apache.ibatis.annotations.Param; import tk.mybatis.mapper.MyMapper; /** @@ -8,4 +9,6 @@ import tk.mybatis.mapper.MyMapper; * @date 2019/11/28 */ public interface ShopUserMapper extends MyMapper { + + ShopUser getUserInfoByPhone(@Param("phone")String phone); } \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/service/UserService.java b/src/main/java/com/hxtec/polaris/service/UserService.java index 3caf7ac..608bfdc 100644 --- a/src/main/java/com/hxtec/polaris/service/UserService.java +++ b/src/main/java/com/hxtec/polaris/service/UserService.java @@ -19,4 +19,10 @@ public interface UserService { * @return */ String getUserPhonenumber(); + + /** + * 获取用户信息 + * @return + */ + ShopUser getUserInfo(); } diff --git a/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java index 061b3c4..b7d27be 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java @@ -39,10 +39,10 @@ public class HistoryServiceImpl implements HistoryService{ @Override public Object getAll() { try { - List> mapList = shopHistoryMapper.getAllHistory(userService.getUserPhonenumber()); + List> mapList = shopHistoryMapper.getAllHistory(userService.getUserInfo().getId()); return Result.ok(mapList); }catch (Exception e){ - String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserPhonenumber()); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserInfo().toString()); throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_GET_FAIL),LOG_MSG); } } @@ -52,7 +52,7 @@ public class HistoryServiceImpl implements HistoryService{ //调用线程,更新path //把当前编辑的节点及其所有子节点挂到新的节点下面,更新路径 // 创建线程池 - shopHistory.setUsername(userService.getUserPhonenumber()); + shopHistory.setUsername(String.valueOf(userService.getUserInfo().getId())); ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(GlobalVar.THREAD_HISTORY_INSERT).build(); ServletContext context = request.getServletContext(); // 计数器 @@ -66,12 +66,12 @@ public class HistoryServiceImpl implements HistoryService{ try { int result = shopHistoryMapper.delete(shopHistory.getId()); if (1 != result){ - String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserPhonenumber()); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserInfo().toString()); throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_DELETE_NULL),LOG_MSG); } return Result.ok(); }catch (Exception e){ - String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserPhonenumber()); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserInfo().toString()); throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_DELETE_FAIL),LOG_MSG); } } @@ -79,14 +79,14 @@ public class HistoryServiceImpl implements HistoryService{ @Override public Object deleteAll() { try { - int result = shopHistoryMapper.deleteAll(userService.getUserPhonenumber()); + int result = shopHistoryMapper.deleteAll(String.valueOf(userService.getUserInfo().getId())); if (1 > result){ - String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserPhonenumber()); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserInfo().toString()); throw new MyException(Result.error(Code.FAIL_4401, Msg.HISTORY_TRUNK_NULL),LOG_MSG); } return Result.ok(); }catch (Exception e){ - String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserPhonenumber()); + String LOG_MSG = MessageFormat.format(Log.PATTERN_BASE,userService.getUserInfo().toString()); throw new MyException(Result.error(Code.FAIL_4401,Msg.HISTORY_TRUNK_FAIL),LOG_MSG); } } diff --git a/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java index 990f6cf..ed471d7 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java @@ -44,7 +44,7 @@ public class LocationServiceImpl implements LocationService { @Override public Object getLoaction() { - List> mapList = shopAddressMapper.getLocationByUsername( userService.getUserPhonenumber()); + List> mapList = shopAddressMapper.getLocationByUsername(String.valueOf(userService.getUserInfo().getId())); if (mapList.size()>0){ return Result.ok(mapList); }else { @@ -128,7 +128,7 @@ public class LocationServiceImpl implements LocationService { */ private void doInsert(ShopAddress shopAddress) { //查询数据库中当前用户设置了几条收货地址,如果是第一次添加收货地址,则该地址为默认收货地址 - String userId = shopAddressMapper.getUserIdByUsername(userService.getUserPhonenumber()); + String userId = String.valueOf(userService.getUserInfo().getId()); shopAddress.setUserId(userId); shopAddress.setCreateTime(new Date()); shopAddress.setUpdateTime(new Date()); @@ -165,9 +165,9 @@ public class LocationServiceImpl implements LocationService { * @param shopAddress */ private void updateDefaultAddress(ShopAddress shopAddress){ - String username =userService.getUserPhonenumber(); + String userId = String.valueOf(userService.getUserInfo().getId()); if (null != shopAddress.getWeight() && shopAddress.getWeight() == 1){ - shopAddressMapper.updateDefaultLocation(username,shopAddress.getId()); + shopAddressMapper.updateDefaultLocation(userId,shopAddress.getId()); } } } diff --git a/src/main/java/com/hxtec/polaris/service/impl/UserServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/UserServiceImpl.java index f1687a0..15b354c 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/UserServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/UserServiceImpl.java @@ -75,4 +75,10 @@ public class UserServiceImpl implements UserService { public String getUserPhonenumber(){ return SecurityContextHolder.getContext().getAuthentication().getName(); } + + @Override + public ShopUser getUserInfo() { + String mobile = SecurityContextHolder.getContext().getAuthentication().getName(); + return shopUserMapper.getUserInfoByPhone(mobile); + } } diff --git a/src/main/resources/mapper/ShopAddressMapper.xml b/src/main/resources/mapper/ShopAddressMapper.xml index 723788f..c9449dd 100644 --- a/src/main/resources/mapper/ShopAddressMapper.xml +++ b/src/main/resources/mapper/ShopAddressMapper.xml @@ -26,7 +26,7 @@ select from shop_address a left join shop_user u on a.user_id = u.id - WHERE u.mobile = #{username} + WHERE u.id = #{username} order by a.update_time desc @@ -77,9 +77,7 @@ UPDATE shop_address set weight = 0 - WHERE id != #{id} and user_id in ( - select id from shop_user where mobile = #{username} - ) + WHERE id != #{id} and user_id=#{uid} diff --git a/src/main/resources/mapper/ShopHistoryMapper.xml b/src/main/resources/mapper/ShopHistoryMapper.xml index 800d1d4..d81d9e7 100644 --- a/src/main/resources/mapper/ShopHistoryMapper.xml +++ b/src/main/resources/mapper/ShopHistoryMapper.xml @@ -22,7 +22,7 @@ select from shop_history - WHERE username = #{username} + WHERE username = #{uid} group by sku ORDER BY time DESC limit 0,10 diff --git a/src/main/resources/mapper/ShopUserMapper.xml b/src/main/resources/mapper/ShopUserMapper.xml index 3d7a470..1c798b0 100644 --- a/src/main/resources/mapper/ShopUserMapper.xml +++ b/src/main/resources/mapper/ShopUserMapper.xml @@ -25,4 +25,14 @@ id, wx_id, mobile, username, nickname, portrait, `password`, gender, create_time, update_time, birthday, `state`, is_delete, comment1, comment2, comment3 + + id,wx_id,mobile,username + + \ No newline at end of file -- Gitee From b2598d6679dc12aaf87c21160a4e1125327171a1 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Sun, 15 Dec 2019 16:00:58 +0800 Subject: [PATCH 19/36] Merge branch 'yonyong' of https://gitee.com/anymre/Polaris into yonyong # Conflicts: # README.md # src/main/java/com/hxtec/polaris/service/UserService.java # src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java # src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java # src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java # src/main/java/com/hxtec/polaris/service/impl/UserServiceImpl.java --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index aa6131c..efa703b 100644 --- a/README.md +++ b/README.md @@ -23,5 +23,4 @@ state 0 全部订单 1 待付款订单 2待收货订单 3待评价订单 4 售 ##### 2019/12/15 09:39 by yonyong ```html 历史记录 shop_history表usrname字段由手机号变更为userid -state 0 全部订单 1 待付款订单 2待收货订单 3待评价订单 4 售后订单 ``` -- Gitee From b04ecd40e61bdc403b7ef372bf615afc173c1c61 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Sun, 15 Dec 2019 16:03:26 +0800 Subject: [PATCH 20/36] Merge branch 'yonyong' of https://gitee.com/anymre/Polaris into yonyong # Conflicts: # README.md # src/main/java/com/hxtec/polaris/service/UserService.java # src/main/java/com/hxtec/polaris/service/impl/HistoryServiceImpl.java # src/main/java/com/hxtec/polaris/service/impl/LocationServiceImpl.java # src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java # src/main/java/com/hxtec/polaris/service/impl/UserServiceImpl.java --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index aa6131c..efa703b 100644 --- a/README.md +++ b/README.md @@ -23,5 +23,4 @@ state 0 全部订单 1 待付款订单 2待收货订单 3待评价订单 4 售 ##### 2019/12/15 09:39 by yonyong ```html 历史记录 shop_history表usrname字段由手机号变更为userid -state 0 全部订单 1 待付款订单 2待收货订单 3待评价订单 4 售后订单 ``` -- Gitee From b058dc032295b2bd9bffc070297b15b36095930c Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Sun, 15 Dec 2019 20:39:45 +0800 Subject: [PATCH 21/36] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E5=B1=95=E7=A4=BA=EF=BC=8C=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../polaris/controller/OrderController.java | 2 ++ .../hxtec/polaris/mapper/ShopOrderMapper.java | 7 ++-- .../hxtec/polaris/service/OrderService.java | 2 ++ .../service/impl/OrderServiceImpl.java | 21 +++++++++--- src/main/resources/mapper/ShopOrderMapper.xml | 34 +++++++++++++++++-- 6 files changed, 58 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index efa703b..21504d6 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ shop_address weight字段用作判断收货地址是否为默认收货地址,1 ##### 2019/12/13 09:39 by yonyong ```html 订单状态 order表state字段 -state 0 全部订单 1 待付款订单 2待收货订单 3待评价订单 4 售后订单 +state 0 待付款 1 待发货订单 2待收货订单 3待评价订单 4 交易成功订单 5 已关闭订单 ``` ##### 2019/12/15 09:39 by yonyong ```html diff --git a/src/main/java/com/hxtec/polaris/controller/OrderController.java b/src/main/java/com/hxtec/polaris/controller/OrderController.java index 196e516..b37fbdf 100644 --- a/src/main/java/com/hxtec/polaris/controller/OrderController.java +++ b/src/main/java/com/hxtec/polaris/controller/OrderController.java @@ -59,4 +59,6 @@ public class OrderController { Map map=orderService.submitOrder(shopAddress); return Result.ok(map); } + @GetMapping("getPrice") + public Object getPrice(int oid){ return orderService.getPrice(oid); } } diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java index 63bb0c5..4155e22 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java @@ -15,7 +15,7 @@ public interface ShopOrderMapper extends MyMapper { * @param state * @return */ - Integer getOrderCount(@Param("phone") String userAccount,@Param("state") Integer state); + Integer getOrderCount(@Param("uid") String userAccount,@Param("state") Integer state); /** * 获取订单信息 @@ -25,7 +25,7 @@ public interface ShopOrderMapper extends MyMapper { * @param rows * @return */ - List> getOrder(@Param("phone") String userAccount,@Param("state") Integer state, @Param("start") Integer start, @Param("rows") Integer rows); + List> getOrder(@Param("uid") String userAccount,@Param("state") Integer state, @Param("start") Integer start, @Param("rows") Integer rows); /** * 获取一条订单对应的商品详情信息 @@ -33,6 +33,7 @@ public interface ShopOrderMapper extends MyMapper { * @param orderId * @return */ - List> getOrderItemsByOneOrder(@Param("phone") String userAccount,@Param("orderId") Integer orderId); + List> getOrderItemsByOneOrder(@Param("uid") String userAccount,@Param("orderId") Integer orderId); + Map getPriceByOrderId(@Param("oid") int oid,@Param("uid") String userid); } \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/service/OrderService.java b/src/main/java/com/hxtec/polaris/service/OrderService.java index 7779346..0d6d405 100644 --- a/src/main/java/com/hxtec/polaris/service/OrderService.java +++ b/src/main/java/com/hxtec/polaris/service/OrderService.java @@ -30,4 +30,6 @@ public interface OrderService { Map submitOrder(ShopAddress shopAddress); Optional getOne(String orderId); + + Object getPrice(int oid); } diff --git a/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java index 6726b0b..5d869f1 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java @@ -86,18 +86,19 @@ public class OrderServiceImpl implements OrderService{ * @return */ private Result doGetOrder(Integer state, Integer pageNow, Integer rows) { + String usrId = String.valueOf(userService.getUserInfo().getId()); //分页信息 - int count = shopOrderMapper.getOrderCount(userService.getUserPhonenumber(),state); + int count = shopOrderMapper.getOrderCount(usrId,state); Page page = new Page(count,pageNow,rows); //数据信息 //分页查出订单信息 - List> list = shopOrderMapper.getOrder(userService.getUserPhonenumber(),state,(pageNow-1)*rows,rows); + List> list = shopOrderMapper.getOrder(usrId,state,(pageNow-1)*rows,rows); if (null!=list && list.size()>0){ for (Map map1 : list){ //将查询出的每个订单的商品信息查出放到订单的map里 - Integer orderId = (Integer) map1.get("orderId"); - List> itemList = shopOrderMapper.getOrderItemsByOneOrder(userService.getUserPhonenumber(),orderId); + Integer orderId = (Integer) map1.get("id"); + List> itemList = shopOrderMapper.getOrderItemsByOneOrder(usrId,orderId); map1.put("goods",itemList); } } @@ -170,6 +171,18 @@ public class OrderServiceImpl implements OrderService{ return Optional.empty(); } + @Override + public Object getPrice(int oid) { + try { + Map orderMap = shopOrderMapper.getPriceByOrderId(oid,String.valueOf(userService.getUserInfo().getId())); + return Result.ok(orderMap); + }catch (Exception e){ + String params = "oid="+oid; + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.DELETE,LOG_CLASS_NAME,LOG_METHOD_GET_ORDER,params); + throw new MyException(Result.error(Code.FAIL_4601, Msg.COMMON_FAIL),LOG_MSG); + } + } + private void saveOrder(ShopOrder shopOrder) { //订单表 shopOrderMapper.insertSelective(shopOrder); diff --git a/src/main/resources/mapper/ShopOrderMapper.xml b/src/main/resources/mapper/ShopOrderMapper.xml index 55d0739..f6bb2e2 100644 --- a/src/main/resources/mapper/ShopOrderMapper.xml +++ b/src/main/resources/mapper/ShopOrderMapper.xml @@ -29,15 +29,45 @@ - + SELECT COUNT(1) + from shop_order + WHERE member_id=#{uid} and (isnull(is_delete) or is_delete!='Y') + + and state=#{state} + + \ No newline at end of file -- Gitee From 38c0ed48460ca1ebd27c8a741591d2cd7b4af646 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Mon, 16 Dec 2019 15:02:08 +0800 Subject: [PATCH 22/36] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=EF=BC=9B=E5=8F=96=E6=B6=88=E8=AE=A2=E5=8D=95=EF=BC=9B=E6=8F=90?= =?UTF-8?q?=E9=86=92=E5=8F=91=E8=B4=A7=EF=BC=9B=E5=BB=B6=E6=97=B6=E5=8F=91?= =?UTF-8?q?=E8=B4=A7=EF=BC=9B=E7=A1=AE=E8=AE=A4=E6=94=B6=E8=B4=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../polaris/commons/constant/GlobalVar.java | 17 +++ .../polaris/controller/OrderController.java | 32 +++++- .../hxtec/polaris/mapper/ShopOrderMapper.java | 36 ++++++ .../hxtec/polaris/service/OrderService.java | 33 ++++++ .../service/impl/OrderServiceImpl.java | 106 +++++++++++++++++- src/main/resources/mapper/ShopOrderMapper.xml | 24 ++++ 6 files changed, 241 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java index b778e80..9ac404e 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java @@ -38,4 +38,21 @@ public final class GlobalVar { public final static String TOURIST = "tourist"; //历史记录保存条数 public final static int HISTORY_ROWS = 30; + + //订单状态管理 state 0 待付款 1 待发货订单 2待收货订单 3待评价订单 4 交易成功订单 5 已关闭订单 + //待付款 + public static final int ORDER_PAYING = 0; + //待发货 + public static final int ORDER_SHIPING = 1; + //待收货 + public static final int ORDER_RECIIVEING = 2; + //待评价 + public static final int ORDER_REPLYING = 3; + //交易成功 + public static final int ORDER_SUCCESS = 4; + //已关闭 + public static final int ORDER_CLOSED = 5; + + //延时收货时间 默认为3天 + public static final int DELAY_TIME = 3; } diff --git a/src/main/java/com/hxtec/polaris/controller/OrderController.java b/src/main/java/com/hxtec/polaris/controller/OrderController.java index b37fbdf..37c3863 100644 --- a/src/main/java/com/hxtec/polaris/controller/OrderController.java +++ b/src/main/java/com/hxtec/polaris/controller/OrderController.java @@ -2,6 +2,7 @@ package com.hxtec.polaris.controller; import com.hxtec.polaris.commons.api.vo.Result; import com.hxtec.polaris.entity.ShopAddress; +import com.hxtec.polaris.entity.ShopOrder; import com.hxtec.polaris.service.OrderService; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; @@ -33,14 +34,14 @@ public class OrderController { @GetMapping("getOrder") public Object getOrder(Integer state, Integer pageNow, Integer rows){ return orderService.getOrder(state,pageNow,rows); } - @PostMapping("cancel") - public Object cancelOrder(){ - return null; + @PutMapping("cancelOrder") + public Object cancelOrder(ShopOrder shopOrder){ + return orderService.cancelOrder(shopOrder); } - @DeleteMapping("delete") - public Object deleteOrder(){ - return null; + @DeleteMapping("deleteOrder") + public Object deleteOrder(ShopOrder shopOrder){ + return orderService.deleteOrder(shopOrder); } @PostMapping("pay") @@ -53,6 +54,25 @@ public class OrderController { return null; } + /** + * 延时收货 + * @param shopOrder + * @return + */ + @PutMapping("extendedReceipt") + public Object extendedReceipt(ShopOrder shopOrder){ + return orderService.extendedReceipt(shopOrder); + } + + /** + * 确认收货 + * @param shopOrder + * @return + */ + @PutMapping("confirmReceipt") + public Object confirmReceipt(ShopOrder shopOrder){ + return orderService.confirmReceipt(shopOrder); + } @PostMapping("submitOrder") public Result submitOrder(@RequestBody ShopAddress shopAddress) { diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java index 4155e22..0d2adbd 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java @@ -4,6 +4,7 @@ import com.hxtec.polaris.entity.ShopOrder; import org.apache.ibatis.annotations.Param; import tk.mybatis.mapper.MyMapper; +import java.util.Date; import java.util.List; import java.util.Map; @@ -36,4 +37,39 @@ public interface ShopOrderMapper extends MyMapper { List> getOrderItemsByOneOrder(@Param("uid") String userAccount,@Param("orderId") Integer orderId); Map getPriceByOrderId(@Param("oid") int oid,@Param("uid") String userid); + + /** + * 延时收货 + * @param id 订单id + * @param uid 用户id + * @param delayTime 延时时间 + * @param date 更新时间 + */ + void doExtendReceipt(@Param("oid") Integer id, @Param("uid") String uid, @Param("delayTime") int delayTime, @Param("updatetime") Date date); + + /** + * 确认收货 将state改为3 待评价状态 + * @param id 订单id + * @param s 用户id + * @param state 收货后的订单状态 3 + * @param date 更新时间 + */ + void doConfirmReceipt(@Param("oid") Integer id, @Param("uid") String s,@Param("state") int state,@Param("updatetime") Date date); + + /** + * 删除订单 将is_delete改为Y + * @param id 订单id + * @param uid 用户id + * @param date 更新时间 + */ + void doDeleteOrder(@Param("oid")Integer id, @Param("uid")String uid,@Param("updatetime")Date date); + + /** + * 确认收货 将state改为5 已关闭状态状态 + * @param id 订单id + * @param s 用户id + * @param state 收货后的订单状态 5 + * @param date 更新时间 + */ + void doCancelOrder(@Param("oid") Integer id, @Param("uid") String s,@Param("state") int state,@Param("updatetime") Date date); } \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/service/OrderService.java b/src/main/java/com/hxtec/polaris/service/OrderService.java index 0d6d405..88b09d9 100644 --- a/src/main/java/com/hxtec/polaris/service/OrderService.java +++ b/src/main/java/com/hxtec/polaris/service/OrderService.java @@ -31,5 +31,38 @@ public interface OrderService { Optional getOne(String orderId); + /** + * 根据订单号获取订单价格及除了商品其它所有的相关的信息 + * @param oid + * @return + */ Object getPrice(int oid); + + /** + * 延时收货 + * @param shopOrder + * @return + */ + Object extendedReceipt(ShopOrder shopOrder); + + /** + * 确认收货 + * @param shopOrder + * @return + */ + Object confirmReceipt(ShopOrder shopOrder); + + /** + * 删除订单 + * @param shopOrder + * @return + */ + Object deleteOrder(ShopOrder shopOrder); + + /** + * 取消订单 + * @param shopOrder + * @return + */ + Object cancelOrder(ShopOrder shopOrder); } diff --git a/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java index 5d869f1..f361f07 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/OrderServiceImpl.java @@ -2,6 +2,7 @@ package com.hxtec.polaris.service.impl; import com.hxtec.polaris.commons.api.vo.Result; import com.hxtec.polaris.commons.constant.Code; +import com.hxtec.polaris.commons.constant.GlobalVar; import com.hxtec.polaris.commons.constant.Log; import com.hxtec.polaris.commons.constant.Msg; import com.hxtec.polaris.commons.contants.CommonContants; @@ -48,6 +49,11 @@ public class OrderServiceImpl implements OrderService{ private final static String LOG_CLASS_NAME = "OrderServiceImpl"; private final static String LOG_METHOD_GET_ORDER = "getOrder"; + private final static String LOG_METHOD_GET_PRICE = "getPrice"; + private final static String LOG_METHOD_EXTEND_RECEIVE = "extendedReceipt"; + private final static String LOG_METHOD_CONFIRM_RECEIVE = "confirmReceipt"; + private final static String LOG_METHOD_DELETE_ORDER = "deleteOrder"; + private final static String LOG_METHOD_CANCEL_ORDER = "cancelOrder"; @Resource private ShopOrderItemMapper shopOrderItemMapper; @@ -178,11 +184,109 @@ public class OrderServiceImpl implements OrderService{ return Result.ok(orderMap); }catch (Exception e){ String params = "oid="+oid; - String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.DELETE,LOG_CLASS_NAME,LOG_METHOD_GET_ORDER,params); + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.QUERY,LOG_CLASS_NAME,LOG_METHOD_GET_PRICE,params); + throw new MyException(Result.error(Code.FAIL_4601, Msg.COMMON_FAIL),LOG_MSG); + } + } + + @Override + public Object extendedReceipt(ShopOrder shopOrder) { + try{ + doExtendReceipt(shopOrder); + return Result.ok(); + }catch (Exception e){ + String params = "shopOrder="+shopOrder.toString(); + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.UPDATE,LOG_CLASS_NAME,LOG_METHOD_EXTEND_RECEIVE,params); throw new MyException(Result.error(Code.FAIL_4601, Msg.COMMON_FAIL),LOG_MSG); } } + @Override + public Object confirmReceipt(ShopOrder shopOrder) { + try{ + doConfirmReceipt(shopOrder); + return Result.ok(); + }catch (Exception e){ + String params = "shopOrder="+shopOrder.toString(); + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.UPDATE,LOG_CLASS_NAME,LOG_METHOD_CONFIRM_RECEIVE,params); + throw new MyException(Result.error(Code.FAIL_4601, Msg.COMMON_FAIL),LOG_MSG); + } + } + + @Override + public Object deleteOrder(ShopOrder shopOrder) { + try{ + doDeleteOrder(shopOrder); + return Result.ok(); + }catch (Exception e){ + String params = "shopOrder="+shopOrder.toString(); + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.DELETE,LOG_CLASS_NAME,LOG_METHOD_DELETE_ORDER,params); + throw new MyException(Result.error(Code.FAIL_4601, Msg.COMMON_FAIL),LOG_MSG); + } + } + + @Override + public Object cancelOrder(ShopOrder shopOrder) { + try{ + doCancelOrder(shopOrder); + return Result.ok(); + }catch (Exception e){ + String params = "shopOrder="+shopOrder.toString(); + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.UPDATE,LOG_CLASS_NAME,LOG_METHOD_CANCEL_ORDER,params); + throw new MyException(Result.error(Code.FAIL_4601, Msg.COMMON_FAIL),LOG_MSG); + } + } + + /** + * 执行订单取消 state设置为5 已关闭状态 + * @param shopOrder + */ + private void doCancelOrder(ShopOrder shopOrder) { + //只有待付款情况下才可以取消订单 + if (shopOrder.getState() == GlobalVar.ORDER_PAYING){ + //执行更新 + shopOrderMapper.doCancelOrder(shopOrder.getId(),String.valueOf(userService.getUserInfo().getId()),GlobalVar.ORDER_CLOSED,new Date()); + } + } + + /** + * 执行订单删除 isdeleted Y + * @param shopOrder + */ + private void doDeleteOrder(ShopOrder shopOrder) { + //只有订单状态为已关闭(5)、待评价(3)、交易完成(4)情况下才可以延时收货 + if (shopOrder.getState() == GlobalVar.ORDER_CLOSED + || shopOrder.getState() == GlobalVar.ORDER_REPLYING + || shopOrder.getState() == GlobalVar.ORDER_SUCCESS){ + //执行更新 + shopOrderMapper.doDeleteOrder(shopOrder.getId(),String.valueOf(userService.getUserInfo().getId()),new Date()); + } + } + + /** + * 执行确认收货 + * @param shopOrder + */ + private void doConfirmReceipt(ShopOrder shopOrder) { + //只有待收货情况下才可以确认收货 + if (shopOrder.getState() == GlobalVar.ORDER_RECIIVEING){ + //执行更新 + shopOrderMapper.doConfirmReceipt(shopOrder.getId(),String.valueOf(userService.getUserInfo().getId()),GlobalVar.ORDER_REPLYING,new Date()); + } + } + + /** + * 执行延时收货 + * @param shopOrder + */ + private void doExtendReceipt(ShopOrder shopOrder) { + //只有待收货情况下才可以延时收货 + if (shopOrder.getState() == GlobalVar.ORDER_RECIIVEING){ + //执行更新 + shopOrderMapper.doExtendReceipt(shopOrder.getId(),String.valueOf(userService.getUserInfo().getId()),GlobalVar.DELAY_TIME,new Date()); + } + } + private void saveOrder(ShopOrder shopOrder) { //订单表 shopOrderMapper.insertSelective(shopOrder); diff --git a/src/main/resources/mapper/ShopOrderMapper.xml b/src/main/resources/mapper/ShopOrderMapper.xml index f6bb2e2..eb87535 100644 --- a/src/main/resources/mapper/ShopOrderMapper.xml +++ b/src/main/resources/mapper/ShopOrderMapper.xml @@ -37,6 +37,30 @@ * + + UPDATE shop_order + set auto_confirm_day = auto_confirm_day+#{delayTime},update_time=#{updatetime} + where id=#{oid} and member_id=#{uid} and auto_confirm_day = 7 and state = 2 and (isnull(is_delete) or is_delete!='Y') + + + + UPDATE shop_order + set state = #{state},update_time=#{updatetime} + where id=#{oid} and member_id=#{uid} and state = 2 and (isnull(is_delete) or is_delete!='Y') + + + + UPDATE shop_order + set state = #{state},update_time=#{updatetime} + where id=#{oid} and member_id=#{uid} and state = 0 and (isnull(is_delete) or is_delete!='Y') + + + + UPDATE shop_order + set is_delete='Y',update_time=#{updatetime} + where id=#{oid} and member_id=#{uid} and (state = 3 || state = 4 || state = 5) and (isnull(is_delete) or is_delete!='Y') + + select @@ -50,27 +53,32 @@ select - + from shop_product_variant pv left join shop_product_base pb on pv.spu=pb.spu left join shop_category c on pb.category_id=c.id + LEFT join shop_stock st on pv.sku=st.sku where c.comment1 like '%-${cid}-%' @@ -112,7 +121,7 @@ pb.weight desc, - pb.comment2*1 desc, + st.lock*1 desc, pv.price asc, @@ -133,6 +142,7 @@ from shop_product_variant pv left join shop_product_base pb on pv.spu=pb.spu left join shop_category c on pb.category_id=c.id + LEFT join shop_stock st on pv.sku=st.sku where c.comment1 like '%-${cid}-%' @@ -144,7 +154,7 @@ pb.weight desc, - pb.comment2*1 desc, + st.lock*1 desc, pv.price asc, -- Gitee From d06d398ef77a37579d2b3e2da268a8e5766d8b6e Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Tue, 17 Dec 2019 11:03:28 +0800 Subject: [PATCH 26/36] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=EF=BC=8C=E8=B6=85=E8=BF=87=E4=B8=80=E5=B0=8F?= =?UTF-8?q?=E6=97=B6=E6=9C=AA=E4=BB=98=E6=AC=BE=E8=87=AA=E5=8A=A8=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hxtec/polaris/PolarisApplication.java | 2 + .../polaris/commons/tasks/OrderCheckTask.java | 36 +++++++++- .../config/SchedulingConfiguration.java | 68 +++++++++++++++++++ .../hxtec/polaris/mapper/ShopOrderMapper.java | 7 ++ src/main/resources/application.yml | 5 ++ src/main/resources/mapper/ShopOrderMapper.xml | 6 ++ 6 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/hxtec/polaris/config/SchedulingConfiguration.java diff --git a/src/main/java/com/hxtec/polaris/PolarisApplication.java b/src/main/java/com/hxtec/polaris/PolarisApplication.java index e1b0304..545b088 100644 --- a/src/main/java/com/hxtec/polaris/PolarisApplication.java +++ b/src/main/java/com/hxtec/polaris/PolarisApplication.java @@ -4,6 +4,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; import springfox.documentation.swagger2.annotations.EnableSwagger2; import tk.mybatis.spring.annotation.MapperScan; @@ -14,6 +15,7 @@ import tk.mybatis.spring.annotation.MapperScan; @MapperScan(value = "com.hxtec.polaris.mapper") @EnableCaching @EnableJpaAuditing +@EnableScheduling public class PolarisApplication { public static void main(String[] args) { diff --git a/src/main/java/com/hxtec/polaris/commons/tasks/OrderCheckTask.java b/src/main/java/com/hxtec/polaris/commons/tasks/OrderCheckTask.java index d2110db..8c7b3f1 100644 --- a/src/main/java/com/hxtec/polaris/commons/tasks/OrderCheckTask.java +++ b/src/main/java/com/hxtec/polaris/commons/tasks/OrderCheckTask.java @@ -1,9 +1,15 @@ package com.hxtec.polaris.commons.tasks; +import com.hxtec.polaris.commons.exception.MyException; +import com.hxtec.polaris.mapper.ShopOrderMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Date; /** * @Describtion 订单相关的任务 @@ -12,14 +18,18 @@ import org.springframework.stereotype.Component; * @Version 1.0.0 **/ @Component +@Transactional public class OrderCheckTask { private static final Logger logger = LoggerFactory.getLogger(OrderCheckTask.class); + @Resource + private ShopOrderMapper shopOrderMapper; + /** * 订单自动完成 针对已确认收货的订单/待评价订单 每日0点执行 */ - @Scheduled(cron = "0 0 0 * * ? ") + @Scheduled(cron = "${mytask.day}") public void completeOrder(){ logger.info("订单自动完成start"); logger.info("订单自动完成end"); @@ -28,9 +38,31 @@ public class OrderCheckTask { /** * 订单自动确认已收货 */ - @Scheduled(cron = "0 0 0 * * ? ") + @Scheduled(cron = "${mytask.day}") public void confirmReceive(){ logger.info("订单自动确认收货start"); logger.info("订单自动确认收货end"); } + + /** + * 订单自动关闭 每小时检查一次 + */ + @Scheduled(cron = "${mytask.hour}") + public void autoCloseOrder(){ + logger.info("订单自动关闭任务开始"); + try{ + doAutoCloseOrder(); + }catch (Exception e){ + throw new MyException("自动关闭失败"); + } + logger.info("订单自动关闭任务结束"); + } + + /** + * 执行订单自动关闭 + */ + private void doAutoCloseOrder() { + int affectrows = shopOrderMapper.doAutoCloseOrder(new Date()); + logger.info("本次自动关闭订单数:"+affectrows+"条"); + } } diff --git a/src/main/java/com/hxtec/polaris/config/SchedulingConfiguration.java b/src/main/java/com/hxtec/polaris/config/SchedulingConfiguration.java new file mode 100644 index 0000000..d19270b --- /dev/null +++ b/src/main/java/com/hxtec/polaris/config/SchedulingConfiguration.java @@ -0,0 +1,68 @@ +package com.hxtec.polaris.config; + +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +import java.util.concurrent.Executor; + +/** + * @Describtion 配置定时任务以多线程态运行 + * @Author yonyong + * @Date 2019/12/17 10:15 + * @Version 1.0.0 + **/ +@Configuration +public class SchedulingConfiguration implements SchedulingConfigurer, AsyncConfigurer { + /** + * 并行任务 + * @param scheduledTaskRegistrar + */ + @Override + public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { + TaskScheduler taskScheduler = taskScheduler(); + scheduledTaskRegistrar.setTaskScheduler(taskScheduler); + } + + /** + * 多线程配置 + * @return + */ + @Bean(destroyMethod = "shutdown") + public ThreadPoolTaskScheduler taskScheduler() { + ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); + scheduler.setPoolSize(20); + // 设置线程名前缀 + scheduler.setThreadNamePrefix("task-"); + // 线程内容执行完后60秒停在 + scheduler.setAwaitTerminationSeconds(60); + // 等待所有线程执行完 + scheduler.setWaitForTasksToCompleteOnShutdown(true); + return scheduler; + } + + /** + * 异步任务 + * @return + */ + @Override + public Executor getAsyncExecutor() { + Executor executor = taskScheduler(); + return executor; + } + + /** + * 异常处理 + * @return + */ + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return new SimpleAsyncUncaughtExceptionHandler(); + } +} diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java index 0d915c5..3f7665e 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopOrderMapper.java @@ -81,4 +81,11 @@ public interface ShopOrderMapper extends MyMapper { * @param date 更新时间 */ void doRateOrder(@Param("oid") int id, @Param("uid")String uid, @Param("state")int state,@Param("updatetime") Date date); + + /** + * 执行订单自动关闭 将state改为已关闭5 + * @param date + * @return + */ + Integer doAutoCloseOrder(@Param("date") Date date); } \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 9419143..f412cc4 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -79,5 +79,10 @@ pay: mchId: 1514858131 key: "00000000000000000000000000000000" +# schedule task interval +mytask: + day: 0 0 0 * * ? + hour: 0 0 * * * ? + sec: 0/5 * * * * ? diff --git a/src/main/resources/mapper/ShopOrderMapper.xml b/src/main/resources/mapper/ShopOrderMapper.xml index d70c738..6ddd1a2 100644 --- a/src/main/resources/mapper/ShopOrderMapper.xml +++ b/src/main/resources/mapper/ShopOrderMapper.xml @@ -67,6 +67,12 @@ where id=#{oid} and member_id=#{uid} and (state = 3 || state = 4 || state = 5) and (isnull(is_delete) or is_delete!='Y') + + UPDATE shop_order + set state=5,update_time=#{date} + where state=0 and now() >SUBDATE(create_time,interval -1 hour) and (isnull(is_delete) or is_delete!='Y') + + + + + insert into shop_category (parent_id, is_parent, -- Gitee From 23fac4b5af1c69092b80393e7d6f86a16b3b2378 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Wed, 18 Dec 2019 17:55:30 +0800 Subject: [PATCH 29/36] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=EF=BC=8C=E5=88=86=E7=B1=BB=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 24 +++++++ .../polaris/commons/constant/GlobalVar.java | 4 ++ .../controller/CategoryController.java | 16 ++++- .../polaris/controller/FileController.java | 34 ++++++++++ .../polaris/mapper/ShopCategoryMapper.java | 10 ++- .../polaris/service/CategoryService.java | 10 ++- .../hxtec/polaris/service/FileService.java | 23 +++++++ .../service/impl/CategoryServiceImpl.java | 16 +++-- .../polaris/service/impl/FileServiceImpl.java | 66 +++++++++++++++++++ .../resources/mapper/ShopCategoryMapper.xml | 18 ++++- 10 files changed, 208 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/hxtec/polaris/controller/FileController.java create mode 100644 src/main/java/com/hxtec/polaris/service/FileService.java create mode 100644 src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java diff --git a/pom.xml b/pom.xml index 0a2dbbb..fb2565b 100644 --- a/pom.xml +++ b/pom.xml @@ -160,6 +160,30 @@ ${slf4j.version} + + + commons-fileupload + commons-fileupload + 1.3.1 + + + commons-io + commons-io + 2.5 + + + org.apache.poi + poi + 3.7 + + + org.apache.poi + poi-ooxml + 3.7 + + + + ch.qos.logback diff --git a/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java index 9ac404e..18a54c7 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java @@ -1,5 +1,6 @@ package com.hxtec.polaris.commons.constant; +import java.io.File; import java.util.Arrays; import java.util.List; @@ -55,4 +56,7 @@ public final class GlobalVar { //延时收货时间 默认为3天 public static final int DELAY_TIME = 3; + + //上传文件存储路径 + public static final String CATEGORY_IMG_PATH = File.separator +"upload" + File.separator + "category"; } diff --git a/src/main/java/com/hxtec/polaris/controller/CategoryController.java b/src/main/java/com/hxtec/polaris/controller/CategoryController.java index 22e7b42..2ad649e 100644 --- a/src/main/java/com/hxtec/polaris/controller/CategoryController.java +++ b/src/main/java/com/hxtec/polaris/controller/CategoryController.java @@ -74,8 +74,8 @@ public class CategoryController { @ApiImplicitParam(name = "name", value = "当前节点编辑后的节点名", required = false, dataType = "String"), }) @PutMapping("update") - public Object updateCategory(HttpServletRequest request,String id, String pid, String name){ - return categoryService.updateCategory(request,pid,id,name); + public Object updateCategory(HttpServletRequest request,String id, String pid, String name,String img){ + return categoryService.updateCategory(request,pid,id,name,img); } /** @@ -84,7 +84,17 @@ public class CategoryController { * @return */ @GetMapping("buildTree") - public Object buildTree(Integer id){ + public Object buildTree(Integer id,String condition){ return categoryService.buildTree(id); } + + /** + * 搜索tree + * @param condition + * @return + */ + @GetMapping("selectTree") + public Object selectTree(String condition){ + return categoryService.selectTree(condition); + } } diff --git a/src/main/java/com/hxtec/polaris/controller/FileController.java b/src/main/java/com/hxtec/polaris/controller/FileController.java new file mode 100644 index 0000000..cb71916 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/controller/FileController.java @@ -0,0 +1,34 @@ +package com.hxtec.polaris.controller; + +import com.hxtec.polaris.service.FileService; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; + +/** + * @Describtion 文件服务 + * @Author yonyong + * @Date 2019/12/18 14:23 + * @Version 1.0.0 + **/ +@RestController +@RequestMapping(value = "file",produces = "application/json;charset=utf-8") +@CrossOrigin +@Api(value = "/file", tags = "文件服务") +public class FileController { + + @Autowired + private FileService fileService; + + /** + * 上传分类图片 + * @return + */ + @PostMapping("/upload/category/image") + public Object uploadCategoryImage(MultipartFile file, HttpServletRequest request){ + return fileService.uploadCategoryImage(file,request); + } +} diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java index e6c8d80..ce2ae8e 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java @@ -50,9 +50,10 @@ public interface ShopCategoryMapper extends MyMapper { * 更新父id * @param id * @param pid + * @param img * @return */ - Integer updateCategoryParentId(@Param("id") String id,@Param("pid") String pid,@Param("name") String name); + Integer updateCategoryParentId(@Param("id") String id,@Param("pid") String pid,@Param("name") String name,@Param("img") String img); /** * 更新父id @@ -89,4 +90,11 @@ public interface ShopCategoryMapper extends MyMapper { * @return */ List> getChildTree(Integer id); + + /** + * 搜索分类 + * @param condition + * @return + */ + List> selectTree(@Param("condition") String condition); } \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/service/CategoryService.java b/src/main/java/com/hxtec/polaris/service/CategoryService.java index 42200fd..d766e5f 100644 --- a/src/main/java/com/hxtec/polaris/service/CategoryService.java +++ b/src/main/java/com/hxtec/polaris/service/CategoryService.java @@ -32,9 +32,10 @@ public interface CategoryService { * @param pid * @param id * @param name + * @param img * @return */ - Object updateCategory(HttpServletRequest request, String pid, String id, String name); + Object updateCategory(HttpServletRequest request, String pid, String id, String name,String img); /** * 构建分类tree @@ -42,4 +43,11 @@ public interface CategoryService { * @return */ Object buildTree(Integer id); + + /** + * 搜索tree + * @param condition + * @return + */ + Object selectTree(String condition); } diff --git a/src/main/java/com/hxtec/polaris/service/FileService.java b/src/main/java/com/hxtec/polaris/service/FileService.java new file mode 100644 index 0000000..cc25495 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/service/FileService.java @@ -0,0 +1,23 @@ +package com.hxtec.polaris.service; + +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; + +/** + * @Author yonyong + * @Description //文件服务 + * @Date 2019/12/18 14:37 + * @Param + * @return + **/ +public interface FileService { + + /** + * 上传分类图片 + * @param img + * @param request + * @return + */ + Object uploadCategoryImage(MultipartFile img, HttpServletRequest request); +} diff --git a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java index 53d7de2..de437a8 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java @@ -113,10 +113,10 @@ public class CategoryServiceImpl implements CategoryService { } @Override - public Object updateCategory(HttpServletRequest request,String pid, String id, String name) { + public Object updateCategory(HttpServletRequest request,String pid, String id, String name,String img) { String params = "pid="+pid+",id="+id+",name="+name; String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.UPDATE,LOG_CLASS_NAME,LOG_METHOD_UPDATE_CATORY,params); - if (!StringUtils.isNumeric(pid) || !StringUtils.isNumeric(id) || StringUtils.isBlank(name)){ + if (!StringUtils.isNumeric(id) || StringUtils.isBlank(name)){ throw new MyException(Result.error(Code.FAIL_4101,Msg.PARAM_INVALID),LOG_MSG); } @@ -127,7 +127,7 @@ public class CategoryServiceImpl implements CategoryService { } //执行更新操作 try { - doUpdateShopCategory(request,pid,id,name); + doUpdateShopCategory(request,pid,id,name,img); }catch (Exception e){ throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_UPDATE_FAIL),LOG_MSG); } @@ -148,6 +148,12 @@ public class CategoryServiceImpl implements CategoryService { } } + @Override + public Object selectTree(String condition) { + List> mapList = shopCategoryMapper.selectTree(condition); + return Result.ok(mapList); + } + /** * ShopCategory实例赋值 * @param pid @@ -174,13 +180,13 @@ public class CategoryServiceImpl implements CategoryService { * @param name * @return */ - private void doUpdateShopCategory(HttpServletRequest request,String pid, String id, String name){ + private void doUpdateShopCategory(HttpServletRequest request,String pid, String id, String name,String img){ //编辑的节点原来的父节点 List shopCategorys = shopCategoryMapper.getCategoryById(id); String oldParentId = shopCategorys.get(0).getParentId(); //step1 将当前节点的父节点和名字更新为修改后的值 - shopCategoryMapper.updateCategoryParentId(id,pid,name); + shopCategoryMapper.updateCategoryParentId(id,pid,name,img); //如果上级节点没有变动,则不需要变更子节点,业务结束 if (equalsIgnoreCase(pid,oldParentId)){ diff --git a/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java new file mode 100644 index 0000000..61a1262 --- /dev/null +++ b/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java @@ -0,0 +1,66 @@ +package com.hxtec.polaris.service.impl; + +import com.hxtec.polaris.commons.api.vo.Result; +import com.hxtec.polaris.commons.constant.Code; +import com.hxtec.polaris.commons.constant.GlobalVar; +import com.hxtec.polaris.commons.constant.Log; +import com.hxtec.polaris.commons.constant.Msg; +import com.hxtec.polaris.commons.exception.MyException; +import com.hxtec.polaris.service.FileService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.apache.commons.io.FileUtils; + +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.text.MessageFormat; +import java.util.Map; + +/** + * @Describtion 文件服务 + * @Author yonyong + * @Date 2019/12/18 14:35 + * @Version 1.0.0 + **/ +@Service +@Transactional +public class FileServiceImpl implements FileService{ + + private static final String LOG_CLASS_NAME = "FileServiceImpl"; + private static final String LOG_METHOD_UPLOAD_CATEGORY= "uploadCategoryImage"; + + @Override + public Object uploadCategoryImage(MultipartFile img, HttpServletRequest request) { + try { + return Result.ok(saveImg(img,request,GlobalVar.CATEGORY_IMG_PATH)); + }catch (Exception e){ + String params = "img="+img; + String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.INSERT,LOG_CLASS_NAME,LOG_METHOD_UPLOAD_CATEGORY,params); + throw new MyException(Result.error(Code.FAIL_4501, Msg.COMMON_FAIL),LOG_MSG); + } + } + + /** + * 保存文件到指定目录,并返回路径 + * @param img + * @param request + * @param categoryImgPath + * @return + */ + private String saveImg(MultipartFile img, HttpServletRequest request, String categoryImgPath) throws IOException { + String path = "error"; + if(!img.isEmpty()) { + //原本的文件名 + //现在的文件名是时间戳加原文件名,出现图片相同时,读取不出来的bug + String nowName = System.currentTimeMillis() + img.getOriginalFilename(); + //将文件保存在当前工程下的一个upload文件 + String realPath = request.getSession().getServletContext().getRealPath(categoryImgPath); + //将文件的输入流输出到一个新的文件 + FileUtils.copyInputStreamToFile(img.getInputStream(), new File(realPath, nowName)); + path=categoryImgPath+nowName; + } + return path; + } +} diff --git a/src/main/resources/mapper/ShopCategoryMapper.xml b/src/main/resources/mapper/ShopCategoryMapper.xml index 130cc06..ba60077 100644 --- a/src/main/resources/mapper/ShopCategoryMapper.xml +++ b/src/main/resources/mapper/ShopCategoryMapper.xml @@ -25,6 +25,10 @@ id, parent_id, is_parent, name,image, weight,is_delete + + * + + + + insert into shop_category (parent_id, is_parent, name, decriptsion, image, @@ -122,7 +134,7 @@ update shop_category - set parent_id = #{pid},name = #{name},is_parent = 'N' + set parent_id = #{pid},name = #{name},image=#{img},is_parent = 'N' where id = #{id} and is_delete = 'N' -- Gitee From b3d8bd0368b279a73d18b22b0cf96bbf7ed79a40 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Wed, 18 Dec 2019 21:24:52 +0800 Subject: [PATCH 30/36] bianji --- .../polaris/mapper/ShopCategoryMapper.java | 9 +++++++++ .../service/impl/CategoryServiceImpl.java | 17 +++++++++++++++++ .../resources/mapper/ShopCategoryMapper.xml | 6 ++++++ 3 files changed, 32 insertions(+) diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java index ce2ae8e..d18fbca 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java @@ -55,6 +55,15 @@ public interface ShopCategoryMapper extends MyMapper { */ Integer updateCategoryParentId(@Param("id") String id,@Param("pid") String pid,@Param("name") String name,@Param("img") String img); + /** + * 更新父id + * @param id + * @param pid + * @param img + * @return + */ + Integer updateRootCategory(@Param("id") String id,@Param("pid") String pid,@Param("name") String name,@Param("img") String img); + /** * 更新父id * @param id diff --git a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java index de437a8..381ec60 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java @@ -120,6 +120,19 @@ public class CategoryServiceImpl implements CategoryService { throw new MyException(Result.error(Code.FAIL_4101,Msg.PARAM_INVALID),LOG_MSG); } + //判断更新的节点是否为根节点,如果为根节点走单独的根节点方法 + List ifRootList = shopCategoryMapper.getCategoryById(id); + if(null != ifRootList && ifRootList.size()>0){ + if(!StringUtils.equals(ifRootList.get(0).getIsDelete(),"Y") && StringUtils.isBlank(ifRootList.get(0).getParentId())){ + try { + doUpdateRootCategory(id,name,img); + }catch (Exception e){ + throw new MyException(Result.error(Code.FAIL_4101,Msg.COMMON_FAIL),LOG_MSG); + } + return Result.ok(); + } + } + List tempList = shopCategoryMapper.getCategoryById(pid); if (null == tempList || tempList.size() ==0 || StringUtils.isBlank(tempList.get(0).getIsDelete()) || !GlobalVar.NO.equals(tempList.get(0).getIsDelete())){ //如果该父节点对应的分类在数据库中没有记录或者删除状态是空或者已删除,则为故障节点,不能进行更新 @@ -135,6 +148,10 @@ public class CategoryServiceImpl implements CategoryService { return Result.ok(Msg.CATEGORY_UPDATE_OK); } + private void doUpdateRootCategory(String id, String name, String img) { + shopCategoryMapper.updateRootCategory(id,null,name,img); + } + @Override public Object buildTree(Integer id) { if (null == id){ diff --git a/src/main/resources/mapper/ShopCategoryMapper.xml b/src/main/resources/mapper/ShopCategoryMapper.xml index ba60077..5bb2663 100644 --- a/src/main/resources/mapper/ShopCategoryMapper.xml +++ b/src/main/resources/mapper/ShopCategoryMapper.xml @@ -138,6 +138,12 @@ where id = #{id} and is_delete = 'N'
+ + update shop_category + set parent_id = #{pid},name = #{name},image=#{img} + where id = #{id} and is_delete = 'N' + + update shop_category set parent_id = #{pid} -- Gitee From ed8384f85a3cefc7183e61edc4ea85491b64b1f8 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Thu, 19 Dec 2019 14:54:17 +0800 Subject: [PATCH 31/36] =?UTF-8?q?=E6=9E=84=E5=BB=BA=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E6=9B=B4=E6=96=B0isparent=E7=8A=B6=E6=80=81?= =?UTF-8?q?=EF=BC=8C=E5=88=86=E7=B1=BB=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/thread/BuildPathRunable.java | 7 +- .../controller/CategoryController.java | 14 +- .../polaris/mapper/ShopCategoryMapper.java | 30 ++++- .../polaris/service/CategoryService.java | 9 +- .../service/impl/CategoryServiceImpl.java | 122 ++++++++---------- .../resources/mapper/ShopCategoryMapper.xml | 20 ++- 6 files changed, 121 insertions(+), 81 deletions(-) diff --git a/src/main/java/com/hxtec/polaris/commons/thread/BuildPathRunable.java b/src/main/java/com/hxtec/polaris/commons/thread/BuildPathRunable.java index f357a17..9d4a514 100644 --- a/src/main/java/com/hxtec/polaris/commons/thread/BuildPathRunable.java +++ b/src/main/java/com/hxtec/polaris/commons/thread/BuildPathRunable.java @@ -61,7 +61,12 @@ public class BuildPathRunable implements Runnable{ getPath(shopCategory,path,new Date()); path.append("-"); shopCategory.setComment1(String.valueOf(path)); - shopCategoryMapper.updateCategoryPath(String.valueOf(shopCategory.getId()),String.valueOf(path)); + int count = shopCategoryMapper.selectChildCountById(shopCategory.getId()); + if(count>0){ + shopCategoryMapper.updateCategoryPath(String.valueOf(shopCategory.getId()),String.valueOf(path),"Y"); + }else if(count == 0){ + shopCategoryMapper.updateCategoryPath(String.valueOf(shopCategory.getId()),String.valueOf(path),"N"); + } } } diff --git a/src/main/java/com/hxtec/polaris/controller/CategoryController.java b/src/main/java/com/hxtec/polaris/controller/CategoryController.java index 2ad649e..1fa9fd1 100644 --- a/src/main/java/com/hxtec/polaris/controller/CategoryController.java +++ b/src/main/java/com/hxtec/polaris/controller/CategoryController.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; import java.util.List; /** @@ -46,8 +47,8 @@ public class CategoryController { @ApiImplicitParam(name = "name", value = "添加的节点名", required = false, dataType = "String") }) @PostMapping("add") - public Object addCategory(String pid,String name){ - return categoryService.addCategory(pid,name); + public Object addCategory(HttpServletRequest request,String pid,String name,String img){ + return categoryService.addCategory(request,pid,name,img); } /** @@ -59,8 +60,9 @@ public class CategoryController { @ApiImplicitParam(name = "ids[]", value = "删除的节点集合", required = false,allowMultiple=true, dataType = "String") }) @DeleteMapping("delete") - public Object deleteCategory(@RequestParam("ids[]") List ids){ - return categoryService.deleteCategory(ids); + public Object deleteCategory(HttpServletRequest request,String[] ids){ + List list = Arrays.asList(ids); + return categoryService.deleteCategory(request,list); } /** @@ -74,8 +76,8 @@ public class CategoryController { @ApiImplicitParam(name = "name", value = "当前节点编辑后的节点名", required = false, dataType = "String"), }) @PutMapping("update") - public Object updateCategory(HttpServletRequest request,String id, String pid, String name,String img){ - return categoryService.updateCategory(request,pid,id,name,img); + public Object updateCategory(String id, String name,String img){ + return categoryService.updateCategory(id,name,img); } /** diff --git a/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java b/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java index d18fbca..57f2b2a 100644 --- a/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java +++ b/src/main/java/com/hxtec/polaris/mapper/ShopCategoryMapper.java @@ -4,6 +4,7 @@ import com.hxtec.polaris.entity.ShopCategory; import org.apache.ibatis.annotations.Param; import tk.mybatis.mapper.MyMapper; +import java.util.Date; import java.util.List; import java.util.Map; @@ -42,9 +43,10 @@ public interface ShopCategoryMapper extends MyMapper { /** * 删除分类 * @param id + * @param date * @return */ - Integer deleteCategory(@Param("id") String id); + Integer deleteCategory(@Param("id") String id ,@Param("date") Date date); /** * 更新父id @@ -83,9 +85,10 @@ public interface ShopCategoryMapper extends MyMapper { * 更新父id * @param id * @param path + * @param isParent * @return */ - Integer updateCategoryPath(@Param("id") String id,@Param("path") String path); + Integer updateCategoryPath(@Param("id") String id,@Param("path") String path,@Param("isParent")String isParent); /** * 初始化tree @@ -106,4 +109,27 @@ public interface ShopCategoryMapper extends MyMapper { * @return */ List> selectTree(@Param("condition") String condition); + + /** + * 添加分类 如果父节点为空,则添加的节点为一级节点,走一级节点添加方法 + * @param shopCategory + * @return + */ + void inserRootCategory(ShopCategory shopCategory); + + /** + * 查看当前id的节点的子节点数量 + * @param id + * @return + */ + int selectChildCountById(@Param("id") Integer id); + + /** + * 编辑商品 提交更新 + * @param id + * @param name + * @param img + * @param date + */ + void doUpdateShopCategory(@Param("id") String id,@Param("name") String name, @Param("img")String img, @Param("date")Date date); } \ No newline at end of file diff --git a/src/main/java/com/hxtec/polaris/service/CategoryService.java b/src/main/java/com/hxtec/polaris/service/CategoryService.java index d766e5f..1770ec2 100644 --- a/src/main/java/com/hxtec/polaris/service/CategoryService.java +++ b/src/main/java/com/hxtec/polaris/service/CategoryService.java @@ -14,28 +14,29 @@ public interface CategoryService { /** * 分类相关 添加分类节点 + * @param request * @param pid * @param name + * @param img * @return */ - Object addCategory(String pid, String name); + Object addCategory(HttpServletRequest request,String pid, String name,String img); /** * 分类相关 删除分类节点 * @param ids * @return */ - Object deleteCategory(List ids); + Object deleteCategory(HttpServletRequest request,List ids); /** * 分类相关 更新分类节点 - * @param pid * @param id * @param name * @param img * @return */ - Object updateCategory(HttpServletRequest request, String pid, String id, String name,String img); + Object updateCategory( String id, String name,String img); /** * 构建分类tree diff --git a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java index 381ec60..872e28e 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/CategoryServiceImpl.java @@ -57,10 +57,20 @@ public class CategoryServiceImpl implements CategoryService { } @Override - public Object addCategory(String pid, String name) { + public Object addCategory(HttpServletRequest request,String pid, String name,String img) { String params = "pid="+pid+",name="+name; String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.INSERT,LOG_CLASS_NAME,LOG_METHOD_ADD_CATORY,params); + //如果父节点为空,则添加的节点为一级节点,走一级节点添加方法 + if(StringUtils.isBlank(pid)){ + try { + doAddRootCategory(request,name,img); + return Result.ok(Msg.CATEGORY_INSERT_OK); + }catch (Exception e){ + throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_INSERT_EXCEPTION),LOG_MSG); + } + } + //请求参数不合法 if (!StringUtils.isNumeric(pid)){ throw new MyException(Result.error(Code.FAIL_4101,Msg.PARAM_INVALID),LOG_MSG); @@ -72,9 +82,10 @@ public class CategoryServiceImpl implements CategoryService { } //实例赋值 ShopCategory shopCategory = setParam(pid,name); + shopCategory.setImage(img); //数据新增入库 try { - doAddCategory(shopCategory,parentObject); + doAddCategory(request,shopCategory,parentObject); }catch (Exception e){ throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_INSERT_EXCEPTION),LOG_MSG); } @@ -82,8 +93,26 @@ public class CategoryServiceImpl implements CategoryService { return Result.ok(Msg.CATEGORY_INSERT_OK); } + /** + * 添加分类 如果父节点为空,则添加的节点为一级节点,走一级节点添加方法 + * @param request + * @param name + * @param img + */ + private void doAddRootCategory(HttpServletRequest request, String name, String img) { + ShopCategory shopCategory = new ShopCategory(); + shopCategory.setName(name); + shopCategory.setImage(img); + shopCategory.setIsParent("N"); + shopCategory.setIsDelete("N"); + shopCategory.setUpdateTime(new Date()); + shopCategory.setCreateTime(new Date()); + shopCategoryMapper.inserRootCategory(shopCategory); + callBuildPath(request); + } + @Override - public Object deleteCategory(List ids) { + public Object deleteCategory(HttpServletRequest request,List ids) { String params = "ids="+ids; String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.DELETE,LOG_CLASS_NAME, LOG_METHOD_DEL_CATORY,params); @@ -99,7 +128,7 @@ public class CategoryServiceImpl implements CategoryService { //更新shop_category表 int deletCategoryResult = 0; try{ - deletCategoryResult = shopCategoryMapper.deleteCategory(id); + deletCategoryResult = shopCategoryMapper.deleteCategory(id,new Date()); }catch (Exception e){ throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_DELETE_EXCEPTION),LOG_MSG); } @@ -108,39 +137,21 @@ public class CategoryServiceImpl implements CategoryService { } } + callBuildPath(request); logger.info(LOG_MSG); return Result.ok(Msg.CATEGORY_DELETE_OK); } @Override - public Object updateCategory(HttpServletRequest request,String pid, String id, String name,String img) { - String params = "pid="+pid+",id="+id+",name="+name; + public Object updateCategory( String id, String name,String img) { + String params = "id="+id+",name="+name; String LOG_MSG = MessageFormat.format(Log.PATTERN_LOG,Log.UPDATE,LOG_CLASS_NAME,LOG_METHOD_UPDATE_CATORY,params); if (!StringUtils.isNumeric(id) || StringUtils.isBlank(name)){ throw new MyException(Result.error(Code.FAIL_4101,Msg.PARAM_INVALID),LOG_MSG); } - - //判断更新的节点是否为根节点,如果为根节点走单独的根节点方法 - List ifRootList = shopCategoryMapper.getCategoryById(id); - if(null != ifRootList && ifRootList.size()>0){ - if(!StringUtils.equals(ifRootList.get(0).getIsDelete(),"Y") && StringUtils.isBlank(ifRootList.get(0).getParentId())){ - try { - doUpdateRootCategory(id,name,img); - }catch (Exception e){ - throw new MyException(Result.error(Code.FAIL_4101,Msg.COMMON_FAIL),LOG_MSG); - } - return Result.ok(); - } - } - - List tempList = shopCategoryMapper.getCategoryById(pid); - if (null == tempList || tempList.size() ==0 || StringUtils.isBlank(tempList.get(0).getIsDelete()) || !GlobalVar.NO.equals(tempList.get(0).getIsDelete())){ - //如果该父节点对应的分类在数据库中没有记录或者删除状态是空或者已删除,则为故障节点,不能进行更新 - throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_PID_EXCEPTION),LOG_MSG); - } //执行更新操作 try { - doUpdateShopCategory(request,pid,id,name,img); + doUpdateShopCategory(id,name,img); }catch (Exception e){ throw new MyException(Result.error(Code.FAIL_4101,Msg.CATEGORY_UPDATE_FAIL),LOG_MSG); } @@ -148,10 +159,6 @@ public class CategoryServiceImpl implements CategoryService { return Result.ok(Msg.CATEGORY_UPDATE_OK); } - private void doUpdateRootCategory(String id, String name, String img) { - shopCategoryMapper.updateRootCategory(id,null,name,img); - } - @Override public Object buildTree(Integer id) { if (null == id){ @@ -180,7 +187,6 @@ public class CategoryServiceImpl implements CategoryService { private ShopCategory setParam(String pid, String name){ ShopCategory shopCategory = new ShopCategory(); //生成id -// shopCategory.setId(GenerateSequenceUtil.generateSequenceNo()); shopCategory.setParentId(pid); shopCategory.setIsParent(GlobalVar.NO); shopCategory.setName(name); @@ -192,39 +198,12 @@ public class CategoryServiceImpl implements CategoryService { /** * 执行db层面的分类更新,返回t - * @param pid * @param id * @param name * @return */ - private void doUpdateShopCategory(HttpServletRequest request,String pid, String id, String name,String img){ - //编辑的节点原来的父节点 - List shopCategorys = shopCategoryMapper.getCategoryById(id); - String oldParentId = shopCategorys.get(0).getParentId(); - - //step1 将当前节点的父节点和名字更新为修改后的值 - shopCategoryMapper.updateCategoryParentId(id,pid,name,img); - - //如果上级节点没有变动,则不需要变更子节点,业务结束 - if (equalsIgnoreCase(pid,oldParentId)){ - return; - } - - //step2 将节点更新前的下级节点指向的parentId,修改为更新的节点原来指向的parentId,相当于往前移了一位 - if (StringUtils.isBlank(oldParentId)){ - shopCategoryMapper.updateCategoryChildNullParentId(oldParentId); - }else { - shopCategoryMapper.updateCategoryChildParentId(id,oldParentId); - } - - //调用线程,更新path - //把当前编辑的节点及其所有子节点挂到新的节点下面,更新路径 - // 创建线程池 - ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(GlobalVar.THREAD_CATEGORY_BUILD_PATH).build(); - ServletContext context = request.getServletContext(); - // 计数器 - CountDownLatch doneSignal = new CountDownLatch(1); - pool.newThread(new BuildPathRunable(context,doneSignal)).start(); + private void doUpdateShopCategory(String id, String name,String img){ + shopCategoryMapper.doUpdateShopCategory(id,name,img,new Date()); } /** @@ -234,14 +213,10 @@ public class CategoryServiceImpl implements CategoryService { * @Param * @return **/ - private void doAddCategory(ShopCategory shopCategory,ShopCategory parentObject){ + private void doAddCategory(HttpServletRequest request,ShopCategory shopCategory,ShopCategory parentObject){ shopCategoryMapper.insertCategory(shopCategory); //构建分类路径 - StringBuilder path = new StringBuilder(GlobalVar.SEPARATOR + shopCategory.getId()); - path.append(parentObject.getComment1()); - shopCategory.setComment1(String.valueOf(path)); - //更新路径 - shopCategoryMapper.updateCategoryDynamic(shopCategory); + callBuildPath(request); } /** @@ -255,4 +230,19 @@ public class CategoryServiceImpl implements CategoryService { str2 = StringUtils.isBlank(str2)? "":str2; return StringUtils.equals(str1, str2); } + + /** + * 更新分类路径 + * @param request + */ + private void callBuildPath(HttpServletRequest request){ + //调用线程,更新path + //把当前编辑的节点及其所有子节点挂到新的节点下面,更新路径 + // 创建线程池 + ThreadFactory pool = new ThreadFactoryBuilder().setNameFormat(GlobalVar.THREAD_CATEGORY_BUILD_PATH).build(); + ServletContext context = request.getServletContext(); + // 计数器 + CountDownLatch doneSignal = new CountDownLatch(1); + pool.newThread(new BuildPathRunable(context,doneSignal)).start(); + } } diff --git a/src/main/resources/mapper/ShopCategoryMapper.xml b/src/main/resources/mapper/ShopCategoryMapper.xml index 5bb2663..545a21e 100644 --- a/src/main/resources/mapper/ShopCategoryMapper.xml +++ b/src/main/resources/mapper/ShopCategoryMapper.xml @@ -62,6 +62,11 @@ and (id like '%${condition}%' or name like '%${condition}%' or comment1 like '%${condition}%' or image like '%${condition}%') + + insert into shop_category (parent_id, is_parent, name, decriptsion, image, @@ -77,6 +82,11 @@ ) + + insert into shop_category (name,is_parent,is_delete,image,create_time,update_time) + VALUES (#{name,jdbcType=VARCHAR},'N','N',#{image,jdbcType=VARCHAR},#{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP}) + + update shop_category @@ -128,7 +138,7 @@ update shop_category - set is_delete = 'Y' + set is_delete = 'Y',update_time = #{date,jdbcType=TIMESTAMP} where comment1 like '%-${id}%-' and is_delete = 'N' @@ -158,7 +168,13 @@ update shop_category - set comment1 = #{path} + set comment1 = #{path},is_parent=#{isParent} + where id = #{id} and is_delete = 'N' + + + + update shop_category + set name = #{name},image=#{img},update_time=#{date} where id = #{id} and is_delete = 'N' -- Gitee From 4ac424ee20c99ed0925337708fdbfb131f1f1f32 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Thu, 19 Dec 2019 17:54:49 +0800 Subject: [PATCH 32/36] path --- .../com/hxtec/polaris/service/impl/FileServiceImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java index 61a1262..fcc8790 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java @@ -59,7 +59,13 @@ public class FileServiceImpl implements FileService{ String realPath = request.getSession().getServletContext().getRealPath(categoryImgPath); //将文件的输入流输出到一个新的文件 FileUtils.copyInputStreamToFile(img.getInputStream(), new File(realPath, nowName)); - path=categoryImgPath+nowName; + //getScheme 当前链接使用的协议 getServerName 服务器地址 getServerPort 端口号 getContextPath 应用名称 + path = request.getScheme() + +"://" + request.getServerName() + + ":" + request.getServerPort() + + request.getContextPath() + + categoryImgPath + + "/" + nowName; } return path; } -- Gitee From 457ee95caf24ead438cdfa90b6ca553e74351591 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Fri, 20 Dec 2019 17:53:57 +0800 Subject: [PATCH 33/36] =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../polaris/commons/constant/GlobalVar.java | 4 +- .../hxtec/polaris/commons/tasks/InitTask.java | 38 +++++++++++++++++++ .../hxtec/polaris/config/ResourceConfig.java | 19 ++++++++++ .../polaris/service/impl/FileServiceImpl.java | 11 ++++-- 4 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/hxtec/polaris/commons/tasks/InitTask.java create mode 100644 src/main/java/com/hxtec/polaris/config/ResourceConfig.java diff --git a/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java index 18a54c7..453861b 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java @@ -58,5 +58,7 @@ public final class GlobalVar { public static final int DELAY_TIME = 3; //上传文件存储路径 - public static final String CATEGORY_IMG_PATH = File.separator +"upload" + File.separator + "category"; + public static final String UPLOAD_BASE_PATH = System.getProperty("user.home")+File.separator + "Polarisdoc"+File.separator; + // public static final String CATEGORY_IMG_PATH = File.separator +"upload" + File.separator + "category"; + public static final String CATEGORY_IMG_PATH = UPLOAD_BASE_PATH +"upload" + File.separator + "category"; } diff --git a/src/main/java/com/hxtec/polaris/commons/tasks/InitTask.java b/src/main/java/com/hxtec/polaris/commons/tasks/InitTask.java new file mode 100644 index 0000000..47ca13d --- /dev/null +++ b/src/main/java/com/hxtec/polaris/commons/tasks/InitTask.java @@ -0,0 +1,38 @@ +package com.hxtec.polaris.commons.tasks; + +import com.hxtec.polaris.commons.constant.GlobalVar; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.CommandLineRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; + +/** + * @Describtion 项目初始化执行任务 + * @Author yonyong + * @Date 2019/12/20 15:15 + * @Version 1.0.0 + **/ +@Component +@Transactional +@Order(value = 1) +public class InitTask implements CommandLineRunner { + + private static final Logger logger = LoggerFactory.getLogger(InitTask.class); + + @Override + public void run(String... args){ + File file = new File(GlobalVar.CATEGORY_IMG_PATH); + if (!file.exists()) { + try{ + file.mkdirs(); + logger.info("当前发布项目下,没有对应目录!已创建"+GlobalVar.CATEGORY_IMG_PATH); + }catch (Exception e){ + logger.info("当前发布项目下,没有对应目录!目录创建失败!目录名称"+GlobalVar.CATEGORY_IMG_PATH); + } + } + } +} diff --git a/src/main/java/com/hxtec/polaris/config/ResourceConfig.java b/src/main/java/com/hxtec/polaris/config/ResourceConfig.java new file mode 100644 index 0000000..66cf98b --- /dev/null +++ b/src/main/java/com/hxtec/polaris/config/ResourceConfig.java @@ -0,0 +1,19 @@ +package com.hxtec.polaris.config; + +import com.hxtec.polaris.commons.constant.GlobalVar; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +public class ResourceConfig extends WebMvcConfigurerAdapter { + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + /** 图片传路径 */ +// registry.addResourceHandler("/profile/**").addResourceLocations("file:" + GlobalVar.CATEGORY_IMG_PATH); + registry.addResourceHandler("/profile/**").addResourceLocations("file:C:\\Users\\Justsafe\\Polaris_doc\\upload\\category"); + registry.addResourceHandler("/profile/**").addResourceLocations("file:C:/Users/Justsafe/Polaris_doc/upload/category"); + } +} diff --git a/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java index fcc8790..1514248 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java @@ -56,15 +56,20 @@ public class FileServiceImpl implements FileService{ //现在的文件名是时间戳加原文件名,出现图片相同时,读取不出来的bug String nowName = System.currentTimeMillis() + img.getOriginalFilename(); //将文件保存在当前工程下的一个upload文件 - String realPath = request.getSession().getServletContext().getRealPath(categoryImgPath); +// String realPath = request.getSession().getServletContext().getRealPath(categoryImgPath); //将文件的输入流输出到一个新的文件 - FileUtils.copyInputStreamToFile(img.getInputStream(), new File(realPath, nowName)); + FileUtils.copyInputStreamToFile(img.getInputStream(), new File(categoryImgPath, nowName)); //getScheme 当前链接使用的协议 getServerName 服务器地址 getServerPort 端口号 getContextPath 应用名称 +// path = request.getScheme() +// +"://" + request.getServerName() +// + ":" + request.getServerPort() +// + request.getContextPath() +// + categoryImgPath +// + "/" + nowName; path = request.getScheme() +"://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() - + categoryImgPath + "/" + nowName; } return path; -- Gitee From efe849f4e57de518702855021b1e4173fd3e6b6a Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Sat, 21 Dec 2019 16:02:06 +0800 Subject: [PATCH 34/36] =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hxtec/polaris/PolarisApplication.java | 2 ++ .../polaris/commons/constant/GlobalVar.java | 4 ++- .../hxtec/polaris/commons/tasks/InitTask.java | 6 ++--- .../hxtec/polaris/config/ResourceConfig.java | 7 +++--- .../polaris/service/impl/FileServiceImpl.java | 25 +++++++++---------- 5 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/hxtec/polaris/PolarisApplication.java b/src/main/java/com/hxtec/polaris/PolarisApplication.java index 545b088..d49865f 100644 --- a/src/main/java/com/hxtec/polaris/PolarisApplication.java +++ b/src/main/java/com/hxtec/polaris/PolarisApplication.java @@ -1,6 +1,7 @@ package com.hxtec.polaris; import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @@ -16,6 +17,7 @@ import tk.mybatis.spring.annotation.MapperScan; @EnableCaching @EnableJpaAuditing @EnableScheduling +@EnableAutoConfiguration public class PolarisApplication { public static void main(String[] args) { diff --git a/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java index 453861b..84f1711 100644 --- a/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java +++ b/src/main/java/com/hxtec/polaris/commons/constant/GlobalVar.java @@ -57,8 +57,10 @@ public final class GlobalVar { //延时收货时间 默认为3天 public static final int DELAY_TIME = 3; + //文件映射mapping + public static final String FILE_MAPPING_PATH = "document"; //上传文件存储路径 public static final String UPLOAD_BASE_PATH = System.getProperty("user.home")+File.separator + "Polarisdoc"+File.separator; // public static final String CATEGORY_IMG_PATH = File.separator +"upload" + File.separator + "category"; - public static final String CATEGORY_IMG_PATH = UPLOAD_BASE_PATH +"upload" + File.separator + "category"; + public static final String CATEGORY_IMG_PATH = "upload" + File.separator + "category"; } diff --git a/src/main/java/com/hxtec/polaris/commons/tasks/InitTask.java b/src/main/java/com/hxtec/polaris/commons/tasks/InitTask.java index 47ca13d..45e9e71 100644 --- a/src/main/java/com/hxtec/polaris/commons/tasks/InitTask.java +++ b/src/main/java/com/hxtec/polaris/commons/tasks/InitTask.java @@ -25,13 +25,13 @@ public class InitTask implements CommandLineRunner { @Override public void run(String... args){ - File file = new File(GlobalVar.CATEGORY_IMG_PATH); + File file = new File(GlobalVar.UPLOAD_BASE_PATH); if (!file.exists()) { try{ file.mkdirs(); - logger.info("当前发布项目下,没有对应目录!已创建"+GlobalVar.CATEGORY_IMG_PATH); + logger.info("当前发布项目下,没有对应目录!已创建"+GlobalVar.UPLOAD_BASE_PATH); }catch (Exception e){ - logger.info("当前发布项目下,没有对应目录!目录创建失败!目录名称"+GlobalVar.CATEGORY_IMG_PATH); + logger.info("当前发布项目下,没有对应目录!目录创建失败!目录名称"+GlobalVar.UPLOAD_BASE_PATH); } } } diff --git a/src/main/java/com/hxtec/polaris/config/ResourceConfig.java b/src/main/java/com/hxtec/polaris/config/ResourceConfig.java index 66cf98b..ab1a4aa 100644 --- a/src/main/java/com/hxtec/polaris/config/ResourceConfig.java +++ b/src/main/java/com/hxtec/polaris/config/ResourceConfig.java @@ -11,9 +11,8 @@ public class ResourceConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { - /** 图片传路径 */ -// registry.addResourceHandler("/profile/**").addResourceLocations("file:" + GlobalVar.CATEGORY_IMG_PATH); - registry.addResourceHandler("/profile/**").addResourceLocations("file:C:\\Users\\Justsafe\\Polaris_doc\\upload\\category"); - registry.addResourceHandler("/profile/**").addResourceLocations("file:C:/Users/Justsafe/Polaris_doc/upload/category"); + //配置文件资源映射路径 + registry.addResourceHandler("/"+GlobalVar.FILE_MAPPING_PATH+"/**").addResourceLocations("file:" + GlobalVar.UPLOAD_BASE_PATH); + super.addResourceHandlers(registry); } } diff --git a/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java b/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java index 1514248..01e8e33 100644 --- a/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java +++ b/src/main/java/com/hxtec/polaris/service/impl/FileServiceImpl.java @@ -44,32 +44,31 @@ public class FileServiceImpl implements FileService{ /** * 保存文件到指定目录,并返回路径 - * @param img + * @param img 前端传递过来的图片 * @param request - * @param categoryImgPath - * @return + * @param savePath 图片存储地址 为相对路径 严格遵守 upload/category 格式 + * @return String 返回图片的地址 http://127.0.0.1:9102/polaris/document/upload/category/test.jpg */ - private String saveImg(MultipartFile img, HttpServletRequest request, String categoryImgPath) throws IOException { + private String saveImg(MultipartFile img, HttpServletRequest request, String savePath) throws IOException { String path = "error"; if(!img.isEmpty()) { //原本的文件名 //现在的文件名是时间戳加原文件名,出现图片相同时,读取不出来的bug String nowName = System.currentTimeMillis() + img.getOriginalFilename(); + //如果文件名太长,给图片重命名 + if (img.getOriginalFilename().length()>20){ + nowName = "图片-" + System.currentTimeMillis(); + } //将文件保存在当前工程下的一个upload文件 -// String realPath = request.getSession().getServletContext().getRealPath(categoryImgPath); //将文件的输入流输出到一个新的文件 - FileUtils.copyInputStreamToFile(img.getInputStream(), new File(categoryImgPath, nowName)); + FileUtils.copyInputStreamToFile(img.getInputStream(), new File(GlobalVar.UPLOAD_BASE_PATH+savePath, nowName)); //getScheme 当前链接使用的协议 getServerName 服务器地址 getServerPort 端口号 getContextPath 应用名称 -// path = request.getScheme() -// +"://" + request.getServerName() -// + ":" + request.getServerPort() -// + request.getContextPath() -// + categoryImgPath -// + "/" + nowName; path = request.getScheme() - +"://" + request.getServerName() + + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + + "/" + GlobalVar.FILE_MAPPING_PATH + + "/" + savePath + "/" + nowName; } return path; -- Gitee From 07cf3366e8bc2961933c02b8a708060cc3b83743 Mon Sep 17 00:00:00 2001 From: yonyong <2365878736@qq.com> Date: Sat, 21 Dec 2019 16:56:56 +0800 Subject: [PATCH 35/36] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E9=9D=99=E6=80=81=E6=98=A0=E5=B0=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hxtec/polaris/config/ResourceConfig.java | 2 + .../polaris/insertDb/UpdateDBPathTest.java | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/test/java/com/hxtec/polaris/com/hxtec/polaris/insertDb/UpdateDBPathTest.java diff --git a/src/main/java/com/hxtec/polaris/config/ResourceConfig.java b/src/main/java/com/hxtec/polaris/config/ResourceConfig.java index ab1a4aa..a0b6766 100644 --- a/src/main/java/com/hxtec/polaris/config/ResourceConfig.java +++ b/src/main/java/com/hxtec/polaris/config/ResourceConfig.java @@ -13,6 +13,8 @@ public class ResourceConfig extends WebMvcConfigurerAdapter { public void addResourceHandlers(ResourceHandlerRegistry registry) { //配置文件资源映射路径 registry.addResourceHandler("/"+GlobalVar.FILE_MAPPING_PATH+"/**").addResourceLocations("file:" + GlobalVar.UPLOAD_BASE_PATH); + //配置项目静态资源访问 只允许访问temp文件夹下内容 + registry.addResourceHandler("/static/temp/**").addResourceLocations("classpath:/static/temp/"); super.addResourceHandlers(registry); } } diff --git a/src/test/java/com/hxtec/polaris/com/hxtec/polaris/insertDb/UpdateDBPathTest.java b/src/test/java/com/hxtec/polaris/com/hxtec/polaris/insertDb/UpdateDBPathTest.java new file mode 100644 index 0000000..28ee155 --- /dev/null +++ b/src/test/java/com/hxtec/polaris/com/hxtec/polaris/insertDb/UpdateDBPathTest.java @@ -0,0 +1,45 @@ +package com.hxtec.polaris.com.hxtec.polaris.insertDb; + +import com.hxtec.polaris.entity.ShopCategory; +import com.hxtec.polaris.mapper.ShopCategoryMapper; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import tk.mybatis.mapper.entity.Example; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @created with IDEA + * @author: yonyong + * @version: 1.0.0 + * @date: 2019/12/21 + * @time: 16:35 + **/ +@SpringBootTest +public class UpdateDBPathTest { + @Resource + private ShopCategoryMapper shopCategoryMapper; + + //更新category图片url + @Test + public void updateCategory(){ + Example example = new Example(ShopCategory.class); + example.createCriteria().andLike("image","http://%"); + List list = shopCategoryMapper.selectByExample(example); + String oldPattern = "http://47.101.193.185:8080/polaris"; + String newPattern = "http://127.0.0.1:9102/polaris"; + for (int i = 0; i Date: Sat, 21 Dec 2019 17:01:03 +0800 Subject: [PATCH 36/36] image --- src/main/resources/static/temp/ad-splash.jpg | Bin 0 -> 45939 bytes src/main/resources/static/temp/ad1.jpg | Bin 0 -> 33801 bytes src/main/resources/static/temp/ad2.jpg | Bin 0 -> 17949 bytes src/main/resources/static/temp/ad3.jpg | Bin 0 -> 38531 bytes src/main/resources/static/temp/banner1.jpg | Bin 0 -> 85944 bytes src/main/resources/static/temp/banner2.jpg | Bin 0 -> 16195 bytes src/main/resources/static/temp/banner3.jpg | Bin 0 -> 85810 bytes src/main/resources/static/temp/banner4.jpg | Bin 0 -> 144635 bytes src/main/resources/static/temp/c1.png | Bin 0 -> 7432 bytes src/main/resources/static/temp/c2.png | Bin 0 -> 8862 bytes src/main/resources/static/temp/c3.png | Bin 0 -> 9845 bytes src/main/resources/static/temp/c4.png | Bin 0 -> 9222 bytes src/main/resources/static/temp/c5.png | Bin 0 -> 7959 bytes src/main/resources/static/temp/c6.png | Bin 0 -> 8140 bytes src/main/resources/static/temp/c7.png | Bin 0 -> 7954 bytes src/main/resources/static/temp/c8.png | Bin 0 -> 9850 bytes src/main/resources/static/temp/cate1.jpg | Bin 0 -> 14667 bytes src/main/resources/static/temp/cate10.jpg | Bin 0 -> 10459 bytes src/main/resources/static/temp/cate11.jpg | Bin 0 -> 13336 bytes src/main/resources/static/temp/cate12.jpg | Bin 0 -> 15048 bytes src/main/resources/static/temp/cate13.jpg | Bin 0 -> 11536 bytes src/main/resources/static/temp/cate14.jpg | Bin 0 -> 10512 bytes src/main/resources/static/temp/cate15.jpg | Bin 0 -> 6538 bytes src/main/resources/static/temp/cate16.jpg | Bin 0 -> 4597 bytes src/main/resources/static/temp/cate17.jpg | Bin 0 -> 5930 bytes src/main/resources/static/temp/cate18.jpg | Bin 0 -> 18224 bytes src/main/resources/static/temp/cate19.jpg | Bin 0 -> 6119 bytes src/main/resources/static/temp/cate2.jpg | Bin 0 -> 8001 bytes src/main/resources/static/temp/cate20.jpg | Bin 0 -> 9617 bytes src/main/resources/static/temp/cate21.jpg | Bin 0 -> 12643 bytes src/main/resources/static/temp/cate22.jpg | Bin 0 -> 13664 bytes src/main/resources/static/temp/cate23.jpg | Bin 0 -> 19424 bytes src/main/resources/static/temp/cate24.jpg | Bin 0 -> 16734 bytes src/main/resources/static/temp/cate3.jpg | Bin 0 -> 19580 bytes src/main/resources/static/temp/cate4.jpg | Bin 0 -> 3959 bytes src/main/resources/static/temp/cate5.jpg | Bin 0 -> 4018 bytes src/main/resources/static/temp/cate6.jpg | Bin 0 -> 2397 bytes src/main/resources/static/temp/cate7.jpg | Bin 0 -> 21783 bytes src/main/resources/static/temp/cate8.jpg | Bin 0 -> 20726 bytes src/main/resources/static/temp/cate9.jpg | Bin 0 -> 13666 bytes src/main/resources/static/temp/h1.png | Bin 0 -> 2918 bytes .../resources/static/temp/secskill-img.jpg | Bin 0 -> 4322 bytes .../resources/static/temp/share_moment.png | Bin 0 -> 12480 bytes src/main/resources/static/temp/share_qq.png | Bin 0 -> 9711 bytes .../resources/static/temp/share_qqzone.png | Bin 0 -> 10392 bytes .../resources/static/temp/share_wechat.png | Bin 0 -> 11385 bytes 46 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/static/temp/ad-splash.jpg create mode 100644 src/main/resources/static/temp/ad1.jpg create mode 100644 src/main/resources/static/temp/ad2.jpg create mode 100644 src/main/resources/static/temp/ad3.jpg create mode 100644 src/main/resources/static/temp/banner1.jpg create mode 100644 src/main/resources/static/temp/banner2.jpg create mode 100644 src/main/resources/static/temp/banner3.jpg create mode 100644 src/main/resources/static/temp/banner4.jpg create mode 100644 src/main/resources/static/temp/c1.png create mode 100644 src/main/resources/static/temp/c2.png create mode 100644 src/main/resources/static/temp/c3.png create mode 100644 src/main/resources/static/temp/c4.png create mode 100644 src/main/resources/static/temp/c5.png create mode 100644 src/main/resources/static/temp/c6.png create mode 100644 src/main/resources/static/temp/c7.png create mode 100644 src/main/resources/static/temp/c8.png create mode 100644 src/main/resources/static/temp/cate1.jpg create mode 100644 src/main/resources/static/temp/cate10.jpg create mode 100644 src/main/resources/static/temp/cate11.jpg create mode 100644 src/main/resources/static/temp/cate12.jpg create mode 100644 src/main/resources/static/temp/cate13.jpg create mode 100644 src/main/resources/static/temp/cate14.jpg create mode 100644 src/main/resources/static/temp/cate15.jpg create mode 100644 src/main/resources/static/temp/cate16.jpg create mode 100644 src/main/resources/static/temp/cate17.jpg create mode 100644 src/main/resources/static/temp/cate18.jpg create mode 100644 src/main/resources/static/temp/cate19.jpg create mode 100644 src/main/resources/static/temp/cate2.jpg create mode 100644 src/main/resources/static/temp/cate20.jpg create mode 100644 src/main/resources/static/temp/cate21.jpg create mode 100644 src/main/resources/static/temp/cate22.jpg create mode 100644 src/main/resources/static/temp/cate23.jpg create mode 100644 src/main/resources/static/temp/cate24.jpg create mode 100644 src/main/resources/static/temp/cate3.jpg create mode 100644 src/main/resources/static/temp/cate4.jpg create mode 100644 src/main/resources/static/temp/cate5.jpg create mode 100644 src/main/resources/static/temp/cate6.jpg create mode 100644 src/main/resources/static/temp/cate7.jpg create mode 100644 src/main/resources/static/temp/cate8.jpg create mode 100644 src/main/resources/static/temp/cate9.jpg create mode 100644 src/main/resources/static/temp/h1.png create mode 100644 src/main/resources/static/temp/secskill-img.jpg create mode 100644 src/main/resources/static/temp/share_moment.png create mode 100644 src/main/resources/static/temp/share_qq.png create mode 100644 src/main/resources/static/temp/share_qqzone.png create mode 100644 src/main/resources/static/temp/share_wechat.png diff --git a/src/main/resources/static/temp/ad-splash.jpg b/src/main/resources/static/temp/ad-splash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4256a79049badcd852fb90c93ff18fa4a7e0082 GIT binary patch literal 45939 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