admin
2021-02-04 e8e342cd6c1334f1b8f71d24baa3157637a9ac43
完善PPTV
31个文件已修改
23个文件已添加
2454 ■■■■ 已修改文件
src/main/java/com/yeshi/buwan/controller/AlipayController.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/PPTVController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/WXController.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/api/ApiControllerV2.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/api/UserController.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/api/VIPController.java 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/parser/CommentParser.java 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/parser/ConfigParser.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/parser/HomeParser.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/parser/UserParser.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/dao/base/BaseDao.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/dao/user/LoginUserDao.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/dao/user/LoginUserExtraDao.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/dao/vip/UserVIPInfoDao.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/dao/vip/VIPOrderRecordDao.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/dao/vip/VIPPriceDao.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/domain/user/LoginUser.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/domain/user/LoginUserExtra.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/domain/vip/UserVIPInfo.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/domain/vip/VIPOrderRecord.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/domain/vip/VIPPrice.java 87 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/domain/vip/VIPPriceType.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/exception/vip/VIPException.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/pptv/PPTVApiUtil.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/pptv/PPTVUtil.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/pptv/PPTVVipManager.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/LoginUserServiceImpl.java 92 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/ResourceVideoService.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/SMSServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/juhe/PPTVServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/vip/VIPPriceServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/vip/VIPServiceImpl.java 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/inter/LoginUserService.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/inter/SMSService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/inter/juhe/PPTVService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/inter/vip/VIPPriceService.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/inter/vip/VIPService.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/util/JsonUtilV2.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/util/JuHe/VideoResourceUtil.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/util/RedisManager.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/util/StringUtil.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/util/factory/vo/UserInfoVOFactory.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/util/user/VipUtil.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/util/vip/VIPOrderUtil.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/vo/client/user/UserInfoVO.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/domain/vip/UserVIPInfo.hbm.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/domain/vip/VIPOrderRecord.hbm.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/hibernate.cfg.xml 336 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sms_tencent_config.properties 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/wx/apiclient_key.pem 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/wxpay.properties 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/user_protocol_bw.jsp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/hxh/spring/test/PPTVTest.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/hxh/spring/test/vip/VIPTest.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/AlipayController.java
@@ -2,14 +2,20 @@
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.yeshi.buwan.domain.vip.VIPOrderRecord;
import com.yeshi.buwan.exception.vip.VIPException;
import com.yeshi.buwan.service.inter.vip.VIPService;
import com.yeshi.buwan.util.RedisManager;
import com.yeshi.buwan.util.StringUtil;
import com.yeshi.buwan.util.user.VipUtil;
import com.yeshi.buwan.util.vip.VIPOrderUtil;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.yeshi.utils.alipay.AlipayH5PayUtil;
import org.yeshi.utils.entity.alipay.AlipayAppInfo;
import javax.annotation.Resource;
@@ -17,6 +23,8 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -28,6 +36,9 @@
    @Resource
    private RedisManager redisManager;
    @Resource
    private VIPService vipService;
    @RequestMapping("printPayForm")
    public void printPayForm(String formId, HttpServletResponse response) {
@@ -65,10 +76,6 @@
        String outTradeNo = map.get("out_trade_no");
        String tradeStatus = map.get("trade_status");
        //支付成功
        if ("TRADE_SUCCESS".equalsIgnoreCase(tradeStatus)) {
        }
        logger.info("支付回调:" + new JSONObject(map).toString());
        AlipayAppInfo app = VipUtil.getAlipayApp();
@@ -76,6 +83,20 @@
        try {
            boolean right = AlipaySignature.rsaCheckV1(map, app.getAlipayPublicKey(), "GBK", map.get("sign_type"));
            if (right) {
                //支付成功
                if ("TRADE_SUCCESS".equalsIgnoreCase(tradeStatus)) {
                    AlipayTradeQueryResponse res = AlipayH5PayUtil.queryOrder(app, outTradeNo, null);
                    //支付成功
                    if (res.isSuccess() && "TRADE_SUCCESS".equalsIgnoreCase(res.getTradeStatus())) {
                        String id = VIPOrderUtil.getIdFromOutOrderNo(outTradeNo);
                        try {
                            vipService.paySuccess(id, VIPOrderRecord.PAY_WAY_ALIPAY, new BigDecimal(res.getPayAmount()), new Date());
                        } catch (VIPException e) {
                            e.printStackTrace();
                            logger.error("支付成功回调出错 id:{}", id, e);
                        }
                    }
                }
                response.getWriter().print("success");
                response.getWriter().close();
            }
src/main/java/com/yeshi/buwan/controller/PPTVController.java
New file
@@ -0,0 +1,59 @@
package com.yeshi.buwan.controller;
import com.yeshi.buwan.pptv.PPTVApiUtil;
import com.yeshi.buwan.pptv.PPTVUtil;
import com.yeshi.buwan.util.AESUtil;
import com.yeshi.buwan.util.StringUtil;
import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@Controller
@RequestMapping("pptv")
public class PPTVController {
    @ResponseBody
    @RequestMapping("user/{code}")
    public void validCode(@PathVariable String code, HttpServletResponse response) throws IOException {
        response.setContentType("application/json;charset=UTF-8");
        PPTVUtil.PPTVCodeInfo codeInfo = PPTVUtil.decryptPPTVCode(code);
        if (codeInfo == null) {
            response.getWriter().print(loadFalseResult(1, "code校验失败,解码失败"));
        } else {
            //间隔时间大于1天
            if (System.currentTimeMillis() - codeInfo.time > 1000 * 60 * 60L * 24) {
                response.getWriter().print(loadFalseResult(2, "code校验失败,时间超限"));
                return;
            }
            response.getWriter().print(loadTrueResult(codeInfo.pptvUid));
        }
    }
    private String loadFalseResult(int code, String msg) {
        JSONObject root = new JSONObject();
        root.put("code", code);
        root.put("infoMsg", msg);
        return root.toString();
    }
    private String loadTrueResult(String pptvUid) {
        JSONObject root = new JSONObject();
        root.put("code", 100);
        root.put("infoMsg", "code校验成功");
        JSONObject data = new JSONObject();
        data.put("userid", pptvUid);
        data.put("channelNo", PPTVApiUtil.CHANNEL_ID);
        data.put("appKey", PPTVApiUtil.APP_KEY);
        root.put("data", data);
        return root.toString();
    }
}
src/main/java/com/yeshi/buwan/controller/WXController.java
@@ -1,6 +1,11 @@
package com.yeshi.buwan.controller;
import com.yeshi.buwan.domain.vip.VIPOrderRecord;
import com.yeshi.buwan.exception.vip.VIPException;
import com.yeshi.buwan.service.inter.vip.VIPService;
import com.yeshi.buwan.util.StringUtil;
import com.yeshi.buwan.util.user.VipUtil;
import com.yeshi.buwan.util.vip.VIPOrderUtil;
import net.sf.json.JSONObject;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
@@ -10,6 +15,7 @@
import org.yeshi.utils.entity.wx.WXAPPInfo;
import org.yeshi.utils.wx.WXPayV3Util;
import javax.annotation.Resource;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.GCMParameterSpec;
@@ -17,16 +23,22 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.security.GeneralSecurityException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Date;
@Controller
@RequestMapping("wx")
public class WXController {
    Logger logger = LoggerFactory.getLogger(WXController.class);
    @Resource
    private VIPService vipService;
    private static String decryptToString(String apiV3Key, String associatedData, String nonce, String ciphertext)
            throws GeneralSecurityException, IOException {
@@ -53,7 +65,7 @@
     * @throws Exception
     */
    private void process(HttpServletRequest request) throws Exception {
        WXAPPInfo wxappInfo = new WXAPPInfo();
        WXAPPInfo wxappInfo = VipUtil.getWXAPP();
        //验证证书序列号
        String mchSerialNo = request.getHeader("Wechatpay-Serial");
        if (!mchSerialNo.equalsIgnoreCase(wxappInfo.getMchSerialNo())) {
@@ -98,13 +110,18 @@
                if (tradeState.equalsIgnoreCase("SUCCESS")) {
                    boolean isPaySuccess = WXPayV3Util.isPaySuccess(outTradeNo, wxappInfo);
                    if (isPaySuccess) {
                        //TODO 支付成功
                        BigDecimal money = new BigDecimal(decript.optJSONObject("amount").optInt("total")).divide(new BigDecimal(100), 2, RoundingMode.FLOOR);
                        String id = VIPOrderUtil.getIdFromOutOrderNo(outTradeNo);
                        try {
                            vipService.paySuccess(id, VIPOrderRecord.PAY_WAY_WX, money, new Date());
                        } catch (VIPException e) {
                            logger.error("订单支付成功处理出错:{}", id, e);
                        }
                    }
                }
                break;
        }
    }
src/main/java/com/yeshi/buwan/controller/api/ApiControllerV2.java
@@ -334,6 +334,8 @@
            commentParser.bindQQ(acceptData, request, out);
        } else if (method.equalsIgnoreCase("bindWX")) {
            commentParser.bindWX(acceptData, request, out);
        } else if (method.equalsIgnoreCase("allowOneKeyLogin")) {
            commentParser.allowOneKeyLogin(acceptData, request, out);
        }
        out.close();
    }
src/main/java/com/yeshi/buwan/controller/api/UserController.java
New file
@@ -0,0 +1,86 @@
package com.yeshi.buwan.controller.api;
import com.google.gson.Gson;
import com.yeshi.buwan.controller.parser.UserParser;
import com.yeshi.buwan.domain.user.LoginUser;
import com.yeshi.buwan.domain.user.LoginUserExtra;
import com.yeshi.buwan.domain.vip.UserVIPInfo;
import com.yeshi.buwan.service.inter.LoginUserService;
import com.yeshi.buwan.service.inter.SMSService;
import com.yeshi.buwan.service.inter.vip.VIPService;
import com.yeshi.buwan.util.JsonUtil;
import com.yeshi.buwan.util.RedisManager;
import com.yeshi.buwan.util.StringUtil;
import com.yeshi.buwan.util.factory.vo.UserInfoVOFactory;
import com.yeshi.buwan.vo.AcceptData;
import com.yeshi.buwan.vo.client.user.UserInfoVO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("api/v2/user")
public class UserController {
    @Resource
    private LoginUserService loginUserService;
    @Resource
    private VIPService vipService;
    @RequestMapping("getUserInfo")
    @ResponseBody
    public String getUserInfo(AcceptData acceptData, String loginUid) {
        LoginUser loginUser = loginUserService.getLoginUser(loginUid);
        if (loginUser == null) {
            return JsonUtil.loadFalseJson("用户不存在");
        }
        LoginUserExtra extra = loginUserService.getExtra(loginUid);
        //初始化用户信息
        if (extra == null)
            extra = loginUserService.initExtra(loginUid);
        UserVIPInfo vipInfo = vipService.getVIPInfo(loginUid);
        UserInfoVO vo = UserInfoVOFactory.create(loginUser, extra, vipInfo);
        return JsonUtil.loadTrueJson(new Gson().toJson(vo));
    }
    @RequestMapping("updateUserInfo")
    @ResponseBody
    public String updateUserInfo(AcceptData acceptData, String portrait, String loginUid, String nickName, String birthday, String sex, String personSign, HttpSession session) {
        LoginUser loginUser = new LoginUser();
        LoginUserExtra extra = new LoginUserExtra();
        loginUser.setId(loginUid);
        extra.setId(loginUid);
        if (!StringUtil.isNullOrEmpty(portrait)) {
            loginUser.setPortrait(UserParser.savePortrait(portrait, session));
        }
        if (!StringUtil.isNullOrEmpty(nickName)) {
            loginUser.setName(nickName);
        }
        if (!StringUtil.isNullOrEmpty(birthday)) {
            loginUser.setBirthday(birthday);
            extra.setBirthday(birthday);
        }
        if (!StringUtil.isNullOrEmpty(sex)) {
            loginUser.setSex(sex);
            extra.setSex(sex);
        }
        if (!StringUtil.isNullOrEmpty(personSign)) {
            loginUser.setSign(personSign);
            extra.setSign(personSign);
        }
        loginUserService.updateSelectiveByPrimaryKey(loginUser);
        loginUserService.updateSelectiveByPrimaryKey(extra);
        return JsonUtil.loadTrueJson("");
    }
}
src/main/java/com/yeshi/buwan/controller/api/VIPController.java
New file
@@ -0,0 +1,163 @@
package com.yeshi.buwan.controller.api;
import com.google.gson.*;
import com.yeshi.buwan.domain.user.LoginUser;
import com.yeshi.buwan.domain.vip.UserVIPInfo;
import com.yeshi.buwan.domain.vip.VIPOrderRecord;
import com.yeshi.buwan.domain.vip.VIPPrice;
import com.yeshi.buwan.domain.vip.VIPPriceType;
import com.yeshi.buwan.exception.vip.VIPException;
import com.yeshi.buwan.service.inter.LoginUserService;
import com.yeshi.buwan.service.inter.vip.VIPPriceService;
import com.yeshi.buwan.service.inter.vip.VIPService;
import com.yeshi.buwan.util.*;
import com.yeshi.buwan.util.user.VipUtil;
import com.yeshi.buwan.util.vip.VIPOrderUtil;
import com.yeshi.buwan.vo.AcceptData;
import com.yeshi.buwan.vo.client.user.UserInfoVO;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Type;
import java.util.List;
import java.util.UUID;
@Controller
@RequestMapping("api/v2/vip")
public class VIPController {
    Logger logger = LoggerFactory.getLogger(VIPController.class);
    @Resource
    private RedisManager redisManager;
    @Resource
    private VIPService vipService;
    @Resource
    private LoginUserService loginUserService;
    @Resource
    private VIPPriceService vipPriceService;
    @RequestMapping("getVIPPriceList")
    @ResponseBody
    public String getVIPPriceList(AcceptData acceptData, String loginUid) {
        Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().registerTypeAdapter(VIPPriceType.class, new JsonSerializer<VIPPriceType>() {
            @Override
            public JsonElement serialize(VIPPriceType value, Type theType, JsonSerializationContext context) {
                if (value == null) {
                    return new JsonPrimitive("");
                } else {
                    return new JsonPrimitive(value.getName());
                }
            }
        }).create();
        JSONObject root = new JSONObject();
        if (!StringUtil.isNullOrEmpty(loginUid)) {
            LoginUser user = loginUserService.getLoginUser(loginUid);
            if (user == null) {
                return JsonUtilV2.loadFalseJson("用户不存在");
            }
            UserVIPInfo vipInfo = vipService.getVIPInfo(loginUid);
            UserInfoVO userInfoVO = new UserInfoVO();
            userInfoVO.setId(user.getId());
            userInfoVO.setNickName(user.getName());
            userInfoVO.setPortrait(user.getPortrait());
            if (vipInfo != null && vipInfo.getExpireDate() != null)
                userInfoVO.setVipExpireTime(vipInfo.getExpireDate().getTime());
            root.put("user", new Gson().toJson(userInfoVO));
        }
        List<VIPPrice> vipPriceList = vipPriceService.listValidPrice();
        root.put("list", gson.toJson(vipPriceList));
        return JsonUtilV2.loadTrueJson(root.toString());
    }
    /**
     * 生成订单
     *
     * @param acceptData
     * @param loginUid
     * @return
     */
    @RequestMapping("createOrder")
    @ResponseBody
    public String createOrder(AcceptData acceptData, HttpServletRequest request, String loginUid, String priceId, int payWay) {
        if (StringUtil.isNullOrEmpty(loginUid)) {
            return JsonUtilV2.loadFalseJson("用户未登录");
        }
        LoginUser user = loginUserService.getLoginUser(loginUid);
        if (user == null) {
            return JsonUtilV2.loadFalseJson("用户不存在");
        }
        if (StringUtil.isNullOrEmpty(user.getPhone())) {
            return JsonUtilV2.loadFalseJson(10001,"请绑定电话号码");
        }
        String ip = IPUtil.getRemotIP(request);
        VIPPrice vipPrice = vipPriceService.selectByPrimaryKey(priceId);
        if (vipPrice == null) {
            return JsonUtilV2.loadFalseJson("套餐不存在");
        }
        VIPOrderRecord record = new VIPOrderRecord();
        record.setUid(loginUid);
        record.setType(vipPrice.getType());
        record.setMoney(vipPrice.getPrice());
        record.setState(VIPOrderRecord.STATE_NOT_PAY);
        try {
            vipService.addVIPRecord(record);
        } catch (VIPException e) {
            logger.error("生成订单出错", e);
            return JsonUtilV2.loadFalseJson("生成订单出错");
        }
        String orderNo = VIPOrderUtil.getOutOrderNo(record.getId());
        switch (payWay) {
            case VIPOrderRecord
                    .PAY_WAY_ALIPAY: {
                //生成支付宝支付订单
                String form = VipUtil.getVipChargeAlipayForm(orderNo, record.getMoney());
                //暂存2分钟
                String id = StringUtil.Md5(UUID.randomUUID().toString() + "#" + System.currentTimeMillis());
                redisManager.cacheCommonString(id, form, 120);
                org.json.JSONObject data = new org.json.JSONObject();
                data.put("payUrl", "http://api.ysdq.yeshitv.com:8089/BuWan/alipay/printPayForm?formId=" + id);
                data.put("payWay", payWay);
                return JsonUtilV2.loadTrueJson(data.toString());
            }
            case VIPOrderRecord
                    .PAY_WAY_WX: {
                //生成微信支付订单
                try {
                    String payUrl = VipUtil.createWXOrder(ip, orderNo, vipPrice.getPrice(), "影视大全VIP-" + vipPrice.getType().getName());
                    org.json.JSONObject data = new org.json.JSONObject();
                    data.put("payUrl", payUrl);
                    data.put("payWay", payWay);
                    return JsonUtilV2.loadTrueJson(data.toString());
                } catch (Exception e) {
                    logger.error("生成微信支付订单出错", e);
                    return JsonUtilV2.loadFalseJson("生成微信支付订单出错");
                }
            }
        }
        return JsonUtilV2.loadFalseJson("请选择支付方式");
    }
}
src/main/java/com/yeshi/buwan/controller/parser/CommentParser.java
@@ -12,9 +12,7 @@
import com.yeshi.buwan.service.imp.push.PushService;
import com.yeshi.buwan.service.inter.LoginUserService;
import com.yeshi.buwan.service.inter.SMSService;
import com.yeshi.buwan.util.AliyunOneKeyLoginUtil;
import com.yeshi.buwan.util.JsonUtil;
import com.yeshi.buwan.util.StringUtil;
import com.yeshi.buwan.util.*;
import com.yeshi.buwan.util.annotation.RequireUid;
import com.yeshi.buwan.util.wx.MyWXLoginUtil;
import com.yeshi.buwan.vo.AcceptData;
@@ -28,6 +26,7 @@
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@Controller
@@ -48,6 +47,9 @@
    @Resource
    private SMSService smsService;
    @Resource
    private RedisManager redisManager;
    @RequireUid
    public void getReadState(AcceptData acceptData, HttpServletRequest request, PrintWriter out) {
@@ -126,6 +128,33 @@
    }
    /**
     * 允许一键登录
     *
     * @param acceptData
     * @param request
     * @param out
     */
    public void allowOneKeyLogin(AcceptData acceptData, HttpServletRequest request, PrintWriter out) {
        Long loginUid = StringUtil.isNullOrEmpty(request.getParameter("loginUid")) ? null : Long.parseLong(request.getParameter("loginUid"));
        if (loginUid == null || loginUid == 0L) {
            out.print(JsonUtil.loadFalseJson("尚未登录"));
            return;
        }
        String device = request.getParameter("Device");
        long time = System.currentTimeMillis();
        String key = "onkeylogin-" + StringUtil.Md5(device + "#" + TimeUtil.getGernalTime(time, "yyyyMMdd"));
        //一个设备一天之内只能允许5次
        String value = redisManager.getCommonString(key);
        if (!StringUtil.isNullOrEmpty(value) && Integer.parseInt(value) > 10) {
            out.print(JsonUtil.loadFalseJson("一键登录次数超限,请明天再试"));
            return;
        }
        out.print(JsonUtil.loadTrueJson(""));
    }
    /**
     * 电话号码绑定
@@ -140,10 +169,13 @@
        String code = request.getParameter("code");
        String accessToken = request.getParameter("accessToken");
        String systemId = request.getParameter("system");
        String device = request.getParameter("Device");
        long time = System.currentTimeMillis();
        if (loginUid == null || loginUid == 0L) {
            out.print(JsonUtil.loadFalseJson("登录失败"));
            out.print(JsonUtil.loadFalseJson("尚未登录"));
            return;
        }
@@ -151,6 +183,14 @@
        if (!StringUtil.isNullOrEmpty(accessToken)) {
            //一键登录
            mobile = AliyunOneKeyLoginUtil.getMobile(accessToken, "");
            //增加一键登录的次数
            String key = "onkeylogin-" + StringUtil.Md5(device + "#" + TimeUtil.getGernalTime(time, "yyyyMMdd"));
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(time);
            calendar.add(Calendar.DAY_OF_WEEK, 1);
            int s = (int) ((TimeUtil.convertGernalTime(TimeUtil.getGernalTime(calendar.getTimeInMillis(), "yyyyMMdd"), "yyyyMMdd") - time) / 1000);
            redisManager.increase(key, s);
        } else {
            //通过验证码登录
            //判断验证码是否正确
@@ -165,7 +205,7 @@
                return;
            }
            if (smsService.verifyBindVCode(phone, code)) {
            if (!smsService.verifyBindVCode(phone, code)) {
                out.print(JsonUtil.loadFalseJson("验证码错误"));
                return;
            }
@@ -285,7 +325,7 @@
        }
        try {
            smsService.sendBindVCode(Long.parseLong(loginUid), phone, 6);
            smsService.sendBindVCode(loginUid, phone, 6);
        } catch (SMSException e) {
            e.printStackTrace();
            out.print(JsonUtil.loadFalseJson(e.getMessage()));
src/main/java/com/yeshi/buwan/controller/parser/ConfigParser.java
@@ -129,7 +129,9 @@
        JSONObject adNew = new JSONObject();
        String ip = IPUtil.getRemotIP(request);
        //会员链接
        String vipLink = map.get("vip_link");
        data.put("vipLink", vipLink);
        ADConfig splashConfig = getAdShowType("ad_splash_config", acceptData.getChannel(), acceptData.getVersion(), map);
src/main/java/com/yeshi/buwan/controller/parser/HomeParser.java
@@ -2,14 +2,16 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.yeshi.buwan.domain.*;
import com.yeshi.buwan.pptv.PPTVUtil;
import com.yeshi.buwan.pptv.entity.PPTVSeries;
import com.yeshi.buwan.service.imp.*;
import com.yeshi.buwan.service.inter.juhe.PPTVService;
import com.yeshi.buwan.util.annotation.RequireUid;
import com.yeshi.buwan.vo.AcceptData;
import org.apache.commons.httpclient.HttpClient;
@@ -18,18 +20,6 @@
import org.springframework.stereotype.Controller;
import com.yeshi.buwan.domain.entity.PlayUrl;
import com.yeshi.buwan.service.imp.AdService;
import com.yeshi.buwan.service.imp.AttentionService;
import com.yeshi.buwan.service.imp.ClassService;
import com.yeshi.buwan.service.imp.CollectionService;
import com.yeshi.buwan.service.imp.CommentService;
import com.yeshi.buwan.service.imp.ConfigService;
import com.yeshi.buwan.service.imp.HomeAdService;
import com.yeshi.buwan.service.imp.HomeTypeService;
import com.yeshi.buwan.service.imp.StatisticsService;
import com.yeshi.buwan.service.imp.SystemService;
import com.yeshi.buwan.service.imp.UserService;
import com.yeshi.buwan.service.imp.VideoManager;
import com.yeshi.buwan.util.CacheUtil;
import com.yeshi.buwan.util.Constant;
import com.yeshi.buwan.util.JsonUtil;
@@ -79,6 +69,12 @@
    @Resource
    private VideoDetailUtil videoDetailUtil;
    @Resource
    private ResourceVideoService resourceVideoService;
    @Resource
    private PPTVService pptvService;
    @RequireUid
    public void getHomeAd(AcceptData acceptData, HttpServletRequest request, PrintWriter out) {
@@ -341,8 +337,31 @@
        List<Long> resourceList = videoResouceUtil.getAvailableResourceIds(acceptData.getPlatform(), acceptData.getVersion());
        VideoInfo info = (videoDeailUtil.getVideoInfo(detailSystem.getId(), videoId, resourceId, resourceList,
                CacheUtil.getMD5Long(resourceList)));
        //获取优先展示的渠道
        if (StringUtil.isNullOrEmpty(resourceId)) {
            Set<Long> rids = new HashSet<>();
            rids.addAll(resourceList);
            VideoResource defaultVideoResource = resourceVideoService.getDefaultVideoResource(videoId, rids);
            if (defaultVideoResource != null) {
                resourceId = defaultVideoResource.getId();
            }
        }
        //PPTV网页播放
        if (resourceId != null && Integer.parseInt(resourceId) == PPTVUtil.RESOURCE_ID) {
            JSONObject data = new JSONObject();
            PPTVSeries series = pptvService.getSeriesDetailByVideoId(videoId);
            String playUrl = PPTVUtil.getPlayUrl(series, series.getSeries().get(0));
            data.put("videoId", videoId);
            data.put("playUrl", playUrl);
            data.put("pptv", true);
            out.print(JsonUtil.loadTrueJson(data.toString()));
            return;
        }
        VideoInfo info = videoDeailUtil.getVideoInfo(detailSystem.getId(), videoId, resourceId, resourceList,
                CacheUtil.getMD5Long(resourceList));
        List<VideoType> typeList = classService.getVideoTypeList(info.getId());
        if (typeList != null && typeList.size() > 0) {
@@ -359,23 +378,8 @@
                if (StringUtil.isNullOrEmpty(vd.getExtraId()))
                    vd.setExtraId(vd.getId() + "");
            }
        System.out.println(info.getPlayPicture());
        // info.setPicture(VideoPictureUtil.getShowPicture(info, platform,
        // version));
        // 过滤版权视频关键字
        // 统计添加
        // statisticsService.addStatistics(detailSystem.getId(), videoId);
        JSONArray array = new JSONArray();
        array.add("http://cloud.letv.com");
        if ((acceptData.getPlatform().equalsIgnoreCase("android")
                && acceptData.getVersion() > 12) || acceptData.getPlatform().equalsIgnoreCase("ios")) {
            for (String st : Constant.POJIE_LIST)
                array.add(st);
        }
        long count = commentService.getComment2ListCount(videoId, thirdType);
        if (info != null)
            info.setCommentCount((int) count);
src/main/java/com/yeshi/buwan/controller/parser/UserParser.java
@@ -19,6 +19,7 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.PrintWriter;
import java.util.*;
@@ -721,6 +722,7 @@
        String pwd = request.getParameter("Pwd");// 密码
        String nickName = request.getParameter("NickName");// 昵称
        String code = request.getParameter("VerifyCode");// 验证码
        String portrait = request.getParameter("Portrait");// 验证码
        if (StringUtil.isNullOrEmpty(account)) {
@@ -763,7 +765,7 @@
        user.setName(nickName);
        user.setOpenid(account);
        user.setPwd(StringUtil.Md5(pwd));
        user.setPortrait(savePortrait(request));
        user.setPortrait(savePortrait(portrait, request.getSession()));
        user.setIpinfo(ip + ":" + port);
        String result = userService.registerByEmail(user);
@@ -852,6 +854,7 @@
        String birthDay = request.getParameter("BirthDay");// 生日
        String personalSign = request.getParameter("PersonalSign");// 个性签名
        String loginUid = request.getParameter("LoginUid");// 个性签名
        String portrait = request.getParameter("Portrait");
        if (StringUtil.isNullOrEmpty(loginUid)) {
            out.print(JsonUtil.loadFalseJson("请上传LoginUid"));
            return;
@@ -862,7 +865,7 @@
        if (user != null) {
            if (!StringUtil.isNullOrEmpty(nickName))
                user.setName(nickName);
            String potrait = savePortrait(request);
            String potrait = savePortrait(portrait, request.getSession());
            if (!StringUtil.isNullOrEmpty(potrait))
                user.setPortrait(potrait);
            if (!StringUtil.isNullOrEmpty(sex))
@@ -972,16 +975,15 @@
    }
    private String savePortrait(HttpServletRequest request) {
        String base64 = request.getParameter("Portrait");
    public static String savePortrait(String base64, HttpSession session) {
        if (StringUtil.isNullOrEmpty(base64))
            return "";
        String fileName = "portrait_" + System.currentTimeMillis() + ".jpg";
        // 定义上传路径
        String path = request.getSession().getServletContext().getRealPath("upload") + "/" + fileName;
        if (!new File(request.getSession().getServletContext().getRealPath("upload") + "/").exists())
            new File(request.getSession().getServletContext().getRealPath("upload") + "/").mkdirs();
        String path = session.getServletContext().getRealPath("upload") + "/" + fileName;
        if (!new File(session.getServletContext().getRealPath("upload") + "/").exists())
            new File(session.getServletContext().getRealPath("upload") + "/").mkdirs();
        boolean isS = StringUtil.generateImageFromBase64(base64, path);
        if (!isS)
            return "";
src/main/java/com/yeshi/buwan/dao/base/BaseDao.java
@@ -85,6 +85,22 @@
    }
    public void update(String hql, final Serializable[] params) {
        hibernateTemplate.execute(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException {
                Query query = session.createQuery(hql);
                if (params != null)
                    for (int i = 0; i < params.length; i++) {
                        query.setParameter(i, params[i]);
                    }
                query.executeUpdate();
                return null;
            }
        });
    }
    @SuppressWarnings("unchecked")
    public List<T> list(String hql) {
        return (List<T>) hibernateTemplate.find(hql);
@@ -166,9 +182,10 @@
                String hql = "select count(*) " + hqlStr.substring(fromIndex);
                Query query = session.createQuery(hql);
                for (int i = 0; i < wheres.length; i++) {
                    query.setParameter(i, wheres[i]);
                }
                if (wheres != null)
                    for (int i = 0; i < wheres.length; i++) {
                        query.setParameter(i, wheres[i]);
                    }
                return Long.parseLong(query.uniqueResult() + "");
            }
        });
src/main/java/com/yeshi/buwan/dao/user/LoginUserDao.java
@@ -4,8 +4,75 @@
import org.springframework.stereotype.Repository;
import com.yeshi.buwan.domain.user.LoginUser;
import org.yeshi.utils.StringUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Repository
public class LoginUserDao extends BaseDao<LoginUser> {
    public void updateSelective(LoginUser loginUser) {
        String hql = "update LoginUser u set ";
        List<Serializable> params = new ArrayList<>();
        List<String> sets = new ArrayList<>();
        if (loginUser.getPhone() != null) {
            sets.add("u.phone=?");
            params.add(loginUser.getPhone());
        }
        if (loginUser.getName() != null) {
            sets.add("u.name=?");
            params.add(loginUser.getName());
        }
        if (loginUser.getPortrait() != null) {
            sets.add("u.portrait=?");
            params.add(loginUser.getPortrait());
        }
        if (loginUser.getSex() != null) {
            sets.add("u.sex=?");
            params.add(loginUser.getSex());
        }
        if (loginUser.getSign() != null) {
            sets.add("u.sign=?");
            params.add(loginUser.getSign());
        }
        if (loginUser.getBirthday() != null) {
            sets.add("u.birthday=?");
            params.add(loginUser.getBirthday());
        }
        if (loginUser.getWxOpenId() != null) {
            sets.add("u.wxOpenId=?");
            params.add(loginUser.getWxOpenId());
        }
        if (loginUser.getWxUnionId() != null) {
            sets.add("u.wxUnionId=?");
            params.add(loginUser.getWxUnionId());
        }
        if (loginUser.getQqOpenId() != null) {
            sets.add("u.qqOpenId=?");
            params.add(loginUser.getQqOpenId());
        }
        if (sets.size() > 0) {
            params.add(loginUser.getId());
            Serializable[] ps = new Serializable[params.size()];
            params.toArray(ps);
            update(hql + StringUtil.concat(sets, ",") + " where u.id=?", ps);
        }
    }
}
src/main/java/com/yeshi/buwan/dao/user/LoginUserExtraDao.java
@@ -57,6 +57,14 @@
            update.set("wxSex", bean.getWxSex());
        }
        if (bean.getPptvUid() != null) {
            update.set("pptvUid", bean.getPptvUid());
        }
        if (bean.getPptvOpenId() != null) {
            update.set("pptvOpenId", bean.getPptvOpenId());
        }
        if (bean.getCreateTime() != null) {
            update.set("createTime", bean.getCreateTime());
        }
src/main/java/com/yeshi/buwan/dao/vip/UserVIPInfoDao.java
New file
@@ -0,0 +1,13 @@
package com.yeshi.buwan.dao.vip;
import com.yeshi.buwan.dao.base.BaseDao;
import com.yeshi.buwan.domain.vip.UserVIPInfo;
import com.yeshi.buwan.domain.vip.VIPOrderRecord;
import org.springframework.stereotype.Repository;
@Repository
public class UserVIPInfoDao extends BaseDao<UserVIPInfo> {
}
src/main/java/com/yeshi/buwan/dao/vip/VIPOrderRecordDao.java
New file
@@ -0,0 +1,44 @@
package com.yeshi.buwan.dao.vip;
import com.yeshi.buwan.dao.base.BaseDao;
import com.yeshi.buwan.domain.vip.VIPOrderRecord;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class VIPOrderRecordDao extends BaseDao<VIPOrderRecord> {
    private String getHql(DaoQuery daoQuery) {
        String hql = "from VIPOrderRecord r where 1=1";
        if (daoQuery.state != null) {
            hql += " and r.state=" + daoQuery.state;
        }
        if (daoQuery.uid != null) {
            hql += " and r.uid=" + daoQuery.uid;
        }
        return hql;
    }
    public List<VIPOrderRecord> list(DaoQuery daoQuery) {
        return super.list(getHql(daoQuery), daoQuery.start, daoQuery.count, null);
    }
    public long count(DaoQuery daoQuery) {
        return super.getCount(getHql(daoQuery),null);
    }
    public static class DaoQuery {
        public Integer state;
        public String uid;
        public int start;
        public int count;
    }
}
src/main/java/com/yeshi/buwan/dao/vip/VIPPriceDao.java
New file
@@ -0,0 +1,24 @@
package com.yeshi.buwan.dao.vip;
import com.yeshi.buwan.dao.base.MongodbBaseDao;
import com.yeshi.buwan.domain.vip.VIPPrice;
import javafx.print.Collation;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class VIPPriceDao extends MongodbBaseDao<VIPPrice> {
    public List<VIPPrice> listAll(Boolean show) {
        Query query = new Query();
        if (show != null)
            query.addCriteria(Criteria.where("show").is(show));
        query.with(new Sort(new Sort.Order(Sort.Direction.ASC, "order")));
        return findList(query);
    }
}
src/main/java/com/yeshi/buwan/domain/user/LoginUser.java
@@ -7,6 +7,11 @@
    
    public final static int STATE_NORMAL=0;
    public final static int STATE_UNREGISTER=1;//已经注销
    public final static int LOGIN_TYPE_QQ=1;
    public final static int LOGIN_TYPE_WX=2;
    public final static int LOGIN_TYPE_EMAIL=3;
    public final static int LOGIN_TYPE_PHONE=4;
    
src/main/java/com/yeshi/buwan/domain/user/LoginUserExtra.java
@@ -2,6 +2,7 @@
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.util.Date;
@@ -15,6 +16,8 @@
    private String birthday;
    private String sign;
    private String email;
    private String qqOpenId;
    private String qqNickName;
    private String qqPortrait;
@@ -27,10 +30,18 @@
    //PPTV的用户ID
    private String pptvUid;
    private String pptvOpenId;
    private Date createTime;
    private Date updateTime;
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPptvUid() {
        return pptvUid;
@@ -167,4 +178,12 @@
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
    public String getPptvOpenId() {
        return pptvOpenId;
    }
    public void setPptvOpenId(String pptvOpenId) {
        this.pptvOpenId = pptvOpenId;
    }
}
src/main/java/com/yeshi/buwan/domain/vip/UserVIPInfo.java
New file
@@ -0,0 +1,43 @@
package com.yeshi.buwan.domain.vip;
import java.util.Date;
public class UserVIPInfo {
    private String uid;
    //到期时间
    private Date expireDate;
    private Date createTime;
    private Date updateTime;
    public String getUid() {
        return uid;
    }
    public void setUid(String uid) {
        this.uid = uid;
    }
    public Date getExpireDate() {
        return expireDate;
    }
    public void setExpireDate(Date expireDate) {
        this.expireDate = expireDate;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public Date getUpdateTime() {
        return updateTime;
    }
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}
src/main/java/com/yeshi/buwan/domain/vip/VIPOrderRecord.java
@@ -26,7 +26,7 @@
    //状态
    private Integer state;
    //类型
    private VIPPrice.VIPPriceType type;
    private VIPPriceType type;
    //资金
    private BigDecimal money;
    //支付方式
@@ -84,11 +84,11 @@
        this.state = state;
    }
    public VIPPrice.VIPPriceType getType() {
    public VIPPriceType getType() {
        return type;
    }
    public void setType(VIPPrice.VIPPriceType type) {
    public void setType(VIPPriceType type) {
        this.type = type;
    }
src/main/java/com/yeshi/buwan/domain/vip/VIPPrice.java
@@ -1,5 +1,6 @@
package com.yeshi.buwan.domain.vip;
import com.google.gson.annotations.Expose;
import org.springframework.data.mongodb.core.mapping.Document;
import java.math.BigDecimal;
@@ -7,20 +8,86 @@
@Document(collection = "vipPrice")
public class VIPPrice {
    public enum VIPPriceType {
        week("周会员"), month("包月"), season("包季"), year("包年");
        private String name;
        private VIPPriceType(String name) {
            this.name = name;
        }
    }
    @Expose
    private String id;
    @Expose
    private VIPPriceType type;
    @Expose
    private BigDecimal price;
    private Date createTime;
    private Date updateTime;
    //PPTV的vip商品类型
    private String pptvGoodsNo;
    private Boolean show;
    //排序值
    private Integer order;
    public Boolean getShow() {
        return show;
    }
    public void setShow(Boolean show) {
        this.show = show;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public VIPPriceType getType() {
        return type;
    }
    public void setType(VIPPriceType type) {
        this.type = type;
    }
    public BigDecimal getPrice() {
        return price;
    }
    public void setPrice(BigDecimal price) {
        this.price = price;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public Date getUpdateTime() {
        return updateTime;
    }
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
    public Integer getOrder() {
        return order;
    }
    public void setOrder(Integer order) {
        this.order = order;
    }
    public String getPptvGoodsNo() {
        return pptvGoodsNo;
    }
    public void setPptvGoodsNo(String pptvGoodsNo) {
        this.pptvGoodsNo = pptvGoodsNo;
    }
}
src/main/java/com/yeshi/buwan/domain/vip/VIPPriceType.java
New file
@@ -0,0 +1,16 @@
package com.yeshi.buwan.domain.vip;
public enum VIPPriceType {
    day("包天"), week("包周"), month("包月"), season("包季"), halfYear("半年"), year("包年");
    private String name;
    private VIPPriceType(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
}
src/main/java/com/yeshi/buwan/exception/vip/VIPException.java
New file
@@ -0,0 +1,14 @@
package com.yeshi.buwan.exception.vip;
public class VIPException extends Exception {
    private int code;
    private String msg;
    public VIPException(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}
src/main/java/com/yeshi/buwan/pptv/PPTVApiUtil.java
@@ -1,27 +1,34 @@
package com.yeshi.buwan.pptv;
import com.google.gson.Gson;
import com.yeshi.buwan.pptv.entity.PPTVProgram;
import com.yeshi.buwan.pptv.entity.PPTVSeries;
import com.yeshi.buwan.util.StringUtil;
import com.yeshi.buwan.util.TimeUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yeshi.utils.HttpUtil;
import java.net.URLEncoder;
import java.util.*;
public class PPTVApiUtil {
    static Logger logger = LoggerFactory.getLogger(PPTVApiUtil.class);
    private final static String APP_KEY = "eb324ec4439e193c38fd8d7fdbdae9af";
    private final static String APP_SECRET = "163cf4fa3780091e61a48c6abb6246d3";
    private final static String CHANNEL_ID = "111111";
    //正式
    public final static String APP_KEY = "9227024a6c540a7f8571d75c469da9ba";
    private final static String APP_SECRET = "f3e922ac18f9da6c816d3012f8b7e575";
    //测试
//    private final static String APP_KEY = "eb324ec4439e193c38fd8d7fdbdae9af";
//    private final static String APP_SECRET = "163cf4fa3780091e61a48c6abb6246d3";
    public final static String CHANNEL_ID = "253350";
    private final static String CANAL = "buwan";
    private static String getBase64(String str) {
        String st = StringUtil.getBase64(str).replace("\r\n", "");
@@ -110,7 +117,7 @@
    }
    private static List<PPTVSeries> getList(String method) {
        String result = baseRequest(null, method);
        String result = baseRequest(new HashMap<>(), method);
        logger.error(result);
        List<String> list = parseUrls(result);
        List<PPTVSeries> totalList = new ArrayList<>();
@@ -154,7 +161,7 @@
        Map<String, String> params = new HashMap<>();
        params.put("uid", uid);
        String result = baseRequest("https://coapi.pptv.com/coapi-web/api/http/sopRequest", params, "pptv.channel.openid.get");
        logger.info(result);
        System.out.println(result);
        JSONObject resultJSON = JSONObject.fromObject(result);
        return resultJSON.optJSONObject("response").optJSONObject("body").optString("openId");
    }
@@ -167,11 +174,9 @@
     */
    public static void login(String code) {
        String url = String.format("https://coapi.pptv.com/coapi-web/api/getUserToken/%s/%s.htm", APP_KEY, code);
        Map<String, String> params = new HashMap<>();
        params.put("code", code);
        String result = baseRequest(url, params, "");
        logger.info(result);
        String result = HttpUtil.get(url);
       System.out.println(result);
//        JSONObject resultJSON = JSONObject.fromObject(result);
//        return resultJSON.optJSONObject("response").optJSONObject("body").optString("openId");
    }
src/main/java/com/yeshi/buwan/pptv/PPTVUtil.java
@@ -4,13 +4,14 @@
import com.yeshi.buwan.domain.VideoType;
import com.yeshi.buwan.pptv.entity.PPTVProgram;
import com.yeshi.buwan.pptv.entity.PPTVSeries;
import com.yeshi.buwan.util.AESUtil;
import com.yeshi.buwan.util.StringUtil;
import com.yeshi.buwan.util.video.VideoConstant;
import com.yeshi.buwan.vo.AcceptData;
public class PPTVUtil {
    public final static int RESOURCE_ID=25;
    public final static int RESOURCE_ID = 25;
    public final static int PLAY_NONE = 0;// 不能播放
    public final static int PLAY_HTML = 1;// 跳转移动端网页播放
@@ -128,4 +129,71 @@
        }
    }
    /**
     * 获取pptv的用户ID
     *
     * @param uid
     * @return
     */
    public static String getPPTVUid(String uid) {
        return "buwan_" + uid;
    }
    /**
     * 获取pptvcode
     *
     * @param pptvUid
     * @return
     */
    public static String getPPTVCode(String pptvUid) {
        if (StringUtil.isNullOrEmpty(pptvUid))
            return null;
        return AESUtil.encrypt(pptvUid + "#" + System.currentTimeMillis());
    }
    public static String getUidFromPPTVUid(String pptvUid) {
        return pptvUid.split("_")[1];
    }
    /**
     * 解密PPTVCode
     *
     * @param code
     * @return
     */
    public static PPTVCodeInfo decryptPPTVCode(String code) {
        String info = AESUtil.decrypt(code);
        if (StringUtil.isNullOrEmpty(info)) {
            return null;
        } else {
            String[] sts = info.split("#");
            if (sts.length != 2)
                return null;
            PPTVCodeInfo codeInfo = new PPTVCodeInfo();
            codeInfo.pptvUid = sts[0];
            codeInfo.time = Long.parseLong(sts[1]);
            return codeInfo;
        }
    }
    /**
     * 获取播放链接
     *
     * @param series
     * @param program
     * @return
     */
    public static String getPlayUrl(PPTVSeries series, PPTVProgram program) {
        //programtype 电影-3  其他-2
        return String.format("https://acmd.api.pptv.com/2021/bwysdqmovie_thrid_h5.html?cid=%s&vid=%s&programtype=%s", series.getSeriesCode(), program.getProgramCode(), series.getProgramType().contains("电影") ? 3 : 2);
    }
    public static class PPTVCodeInfo {
        public String pptvUid;
        public long time;
    }
}
src/main/java/com/yeshi/buwan/pptv/PPTVVipManager.java
New file
@@ -0,0 +1,20 @@
package com.yeshi.buwan.pptv;
import org.springframework.stereotype.Component;
/**
 * PPTV会员
 */
