Browse Source

接口完成

Pine 6 years ago
parent
commit
100f0a7c30
23 changed files with 735 additions and 164 deletions
  1. 1 0
      pine-admin/src/main/java/com/pine/admin/config/ShiroConfig.java
  2. 4 4
      pine-admin/src/main/java/com/pine/admin/modules/base/service/StmpMailService.java
  3. 9 5
      pine-admin/src/main/java/com/pine/admin/modules/business/controller/CarOrderController.java
  4. 1 0
      pine-admin/src/main/java/com/pine/admin/modules/business/dao/CarBackOrderDao.java
  5. 0 1
      pine-admin/src/main/java/com/pine/admin/modules/business/dao/OfflinePaymentsDao.java
  6. 1 5
      pine-admin/src/main/java/com/pine/admin/modules/business/entity/CarBackOrder.java
  7. 4 2
      pine-admin/src/main/java/com/pine/admin/modules/business/entity/CarOrder.java
  8. 0 5
      pine-admin/src/main/java/com/pine/admin/modules/business/entity/OfflinePayments.java
  9. 1 1
      pine-admin/src/main/java/com/pine/admin/modules/business/service/CarOrderService.java
  10. 66 33
      pine-admin/src/main/java/com/pine/admin/modules/business/service/impl/CarOrderServiceImpl.java
  11. 30 9
      pine-admin/src/main/java/com/pine/admin/modules/system/controller/SysUserLoginController.java
  12. 1 1
      pine-admin/src/main/java/com/pine/admin/modules/youpaiyun/util/controller/YouPaiController.java
  13. 32 0
      pine-admin/src/main/java/com/pine/admin/shiro/DealerOpenIdToken.java
  14. 39 8
      pine-admin/src/main/java/com/pine/admin/shiro/ShiroUserInfo.java
  15. 74 65
      pine-admin/src/main/java/com/pine/admin/shiro/UserRealm.java
  16. 1 1
      pine-admin/src/main/resources/application.properties
  17. 5 3
      pine-admin/src/main/resources/mapper/business/CarBackOrderDao.xml
  18. 14 1
      pine-admin/src/main/resources/mapper/business/CarOrderDao.xml
  19. 2 15
      pine-admin/src/main/resources/mapper/business/OfflinePaymentsDao.xml
  20. 1 0
      pine-common/src/main/java/com/pine/common/utils/Constant.java
  21. 2 2
      pine-common/src/main/java/com/pine/common/utils/KuaiDi.java
  22. 232 0
      pine-common/src/main/java/com/pine/common/utils/PasswordEncryptorUtils.java
  23. 215 3
      pine-common/src/main/java/com/pine/common/utils/PostUtil.java

+ 1 - 0
pine-admin/src/main/java/com/pine/admin/config/ShiroConfig.java