@Component
public class PPTVVipManager {
    /**
     * 购买VIP
     */
    public void buyVIP() {
    }
}
src/main/java/com/yeshi/buwan/service/imp/LoginUserServiceImpl.java
@@ -5,6 +5,7 @@
import com.yeshi.buwan.domain.user.LoginUser;
import com.yeshi.buwan.domain.user.LoginUserExtra;
import com.yeshi.buwan.exception.LoginUserException;
import com.yeshi.buwan.pptv.PPTVUtil;
import com.yeshi.buwan.service.inter.LoginUserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -75,7 +76,6 @@
        loginUserDao.update(user);
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void bindQQ(String loginUid, String openId, String nickName, String portrait) throws LoginUserException {
@@ -85,28 +85,30 @@
        }
        LoginUser other = getLoginUserByQQOpenId(user.getSystemId(), openId);
        if (other != null) {
        if (other != null && !other.getId().equalsIgnoreCase(loginUid)) {
            throw new LoginUserException("QQ已被其他账户绑定");
        }
        LoginUser update = new LoginUser();
        update.setId(loginUid);
        update.setQqOpenId(openId);
        loginUserDao.updateSelective(update);
        user.setQqOpenId(openId);
        loginUserDao.update(user);
        LoginUserExtra extra = new LoginUserExtra();
        extra.setId(loginUid);
        LoginUserExtra extra = loginUserExtraDao.get(loginUid);
        if (extra == null) {
            extra = new LoginUserExtra();
            extra.setId(loginUid);
        }
        extra.setQqNickName(nickName);
        extra.setQqOpenId(openId);
        extra.setQqPortrait(portrait);
        if (loginUserExtraDao.get(loginUid) == null) {
        if (extra.getId() == null) {
            initExtra(extra);
        } else {
            loginUserExtraDao.updateSelective(extra);
            loginUserExtraDao.save(extra);
        }
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void bindWX(String loginUid, WeiXinUser weiXinUser) throws LoginUserException {
        LoginUser user = getLoginUser(loginUid);
@@ -115,15 +117,20 @@
        }
        LoginUser other = getLoginUserByWxUnionId(user.getSystemId(), weiXinUser.getUnionid());
        if (other != null) {
        if (other != null && !other.getId().equalsIgnoreCase(loginUid)) {
            throw new LoginUserException("微信已被其他账户绑定");
        }
        user.setWxOpenId(weiXinUser.getOpenid());
        user.setWxUnionId(weiXinUser.getUnionid());
        loginUserDao.update(user);
        LoginUser update = new LoginUser();
        update.setId(loginUid);
        update.setWxOpenId(weiXinUser.getOpenid());
        update.setWxUnionId(weiXinUser.getUnionid());
        loginUserDao.updateSelective(update);
        LoginUserExtra extra = new LoginUserExtra();
        extra.setId(loginUid);
        LoginUserExtra extra = null;//loginUserExtraDao.get(loginUid);
        if (extra == null) {
            extra = new LoginUserExtra();
            extra.setId(loginUid);
        }
        extra.setWxNickName(weiXinUser.getNickname());
        extra.setWxOpenId(weiXinUser.getOpenid());
        extra.setWxUnionId(weiXinUser.getUnionid());
@@ -132,9 +139,60 @@
        if (loginUserExtraDao.get(loginUid) == null) {
            initExtra(extra);
        } else {
            extra.setUpdateTime(new Date());
            loginUserExtraDao.updateSelective(extra);
        }
        System.out.println("12213");
    }
    @Override
    public LoginUserExtra getExtra(String uid) {
        return loginUserExtraDao.get(uid);
    }
    @Override
    public LoginUserExtra initExtra(String uid) {
        LoginUser user = getLoginUser(uid);
        if (user == null)
            return null;
        LoginUserExtra extra = new LoginUserExtra();
        extra.setId(uid);
        extra.setCreateTime(new Date());
        //之前的用户邮箱登录
        if (user.getLoginType() == LoginUser.LOGIN_TYPE_QQ) {
            user.setQqOpenId(user.getOpenid());
            extra.setQqOpenId(user.getOpenid());
            extra.setQqPortrait(user.getPortrait());
        } else if (user.getLoginType() == LoginUser.LOGIN_TYPE_EMAIL) {
            user.setEmail(user.getOpenid());
            extra.setEmail(user.getOpenid());
        } else if (user.getLoginType() == LoginUser.LOGIN_TYPE_WX) {
            user.setWxOpenId(user.getOpenid());
            extra.setWxOpenId(user.getOpenid());
            extra.setWxPortrait(user.getPortrait());
        }
        extra.setBirthday(user.getBirthday());
        extra.setSex(user.getSex());
        extra.setSign(user.getSign());
        extra.setIpinfo(user.getIpinfo());
        extra.setDevice(user.getDevice());
        extra.setPptvUid(PPTVUtil.getPPTVUid(uid));
        //TODO 初始化附加信息
        loginUserDao.update(user);
        loginUserExtraDao.save(extra);
        return extra;
    }
    @Override
    public void updateSelectiveByPrimaryKey(LoginUser loginUser) {
        loginUserDao.updateSelective(loginUser);
    }
    @Override
    public void updateSelectiveByPrimaryKey(LoginUserExtra extra) {
        loginUserExtraDao.updateSelective(extra);
    }
}
src/main/java/com/yeshi/buwan/service/imp/ResourceVideoService.java
@@ -1,7 +1,6 @@
package com.yeshi.buwan.service.imp;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import com.yeshi.buwan.dao.VideoResourceMapExtraInfoDao;
import com.yeshi.buwan.dao.juhe.iqiyi.VideoIqiyiDao;
@@ -76,6 +75,43 @@
        return getResourceList(videoInfoList);
    }
    /**
     * 获取默认的源
     *
     * @param videoId
     * @param avaiableResourceIds
     * @return
     */
    public VideoResource getDefaultVideoResource(String videoId, Set<Long> avaiableResourceIds) {
        List<ResourceVideo> resourceVideoList = resourceVideoDao.list("FROM ResourceVideo rv where rv.video.id=? order by rv.resource.orderby desc", videoId);
        //删除无用来源
        for (int i = 0; i < resourceVideoList.size(); i++) {
            if (!avaiableResourceIds.contains(Long.parseLong(resourceVideoList.get(i).getResource().getId())) || resourceVideoList.get(i).getResource() == null) {
                resourceVideoList.remove(i--);
            }
        }
        //排序
        List<VideoResource> resourceList = new ArrayList<>();
        for (ResourceVideo rv : resourceVideoList) {
            resourceList.add(rv.getResource());
        }
        Comparator<VideoResource> cm = new Comparator<VideoResource>() {
            @Override
            public int compare(VideoResource o1, VideoResource o2) {
                return o2.getOrderby() - o1.getOrderby();
            }
        };
        Collections.sort(resourceList, cm);
        if (resourceList.size() > 0)
            return resourceList.get(0);
        return null;
    }
    /**
     * 根据视频ID与ResourceId查询
src/main/java/com/yeshi/buwan/service/imp/SMSServiceImpl.java
@@ -20,14 +20,14 @@
    private RedisManager redisManager;
    @Override
    public void sendBindVCode(Long uid, String phone, int codeLength) throws SMSException {
    public void sendBindVCode(String uid, String phone, int codeLength) throws SMSException {
        String limitKey = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSLIMIT, uid + "");
        String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSVCode, phone + "-" + 0);
        if (StringUtil.isNullOrEmpty(redisManager.getCommonString(limitKey)))
        if (!StringUtil.isNullOrEmpty(redisManager.getCommonString(limitKey)))
            throw new SMSException(1001, "请过60秒再试");
        String msgCode = StringUtil.getVerifyCode(codeLength);
        String msgCode = StringUtil.getNumberVerifyCode(codeLength);
        TencentSMSConfig tencentSMSConfig = Constant.tencentSMSConfig;
@@ -43,7 +43,7 @@
            throw new SMSException(result.result, "短信发送失败");
        }
        //保存验证码
        redisManager.cacheCommonString(key, msgCode, 60 * 2);
        redisManager.cacheCommonString(key, msgCode, 60 * 5);
        //60s后再发送
        redisManager.cacheCommonString(limitKey, "1", 60);
    }
@@ -53,6 +53,7 @@
        String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSVCode, phone + "-" + 0);
        String cacheCode = redisManager.getCommonString(key);
        if (cacheCode != null && cacheCode.equalsIgnoreCase(code)) {
            redisManager.removeCommonString(key);
            return true;
        }
        return false;
src/main/java/com/yeshi/buwan/service/imp/juhe/PPTVServiceImpl.java
@@ -220,6 +220,15 @@
    }
    @Override
    public PPTVSeries getSeriesDetailByVideoId(String videoId) {
        VideoPPTVMap map = videoPPTVMapDao.get(videoId);
        if (map == null) {
            return null;
        }
        return getSeriesDetail(map.getInfoId());
    }
    /**
     * 删除剧集
     *
src/main/java/com/yeshi/buwan/service/imp/vip/VIPPriceServiceImpl.java
New file
@@ -0,0 +1,50 @@
package com.yeshi.buwan.service.imp.vip;
import com.yeshi.buwan.dao.vip.VIPPriceDao;
import com.yeshi.buwan.domain.vip.VIPPrice;
import com.yeshi.buwan.exception.vip.VIPException;
import com.yeshi.buwan.service.inter.vip.VIPPriceService;
import com.yeshi.buwan.util.StringUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Service
public class VIPPriceServiceImpl implements VIPPriceService {
    @Resource
    private VIPPriceDao vipPriceDao;
    @Override
    public void addPrice(VIPPrice price) throws VIPException {
        if (price == null || price.getPrice() == null || price.getType() == null) {
            throw new VIPException(1, "参数不完整");
        }
        if (price.getCreateTime() == null) {
            price.setCreateTime(new Date());
        }
        if (price.getOrder() == null) {
            price.setOrder(price.getPrice().multiply(new BigDecimal(100)).intValue());
        }
        price.setId(StringUtil.Md5(price.getType().name()));
        vipPriceDao.save(price);
    }
    @Override
    public List<VIPPrice> listValidPrice() {
        return vipPriceDao.listAll(true);
    }
    @Override
    public VIPPrice selectByPrimaryKey(String id) {
        return vipPriceDao.get(id);
    }
}
src/main/java/com/yeshi/buwan/service/imp/vip/VIPServiceImpl.java
New file
@@ -0,0 +1,192 @@
package com.yeshi.buwan.service.imp.vip;
import com.yeshi.buwan.dao.vip.UserVIPInfoDao;
import com.yeshi.buwan.dao.vip.VIPOrderRecordDao;
import com.yeshi.buwan.domain.vip.UserVIPInfo;
import com.yeshi.buwan.domain.vip.VIPOrderRecord;
import com.yeshi.buwan.domain.vip.VIPPriceType;
import com.yeshi.buwan.exception.vip.VIPException;
import com.yeshi.buwan.service.inter.vip.VIPService;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate4.HibernateCallback;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@Service
public class VIPServiceImpl implements VIPService {
    @Resource
    private VIPOrderRecordDao vipOrderRecordDao;
    @Resource
    private UserVIPInfoDao userVIPInfoDao;
    /**
     * VIP购买记录
     *
     * @param record
     * @throws VIPException
     */
    @Override
    public void addVIPRecord(VIPOrderRecord record) throws VIPException {
        if (record.getMoney() == null || record.getType() == null || record.getUid() == null) {
            throw new VIPException(1, "参数不完整");
        }
        if (record.getState() == null) {
            record.setState(VIPOrderRecord.STATE_NOT_PAY);
        }
        if (record.getCreateTime() == null) {
            record.setCreateTime(new Date());
        }
        Serializable id = vipOrderRecordDao.save(record);
        record.setId(id.toString());
    }
    /**
     * 支付成功
     *
     * @param id
     * @param payWay
     * @param payMoney
     * @param payTime
     * @throws VIPException
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void paySuccess(final String id, int payWay, BigDecimal payMoney, Date payTime) throws VIPException {
        VIPException exception = (VIPException) vipOrderRecordDao.excute(new HibernateCallback() {
            @Override
            public VIPException doInHibernate(Session session) throws HibernateException {
                //修改记录
                Query query = session.createQuery("from VIPOrderRecord as r where r.id=? ").setParameter(0, id);
                query.setLockMode("r", LockMode.UPGRADE);
                List<VIPOrderRecord> list = query.list();
                if (list != null && list.size() > 0) {
                    if (list.get(0).getState() == VIPOrderRecord.STATE_PAY)
                        return new VIPException(1, "订单已经支付");
                    Date[] expireDate = addExpireTime(session, list.get(0).getUid(), payTime, list.get(0).getType());
                    if (expireDate == null) {
                        return new VIPException(2, "添加用户会员时间出错");
                    }
                    session.createQuery("update VIPOrderRecord r set r.payWay=?,r.payMoney=?,r.payTime=?,r.updateTime=?,r.vipStartTime=?,r.vipEndTime=?,r.state=? where r.id=? ")
                            .setParameter(0, payWay)
                            .setParameter(1, payMoney)
                            .setParameter(2, payTime)
                            .setParameter(3, new Date())
                            .setParameter(4, expireDate[0])
                            .setParameter(5, expireDate[1])
                            .setParameter(6, VIPOrderRecord.STATE_PAY)
                            .setParameter(7, id).executeUpdate();
                } else {
                    return new VIPException(10, "订单不存在");
                }
                return null;
            }
        });
        if (exception != null)
            throw exception;
    }
    /**
     * 续期
     *
     * @param session
     * @param uid
     * @param payTime
     * @param type
     * @return
     */
    private Date[] addExpireTime(Session session, String uid, Date payTime, VIPPriceType type) {
        if (type == null || uid == null)
            return null;
        List list = session.createQuery("from UserVIPInfo i where i.uid=?").setParameter(0, uid).setLockMode("i", LockMode.UPGRADE).list();
        if (list == null || list.size() == 0) {
            //新增
            UserVIPInfo vip = new UserVIPInfo();
            vip.setUid(uid);
            vip.setCreateTime(new Date());
            vip.setExpireDate(getExpireTime(payTime, null, type));
            session.save(vip);
            return new Date[]{payTime, vip.getExpireDate()};
        } else {
            //修改
            UserVIPInfo vipInfo = (UserVIPInfo) list.get(0);
            Date expireDate = getExpireTime(payTime, vipInfo.getExpireDate(), type);
            session.createQuery("update UserVIPInfo i set i.expireDate=? ,i.updateTime=? where i.uid=?").setParameter(0, expireDate).setParameter(1, new Date()).setParameter(2, uid).executeUpdate();
            return new Date[]{vipInfo.getExpireDate(), expireDate};
        }
    }
    /**
     * 获取到期时间
     *
     * @param payTime
     * @param expireTime
     * @param type
     * @return
     */
    private Date getExpireTime(Date payTime, Date expireTime, VIPPriceType type) {
        Calendar calendar = Calendar.getInstance();
        if (expireTime != null) {
            calendar.setTimeInMillis(expireTime.getTime());
        } else {
            calendar.setTimeInMillis(payTime.getTime());
        }
        if (type == VIPPriceType.day) {
            calendar.add(Calendar.DAY_OF_WEEK, 1);
        } else if (type == VIPPriceType.week) {
            calendar.add(Calendar.WEEK_OF_YEAR, 1);
        } else if (type == VIPPriceType.month) {
            calendar.add(Calendar.MONTH, 1);
        } else if (type == VIPPriceType.season) {
            calendar.add(Calendar.MONTH, 3);
        } else if (type == VIPPriceType.halfYear) {
            calendar.add(Calendar.MONTH, 6);
        } else if (type == VIPPriceType.year) {
            calendar.add(Calendar.YEAR, 1);
        }
        return new Date(calendar.getTimeInMillis());
    }
    @Override
    public UserVIPInfo getVIPInfo(String uid) {
        return userVIPInfoDao.find(UserVIPInfo.class, uid);
    }
    @Override
    public List<VIPOrderRecord> listOrderRecord(String uid, Integer state, int page, int pageSize) {
        VIPOrderRecordDao.DaoQuery query = new VIPOrderRecordDao.DaoQuery();
        query.start = (page - 1) * pageSize;
        query.count = pageSize;
        query.uid = uid;
        query.state = state;
        return vipOrderRecordDao.list(query);
    }
    @Override
    public long countOrderRecord(String uid, Integer state) {
        VIPOrderRecordDao.DaoQuery query = new VIPOrderRecordDao.DaoQuery();
        query.uid = uid;
        query.state = state;
        return vipOrderRecordDao.count(query);
    }
}
src/main/java/com/yeshi/buwan/service/inter/LoginUserService.java
@@ -9,9 +9,10 @@
    /**
     * 初始化附加信息
     *
     * @param extra
     */
    public void  initExtra(LoginUserExtra extra);
    public void initExtra(LoginUserExtra extra);
    /**
     * 主键查询
@@ -96,4 +97,36 @@
     */
    public void bindWX(String loginUid, WeiXinUser info) throws LoginUserException;
    /**
     * 获取附加信息
     *
     * @param uid
     * @return
     */
    public LoginUserExtra getExtra(String uid);
    /**
     * 初始化附加信息
     *
     * @param uid
     */
    public LoginUserExtra initExtra(String uid);
    /**
     * 根据主键更新
     *
     * @param loginUser
     */
    public void updateSelectiveByPrimaryKey(LoginUser loginUser);
    /**
     * 根据主键更新
     * @param extra
     */
    public void updateSelectiveByPrimaryKey(LoginUserExtra extra);
}
src/main/java/com/yeshi/buwan/service/inter/SMSService.java
@@ -12,7 +12,7 @@
     * @param codeLength
     * @throws SMSException
     */
    public void sendBindVCode(Long uid, String phone, int codeLength) throws SMSException;
    public void sendBindVCode(String uid, String phone, int codeLength) throws SMSException;
    /**
     * 验证码是否在正确
src/main/java/com/yeshi/buwan/service/inter/juhe/PPTVService.java
@@ -47,4 +47,13 @@
    public void save(PPTVSeries series);
    /**
     * 根据视频ID查询专辑详情
     *
     * @param videoId
     * @return
     */
    public PPTVSeries getSeriesDetailByVideoId(String videoId);
}
src/main/java/com/yeshi/buwan/service/inter/vip/VIPPriceService.java
New file
@@ -0,0 +1,35 @@
package com.yeshi.buwan.service.inter.vip;
import com.yeshi.buwan.domain.vip.VIPPrice;
import com.yeshi.buwan.exception.vip.VIPException;
import java.util.List;
public interface VIPPriceService {
    /**
     * 添加套餐
     *
     * @param price
     */
    public void addPrice(VIPPrice price) throws VIPException;
    /**
     * 拉取列表
     *
     * @return
     */
    public List<VIPPrice> listValidPrice();
    /**
     * 主键查询
     *
     * @param id
     * @return
     */
    public VIPPrice selectByPrimaryKey(String id);
}
src/main/java/com/yeshi/buwan/service/inter/vip/VIPService.java
New file
@@ -0,0 +1,58 @@
package com.yeshi.buwan.service.inter.vip;
import com.yeshi.buwan.domain.vip.UserVIPInfo;
import com.yeshi.buwan.domain.vip.VIPOrderRecord;
import com.yeshi.buwan.exception.vip.VIPException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
public interface VIPService {
    /**
     * 添加记录
     *
     * @param record
     */
    public void addVIPRecord(VIPOrderRecord record) throws VIPException;
    /**
     * 支付成功
     *
     * @param id
     * @param payMoney
     * @param payTime
     * @throws VIPException
     */
    public void paySuccess(String id, int payWay, BigDecimal payMoney, Date payTime) throws VIPException;
    /**
     * 获取会员信息
     *
     * @param uid
     * @return
     */
    public UserVIPInfo getVIPInfo(String uid);
    /**
     * 获取订单记录
     *
     * @param uid
     * @param state
     * @return
     */
    public List<VIPOrderRecord> listOrderRecord(String uid, Integer state, int page, int pageSize);
    /**
     * @param uid
     * @param state
     * @return
     */
    public long countOrderRecord(String uid, Integer state);
}
src/main/java/com/yeshi/buwan/util/JsonUtilV2.java
New file
@@ -0,0 +1,38 @@
package com.yeshi.buwan.util;
import com.google.gson.Gson;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import javax.persistence.Entity;
import java.util.ArrayList;
import java.util.List;
@Entity
public class JsonUtilV2 {
    private static Gson baseGson = new Gson();
    public static String loadTrueJson(String data) {
        JSONObject root = new JSONObject();
        root.put("code", 0);
        root.put("data", data);
        root.put("msg", "");
        String st = DESUtil.encode(root.toString());
        return st;
    }
    public static String loadFalseJson(int code, String msg) {
        JSONObject root = new JSONObject();
        root.put("code", code);
        root.put("msg", msg);
        String st = DESUtil.encode(root.toString());
        return st;
    }
    public static String loadFalseJson(String msg) {
        return loadFalseJson(1, msg);
    }
}
src/main/java/com/yeshi/buwan/util/JuHe/VideoResourceUtil.java
@@ -41,6 +41,13 @@
                    list.add(Long.parseLong(vr.getId()));
                else if (resourceName.indexOf("风行") > -1)
                    list.add(Long.parseLong(vr.getId()));
                else if (resourceName.indexOf("PPTV") > -1) {
                    //3.8.7以后的Android支持
                    if (versionCode >= 105) {
                        list.add(Long.parseLong(vr.getId()));
                    }
                }
            }
        } else if ("ios".equalsIgnoreCase(platform)) {
            if (versionCode < 14) {
@@ -97,7 +104,6 @@
        }
        return list;
    }
}
src/main/java/com/yeshi/buwan/util/RedisManager.java
@@ -93,6 +93,17 @@
        }
    }
    public void increase(String key,int s) {
        Jedis jedis = getJedis();
        try {
            jedis.incr(key);
            jedis.expire(key, s);
        } finally {
            jedis.close();
        }
    }
    public void expire(String key, int seconds) {
        Jedis jedis = getJedis();
        try {
src/main/java/com/yeshi/buwan/util/StringUtil.java
@@ -86,9 +86,13 @@
     * @return
     */
    public static String getVerifyCode() {
        return getNumberVerifyCode(6);
    }
    public static String getNumberVerifyCode(int number) {
        String sts = "0123456789";
        String code = "";
        for (int i = 0; i < 6; i++) {
        for (int i = 0; i < number; i++) {
            int p = (int) (Math.random() * 10);
            code += sts.charAt(p);
        }
src/main/java/com/yeshi/buwan/util/factory/vo/UserInfoVOFactory.java
New file
@@ -0,0 +1,69 @@
package com.yeshi.buwan.util.factory.vo;
import com.yeshi.buwan.domain.user.LoginUser;
import com.yeshi.buwan.domain.user.LoginUserExtra;
import com.yeshi.buwan.domain.vip.UserVIPInfo;
import com.yeshi.buwan.pptv.PPTVUtil;
import com.yeshi.buwan.util.StringUtil;
import com.yeshi.buwan.vo.client.user.UserInfoVO;
public class UserInfoVOFactory {
    public static UserInfoVO create(LoginUser user, LoginUserExtra extra, UserVIPInfo vipInfo) {
        UserInfoVO vo = new UserInfoVO();
        vo.setId(user.getId());
        vo.setPptvCode(PPTVUtil.getPPTVCode(extra.getPptvUid()));
        vo.setQqNickName(extra.getQqNickName());
        vo.setBirthday(extra.getBirthday());
        vo.setEmail(getHiddenEmail(extra.getEmail()));
        vo.setNickName(user.getName());
        vo.setPhone(getHiddenPhone(user.getPhone()));
        vo.setPortrait(user.getPortrait());
        vo.setQqOpenId(getHiddenOpenId(extra.getQqOpenId()));
        vo.setSex(extra.getSex());
        vo.setSign(extra.getSign());
        if (vipInfo != null && vipInfo.getExpireDate() != null)
            vo.setVipExpireTime(vipInfo.getExpireDate().getTime());
        vo.setWxName(extra.getWxNickName());
        vo.setWxUnionId(getHiddenOpenId(extra.getWxUnionId()));
        return vo;
    }
    private static String getHiddenPhone(String phone) {
        if (StringUtil.isNullOrEmpty(phone)) {
            return null;
        }
        if (phone.length() < 11) {
            return phone;
        }
        return phone.substring(0, 3) + "****" + phone.substring(phone.length() - 4, phone.length());
    }
    private static String getHiddenOpenId(String openId) {
        if (StringUtil.isNullOrEmpty(openId)) {
            return null;
        }
        if (openId.length() < 11) {
            return openId;
        }
        return openId.substring(0, 4) + "****" + openId.substring(openId.length() - 4, openId.length() - 4);
    }
    private static String getHiddenEmail(String email) {
        if (StringUtil.isNullOrEmpty(email)) {
            return null;
        }
        int index = email.indexOf("@");
        if (index < 0)
            return null;
        String prefix = email.substring(0, index);
        if (prefix.length() < 2)
            return prefix.substring(0, 1) + "**" + email.substring(index, email.length());
        return prefix.substring(0, 2) + "**" + email.substring(index, email.length());
    }
}
src/main/java/com/yeshi/buwan/util/user/VipUtil.java
@@ -1,9 +1,14 @@
package com.yeshi.buwan.util.user;
import com.alipay.api.AlipayApiException;
import org.apache.commons.io.IOUtils;
import org.yeshi.utils.alipay.AlipayH5PayUtil;
import org.yeshi.utils.entity.alipay.AlipayAppInfo;
import org.yeshi.utils.entity.wx.WXAPPInfo;
import org.yeshi.utils.entity.wx.WXPlaceOrderParams;
import org.yeshi.utils.wx.WXPayV3Util;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Properties;
@@ -28,6 +33,39 @@
    }
    /**
     * 获取微信app
     *
     * @return
     */
    public static WXAPPInfo getWXAPP() {
        String privateKey = "";
        try {
            String content = IOUtils.toString(VipUtil.class.getClassLoader().getResourceAsStream("wx/apiclient_key.pem"));
            privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
                    .replace("-----END PRIVATE KEY-----", "")
                    .replaceAll("\\s+", "");
        } catch (Exception e) {
        }
        Properties properties = new Properties();
        try {
            properties.load(VipUtil.class.getClassLoader().getResourceAsStream("wxpay.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        String appId = properties.getProperty("app_id");
        String mchId = properties.getProperty("mch_id");
        String mchSerialNo = properties.getProperty("mch_serial_no");
        String apiV3Key = properties.getProperty("api_v3_key");
        WXAPPInfo app = new WXAPPInfo(appId, mchId, mchSerialNo, privateKey, apiV3Key);
        return app;
    }
    /**
     * 获取会员充值支付宝支付表单
     *
     * @param orderNo
@@ -38,7 +76,7 @@
        try {
            String goodsTitle = "影视大全会员充值";
            String returnUrl = "http://vip.ysdq.yeshitv.com";
            String notifyUrl = "http://193.112.34.40:8089/BuWan/alipay/pay";
            String notifyUrl = "http://api.ysdq.yeshitv.com:8089/BuWan/alipay/pay";
            AlipayAppInfo appInfo = getAlipayApp();
            String form = AlipayH5PayUtil.createOrderForm(appInfo, orderNo, money, goodsTitle, returnUrl, notifyUrl);
            return form;
@@ -49,4 +87,27 @@
    }
    /**
     * 微信下单
     *
     * @param ip
     * @param orderNo
     * @param money
     * @param title
     * @return
     * @throws Exception
     */
    public static String createWXOrder(String ip, String orderNo, BigDecimal money, String title) throws Exception {
        WXPlaceOrderParams params = new WXPlaceOrderParams();
        params.setIp(ip);
        params.setOrderNo(orderNo);
        params.setNotifyUrl("http://api.ysdq.yeshitv.com:8089/BuWan/wx/pay/vip");
        params.setFee(money);
        params.setBody(title);
        params.setApp(getWXAPP());
        String payUrl = WXPayV3Util.createH5Order(params, "http://vip.ysdq.yeshitv.com/wx_result.html");
        return payUrl;
    }
}
src/main/java/com/yeshi/buwan/util/vip/VIPOrderUtil.java
New file
@@ -0,0 +1,20 @@
package com.yeshi.buwan.util.vip;
public class VIPOrderUtil {
    /**
     * 获取第三方订单号
     *
     * @param id
     * @return
     */
    public static String getOutOrderNo(String id) {
        return "buwan_vip_" + id;
    }
    public static String getIdFromOutOrderNo(String orderNo) {
        return orderNo.replace("buwan_vip_", "");
    }
}
src/main/java/com/yeshi/buwan/vo/client/user/UserInfoVO.java
New file
@@ -0,0 +1,135 @@
package com.yeshi.buwan.vo.client.user;
public class UserInfoVO {
    private String id;
    private String nickName;
    private String portrait;
    private String sex;
    private String birthday;
    private String sign;
    private String pptvCode;
    //绑定的电话号码
    private String qqOpenId;
    private String qqNickName;
    private String wxUnionId;
    private String wxName;
    private String phone;
    private String email;
    //VIP到期时间
    private Long vipExpireTime;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    public String getPortrait() {
        return portrait;
    }
    public void setPortrait(String portrait) {
        this.portrait = portrait;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getBirthday() {
        return birthday;
    }
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
    public String getSign() {
        return sign;
    }
    public void setSign(String sign) {
        this.sign = sign;
    }
    public String getPptvCode() {
        return pptvCode;
    }
    public void setPptvCode(String pptvCode) {
        this.pptvCode = pptvCode;
    }
    public String getQqOpenId() {
        return qqOpenId;
    }
    public void setQqOpenId(String qqOpenId) {
        this.qqOpenId = qqOpenId;
    }
    public String getQqNickName() {
        return qqNickName;
    }
    public void setQqNickName(String qqNickName) {
        this.qqNickName = qqNickName;
    }
    public String getWxUnionId() {
        return wxUnionId;
    }
    public void setWxUnionId(String wxUnionId) {
        this.wxUnionId = wxUnionId;
    }
    public String getWxName() {
        return wxName;
    }
    public void setWxName(String wxName) {
        this.wxName = wxName;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Long getVipExpireTime() {
        return vipExpireTime;
    }
    public void setVipExpireTime(Long vipExpireTime) {
        this.vipExpireTime = vipExpireTime;
    }
}
src/main/resources/domain/vip/UserVIPInfo.hbm.xml
New file
@@ -0,0 +1,17 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.yeshi.buwan.domain.vip">
    <class name="UserVIPInfo" table="wk_user_vip">
        <id name="uid" column="uid">
        </id>
        <property name="expireDate" column="expire_date" type="timestamp"></property>
        <property name="createTime" column="create_time" type="timestamp"></property>
        <property name="updateTime" column="update_time" type="timestamp"></property>
    </class>
</hibernate-mapping>
src/main/resources/domain/vip/VIPOrderRecord.hbm.xml
New file
@@ -0,0 +1,33 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.yeshi.buwan.domain.vip">
    <class name="VIPOrderRecord" table="wk_vip_order_record">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>
        <property name="uid" column="uid" type="string"></property>
        <property name="state" column="state" type="integer"></property>
        <property name="type" column="type">
            <type name="org.hibernate.type.EnumType">
                <param name="enumClass">com.yeshi.buwan.domain.vip.VIPPriceType</param>
                <param name="type">12</param>
            </type>
        </property>
        <property name="money" column="money" type="java.math.BigDecimal"></property>
        <property name="payWay" column="pay_way" type="integer"></property>
        <property name="payMoney" column="pay_money" type="java.math.BigDecimal"></property>
        <property name="payTime" column="pay_time" type="timestamp"></property>
        <property name="createTime" column="create_time" type="timestamp"></property>
        <property name="updateTime" column="update_time" type="timestamp"></property>
        <property name="vipStartTime" column="vip_start_time" type="timestamp"></property>
        <property name="vipEndTime" column="vip_end_time" type="timestamp"></property>
    </class>
</hibernate-mapping>
src/main/resources/hibernate.cfg.xml
@@ -1,197 +1,203 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.hbm2ddl.auto">none</property>
        <property name="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</property>
        <!-- 打印sql语句 -->
        <property name="show_sql">true</property>
        <!-- 映射文件配置 -->
        <mapping resource="domain/AdCancelRule.hbm.xml"  />
        <mapping resource="domain/AdminInfo.hbm.xml" />
        <mapping resource="domain/AdTag.hbm.xml" />
        <mapping resource="domain/AdType.hbm.xml" />
        <mapping resource="domain/Advice.hbm.xml" />
        <mapping resource="domain/Collection.hbm.xml" />
        <mapping resource="domain/Config.hbm.xml" />
        <mapping resource="domain/GetScoreCollect.hbm.xml" />
        <mapping resource="domain/GetScoreOpen.hbm.xml" />
        <mapping resource="domain/GetScoreRule.hbm.xml" />
        <mapping resource="domain/GetScoreSaveVideo.hbm.xml" />
        <mapping resource="domain/GetScoreShare.hbm.xml" />
        <mapping resource="domain/GetScoreWatch.hbm.xml" />
        <mapping resource="domain/GetScoreContinueWatch.hbm.xml" />
        <mapping resource="domain/GetScoreEvaluate.hbm.xml" />
        <mapping resource="domain/GetScoreHistory.hbm.xml" />
        <mapping resource="domain/HomeAd.hbm.xml" />
        <mapping resource="domain/HomeType.hbm.xml" />
        <mapping resource="domain/HomeVideo.hbm.xml" />
        <mapping resource="domain/HotSearch.hbm.xml" />
        <mapping resource="domain/HotStar.hbm.xml" />
        <mapping resource="domain/HotStarVideo.hbm.xml" />
        <mapping resource="domain/SearchHistory.hbm.xml" />
        <mapping resource="domain/ScoreHistory.hbm.xml" />
        <mapping resource="domain/SystemInfo.hbm.xml" />
        <mapping resource="domain/UserInfo.hbm.xml" />
        <mapping resource="domain/UseScoreHistory.hbm.xml" />
        <mapping resource="domain/VideoDetailInfo.hbm.xml" />
        <mapping resource="domain/VideoInfo.hbm.xml" />
        <mapping resource="domain/VideoResourceMapExtraInfo.hbm.xml" />
        <mapping resource="domain/VideoResource.hbm.xml" />
        <mapping resource="domain/VideoScoreHistory.hbm.xml" />
        <mapping resource="domain/VideoType.hbm.xml" />
        <mapping resource="domain/VideoUrl.hbm.xml" />
        <mapping resource="domain/UserBanner.hbm.xml" />
        <mapping resource="domain/WXAd.hbm.xml" />
        <mapping resource="domain/WXStatistics.hbm.xml" />
        <mapping resource="domain/ShareContent.hbm.xml" />
        <mapping resource="domain/DetailSystem.hbm.xml" />
        <mapping resource="domain/LeShiAccount.hbm.xml" />
        <mapping resource="domain/LeShiUrl.hbm.xml" />
        <mapping resource="domain/VideoPlayError.hbm.xml" />
        <mapping resource="domain/LeShiWatch.hbm.xml" />
        <mapping resource="domain/LeShiAccountVideo.hbm.xml" />
        <mapping resource="domain/DeviceInfo.hbm.xml" />
        <mapping resource="domain/LeShiDownLoad.hbm.xml" />
        <mapping resource="domain/LeShiWatchCopy.hbm.xml" />
        <mapping resource="domain/HomeNotice.hbm.xml" />
        <mapping resource="domain/WeiXinInfo.hbm.xml" />
        <mapping resource="domain/WeiXinImage.hbm.xml" />
        <mapping resource="domain/ImageInfo.hbm.xml" />
        <mapping resource="domain/LeShiRegister.hbm.xml" />
        <mapping resource="domain/KKInstall.hbm.xml" />
        <mapping resource="domain/HotVideoType.hbm.xml" />
        <mapping resource="domain/VideoTypeStatistics.hbm.xml" />
        <mapping resource="domain/VideoIntersection.hbm.xml" />
        <mapping resource="domain/VideoIntersectionVideo.hbm.xml" />
        <mapping resource="domain/FengXingUrlId.hbm.xml" />
        <mapping resource="domain/HuaShuUrlId.hbm.xml" />
        <mapping resource="domain/MangGuoUrlId.hbm.xml" />
        <mapping resource="domain/SoHuVideoUrlId.hbm.xml" />
        <mapping resource="domain/VideoBanQuan.hbm.xml" />
        <mapping resource="domain/VideoBanQuanVideo.hbm.xml" />
        <mapping resource="domain/RecommendAd.hbm.xml" />
        <mapping resource="domain/SuperHomeType.hbm.xml" />
        <mapping resource="domain/SuperHomeAd.hbm.xml" />
        <mapping resource="domain/LeShiMovieVip.hbm.xml" />
        <mapping resource="domain/SuperVideoType.hbm.xml" />
        <mapping resource="domain/SuperHotType.hbm.xml" />
        <mapping resource="domain/SuperUserBanner.hbm.xml" />
        <mapping resource="domain/SuperRecommendAd.hbm.xml" />
        <mapping resource="domain/SuperHotSearch.hbm.xml" />
        <mapping resource="domain/SuperHomeNotice.hbm.xml" />
        <mapping resource="domain/LeShiUrlIds.hbm.xml" />
        <mapping resource="domain/AcfunUrlId.hbm.xml" />
        <mapping resource="domain/AcfunVideoUrl.hbm.xml" />
        <mapping resource="domain/Comment.hbm.xml" />
        <mapping resource="domain/Comment2.hbm.xml" />
        <mapping resource="domain/YSDQVideoUrl.hbm.xml" />
        <mapping resource="domain/ad/YouDaoStatistics.hbm.xml" />
        <mapping resource="domain/BiliBiliUrlId.hbm.xml" />
        <mapping resource="domain/Contact.hbm.xml" />
        <mapping resource="domain/YouKuVideoUrl.hbm.xml" />
        <mapping resource="domain/AdRecommendRight.hbm.xml" />
        <mapping resource="domain/VideoPlayStatistics.hbm.xml" />
        <mapping resource="domain/HomeTypeItem.hbm.xml" />
        <mapping resource="domain/SuperHotStar.hbm.xml" />
        <mapping resource="domain/LoginUser.hbm.xml" />
        <mapping resource="domain/Attention.hbm.xml" />
        <mapping resource="domain/WebVideo.hbm.xml" />
    <session-factory>
        <property name="hibernate.hbm2ddl.auto">none</property>
        <property name="hibernate.current_session_context_class">
            org.springframework.orm.hibernate4.SpringSessionContext
        </property>
        <!-- 打印sql语句 -->
        <property name="show_sql">true</property>
        <!-- 映射文件配置 -->
        <mapping resource="domain/AdCancelRule.hbm.xml"/>
        <mapping resource="domain/AdminInfo.hbm.xml"/>
        <mapping resource="domain/AdTag.hbm.xml"/>
        <mapping resource="domain/AdType.hbm.xml"/>
        <mapping resource="domain/Advice.hbm.xml"/>
        <mapping resource="domain/Collection.hbm.xml"/>
        <mapping resource="domain/Config.hbm.xml"/>
        <mapping resource="domain/GetScoreCollect.hbm.xml"/>
        <mapping resource="domain/GetScoreOpen.hbm.xml"/>
        <mapping resource="domain/GetScoreRule.hbm.xml"/>
        <mapping resource="domain/GetScoreSaveVideo.hbm.xml"/>
        <mapping resource="domain/GetScoreShare.hbm.xml"/>
        <mapping resource="domain/GetScoreWatch.hbm.xml"/>
        <mapping resource="domain/GetScoreContinueWatch.hbm.xml"/>
        <mapping resource="domain/GetScoreEvaluate.hbm.xml"/>
        <mapping resource="domain/GetScoreHistory.hbm.xml"/>
        <mapping resource="domain/HomeAd.hbm.xml"/>
        <mapping resource="domain/HomeType.hbm.xml"/>
        <mapping resource="domain/HomeVideo.hbm.xml"/>
        <mapping resource="domain/HotSearch.hbm.xml"/>
        <mapping resource="domain/HotStar.hbm.xml"/>
        <mapping resource="domain/HotStarVideo.hbm.xml"/>
        <mapping resource="domain/SearchHistory.hbm.xml"/>
        <mapping resource="domain/ScoreHistory.hbm.xml"/>
        <mapping resource="domain/SystemInfo.hbm.xml"/>
        <mapping resource="domain/UserInfo.hbm.xml"/>
        <mapping resource="domain/UseScoreHistory.hbm.xml"/>
        <mapping resource="domain/VideoDetailInfo.hbm.xml"/>
        <mapping resource="domain/VideoInfo.hbm.xml"/>
        <mapping resource="domain/VideoResourceMapExtraInfo.hbm.xml"/>
        <mapping resource="domain/VideoResource.hbm.xml"/>
        <mapping resource="domain/VideoScoreHistory.hbm.xml"/>
        <mapping resource="domain/VideoType.hbm.xml"/>
        <mapping resource="domain/VideoUrl.hbm.xml"/>
        <mapping resource="domain/UserBanner.hbm.xml"/>
        <mapping resource="domain/WXAd.hbm.xml"/>
        <mapping resource="domain/WXStatistics.hbm.xml"/>
        <mapping resource="domain/ShareContent.hbm.xml"/>
        <mapping resource="domain/DetailSystem.hbm.xml"/>
        <mapping resource="domain/LeShiAccount.hbm.xml"/>
        <mapping resource="domain/LeShiUrl.hbm.xml"/>
        <mapping resource="domain/VideoPlayError.hbm.xml"/>
        <mapping resource="domain/LeShiWatch.hbm.xml"/>
        <mapping resource="domain/LeShiAccountVideo.hbm.xml"/>
        <mapping resource="domain/DeviceInfo.hbm.xml"/>
        <mapping resource="domain/LeShiDownLoad.hbm.xml"/>
        <mapping resource="domain/LeShiWatchCopy.hbm.xml"/>
        <mapping resource="domain/HomeNotice.hbm.xml"/>
        <mapping resource="domain/WeiXinInfo.hbm.xml"/>
        <mapping resource="domain/WeiXinImage.hbm.xml"/>
        <mapping resource="domain/ImageInfo.hbm.xml"/>
        <mapping resource="domain/LeShiRegister.hbm.xml"/>
        <mapping resource="domain/KKInstall.hbm.xml"/>
        <mapping resource="domain/HotVideoType.hbm.xml"/>
        <mapping resource="domain/VideoTypeStatistics.hbm.xml"/>
        <mapping resource="domain/VideoIntersection.hbm.xml"/>
        <mapping resource="domain/VideoIntersectionVideo.hbm.xml"/>
        <mapping resource="domain/FengXingUrlId.hbm.xml"/>
        <mapping resource="domain/HuaShuUrlId.hbm.xml"/>
        <mapping resource="domain/MangGuoUrlId.hbm.xml"/>
        <mapping resource="domain/SoHuVideoUrlId.hbm.xml"/>
        <mapping resource="domain/VideoBanQuan.hbm.xml"/>
        <mapping resource="domain/VideoBanQuanVideo.hbm.xml"/>
        <mapping resource="domain/RecommendAd.hbm.xml"/>
        <mapping resource="domain/SuperHomeType.hbm.xml"/>
        <mapping resource="domain/SuperHomeAd.hbm.xml"/>
        <mapping resource="domain/LeShiMovieVip.hbm.xml"/>
        <mapping resource="domain/SuperVideoType.hbm.xml"/>
        <mapping resource="domain/SuperHotType.hbm.xml"/>
        <mapping resource="domain/SuperUserBanner.hbm.xml"/>
        <mapping resource="domain/SuperRecommendAd.hbm.xml"/>
        <mapping resource="domain/SuperHotSearch.hbm.xml"/>
        <mapping resource="domain/SuperHomeNotice.hbm.xml"/>
        <mapping resource="domain/LeShiUrlIds.hbm.xml"/>
        <mapping resource="domain/AcfunUrlId.hbm.xml"/>
        <mapping resource="domain/AcfunVideoUrl.hbm.xml"/>
        <mapping resource="domain/Comment.hbm.xml"/>
        <mapping resource="domain/Comment2.hbm.xml"/>
        <mapping resource="domain/YSDQVideoUrl.hbm.xml"/>
        <mapping resource="domain/ad/YouDaoStatistics.hbm.xml"/>
        <mapping resource="domain/BiliBiliUrlId.hbm.xml"/>
        <mapping resource="domain/Contact.hbm.xml"/>
        <mapping resource="domain/YouKuVideoUrl.hbm.xml"/>
        <mapping resource="domain/AdRecommendRight.hbm.xml"/>
        <mapping resource="domain/VideoPlayStatistics.hbm.xml"/>
        <mapping resource="domain/HomeTypeItem.hbm.xml"/>
        <mapping resource="domain/SuperHotStar.hbm.xml"/>
        <mapping resource="domain/LoginUser.hbm.xml"/>
        <mapping resource="domain/Attention.hbm.xml"/>
        <mapping resource="domain/WebVideo.hbm.xml"/>
        <mapping resource="domain/special/Special.hbm.xml" />
        <mapping resource="domain/special/SpecialVideo.hbm.xml" />
        <mapping resource="domain/special/SuperSpecial.hbm.xml" />
        <mapping resource="domain/special/Special.hbm.xml"/>
        <mapping resource="domain/special/SpecialVideo.hbm.xml"/>
        <mapping resource="domain/special/SuperSpecial.hbm.xml"/>
        <mapping resource="domain/MaskKey.hbm.xml" />
        <mapping resource="domain/MaskKey.hbm.xml"/>
        <mapping resource="domain/push/VideoPushHistory.hbm.xml" />
        <mapping resource="domain/push/VideoPushHistory.hbm.xml"/>
        <!-- 推荐 -->
        <mapping
            resource="domain/recommend/CategoryRecommendVideo.hbm.xml" />
        <!-- 推荐 -->
        <mapping
                resource="domain/recommend/CategoryRecommendVideo.hbm.xml"/>
        <mapping
            resource="domain/recommend/CategoryRecommendCacheVideo.hbm.xml" />
        <mapping
                resource="domain/recommend/CategoryRecommendCacheVideo.hbm.xml"/>
        <mapping resource="domain/recommend/AreaVideoCache.hbm.xml" />
        <mapping resource="domain/recommend/AreaVideoCache.hbm.xml"/>
        <mapping
            resource="domain/recommend/CategoryRecommendCacheVideoNumber.hbm.xml" />
        <mapping
                resource="domain/recommend/CategoryRecommendCacheVideoNumber.hbm.xml"/>
        <!-- 评论 -->
        <mapping resource="domain/CommentReply.hbm.xml"/>
        <!-- 评论 -->
        <mapping resource="domain/CommentReply.hbm.xml" />
        <!-- 直播 -->
        <mapping resource="domain/video/zhibo/ZhiBoStatisticsDetail.hbm.xml" />
        <mapping resource="domain/video/zhibo/ZhiBoStatistics.hbm.xml" />
        <mapping resource="domain/video/zhibo/LiveType.hbm.xml" />
        <!-- 直播 -->
        <mapping resource="domain/video/zhibo/ZhiBoStatisticsDetail.hbm.xml"/>
        <mapping resource="domain/video/zhibo/ZhiBoStatistics.hbm.xml"/>
        <mapping resource="domain/video/zhibo/LiveType.hbm.xml"/>
        <!-- 下载 -->
        <mapping resource="domain/DownLoadVideoInfo.hbm.xml" />
        <mapping resource="domain/DownLoadVersionVideo.hbm.xml" />
        <mapping resource="domain/DownLoadUserInfo.hbm.xml" />
        <mapping resource="domain/DownLoadCollect.hbm.xml" />
        <mapping resource="domain/DownLoadVideoType.hbm.xml" />
        <mapping resource="domain/DownLoadTypeVideo.hbm.xml" />
        <mapping resource="domain/DownLoadVideoUrl.hbm.xml" />
        <!-- 下载 -->
        <mapping resource="domain/DownLoadVideoInfo.hbm.xml"/>
        <mapping resource="domain/DownLoadVersionVideo.hbm.xml"/>
        <mapping resource="domain/DownLoadUserInfo.hbm.xml"/>
        <mapping resource="domain/DownLoadCollect.hbm.xml"/>
        <mapping resource="domain/DownLoadVideoType.hbm.xml"/>
        <mapping resource="domain/DownLoadTypeVideo.hbm.xml"/>
        <mapping resource="domain/DownLoadVideoUrl.hbm.xml"/>
        <mapping resource="domain/ResourceVideo.hbm.xml" />
        <mapping resource="domain/CategoryVideo.hbm.xml" />
        <mapping resource="domain/CategoryContry.hbm.xml" />
        <mapping resource="domain/ResourceVideo.hbm.xml"/>
        <mapping resource="domain/CategoryVideo.hbm.xml"/>
        <mapping resource="domain/CategoryContry.hbm.xml"/>
        <mapping
            resource="domain/recommend/SuperCategoryRecommendVideo.hbm.xml" />
        <mapping
                resource="domain/recommend/SuperCategoryRecommendVideo.hbm.xml"/>
        <!-- 广告 -->
        <mapping resource="domain/ad/CommonAd.hbm.xml" />
        <mapping resource="domain/ad/CommonAdStatistics.hbm.xml" />
        <mapping resource="domain/ad/CommonAdPosition.hbm.xml" />
        <mapping resource="domain/ad/CommonAdPositionAd.hbm.xml" />
        <!-- 广告 -->
        <mapping resource="domain/ad/CommonAd.hbm.xml"/>
        <mapping resource="domain/ad/CommonAdStatistics.hbm.xml"/>
        <mapping resource="domain/ad/CommonAdPosition.hbm.xml"/>
        <mapping resource="domain/ad/CommonAdPositionAd.hbm.xml"/>
        <!-- 新闻阅读 -->
        <mapping resource="domain/news/News.hbm.xml" />
        <mapping resource="domain/news/NewsImage.hbm.xml" />
        <mapping resource="domain/news/NewsType.hbm.xml" />
        <mapping resource="domain/news/NewsTypeContent.hbm.xml" />
        <mapping resource="domain/news/FoundNews.hbm.xml" />
        <mapping resource="domain/news/SuperFoundNrews.hbm.xml" />
        <!-- 新闻阅读 -->
        <mapping resource="domain/news/News.hbm.xml"/>
        <mapping resource="domain/news/NewsImage.hbm.xml"/>
        <mapping resource="domain/news/NewsType.hbm.xml"/>
        <mapping resource="domain/news/NewsTypeContent.hbm.xml"/>
        <mapping resource="domain/news/FoundNews.hbm.xml"/>
        <mapping resource="domain/news/SuperFoundNrews.hbm.xml"/>
        <mapping resource="domain/video/JuHeFilterKey.hbm.xml"/>
        <mapping resource="domain/video/JuHeFilterKey.hbm.xml" />
        <!-- 爱奇艺 -->
        <mapping resource="domain/video/iqiyi/IqiyiAlbum.hbm.xml"/>
        <mapping resource="domain/video/iqiyi/IqiyiVideoInfo.hbm.xml"/>
        <mapping resource="domain/video/iqiyi/VideoIqiyi.hbm.xml"/>
        <mapping resource="domain/video/iqiyi/IqiyiUpdateQueue.hbm.xml"/>
        <!-- 爱奇艺 -->
        <mapping resource="domain/video/iqiyi/IqiyiAlbum.hbm.xml" />
        <mapping resource="domain/video/iqiyi/IqiyiVideoInfo.hbm.xml" />
        <mapping resource="domain/video/iqiyi/VideoIqiyi.hbm.xml" />
        <mapping resource="domain/video/iqiyi/IqiyiUpdateQueue.hbm.xml" />
        <!-- 搜狐 -->
        <mapping resource="domain/video/sohu/SoHuAlbum.hbm.xml" />
        <mapping resource="domain/video/sohu/SoHuVideo.hbm.xml" />
        <mapping resource="domain/video/sohu/VideoSoHu.hbm.xml" />
        <!-- 搜狐 -->
        <mapping resource="domain/video/sohu/SoHuAlbum.hbm.xml"/>
        <mapping resource="domain/video/sohu/SoHuVideo.hbm.xml"/>
        <mapping resource="domain/video/sohu/VideoSoHu.hbm.xml"/>
        <!-- 风行 -->
        <mapping resource="domain/video/funtv/VideoFunTV.hbm.xml" />
        <!-- 风行 -->
        <mapping resource="domain/video/funtv/VideoFunTV.hbm.xml"/>
        <!-- 商城相关 -->
        <mapping resource="domain/shop/ShopItemCollect.hbm.xml" />
        <mapping resource="domain/shop/ShopItemComment.hbm.xml" />
        <!-- 商城相关 -->
        <mapping resource="domain/shop/ShopItemCollect.hbm.xml"/>
        <mapping resource="domain/shop/ShopItemComment.hbm.xml"/>
        <mapping class="com.yeshi.buwan.domain.AcFunTemporary"/>
        <mapping class="com.yeshi.buwan.acFun.AcFunVideo"/>
        <mapping class="com.yeshi.buwan.acFun.AcFunType"/>
        <mapping class="com.yeshi.buwan.acFun.AcTypeEqVideoType"/>
        <mapping class="com.yeshi.buwan.domain.Holmes"/>
    </session-factory>
        <!-- VIP -->
        <mapping resource="domain/vip/UserVIPInfo.hbm.xml"/>
        <mapping resource="domain/vip/VIPOrderRecord.hbm.xml"/>
        <mapping class="com.yeshi.buwan.domain.AcFunTemporary"/>
        <mapping class="com.yeshi.buwan.acFun.AcFunVideo"/>
        <mapping class="com.yeshi.buwan.acFun.AcFunType"/>
        <mapping class="com.yeshi.buwan.acFun.AcTypeEqVideoType"/>
        <mapping class="com.yeshi.buwan.domain.Holmes"/>
    </session-factory>
</hibernate-configuration>
src/main/resources/sms_tencent_config.properties
@@ -1,4 +1,4 @@
app_id=1400246689
app_key=7f3dfd82f3ff0326127a21009464bfd9
sign=板栗快省
app_id=1400483517
app_key=f7933d53b41d9a0bdfaf7f837c4a5b31
sign=影视大全
content_bind=【[签名]】验证码:[验证码],2分钟内有效。为了保护您的账号安全,验证短信请勿转发他人。
src/main/resources/wx/apiclient_key.pem
New file
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDAy5UF6702led7
2WrytnQVdHCwH83WAPArEdayXCCc1DId/UvgMVdpxO52elambEhJyU6NSgv4N+Vp
QZ/ewQI7Jz9E90NmsPz/DaV+OfolS5VgMzCUXbVKtPX83oALZMNVqmtgAkhqjBFC
XyblhYWjzVgqOXLYHxIJEqIZzSeWvTGKGFwQclw3fT4rto2hX90xJVq4RlCw+/fe
oO9PnWWilwTE59hiw/V9Q2YlO0sDlzOoCiSPNcfeHhwywbLAKKzz62xLGoMCcquK
Xg80YuOL8nR486FcskwR3osePUSd6tv0MfMuVCwhhv7uDGzBjpNAmsvMXNXwXau1
6RgU93cZAgMBAAECggEAa5VvPFWXSY2PFip2Jqiv0IUgmPe2ahQt8SrMLs2AGWPD
7744CAwgplIRa6XLEqVcFWizX96RHVs7tme7aZc0woOdJ8P/JZ/gHgekcPKzZvpt
ibgnBLPiBaVDm28h7rm00un9bx73ABXXT70/PFctAwIEj9NtBbMY4l02fcVgsRk7
oRCNgL1eWMrjWTZpE6G1JQlWpeMsmfSeuDf/D7Z6ZWdbAglkb9lDo9e2eVPGQHRq
JH58fF7F1oDuXntaNimAXicZifOPMANvT0Y6iCx6ebapHmLwRCS2j0MYpJbq4URn
uKXsNLCAFaqEfYfvS6O+r9nzvLlelIB2YGMs1OvR8QKBgQDu6eDU27b71MQJC/64
GZ17yMJBRF3HQbUlTMPnQoWgAGEAtRSqlAX1zC/14mKbUkMTM1EGKKyP0jX5u2df
RmVGMQnqVURVm7IoZxXU7XBajSzuDFCoXRtUl2Ut88DCa2yqwavq3M0rObQ9hq3R
2YKr1DM6SPtYh0X3HMLoVX7X7QKBgQDOlVn8Tu1Zd+sGr0U9oNP+iIyR81pjx8Nc
/14gAB4wuMKPhY52exKB4q7b76RHlftMblzWOUPBcv3ZiyFI2I2sDOyq/pJxjqJV
KAR2Eatx28xYJ0scLFkvohxnTBqUxi+IRytXJ/aCabSgQ9rrt+ZPr30nDR0anL0p
Bk/D9cJeXQKBgQCkDcEvKPhLkNxUAgKU1DIJr9+EBbgHfR0wUbgr8sfjCJ+TZsSc
JSy6jc1ZIGzpjuE0LAa1HfTwhT4/D+p5x9L/EelnGcnkpxb9G1wobCq8Yzi49Yfl
NJnxykvV9A0m87EYyAiPK7NOvT8BCJwO/zb1Wq8alMbTEYB/oSZNd3e0OQKBgA00
VK0g6mDmnlouB9H5nrNNTRbjJCrukNk35W9MMqHQnXcJBWMjWLp+n8ilF64PsyFe
iIaU4HTUAc/O6dC7LssJhHMllHy3rj6dMTPOy1OaxgP4dv+VAhpeVUxw+934kP83
9Vg70LDjSs1XqP2aIpmDUQ+W8f5KeHjP03dmFQdtAoGBAKPJjivKn5WsGWhMHEm/
DX+X/RQGHx4KK7JexCAxS2aTt+/2gLZEA7MH56c5E92tkFFv9vZ6VEE3EzZKTEtn
EmxIXnpVdPiFJuES3m9XikfIbZjlZ8U9vI7i6YKP8/a9XO4NCCgzU4WtslmOJ+Nu
gcPoYuqLpfNU0D+aqXakLgN3
-----END PRIVATE KEY-----
src/main/resources/wxpay.properties
New file
@@ -0,0 +1,4 @@
app_id=wxa99686bb65a9f466
mch_id=1520950211
mch_serial_no=454328C324C6CC21355D064B44D6524CD7506DD0
api_v3_key=XYJkJ2018FAfaodCCx899mLl138rfGVd
src/main/webapp/user_protocol_bw.jsp
@@ -418,6 +418,10 @@
</p>
</p>
<div style="display: none;">
    <script type="text/javascript" src="https://s4.cnzz.com/z_stat.php?id=1279668448&web_id=1279668448"></script>
</div>
</body>
</html>
src/test/java/com/hxh/spring/test/PPTVTest.java
@@ -1,9 +1,14 @@
package com.hxh.spring.test;
import com.yeshi.buwan.pptv.PPTVApiUtil;
import com.yeshi.buwan.pptv.PPTVUtil;
import com.yeshi.buwan.pptv.entity.PPTVSeries;
import com.yeshi.buwan.service.inter.juhe.PPTVService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import javax.annotation.Resource;
import java.util.List;
@@ -20,7 +25,7 @@
    @Test
    public void save() {
        List<PPTVSeries> list = PPTVApiUtil.getUpdateList();
//        pptvService.save(list);
        pptvService.save(list);
    }
    @Test
@@ -30,17 +35,29 @@
    }
    @Test
    public void test(){
      PPTVApiUtil.getOpenId("123");
    public void test() {
        PPTVApiUtil.getOpenId("123");
    }
    @Test
    public void getAll() {
        PPTVApiUtil.getUpdateList();
    }
    @Test
    public void getApiDetail(){
    public void getApiDetail() {
        PPTVApiUtil.getDetail("32159127,10215224,15326213");
    }
    @Test
    public void getOpenId() {
        //CODE:XefbSM0H8BC9kaEGEjHF2U7wd6Sd9ec1oSUmG1gZDTg=
        PPTVApiUtil.login("XefbSM0H8BC9kaEGEjHF2U7wd6Sd9ec1oSUmG1gZDTg=");
        PPTVApiUtil.getOpenId("buwan_766693");
    }
}
src/test/java/com/hxh/spring/test/vip/VIPTest.java
New file
@@ -0,0 +1,132 @@
package com.hxh.spring.test.vip;
import com.yeshi.buwan.domain.vip.VIPOrderRecord;
import com.yeshi.buwan.domain.vip.VIPPrice;
import com.yeshi.buwan.domain.vip.VIPPriceType;
import com.yeshi.buwan.exception.vip.VIPException;
import com.yeshi.buwan.service.inter.vip.VIPPriceService;
import com.yeshi.buwan.service.inter.vip.VIPService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
@ContextConfiguration(locations = {"classpath:spring.xml"})
@WebAppConfiguration
public class VIPTest {
    @Resource
    private VIPPriceService vipPriceService;
    @Resource
    private VIPService vipService;
    @Test
    public void addVIPPrice() {
        VIPPrice price = new VIPPrice();
        price.setPrice(new BigDecimal(8));
        price.setType(VIPPriceType.month);
        price.setPptvGoodsNo("DA7559531560894");
        price.setShow(true);
        try {
            vipPriceService.addPrice(price);
        } catch (VIPException e) {
            e.printStackTrace();
        }
        price = new VIPPrice();
        price.setPrice(new BigDecimal(24));
        price.setType(VIPPriceType.season);
        price.setPptvGoodsNo("DA7559574625089");
        price.setShow(true);
        try {
            vipPriceService.addPrice(price);
        } catch (VIPException e) {
            e.printStackTrace();
        }
        price = new VIPPrice();
        price.setPrice(new BigDecimal(45));
        price.setType(VIPPriceType.halfYear);
        price.setPptvGoodsNo("DA6989580247516");
        price.setShow(true);
        try {
            vipPriceService.addPrice(price);
        } catch (VIPException e) {
            e.printStackTrace();
        }
        price = new VIPPrice();
        price.setPrice(new BigDecimal(88));
        price.setType(VIPPriceType.year);
        price.setPptvGoodsNo("DA8129574268091");
        price.setShow(true);
        try {
            vipPriceService.addPrice(price);
        } catch (VIPException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void listVIPPrice() {
        List<VIPPrice> list = vipPriceService.listValidPrice();
        System.out.println(list);
    }
    @Test
    public void addOrderRecord() {
        VIPPrice price = vipPriceService.selectByPrimaryKey("172a8327fcd3685ab3c0f740d031da09");
        VIPOrderRecord record = new VIPOrderRecord();
        record.setMoney(price.getPrice());
        record.setType(price.getType());
        record.setUid(766693 + "");
        try {
            vipService.addVIPRecord(record);
        } catch (VIPException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void listRecord() {
        List<VIPOrderRecord> list = vipService.listOrderRecord(null, null, 1, 10);
        long count = vipService.countOrderRecord(null, null);
        list = vipService.listOrderRecord(766693 + "", null, 1, 10);
        count = vipService.countOrderRecord(766693 + "", null);
        list = vipService.listOrderRecord(766693 + "", VIPOrderRecord.STATE_NOT_PAY, 1, 10);
        count = vipService.countOrderRecord(766693 + "", VIPOrderRecord.STATE_NOT_PAY);
        list = vipService.listOrderRecord(766693 + "", VIPOrderRecord.STATE_PAY, 1, 10);
        count = vipService.countOrderRecord(766693 + "", VIPOrderRecord.STATE_PAY);
        System.out.println(list);
    }
    @Test
    public void paySuccess() {
        try {
            vipService.paySuccess("2", VIPOrderRecord.PAY_WAY_ALIPAY, new BigDecimal("2.99"), new Date());
        } catch (VIPException e) {
            e.printStackTrace();
        }
    }
}