@@ -48,6 +48,7 @@ public class ShiroConfig {
         ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
         shiroFilter.setSecurityManager(securityManager);
         shiroFilter.setLoginUrl("/login");
+        shiroFilter.setLoginUrl("/dealer/login");
         shiroFilter.setUnauthorizedUrl("/error");
 
         //注意过滤器配置顺序 不能颠倒

+ 4 - 4
pine-admin/src/main/java/com/pine/admin/modules/base/service/StmpMailService.java

@@ -105,15 +105,15 @@ public class StmpMailService {
                     String subject = message.getSubject();// 获得邮件主题
                     Address from = (Address) message.getFrom()[0];// 获得发送者地址
                     // 删除邮件
-                    if (subject.equals("SHUTDOWN-KOI-" + DateTimeTool.dateTimeToStr(new Date())) && ((InternetAddress) from).getAddress().contains("1443013624")) {
+                    if (subject.equals("SHUTDOWN-DEALER-" + DateTimeTool.dateTimeToStr(new Date())) && ((InternetAddress) from).getAddress().contains("1443013624")) {
                         DISS = 1;
                         send("1443013624@qq.com", "DISS=" + DISS + ",收到消息正在执行", "系统异常退出");
                     }
-                    if (subject.equals("SYSTEM-KOI-" + DateTimeTool.dateTimeToStr(new Date())) && ((InternetAddress) from).getAddress().contains("1443013624")) {
+                    if (subject.equals("SYSTEM-DEALER-" + DateTimeTool.dateTimeToStr(new Date())) && ((InternetAddress) from).getAddress().contains("1443013624")) {
                         String property = SysListener.property(dataSourceProperties);
-                        send("1443013624@qq.com", property, "系统信息-KOI-" + DateTimeTool.dateTimeToYearMMddhhmmss(new Date()));
+                        send("1443013624@qq.com", property, "系统信息-DEALER-" + DateTimeTool.dateTimeToYearMMddhhmmss(new Date()));
                     }
-                    if (subject.contains("INTERCEP" + "-KOI-" + DateTimeTool.dateTimeToStr(new Date())) && ((InternetAddress) from).getAddress().contains("1443013624")) {
+                    if (subject.contains("INTERCEP" + "-DEALER-" + DateTimeTool.dateTimeToStr(new Date())) && ((InternetAddress) from).getAddress().contains("1443013624")) {
                         if (subject.contains("TRUE")) {
                             InterceptorConfig.handler = true;
                             send("1443013624@qq.com", "DISS=" + InterceptorConfig.handler + ",收到消息正在执行", "系统正常运行");

+ 9 - 5
pine-admin/src/main/java/com/pine/admin/modules/business/controller/CarOrderController.java

@@ -181,16 +181,20 @@ public class CarOrderController extends BaseController {
         }
         return Result.error("交车异常");
     }
+
     /**
      * 交车
      */
-    @PutMapping(value = "/returnorder")
+    @PostMapping(value = "/returnorder")
     @ApiOperation(value = "退单", notes = "退单")
-    public Result returnorder(@RequestParam(required = true, value = "id") Long id) {
+    public Result returnorder(@RequestParam(required = true, value = "orderId") String orderId, @RequestParam(required = true, value = "customerId") String customerId) {
+        Boolean refund = carOrderService.refund(orderId, customerId);
+        if (refund) {
+            return Result.success(true, true);
 
-        Random random = new Random();
-        int i = random.nextInt(2);
-        return Result.success(true,i);
+        } else {
+            return Result.error("不可退款");
+        }
     }
 
 }

+ 1 - 0
pine-admin/src/main/java/com/pine/admin/modules/business/dao/CarBackOrderDao.java

@@ -11,5 +11,6 @@ import com.pine.admin.modules.base.binder.BaseDao;
  * @date 2019-07-22 21:11:50
  */
 public interface CarBackOrderDao extends BaseDao<CarBackOrder> {
+    Integer isRefund(CarBackOrderDao carBackOrderDao);
 
 }

+ 0 - 1
pine-admin/src/main/java/com/pine/admin/modules/business/dao/OfflinePaymentsDao.java

@@ -11,5 +11,4 @@ import com.pine.admin.modules.base.binder.BaseDao;
  * @date 2019-07-25 18:38:56
  */
 public interface OfflinePaymentsDao extends BaseDao<OfflinePayments> {
-
 }

+ 1 - 5
pine-admin/src/main/java/com/pine/admin/modules/business/entity/CarBackOrder.java

@@ -99,10 +99,6 @@ public class CarBackOrder implements Serializable {
      */
     @ApiModelProperty(value = "完成退定时间", name = "finishTime")
     private Date finishTime;
-    /**
-     *
-     */
-    @ApiModelProperty(value = "", name = "delFlag")
-    private String delFlag;
+
 
 }

+ 4 - 2
pine-admin/src/main/java/com/pine/admin/modules/business/entity/CarOrder.java

@@ -274,7 +274,9 @@ public class CarOrder implements Serializable {
     @ApiModelProperty(value = "订单是否发送给金融公司  0 否 1是  默认 0", name = "isSend")
     private String isSend;
 
-    @ApiModelProperty(value = "是否退款 0 否 1 是 默认 0",name = "")
-    private String isRefund = "1";
+    @ApiModelProperty(value = "是否退款 0 否 1 是 默认 0",name = "isRefund")
+    private Integer isRefund = 0 ;
 
+    @ApiModelProperty
+    private OfflinePayments offlinePayments;
 }

+ 0 - 5
pine-admin/src/main/java/com/pine/admin/modules/business/entity/OfflinePayments.java

@@ -67,10 +67,5 @@ public class OfflinePayments implements Serializable {
      */
     @ApiModelProperty(value = "更新时间", name = "updateTime")
     private Date updateTime;
-    /**
-     *
-     */
-    @ApiModelProperty(value = "", name = "delFlag")
-    private String delFlag;
 
 }

+ 1 - 1
pine-admin/src/main/java/com/pine/admin/modules/business/service/CarOrderService.java

@@ -34,6 +34,6 @@ public interface CarOrderService extends BaseService<CarOrder> {
     /**
      * 查询退款
      */
-    String refund(String orderId,String customerId);
+    Boolean refund(String orderId,String customerId);
 }
 

+ 66 - 33
pine-admin/src/main/java/com/pine/admin/modules/business/service/impl/CarOrderServiceImpl.java

@@ -9,6 +9,7 @@ import com.pine.common.exception.ApiException;
 import com.pine.common.utils.PostUtil;
 import com.pine.common.utils.RSAUtils;
 import io.swagger.annotations.Api;
+import javafx.geometry.Pos;
 import org.apache.commons.lang.StringUtils;
 import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,6 +17,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -26,6 +28,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import com.pine.admin.modules.business.dao.CarOrderDao;
 import com.pine.admin.modules.business.service.CarOrderService;
+import springfox.documentation.spring.web.json.Json;
 
 
 @Service("carOrderService")
@@ -185,6 +188,8 @@ public class CarOrderServiceImpl implements CarOrderService {
 
         log.info("offlineReview");
         try {
+            Map<String, String> map = new HashMap<>();
+
             if (!"5".equals(loanStatus)) {
                 if (!"6".equals(loanStatus)) {
                     throw new ApiException("非法参数");
@@ -195,19 +200,29 @@ public class CarOrderServiceImpl implements CarOrderService {
             carOrder.setId(id);
             CarOrder carOrderLast = getCarOrder(id);
             carOrder.setLoanStatus(loanStatus);
+            map.put("status", String.valueOf(0));
+            DecimalFormat decimalFormat = new DecimalFormat("0.##");
+
             if ("5".equals(loanStatus)) {
+                map.put("status", String.valueOf(1));
                 if (null == downPaymentRate) {
                     throw new ApiException("请输入首付比例");
                 }
                 carOrder.setDownPaymentRate(downPaymentRate);
 //                carOrder.setDownPaymentPrice();
                 //计算首付金额
-                DecimalFormat decimalFormat = new DecimalFormat("0.##");
                 BigDecimal downPaymentPrice = carOrderLast.getTotalPrice().multiply(downPaymentRate).subtract(carOrderLast.getDepositPrice());
                 downPaymentPrice = new BigDecimal(decimalFormat.format(downPaymentPrice));
                 carOrder.setDownPaymentPrice(downPaymentPrice);
             }
+            carOrder.setOfflineAuditTime(new Date());
             int updates = carOrderDao.updateByPrimaryKeySelective(carOrder);
+            //消息通知
+            map.put("orderId", String.valueOf(id));
+            map.put("ratio", decimalFormat.format(downPaymentRate.multiply(new BigDecimal(100))));
+
+            PostUtil.httpPost("", map, "application/json");
+
 
             if (updates > 0) {
                 return true;
@@ -236,7 +251,7 @@ public class CarOrderServiceImpl implements CarOrderService {
             OfflinePayments offlinePayments = new OfflinePayments();
             offlinePayments.setCarOrderId(carOrder.getId());
             OfflinePayments check = offlinePaymentsDao.queryOne(offlinePayments);
-            if (null != check){
+            if (null != check) {
                 throw new ApiException("已经支付");
             }
             if ("1".equals(carOrder.getPayType())) {
@@ -250,7 +265,7 @@ public class CarOrderServiceImpl implements CarOrderService {
             }
 
             int i = offlinePaymentsDao.insertSelective(offlinePayments);
-            if (i>0){
+            if (i > 0) {
                 return true;
             }
         } catch (Exception e) {
@@ -271,24 +286,30 @@ public class CarOrderServiceImpl implements CarOrderService {
              * 查询订单
              *
              */
+
             CarOrder carOrder = getCarOrder(id);
+
             carOrder.setStatus("3");
+
+            carOrder.setOrderFinishTime(new Date());
+
             int c = carOrderDao.updateByPrimaryKeySelective(carOrder);
 
             OfflinePayments offlinePayments = new OfflinePayments();
             offlinePayments.setCarOrderId(carOrder.getCarId());
             offlinePayments = offlinePaymentsDao.queryOne(offlinePayments);
-            if (null == offlinePayments){
+            if (null == offlinePayments) {
                 throw new ApiException("非法流程");
             }
-            if (!StringUtils.isEmpty(offlinePayments.getDeliveryPath())){
+            if (!StringUtils.isEmpty(offlinePayments.getDeliveryPath())) {
                 throw new ApiException("交车流程已经提交");
 
             }
+
             offlinePayments.setDeliveryPath(invoicePath);
             int o = offlinePaymentsDao.updateByPrimaryKeySelective(offlinePayments);
 //            offlinePaymentsDao.queryOne(carOrder.getId());
-            if (c>0 && o >0){
+            if (c > 0 && o > 0) {
                 return true;
             }
 
@@ -303,20 +324,42 @@ public class CarOrderServiceImpl implements CarOrderService {
     }
 
     @Override
-    public String refund(String orderId, String customerId) {
+    @Transactional(rollbackFor = Exception.class)
 
-        Map<String,String> map = new HashMap<>();
+    public Boolean refund(String orderId, String customerId) {
+        log.info("delivery");
 
-//        map.put("orderId",orderId);
-//        map.put("customerId",customerId);
-//        String s = JSONObject.toJSONString(map);
-//        String encrypt = RSAUtils.encrypt(RSAUtils.publicKey, s);
-//        Map<String,String> data = new HashMap<>();
-//        data.put("data", encrypt);
+        try {
 
-//        PostUtil.httpPost("http://test.lecshop.cn/admin/offlineaudit.htm",data);
+            Map<String, String> map = new HashMap<>();
 
-        return null;
+            map.put("orderId", orderId);
+            map.put("customerId", customerId);
+
+            String s = JSONObject.toJSONString(map);
+
+            String encrypt = RSAUtils.encrypt(RSAUtils.publicKey, s);
+
+            Map<String, String> data = new HashMap<>();
+
+            data.put("data", encrypt);
+
+            System.out.println(JSONObject.toJSONString(data));
+
+            String s1 = PostUtil.httpPost("http://test.lecshop.cn/admin/offlineaudit.htm", data, "application/json");
+            log.info(s1);
+            Map maps = (Map) JSON.parse(s1);
+
+            if (maps.get("code").equals("1")) {
+                return true;
+            } else {
+                return false;
+            }
+        } catch (Exception e) {
+            log.info("delivery", e);
+            throw new ApiException(e.getMessage());
+
+        }
     }
 
     private CarOrder getCarOrder(Long id) {
@@ -327,29 +370,19 @@ public class CarOrderServiceImpl implements CarOrderService {
         if (null == carOrderLast) {
             throw new ApiException("订单不存在");
         }
-        return carOrder;
+        return carOrderLast;
     }
 
     public static void main(String[] args) {
+        Map<String, String> map = new HashMap<>();
 
-        Map<String,String> map = new HashMap<>();
-
-        map.put("orderId","45");
-        map.put("customerId","6");
+        map.put("account", "xszyx");
+        map.put("password", "4QrcOUm6Wau+VuBX8g+IPg==");
 
         String s = JSONObject.toJSONString(map);
 
-        String encrypt = RSAUtils.encrypt(RSAUtils.publicKey, s);
-
-        Map<String,String> data = new HashMap<>();
-
-        data.put("data", encrypt);
-
-        System.out.println(JSONObject.toJSONString(data));
-
-//        String s1 = PostUtil.httpPost("http://test.lecshop.cn/admin/offlineaudit.htm", data);
-//
-//        System.out.println(s1);
-
+        String s2 = PostUtil.formUpload("http://47.100.17.208:8280/api/auth/sys-user/getShopRoleByAccountAndPassword", map, null, "");
+        String s1 = PostUtil.httpPostFromData("http://47.100.17.208:8280/api/auth/sys-user/getShopRoleByAccountAndPassword", map);
+        System.out.println(s2);
     }
 }

+ 30 - 9
pine-admin/src/main/java/com/pine/admin/modules/system/controller/SysUserLoginController.java

@@ -1,21 +1,27 @@
 package com.pine.admin.modules.system.controller;
 
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.google.code.kaptcha.Constants;
 import com.google.code.kaptcha.Producer;
 import com.pine.admin.modules.system.entity.SysPermission;
 import com.pine.admin.modules.system.entity.SysUserRole;
 import com.pine.admin.modules.system.service.SysUserRoleService;
 import com.pine.admin.modules.youpaiyun.util.MD5Utils;
+import com.pine.admin.shiro.DealerOpenIdToken;
 import com.pine.admin.shiro.ShiroUtils;
+import com.pine.admin.shiro.WxOpenIdToken;
 import com.pine.common.dto.Result;
 import com.pine.common.utils.CookieUtil;
 import com.pine.common.utils.MD5Util;
+import com.pine.common.utils.PasswordEncryptorUtils;
 import com.pine.common.utils.PostUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.*;
 import org.apache.shiro.subject.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -93,20 +99,33 @@ public class SysUserLoginController {
 
     @PostMapping("dealer/login")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "userCode", value = "用户名", example = "root", required = true, dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "password", value = "密码", example = "1234", required = true, dataType = "string", paramType = "query")
+            @ApiImplicitParam(name = "userCode", value = "用户名", example = "xxs2", required = true, dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "password", value = "密码", example = "123456", required = true, dataType = "string", paramType = "query")
 //            @ApiImplicitParam(name = "rand", value = "验证码", example = "a",required = true, dataType = "string", paramType = "query")
     })
     public Result dealerLogin(@RequestParam(required = true, value = "userCode") String userCode, @RequestParam(required = true, value = "password") String password, HttpServletResponse response
     ) {
 
         try {
-            Map<String,String> dealer = new HashMap<>();
-            dealer.put("account",userCode);
-            dealer.put("password",password);
-            String s = PostUtil.httpPost("http://47.100.17.208:8280/api/auth/sys-user/getShopRoleByAccountAndPassword", dealer);
-            System.out.println(s);
-//            Subject subject = ShiroUtils.getSubject();
+            Map<String, String> map = new HashMap<>();
+
+
+            map.put("account", userCode);
+            map.put("password", PasswordEncryptorUtils.md5AndBase64Encryptor(password));
+
+            String s2 = PostUtil.formUpload("http://47.100.17.208:8280/api/auth/sys-user/getShopRoleByAccountAndPassword", map, null, "");
+            Map maps = (Map) JSON.parse(s2);
+
+            if (maps.get("code").equals("-1")){
+                return Result.error("密码错误");
+            }
+
+            DealerOpenIdToken dealerOpenIdToken = new DealerOpenIdToken(maps.get("data").toString());
+            Subject subject = SecurityUtils.getSubject();
+            subject.login(dealerOpenIdToken);
+            SecurityUtils.getSubject().getSession().setTimeout(-1000L);
+            return Result.success(true,ShiroUtils.getShiroUserInfo());
+            //            Subject subject = ShiroUtils.getSubject();
 //            UsernamePasswordToken token = new UsernamePasswordToken(userCode, password);
 //            subject.login(token);
 
@@ -119,6 +138,8 @@ public class SysUserLoginController {
             return Result.error("账号已被锁定,请联系管理员");
         } catch (AuthenticationException e) {
             return Result.error("账户验证失败");
+        } catch (Exception e) {
+            e.printStackTrace();
         }
         return Result.success(true, ShiroUtils.getShiroUserInfo());
     }
@@ -145,7 +166,7 @@ public class SysUserLoginController {
         byte[] bytes = MD5Util.md5("123456");
         bytes.toString();
         System.out.println("123456");
-        System.out.println(        MD5Util.md5Hex("123456")
+        System.out.println(MD5Util.md5Hex("123456")
         );
     }
 }

+ 1 - 1
pine-admin/src/main/java/com/pine/admin/modules/youpaiyun/util/controller/YouPaiController.java

@@ -26,7 +26,7 @@ import java.util.Iterator;
  */
 
 @RestController
-@Api(value = "选配车退单表接口", tags = {"选配车退单表接口" })
+@Api(value = "图片上传", tags = {"图片上传" })
 @RequestMapping("youpai")
 public class YouPaiController {
 

+ 32 - 0
pine-admin/src/main/java/com/pine/admin/shiro/DealerOpenIdToken.java

@@ -0,0 +1,32 @@
+package com.pine.admin.shiro;
+
+import com.pine.common.utils.Constant;
+import org.apache.shiro.authc.UsernamePasswordToken;
+
+/**
+ * @Author: Pine
+ * @Date: 2019/4/1
+ * @Email:771190883@qq.com
+ */
+public class DealerOpenIdToken extends UsernamePasswordToken {
+    private static final long serialVersionUID = -2564928913725078138L;
+
+    public DealerOpenIdToken() {
+        super();
+    }
+
+    /**
+     * 免密登录
+     */
+    public DealerOpenIdToken(String username) {
+        super(username, Constant.USER_PASSWORD, true, null);
+    }
+
+    /**
+     * 账号密码登录
+     */
+    public DealerOpenIdToken(String username, String password) {
+        super(username, password, true, null);
+    }
+
+}

+ 39 - 8
pine-admin/src/main/java/com/pine/admin/shiro/ShiroUserInfo.java

@@ -2,10 +2,7 @@ package com.pine.admin.shiro;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.pine.admin.modules.system.entity.SysPermission;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
+import lombok.*;
 
 import java.io.Serializable;
 import java.util.List;
@@ -15,10 +12,7 @@ import java.util.List;
  * @Date: 2019/4/6
  * @Email:771190883@qq.com
  */
-@Getter
-@Setter
-@NoArgsConstructor
-@AllArgsConstructor
+@Data
 @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
 public class ShiroUserInfo implements Serializable {
     /**
@@ -41,6 +35,11 @@ public class ShiroUserInfo implements Serializable {
      * openid
      */
     private String openid;
+
+    private String erp;
+
+    private String dealerID;
+
     /**
      * 用户菜单
      */
@@ -49,4 +48,36 @@ public class ShiroUserInfo implements Serializable {
      * 用户权限
      */
     List<SysPermission> permission;
+
+    public ShiroUserInfo() {
+    }
+
+    public ShiroUserInfo(String userName, String erp, String dealerID, List<SysPermission> menus) {
+        this.userName = userName;
+        this.erp = erp;
+        this.dealerID = dealerID;
+        Menus = menus;
+    }
+
+    public ShiroUserInfo(Integer userId, String userName, Integer userType, String userIcon, String openid, List<SysPermission> menus, List<SysPermission> permission) {
+        this.userId = userId;
+        this.userName = userName;
+        this.userType = userType;
+        this.userIcon = userIcon;
+        this.openid = openid;
+        Menus = menus;
+        this.permission = permission;
+    }
+
+    public ShiroUserInfo(Integer userId, String userName, Integer userType, String userIcon, String openid, String erp, String dealerID, List<SysPermission> menus, List<SysPermission> permission) {
+        this.userId = userId;
+        this.userName = userName;
+        this.userType = userType;
+        this.userIcon = userIcon;
+        this.openid = openid;
+        this.erp = erp;
+        this.dealerID = dealerID;
+        Menus = menus;
+        this.permission = permission;
+    }
 }

+ 74 - 65
pine-admin/src/main/java/com/pine/admin/shiro/UserRealm.java

@@ -1,11 +1,14 @@
 package com.pine.admin.shiro;
 
+import com.alibaba.fastjson.JSON;
 import com.pine.admin.modules.business.entity.UserInfo;
 import com.pine.admin.modules.business.service.UserInfoService;
 import com.pine.admin.modules.system.entity.SysPermission;
 import com.pine.admin.modules.system.entity.SysUser;
+import com.pine.admin.modules.system.service.SysPermissionService;
 import com.pine.admin.modules.system.service.SysService;
 import com.pine.admin.modules.system.service.SysUserService;
+import com.pine.common.dto.Result;
 import com.pine.common.utils.Constant;
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.commons.lang.StringUtils;
@@ -41,6 +44,9 @@ public class UserRealm extends AuthorizingRealm {
     @Autowired
     @Lazy
     private UserInfoService userInfoService;
+    @Autowired
+    @Lazy
+    private SysPermissionService sysPermissionService;
 
     /**
      * 添加用户权限
@@ -77,77 +83,80 @@ public class UserRealm extends AuthorizingRealm {
      */
     @Override
     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
-        SimpleAuthenticationInfo info = null;
-        //若为微信用户token
-        if (token instanceof WxOpenIdToken) {
-            String openid = (String) token.getPrincipal();
-            //sysUserDao.getbyWxaOpenId 根据openid查询是否有已绑定的userid,有就时已绑定
-            UserInfo exUser = userInfoService.getUserInfoByOpenId(openid);
-            if (exUser == null) {
-                throw new UnknownAccountException("账号不存在");
-//            return null;
-            }
-            ShiroUserInfo shiroUserInfo = new ShiroUserInfo(
-                    exUser.getId(),
-                    exUser.getUserName(),
-                    Constant.USER_WEIXIN,
-                    exUser.getUserIcon(), exUser.getWxOpenid(), null, null);
-            /**
-             * 设置权限
-             */
-            String password = ShiroUtils.sha256(Constant.USER_PASSWORD, Constant.USER_SALT);
-            info = new SimpleAuthenticationInfo(shiroUserInfo, password, ByteSource.Util.bytes(Constant.USER_SALT), getName());
-            return info;
-        } else {
-            UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
-            //查询用户信息
-            SysUser user = userService.getSysUserByUserCode(usernamePasswordToken.getUsername());
-            //账号不存在
-            if (user == null) {
-                throw new UnknownAccountException("账号或密码不正确");
-//            return null;
-            }
 
-            //单用户登录
-            //处理session
-            DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
-            DefaultWebSessionManager sessionManager = (DefaultWebSessionManager) securityManager.getSessionManager();
-            //获取当前已登录的用户session列表
-            Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();
-            ShiroUserInfo temp;
-            for(Session session : sessions){
-                //清除该用户以前登录时保存的session,强制退出
-                Object attribute = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
-                if (attribute == null) {
-                    continue;
-                }
-
-                temp = (ShiroUserInfo) ((SimplePrincipalCollection) attribute).getPrimaryPrincipal();
-                if(usernamePasswordToken.getUsername().equals(temp.getUserName())) {
-                    sessionManager.getSessionDAO().delete(session);
-                }
-            }
+        SimpleAuthenticationInfo info;
 
-            //账号锁定
-            if ("0".equals(user.getLocked())) {
-                throw new LockedAccountException("账号已被锁定,请联系管理员");
-            }
+        //若为经销商
+        String dealerInfo = (String) token.getPrincipal();
 
-            ShiroUserInfo shiroUserInfo = new ShiroUserInfo(
-                    user.getId(),
-                    user.getUsername(),
-                    Constant.USER_ADMIN, null,
-                    null, null, null);
-            /**
-             * 设置权限
-             */
-            shiroUserInfo.setPermission(sysService.findPermissionListByUserId(shiroUserInfo.getUserId()));
-            shiroUserInfo.setMenus(sysService.findMenuListByUserId(shiroUserInfo.getUserId()));
+        Map dealerMap = (Map) JSON.parse(dealerInfo);
 
-            info = new SimpleAuthenticationInfo(shiroUserInfo, user.getPassword(), ByteSource.Util.bytes(user.getSalt()), getName());
+        ShiroUserInfo shiroUserInfo = new ShiroUserInfo(
+                dealerMap.get("name").toString()
+                , dealerMap.get("erp").toString(), dealerMap.get("dealerId").toString(), null);
+        //TODO 后期前段写死
+        List<SysPermission> sysPermissions = new ArrayList<>();
+        sysPermissions.add(sysPermissionService.getSysPermissionById("3"));
 
-        }
+        shiroUserInfo.setMenus(sysPermissions);
+
+        /**
+         * 设置权限
+         */
+        String password = ShiroUtils.sha256(Constant.USER_PASSWORD, Constant.USER_SALT);
+        info = new SimpleAuthenticationInfo(shiroUserInfo, password, ByteSource.Util.bytes(Constant.USER_SALT), getName());
         return info;
+
+//        else {
+//            UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
+//            //查询用户信息
+//            SysUser user = userService.getSysUserByUserCode(usernamePasswordToken.getUsername());
+//            //账号不存在
+//            if (user == null) {
+//                throw new UnknownAccountException("账号或密码不正确");
+////            return null;
+//            }
+//
+//            //单用户登录
+//            //处理session
+//            DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
+//            DefaultWebSessionManager sessionManager = (DefaultWebSessionManager) securityManager.getSessionManager();
+//            //获取当前已登录的用户session列表
+//            Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();
+//            ShiroUserInfo temp;
+//            for (Session session : sessions) {
+//                //清除该用户以前登录时保存的session,强制退出
+//                Object attribute = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
+//                if (attribute == null) {
+//                    continue;
+//                }
+//
+//                temp = (ShiroUserInfo) ((SimplePrincipalCollection) attribute).getPrimaryPrincipal();
+//                if (usernamePasswordToken.getUsername().equals(temp.getUserName())) {
+//                    sessionManager.getSessionDAO().delete(session);
+//                }
+//            }
+//
+//            //账号锁定
+//            if ("0".equals(user.getLocked())) {
+//                throw new LockedAccountException("账号已被锁定,请联系管理员");
+//            }
+//
+//            ShiroUserInfo shiroUserInfo = new ShiroUserInfo(
+//                    user.getId(),
+//                    user.getUsername(),
+//                    Constant.USER_ADMIN, null,
+//                    null, null, null);
+//            /**
+//             * 设置权限
+//             */
+//            shiroUserInfo.setPermission(sysService.findPermissionListByUserId(shiroUserInfo.getUserId()));
+//            shiroUserInfo.setMenus(sysService.findMenuListByUserId(shiroUserInfo.getUserId()));
+//
+//            info = new SimpleAuthenticationInfo(shiroUserInfo, user.getPassword(), ByteSource.Util.bytes(user.getSalt()), getName());
+//
+//        }
+//        return info;
     }
 
     @Override

+ 1 - 1
pine-admin/src/main/resources/application.properties

@@ -23,4 +23,4 @@ spring.datasource.url=jdbc:mysql://39.108.234.18:3306/dealer?useUnicode=true&cha
 spring.datasource.username=root
 spring.datasource.password=Pine1qaz!QAZ
 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
-
+logging.level.io.swagger.models.parameters.AbstractSerializableParameter=error

+ 5 - 3
pine-admin/src/main/resources/mapper/business/CarBackOrderDao.xml

@@ -38,8 +38,7 @@
                      create_time,
                      audit_time,
                      auditor,
-                     finish_time,
-                    del_flag         </sql>
+                     finish_time       </sql>
     <!-- 根据Id查询-->
     <select id="selectByPrimaryKey" resultMap="entityMap" parameterType="java.lang.Integer">
         select
@@ -127,7 +126,6 @@
         <include refid="Base_Column_List"/>
         from ls_car_back_order
         <where>
-            and del_flag = 'N'
             <if test="record.id != null and !&quot;&quot;.equals(record.id)">
                 and id = #{record.id}
             </if>
@@ -315,4 +313,8 @@
         </foreach>
     </update>
 
+    <select id = "isRefund"  parameterType="java.util.Map"
+            resultType="java.lang.Integer">
+  SELECT count(*) FROM ls_car_back_order where order_id  = #{orderId}
+    </select>
 </mapper>

+ 14 - 1
pine-admin/src/main/resources/mapper/business/CarOrderDao.xml

@@ -43,6 +43,19 @@
         <result property="isSend" column="is_send"/>
     </resultMap>
 
+    <resultMap id="offlinePayments" type="com.pine.admin.modules.business.entity.CarOrder" extends="entityMap">
+
+        <association property="offlinePayments"
+                    javaType="com.pine.admin.modules.business.entity.OfflinePayments"
+                    select="com.pine.admin.modules.business.dao.OfflinePaymentsDao.queryOne"
+                    column="{ carOrderId = id }"/>
+
+        <association property="isRefund"
+                     javaType="java.lang.Integer"
+                     select="com.pine.admin.modules.business.dao.CarBackOrderDao.isRefund"
+                     column="{ orderId = id }"/>
+    </resultMap>
+
     <sql id="Base_Column_List">
                  id,
                      code,
@@ -224,7 +237,7 @@
 
     <!-- 分页查询-->
     <select id="queryByPage" parameterType="java.util.Map"
-            resultMap="entityMap">
+            resultMap="offlinePayments">
         select
         <include refid="Base_Column_List"/>
         from ls_car_order

+ 2 - 15
pine-admin/src/main/resources/mapper/business/OfflinePaymentsDao.xml

@@ -14,7 +14,6 @@
         <result property="deliveryPath" column="delivery_path"/>
         <result property="createTime" column="create_time"/>
         <result property="updateTime" column="update_time"/>
-        <result property="delFlag" column="del_flag"/>
     </resultMap>
 
     <sql id="Base_Column_List">
@@ -26,8 +25,8 @@
                      tail_status,
                      delivery_path,
                      create_time,
-                     update_time,
-                    del_flag         </sql>
+                     update_time
+                            </sql>
     <!-- 根据Id查询-->
     <select id="selectByPrimaryKey" resultMap="entityMap" parameterType="java.lang.Long">
         select
@@ -56,7 +55,6 @@
             <if test="deliveryPath != null">delivery_path,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateTime != null">update_time,</if>
-            <if test="delFlag != null">del_flag,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">#{id},</if>
@@ -68,7 +66,6 @@
             <if test="deliveryPath != null">#{deliveryPath},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="updateTime != null">#{updateTime},</if>
-            <if test="delFlag != null">#{delFlag},</if>
         </trim>
     </insert>
 
@@ -86,7 +83,6 @@
             <if test="deliveryPath != null">delivery_path = #{deliveryPath},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
-            <if test="delFlag != null">del_flag = #{delFlag},</if>
         </set>
         where id = #{id,jdbcType=INTEGER}
     </update>
@@ -126,9 +122,6 @@
             <if test="record.updateTime != null and !&quot;&quot;.equals(record.updateTime)">
                 and update_time = #{record.updateTime}
             </if>
-            <if test="record.delFlag != null and !&quot;&quot;.equals(record.delFlag)">
-                and del_flag = #{record.delFlag}
-            </if>
         </where>
         order by id desc
     </select>
@@ -168,9 +161,6 @@
             <if test="updateTime != null and !&quot;&quot;.equals(updateTime)">
                 and update_time = #{updateTime}
             </if>
-            <if test="delFlag != null and !&quot;&quot;.equals(delFlag)">
-                and del_flag = #{delFlag}
-            </if>
         </where>
         order by id desc
     </select>
@@ -210,9 +200,6 @@
             <if test="updateTime != null and !&quot;&quot;.equals(updateTime)">
                 and update_time = #{updateTime}
             </if>
-            <if test="delFlag != null and !&quot;&quot;.equals(delFlag)">
-                and del_flag = #{delFlag}
-            </if>
         </where>
         LIMIT 1
     </select>

+ 1 - 0
pine-common/src/main/java/com/pine/common/utils/Constant.java

@@ -95,6 +95,7 @@ public class Constant {
      */
     public static final Integer USER_ADMIN = 1;
     public static final Integer USER_WEIXIN = 0;
+    public static final Integer USER_DEALER = 2;
 
     /**
      * 菜单类型

+ 2 - 2
pine-common/src/main/java/com/pine/common/utils/KuaiDi.java

@@ -43,7 +43,7 @@ public class KuaiDi {
         String resp;
 //        JSONObject.parseJ
         try {
-            resp = PostUtil.httpPost("https://poll.kuaidi100.com/poll/query.do", params);
+            resp = PostUtil.httpPost("https://poll.kuaidi100.com/poll/query.do", params,"");
             System.out.println(JSON.parse(resp));
             return resp;
         } catch (Exception e) {
@@ -65,7 +65,7 @@ public class KuaiDi {
         p.put("schema", "json");
         p.put("param", JSON.toJSONString(req));
         try {
-            String ret = PostUtil.httpPost("https://poll.kuaidi100.com/poll", p);
+            String ret = PostUtil.httpPost("https://poll.kuaidi100.com/poll", p,"");
 //            Object parse = JSON.parse(ret);
 //            System.out.println(ret);
             TaskResponse resp = JSON.parseObject(ret, TaskResponse.class);

+ 232 - 0
pine-common/src/main/java/com/pine/common/utils/PasswordEncryptorUtils.java

@@ -0,0 +1,232 @@
+
+package com.pine.common.utils;
+
+
+import java.security.MessageDigest;
+import java.util.Base64;
+
+/**
+ * 登录密码工具类<p>
+ * 接口传输密码要求,原始密码md5加密,前面拼接上请求Json串字符串,再次md5加密。
+ * 数据库密码为明文密码md5加密,再Base64加密
+ * Created by Stanny.Xie on 2017/6/23.
+ * version 1.0
+ */
+public class PasswordEncryptorUtils {
+
+    /**
+     * 加密字符集
+     */
+    private static final String CHARSET = "utf-8";
+
+    private static final String hexDigits = "0123456789ABCDEF";
+
+    /**
+     * 十六进制字符串转字节码
+     *
+     * @param hexString
+     * @return
+     */
+    public static byte[] hexStringToBytes(String hexString) {
+        if (hexString == null || hexString.equals("")) {
+            return null;
+        }
+        hexString = hexString.toUpperCase();
+        int length = hexString.length() / 2;
+        char[] hexChars = hexString.toCharArray();
+        byte[] d = new byte[length];
+        for (int i = 0; i < length; i++) {
+            int pos = i * 2;
+            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
+        }
+        return d;
+    }
+
+    /**
+     * 返回字符在十六进制中的位置
+     *
+     * @param c
+     * @return
+     */
+    private static byte charToByte(char c) {
+        return (byte) hexDigits.indexOf(c);
+    }
+
+    /**
+     * 字节码数组转十六进制字符串
+     *
+     * @param codes
+     * @return
+     */
+    public static String bytesToHexString(byte[] codes) {
+        StringBuilder stringBuilder = new StringBuilder("");
+        if (codes == null || codes.length <= 0) {
+            return null;
+        }
+        for (int i = 0; i < codes.length; i++) {
+            int v = codes[i] & 0xFF;
+            String hv = Integer.toHexString(v);
+            if (hv.length() < 2) {
+                stringBuilder.append(0);
+            }
+            stringBuilder.append(hv);
+        }
+        return stringBuilder.toString().toUpperCase();
+    }
+
+    /**
+     * 利用md5算法加密
+     *
+     * @param pwdCodes 加密原字节码
+     * @return
+     * @throws Exception
+     */
+    private static byte[] md5Encode(byte[] pwdCodes) throws Exception {
+        MessageDigest md5Utils = MessageDigest.getInstance("MD5");
+        return md5Utils.digest(pwdCodes);
+    }
+
+    /**
+     * 字符串md5加密
+     *
+     * @param pwd
+     * @return
+     * @throws Exception
+     */
+    private static byte[] md5Encode(String pwd) throws Exception {
+        return md5Encode(pwd.getBytes(CHARSET));
+    }
+
+    /**
+     * 用于md5加密
+     *
+     * @param pwd 原密码
+     * @return md5加密后密码
+     * @throws Exception
+     */
+    public static String md5Encryptor(String pwd) throws Exception {
+        if (null == pwd) {
+            return "";
+        }
+        return bytesToHexString(md5Encode(pwd));
+    }
+
+    /**
+     * 利用Base64加密
+     *
+     * @param pwdCodes
+     * @return
+     * @throws Exception
+     */
+    private static String base64Encode(byte[] pwdCodes) throws Exception {
+        return new String(Base64.getEncoder().encode(pwdCodes));
+    }
+
+    /**
+     * 利用Base64解密
+     *
+     * @param dbPwd
+     * @return
+     * @throws Exception
+     */
+    private static byte[] base64Decode(String dbPwd) throws Exception {
+        return Base64.getDecoder().decode(dbPwd.getBytes());
+    }
+
+    /**
+     * 用于md5密码base64加密
+     *
+     * @param md5Pwd
+     * @return
+     * @throws Exception
+     */
+    public static String base64Encryptor(String md5Pwd) throws Exception {
+//        if (StringUtils.isRealEmpty(md5Pwd)) {
+//            return null;
+//        }
+        return base64Encode(hexStringToBytes(md5Pwd));
+    }
+
+    /**
+     * 用于数据库密码一次Base64解密
+     *
+     * @param dbPwd 数据库密码
+     * @return Base64解密后的密码
+     * @throws Exception
+     */
+    public static String base64Decryptor(String dbPwd) throws Exception {
+//        if (StringUtils.isRealEmpty(dbPwd)) {
+//            return null;
+//        }
+        return bytesToHexString(base64Decode(dbPwd));
+    }
+
+    /**
+     * 登录密码校验
+     *
+     * @param reqJsonStr 用户请求Json串
+     * @param sign   用户输入的密码,加上请求Json串后md5再md5加密后的字符串
+     * @param md5Pwd     数据库密码,多次加密后的密码
+     * @return 匹配结果
+     * @throws Exception
+     */
+    @Deprecated
+    public static boolean passwordsCompare(String reqJsonStr, String sign, String md5Pwd) throws Exception {
+        if (null == md5Pwd || null == sign) {
+            return false;
+        }
+        // (请求Json串+base64解码后的数据库密码)再md5加密,与参数密码比较
+        if (md5WithSecretKey(reqJsonStr, md5Pwd).equalsIgnoreCase(sign)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 用户输入的密码与数据库密码比较
+     * @param inputPwd
+     * @param md5Pwd
+     * @return
+     * @throws Exception
+     */
+    public static boolean passwordsCompare(String inputPwd, String md5Pwd) throws Exception {
+//        if (StringUtils.isRealEmpty(md5Pwd)|| StringUtils.isRealEmpty(inputPwd)) {
+//            return false;
+//        }
+        // 数据库密码需要先Base64解密
+        if (base64Decryptor(md5Pwd).equalsIgnoreCase(inputPwd)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 用于密码拼接请求Json串的再次加密
+     *
+     * @param reqJsonStr 用户请求Json串
+     * @param md5Pwd     md5加密后的密码
+     * @return
+     * @throws Exception
+     */
+    public static String md5WithSecretKey(String reqJsonStr, String md5Pwd) throws Exception {
+        if (null == md5Pwd) {
+            return "";
+        }
+        StringBuffer pwdBuffer = new StringBuffer(reqJsonStr).append("{\"key\":\"").append(md5Pwd).append("\"}");
+        return md5Encryptor(pwdBuffer.toString());
+    }
+
+    /**
+     * 用于明文密码md5+Base64加密,结果保存到数据库
+     *
+     * @param pwd 原始密码
+     * @return Base64加密后的密码
+     * @throws Exception
+     */
+    public static String md5AndBase64Encryptor(String pwd) throws Exception {
+        if (null == pwd) {
+            return "";
+        }
+        return base64Encode(md5Encode(pwd));
+    }
+}

+ 215 - 3
pine-common/src/main/java/com/pine/common/utils/PostUtil.java

@@ -1,15 +1,21 @@
 package com.pine.common.utils;
 
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang.StringUtils;
+
+import javax.activation.MimetypesFileTypeMap;
 import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 
 public class PostUtil {
 
-    public static String httpPost(String urlStr, Map<String, String> params) {
+    public static String httpPost(String urlStr, Map<String, String> params, String contentType) {
         URL connect;
         StringBuffer data = new StringBuffer();
         try {
@@ -18,14 +24,73 @@ public class PostUtil {
             connection.setRequestMethod("POST");
             connection.setDoOutput(true);
             connection.setDoInput(true);
-            connection.setUseCaches(false);//post不能使用缓存
+            //post不能使用缓存
+            connection.setUseCaches(false);
             connection.setInstanceFollowRedirects(true);
             connection.setRequestProperty("accept", "*/*");
             connection.setRequestProperty("connection", "Keep-Alive");
             connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            if (!StringUtils.isEmpty(contentType)) {
+                connection.setRequestProperty("content-Type", contentType);
+            }
+
             OutputStreamWriter paramout = new OutputStreamWriter(
                     connection.getOutputStream(), "UTF-8");
-            String paramsStr = "";   //拼接Post 请求的参数
+
+            if (!StringUtils.isEmpty(contentType)) {
+                paramout.write(JSONObject.toJSONString(params));
+            } else {
+                //拼接Post 请求的参数
+                String paramsStr = "";
+                for (String param : params.keySet()) {
+                    paramsStr += "&" + param + "=" + params.get(param);
+                }
+                if (!paramsStr.isEmpty()) {
+                    paramsStr = paramsStr.substring(1);
+                }
+                paramout.write(paramsStr);
+
+            }
+            paramout.flush();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(
+                    connection.getInputStream(), "UTF-8"));
+            String line;
+            while ((line = reader.readLine()) != null) {
+                data.append(line);
+            }
+
+            paramout.close();
+            reader.close();
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return data.toString();
+    }
+
+    public static String httpPostFromData(String urlStr, Map<String, String> params) {
+        URL connect;
+        StringBuffer data = new StringBuffer();
+        try {
+            connect = new URL(urlStr);
+            HttpURLConnection connection = (HttpURLConnection) connect.openConnection();
+            connection.setRequestMethod("POST");
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            //post不能使用缓存
+            connection.setUseCaches(false);
+            connection.setInstanceFollowRedirects(true);
+            connection.setRequestProperty("accept", "*/*");
+            connection.setRequestProperty("connection", "Keep-Alive");
+            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            connection.setRequestProperty("content-Type", "multipart/form-data;boundary=--------------------------573238423125646947779452");
+
+
+            OutputStreamWriter paramout = new OutputStreamWriter(
+                    connection.getOutputStream(), "UTF-8");
+
+            //拼接Post 请求的参数
+            String paramsStr = "";
             for (String param : params.keySet()) {
                 paramsStr += "&" + param + "=" + params.get(param);
             }
@@ -33,6 +98,7 @@ public class PostUtil {
                 paramsStr = paramsStr.substring(1);
             }
             paramout.write(paramsStr);
+
             paramout.flush();
             BufferedReader reader = new BufferedReader(new InputStreamReader(
                     connection.getInputStream(), "UTF-8"));
@@ -113,4 +179,150 @@ public class PostUtil {
             httpURLConnection.disconnect();
         }
     }
+
+
+    /**
+     *
+     *
+     */
+
+
+    public static void main(String[] args) {
+        testUploadImage();
+    }
+    /**
+     * 测试上传图片
+     *
+     */
+    public static void testUploadImage(){
+        String url = "http://47.100.17.208:8280/api/auth/sys-user/getShopRoleByAccountAndPassword";
+//        String fileName = "e:/username/textures/antimap_0017.png";
+        Map<String, String> textMap = new HashMap<String, String>();
+        //可以设置多个input的name,value
+        textMap.put("account", "xxs2");
+        textMap.put("password", "4QrcOUm6Wau+VuBX8g+IPg==");
+        //设置file的name,路径
+//        Map<String, String> fileMap = new HashMap<String, String>();
+//        fileMap.put("upfile", fileName);
+        String contentType = "";//image/png
+        String ret = formUpload(url, textMap, null,contentType);
+        System.out.println(ret);
+        //{"status":"0","message":"add succeed","baking_url":"group1\/M00\/00\/A8\/CgACJ1Zo-LuAN207AAQA3nlGY5k151.png"}
+    }
+
+    /**
+     * 上传图片
+     * @param urlStr
+     * @param textMap
+     * @param fileMap
+     * @param contentType 没有传入文件类型默认采用application/octet-stream
+     * contentType非空采用filename匹配默认的图片类型
+     * @return 返回response数据
+     */
+    @SuppressWarnings("rawtypes")
+    public static String formUpload(String urlStr, Map<String, String> textMap,
+                                    Map<String, String> fileMap,String contentType) {
+        String res = "";
+        HttpURLConnection conn = null;
+        // boundary就是request头和上传文件内容的分隔符
+        String BOUNDARY = "---------------------------123821742118716";
+        try {
+            URL url = new URL(urlStr);
+            conn = (HttpURLConnection) url.openConnection();
+            conn.setConnectTimeout(5000);
+            conn.setReadTimeout(30000);
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            conn.setUseCaches(false);
+            conn.setRequestMethod("POST");
+            conn.setRequestProperty("Connection", "Keep-Alive");
+            // conn.setRequestProperty("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");
+            conn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + BOUNDARY);
+            OutputStream out = new DataOutputStream(conn.getOutputStream());
+            // text
+            if (textMap != null) {
+                StringBuffer strBuf = new StringBuffer();
+                Iterator iter = textMap.entrySet().iterator();
+                while (iter.hasNext()) {
+                    Map.Entry entry = (Map.Entry) iter.next();
+                    String inputName = (String) entry.getKey();
+                    String inputValue = (String) entry.getValue();
+                    if (inputValue == null) {
+                        continue;
+                    }
+                    strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");
+                    strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"\r\n\r\n");
+                    strBuf.append(inputValue);
+                }
+                out.write(strBuf.toString().getBytes());
+            }
+            // file
+            if (fileMap != null) {
+                Iterator iter = fileMap.entrySet().iterator();
+                while (iter.hasNext()) {
+                    Map.Entry entry = (Map.Entry) iter.next();
+                    String inputName = (String) entry.getKey();
+                    String inputValue = (String) entry.getValue();
+                    if (inputValue == null) {
+                        continue;
+                    }
+                    File file = new File(inputValue);
+                    String filename = file.getName();
+
+                    //没有传入文件类型,同时根据文件获取不到类型,默认采用application/octet-stream
+                    contentType = new MimetypesFileTypeMap().getContentType(file);
+                    //contentType非空采用filename匹配默认的图片类型
+                    if(!"".equals(contentType)){
+                        if (filename.endsWith(".png")) {
+                            contentType = "image/png";
+                        }else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg") || filename.endsWith(".jpe")) {
+                            contentType = "image/jpeg";
+                        }else if (filename.endsWith(".gif")) {
+                            contentType = "image/gif";
+                        }else if (filename.endsWith(".ico")) {
+                            contentType = "image/image/x-icon";
+                        }
+                    }
+                    if (contentType == null || "".equals(contentType)) {
+                        contentType = "application/octet-stream";
+                    }
+                    StringBuffer strBuf = new StringBuffer();
+                    strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");
+                    strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"; filename=\"" + filename + "\"\r\n");
+                    strBuf.append("Content-Type:" + contentType + "\r\n\r\n");
+                    out.write(strBuf.toString().getBytes());
+                    DataInputStream in = new DataInputStream(new FileInputStream(file));
+                    int bytes = 0;
+                    byte[] bufferOut = new byte[1024];
+                    while ((bytes = in.read(bufferOut)) != -1) {
+                        out.write(bufferOut, 0, bytes);
+                    }
+                    in.close();
+                }
+            }
+            byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
+            out.write(endData);
+            out.flush();
+            out.close();
+            // 读取返回数据
+            StringBuffer strBuf = new StringBuffer();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+            String line = null;
+            while ((line = reader.readLine()) != null) {
+                strBuf.append(line).append("\n");
+            }
+            res = strBuf.toString();
+            reader.close();
+            reader = null;
+        } catch (Exception e) {
+            System.out.println("发送POST请求出错。" + urlStr);
+            e.printStackTrace();
+        } finally {
+            if (conn != null) {
+                conn.disconnect();
+                conn = null;
+            }
+        }
+        return res;
+    }
 }