Pārlūkot izejas kodu

支付宝移动端支付

guomengjiao 5 mēneši atpakaļ
vecāks
revīzija
b17661a70d

+ 21 - 14
.idea/workspace.xml

@@ -29,7 +29,14 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="fc9366aa-6566-4981-8149-d75e02f8e884" name="默认的" comment="支付宝移动端支付">
-      <change beforePath="$PROJECT_DIR$/modules/report/src/main/resources/mappings/modules/report/ResearchBriefReportLabelRelevancyDao.xml" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/resources/mappings/modules/report/ResearchBriefReportLabelRelevancyDao.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/ResearchBriefReportControllerApi.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/ResearchBriefReportControllerApi.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/WebsiteUserControllerApi.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/WebsiteUserControllerApi.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/WebsiteUserOrderControllerApi.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/WebsiteUserOrderControllerApi.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/modules/core/src/main/java/com/jeesite/modules/sys/interceptor/WebsiteLoginInterceptor.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/core/src/main/java/com/jeesite/modules/sys/interceptor/WebsiteLoginInterceptor.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/modules/core/src/main/java/com/jeesite/modules/sys/utils/R.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/core/src/main/java/com/jeesite/modules/sys/utils/R.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/WebsiteUserOrderService.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/WebsiteUserOrderService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/web/ResearchBriefReportController.java" beforeDir="false" afterPath="$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/web/ResearchBriefReportController.java" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -91,7 +98,7 @@
     <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
     <property name="WebServerToolWindowFactoryState" value="false" />
     <property name="aspect.path.notification.shown" value="true" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/../../maintenance-support/maintenance-support-java" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/../../yicangzongtai/api" />
     <property name="project.structure.last.edited" value="Project" />
     <property name="project.structure.proportion" value="0.15" />
     <property name="project.structure.side.proportion" value="0.25287357" />
@@ -109,8 +116,8 @@
       <recent name="D:\Git\xiangxi\bjfl_web\modules\basedata\src\main\resources\mappings\modules\basedata" />
     </key>
     <key name="CopyClassDialog.RECENTS_KEY">
-      <recent name="com.jeesite.modules.bjflapi.report" />
       <recent name="com.jeesite.modules.sys.utils" />
+      <recent name="com.jeesite.modules.bjflapi.report" />
       <recent name="com.jeesite.modules.report.dto" />
       <recent name="com.jeesite.modules.config.web.interceptor" />
       <recent name="com.jeesite.modules.bjflapi" />
@@ -454,14 +461,7 @@
       <workItem from="1734579234738" duration="258000" />
       <workItem from="1734579502121" duration="1272000" />
       <workItem from="1734658594781" duration="126472000" />
-      <workItem from="1735184825354" duration="15815000" />
-    </task>
-    <task id="LOCAL-00002" summary="1">
-      <created>1676368733682</created>
-      <option name="number" value="00002" />
-      <option name="presentableId" value="LOCAL-00002" />
-      <option name="project" value="LOCAL" />
-      <updated>1676368733682</updated>
+      <workItem from="1735184825354" duration="18728000" />
     </task>
     <task id="LOCAL-00003" summary="更新">
       <created>1678439872833</created>
@@ -799,7 +799,14 @@
       <option name="project" value="LOCAL" />
       <updated>1735207434639</updated>
     </task>
-    <option name="localTasksCounter" value="51" />
+    <task id="LOCAL-00051" summary="支付宝移动端支付">
+      <created>1735207878101</created>
+      <option name="number" value="00051" />
+      <option name="presentableId" value="LOCAL-00051" />
+      <option name="project" value="LOCAL" />
+      <updated>1735207878101</updated>
+    </task>
+    <option name="localTasksCounter" value="52" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -886,8 +893,8 @@
       <breakpoints>
         <line-breakpoint enabled="true" type="java-line">
           <url>file://$PROJECT_DIR$/modules/report/src/main/java/com/jeesite/modules/report/service/ResearchBriefReportService.java</url>
-          <line>77</line>
-          <option name="timeStamp" value="44" />
+          <line>140</line>
+          <option name="timeStamp" value="47" />
         </line-breakpoint>
       </breakpoints>
     </breakpoint-manager>

+ 11 - 10
modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/ResearchBriefReportControllerApi.java

@@ -6,6 +6,7 @@ import com.jeesite.common.entity.Page;
 import com.jeesite.modules.report.entity.ResearchBriefReport;
 import com.jeesite.modules.report.entity.ResearchBriefReportLabel;
 import com.jeesite.modules.report.service.ResearchBriefReportService;
+import com.jeesite.modules.sys.utils.R;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -32,8 +33,8 @@ public class ResearchBriefReportControllerApi {
      */
     @PostMapping(value = "/pageList")
     @ApiOperation(value = "简报智库", notes = "简报智库列表")
-    public Page<ResearchBriefReport> pageList(ResearchBriefReport researchBriefReport) {
-        return researchBriefReportService.findReportPage(researchBriefReport);
+    public R<Page<ResearchBriefReport>> pageList(ResearchBriefReport researchBriefReport) {
+        return R.ok(researchBriefReportService.findReportPage(researchBriefReport));
     }
 
     /**
@@ -43,9 +44,9 @@ public class ResearchBriefReportControllerApi {
      */
     @PostMapping(value = "/categoryList")
     @ApiOperation(value = "简报智库", notes = "简报智库类别")
-    public List<ResearchBriefReportLabel> categoryList() {
+    public R<List<ResearchBriefReportLabel>> categoryList() {
         // 分类
-        return researchBriefReportService.marketTypeList();
+        return R.ok(researchBriefReportService.marketTypeList());
     }
 
     /**
@@ -55,7 +56,7 @@ public class ResearchBriefReportControllerApi {
      */
     @GetMapping(value = "/form")
     @ApiOperation(value = "简报智库表单", notes = "简报智库表单")
-    public Map<String, Object> researchBriefReportForm(ResearchBriefReport researchBriefReport, HttpServletRequest request) {
+    public R<Map<String, Object>> researchBriefReportForm(ResearchBriefReport researchBriefReport, HttpServletRequest request) {
         Map<String, Object> map = MapUtils.newHashMap();
         ResearchBriefReport vo = researchBriefReportService.researchBriefReportForm(researchBriefReport, request);
         map.put("vo", vo);
@@ -70,7 +71,7 @@ public class ResearchBriefReportControllerApi {
             list = researchBriefReportService.moreReportList(query);
         }
         map.put("list", list);
-        return map;
+        return R.ok(map);
     }
 
     /**
@@ -80,8 +81,8 @@ public class ResearchBriefReportControllerApi {
      */
     @GetMapping(value = "/hotReports")
     @ApiOperation(value = "简报智库列表", notes = "热门报告,查询最新6个")
-    public List<ResearchBriefReport> hotReports() {
-        return researchBriefReportService.hotReports(6);
+    public R<List<ResearchBriefReport>> hotReports() {
+        return R.ok(researchBriefReportService.hotReports(6));
     }
 
     /**
@@ -91,7 +92,7 @@ public class ResearchBriefReportControllerApi {
      */
     @GetMapping(value = "/choicenessReports")
     @ApiOperation(value = "简报智库列表", notes = "精选简报,查询最新2个")
-    public List<ResearchBriefReport> choicenessReports() {
-        return researchBriefReportService.choicenessReports();
+    public R<List<ResearchBriefReport>> choicenessReports() {
+        return R.ok(researchBriefReportService.choicenessReports());
     }
 }

+ 31 - 28
modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/WebsiteUserControllerApi.java

@@ -58,35 +58,35 @@ public class WebsiteUserControllerApi extends AbstractController {
      * 登录页面
      */
     @PostMapping(value = "login")
-    public Map<String, Object> login(WebsiteUser websiteUser) {
+    public R<Map<String, Object>> login(WebsiteUser websiteUser) {
         String loginCode = websiteUser.getLoginCode();
         String password = websiteUser.getPassword();
         // 登录用户名解密(解决登录用户名明文传输安全问题)
         String secretKey = Global.getProperty("shiro.loginSubmit.secretKey");
         if (StringUtils.isEmpty(loginCode)) {
-            return R.error("登录账号为空");
+            return R.fail("登录账号为空");
         }
         if (StringUtils.isEmpty(password)) {
-            return R.error("登录密码为空");
+            return R.fail("登录密码为空");
         }
         loginCode = DesUtils.decode(loginCode, secretKey);
         password = DesUtils.decode(password, secretKey);
         if (StringUtils.isNotEmpty(websiteUser.getValidCode())) {
             //验证是否一致
             if (!websiteUser.getValidCode().equals((String) redisUtil.get(Constants.WEBSITE_VALID_CODE + websiteUser.getUnTime()))) {
-                return R.error("验证码不一致");
+                return R.fail("验证码不一致");
             }
             redisUtil.del(Constants.WEBSITE_VALID_CODE + websiteUser.getUnTime());
         }
         //查询用户
         WebsiteUser oldUser = websiteUserService.findLoginCode(loginCode);
         if (oldUser == null) {
-            return R.error("用户不存在,请先注册");
+            return R.fail("用户不存在,请先注册");
         }
         //验证密码
         String passwordEncode = PasswordUtil.encrypt(loginCode, password, oldUser.getSalt());
         if (!passwordEncode.equals(oldUser.getPassword())) {
-            return R.error("登录密码不正确");
+            return R.fail("登录密码不正确");
         }
         //TODO 单点登录,清理登录用户的登录token
         List<Object> tokenList = redisUtil.lGet(Constants.PREFIX_USER_TOKEN_LIST + loginCode, 0, -1);
@@ -107,31 +107,31 @@ public class WebsiteUserControllerApi extends AbstractController {
     }
 
     @PostMapping(value = "register")
-    public Map<String, Object> register(WebsiteUser websiteUser) {
+    public R<Map<String, Object>> register(WebsiteUser websiteUser) {
         String loginCode = websiteUser.getLoginCode();
         String password = websiteUser.getPassword();
         // 登录用户名解密(解决登录用户名明文传输安全问题)
         String secretKey = Global.getProperty("shiro.loginSubmit.secretKey");
         if (StringUtils.isEmpty(loginCode)) {
-            return R.error("登录账号为空");
+            return R.fail("登录账号为空");
         }
         if (StringUtils.isEmpty(password)) {
-            return R.error("登录密码为空");
+            return R.fail("登录密码为空");
         }
         loginCode = DesUtils.decode(loginCode, secretKey);
         password = DesUtils.decode(password, secretKey);
         String confirmNewPassword = DesUtils.decode(websiteUser.getConfirmNewPassword(), secretKey);
         // 验证新密码和确认密码
         if (!StringUtils.equals(password, confirmNewPassword)) {
-            return R.error("两次密码不一致");
+            return R.fail("两次密码不一致");
         }
         WebsiteUser oldUser = websiteUserService.findLoginCode(loginCode);
         if (oldUser != null) {
-            return R.error("用户已存在");
+            return R.fail("用户已存在");
         }
         oldUser = websiteUserService.findEmail(websiteUser.getEmail());
         if (oldUser != null) {
-            return R.error("邮箱已存在");
+            return R.fail("邮箱已存在");
         }
         WebsiteUser newUser = new WebsiteUser();
         BeanUtils.copyProperties(websiteUser, newUser);
@@ -150,13 +150,13 @@ public class WebsiteUserControllerApi extends AbstractController {
      */
     @WebsiteAuth
     @PostMapping(value = "updatePwd")
-    public Map<String, Object> updatePwd(WebsiteUserDto dto) throws Exception {
+    public R<String> updatePwd(WebsiteUserDto dto) throws Exception {
         String userId = getUserIdByRequest();
         WebsiteUser websiteUser = websiteUserService.get(userId);
-        return R.ok(updatePass(websiteUser, dto.getNewPassword(), dto.getConfirmNewPassword()));
+        return updatePass(websiteUser, dto.getNewPassword(), dto.getConfirmNewPassword());
     }
 
-    private String updatePass(WebsiteUser websiteUser, String newPassword, String confirmNewPassword) {
+    private R<String> updatePass(WebsiteUser websiteUser, String newPassword, String confirmNewPassword) {
         // 登录密码解密(解决密码明文传输安全问题)
         String secretKey = Global.getProperty("shiro.loginSubmit.secretKey");
         if (StringUtils.isNotBlank(secretKey)) {
@@ -164,29 +164,32 @@ public class WebsiteUserControllerApi extends AbstractController {
             confirmNewPassword = DesUtils.decode(confirmNewPassword, secretKey);
         }
         if (StringUtils.isEmpty(newPassword)) {
-            return "密码为空";
+            return R.fail("密码为空");
         }
         // 验证新密码和确认密码
         if (!StringUtils.equals(newPassword, confirmNewPassword)) {
-            return "两次密码不一致";
+            return R.fail("两次密码不一致");
         }
         // 更新密码
         String passwordEncode = PasswordUtil.encrypt(websiteUser.getLoginCode(), newPassword, websiteUser.getSalt());
         websiteUser.setPassword(passwordEncode);
         websiteUserService.updatePass(websiteUser);
-        return "成功";
+        return R.ok();
     }
 
     @PostMapping(value = "forgetPwd")
-    public Map<String, Object> forgetPwd(WebsiteUserDto dto) {
+    public R<Map<String, Object>> forgetPwd(WebsiteUserDto dto) {
         String secretKey = Global.getProperty("shiro.loginSubmit.secretKey");
         String redisKey = Constants.PREFIX_USER_FORGET_TOKEN + dto.getUuid();
         String userId = (String) redisUtil.get(redisKey);
         if (userId == null) {
-            return R.error("链接已过期");
+            return R.fail("链接已过期");
         }
         WebsiteUser websiteUser = websiteUserService.get(userId);
-        updatePass(websiteUser, dto.getNewPassword(), dto.getConfirmNewPassword());
+        R<String> updatePass = updatePass(websiteUser, dto.getNewPassword(), dto.getConfirmNewPassword());
+        if (updatePass.getCode() != R.SUCCESS) {
+            return R.fail(updatePass.getMsg());
+        }
         redisUtil.del(redisKey);
         WebsiteUser newWebsiteUser = new WebsiteUser();
         newWebsiteUser.setPassword(dto.getNewPassword());
@@ -199,20 +202,20 @@ public class WebsiteUserControllerApi extends AbstractController {
      */
     @PostMapping(value = "getWuValidCode")
     @ApiOperation(value = "获取找回密码的邮件验证码")
-    public Map<String, Object> getWuValidCode(WebsiteUserDto dto) {
+    public R<String> getWuValidCode(WebsiteUserDto dto) {
         String email = dto.getEmail();
         if (StringUtils.isEmpty(email)) {
-            return R.error("邮箱为空");
+            return R.fail("邮箱为空");
         }
         WebsiteUser websiteUser = websiteUserService.findEmail(email);
         if (websiteUser == null) {
-            return R.error("邮箱不存在");
+            return R.fail("邮箱不存在");
         }
         String dateKey = "wuLastDate" + email;
         // 操作是否频繁验证, 如果离上次获取验证码小于60秒,则提示操作频繁。
         String date = (String) redisUtil.get(dateKey);
         if (date != null && (System.currentTimeMillis()- DateUtils.parseDate(date).getTime())/(1000L) < 60L){
-            return R.error("您当前操作太频繁,请稍等一会再操作!");
+            return R.fail("您当前操作太频繁,请稍等一会再操作!");
         }else{
             redisUtil.set(dateKey, new Date());
             redisUtil.expire(dateKey, 60);
@@ -226,7 +229,7 @@ public class WebsiteUserControllerApi extends AbstractController {
         // 准备邮件内容,包含重置密码链接
         String emailContent = "请点击以下链接重置密码: <a href='" + resetUrl + "'>" + resetUrl + "</a>";
         EmailUtils.send(email, "找回密码,请点击以下链接重置密码", emailContent);
-        return R.ok("成功");
+        return R.ok();
     }
 
     /**
@@ -253,8 +256,8 @@ public class WebsiteUserControllerApi extends AbstractController {
      */
     @WebsiteAuth
     @GetMapping(value = "getUserInfo")
-    public WebsiteUser getUserInfo() throws Exception {
+    public R<WebsiteUser> getUserInfo() throws Exception {
         String userId = getUserIdByRequest();
-        return websiteUserService.get(userId);
+        return R.ok(websiteUserService.get(userId));
     }
 }

+ 21 - 21
modules/bjflapi/src/main/java/com/jeesite/modules/bjflapi/report/WebsiteUserOrderControllerApi.java

@@ -41,10 +41,10 @@ public class WebsiteUserOrderControllerApi extends AbstractController {
      */
     @WebsiteAuth
     @PostMapping(value = "orderList")
-    public Page<WebsiteUserOrder> orderList(WebsiteUserOrder websiteUserOrder) throws Exception {
+    public R<Page<WebsiteUserOrder>> orderList(WebsiteUserOrder websiteUserOrder) throws Exception {
         String userId = getUserIdByRequest();
         websiteUserOrder.setWebsiteUserId(userId);
-        return websiteUserOrderService.findPage(websiteUserOrder);
+        return R.ok(websiteUserOrderService.findPage(websiteUserOrder));
     }
 
     /**
@@ -52,37 +52,37 @@ public class WebsiteUserOrderControllerApi extends AbstractController {
      */
     @WebsiteAuth
     @PostMapping(value = "downList")
-    public Page<WebsiteUserOrderDown> downList(WebsiteUserOrderDown websiteUserOrderDown) throws Exception {
+    public R<Page<WebsiteUserOrderDown>> downList(WebsiteUserOrderDown websiteUserOrderDown) throws Exception {
         String userId = getUserIdByRequest();
         websiteUserOrderDown.setWebsiteUserId(userId);
-        return websiteUserOrderDownService.findPage(websiteUserOrderDown);
+        return R.ok(websiteUserOrderDownService.findPage(websiteUserOrderDown));
     }
 
     @PostMapping(value = "downFile")
-    public Map<String, Object> downFile(HttpServletRequest request, WebsiteUserOrder websiteUserOrder) {
+    public R<String> downFile(HttpServletRequest request, WebsiteUserOrder websiteUserOrder) {
         String reportId = websiteUserOrder.getResearchBriefReportId();
         if (StringUtils.isEmpty(reportId)) {
-            return R.error("简报为空");
+            return R.fail("简报为空");
         }
         String fileType = websiteUserOrder.getFileType();
         if (StringUtils.isEmpty(fileType)) {
-            return R.error("下载类型为空");
+            return R.fail("下载类型为空");
         }
         //判断简报是否需要收费
         ResearchBriefReport researchBriefReport = researchBriefReportService.get(reportId);
         if (researchBriefReport == null) {
-            return R.error("简报为空");
+            return R.fail("简报为空");
         }
         if (Constants.enableType.NO.equals(researchBriefReport.getUseDownPay())) {
             return getFileName(fileType, reportId, null);
         }
         String token = request.getHeader(Constants.WEBSITE_TOKEN);//header方式
         if (StringUtils.isEmpty(token)) {
-            return R.error(5001, "用户未登录");
+            return R.fail(5001, "用户未登录");
         }
         String uid = (String) redisUtil.get(Constants.PREFIX_USER_TOKEN + token);
         if (StringUtils.isEmpty(uid)) {
-            return R.error(5001, "用户未登录");
+            return R.fail(5001, "用户未登录");
         }
         WebsiteUserOrder orderWhere = new WebsiteUserOrder();
         orderWhere.setWebsiteUserId(uid);
@@ -90,7 +90,7 @@ public class WebsiteUserOrderControllerApi extends AbstractController {
         orderWhere.setPayStatus(Constants.orderPayStatus.PAY_SUCCESS);
         WebsiteUserOrder oldOrder = websiteUserOrderService.get(orderWhere);
         if (oldOrder == null) {
-            return R.error(5002, "用户未支付");
+            return R.fail(5002, "用户未支付");
         }
         WebsiteUserOrderDown downWhere = new WebsiteUserOrderDown();
         downWhere.setWebsiteUserId(uid);
@@ -98,14 +98,14 @@ public class WebsiteUserOrderControllerApi extends AbstractController {
         return getFileName(fileType, reportId, downWhere);
     }
 
-    private Map<String, Object> getFileName(String fileType, String reportId, WebsiteUserOrderDown down) {
+    private R<String> getFileName(String fileType, String reportId, WebsiteUserOrderDown down) {
         String fileName;
         if (Constants.briefReportFileType.PDF.equals(fileType)) {
             fileName = researchBriefReportService.convertFile(reportId, Constants.briefReport.BRIEFING_INFO_PDF);
         } else if (Constants.briefReportFileType.PPT.equals(fileType)) {
             fileName = researchBriefReportService.convertFile(reportId, Constants.briefReport.BRIEFING_INFO_PPT);
         } else {
-            return R.error("下载类型不存在");
+            return R.fail("下载类型不存在");
         }
         if (down != null) {
             //保存下载记录
@@ -117,29 +117,29 @@ public class WebsiteUserOrderControllerApi extends AbstractController {
 
     @WebsiteAuth
     @PostMapping(value = "payOrder")
-    public Map<String, Object> payOrder(WebsiteUserOrder websiteUserOrder) throws Exception {
+    public R<String> payOrder(WebsiteUserOrder websiteUserOrder) throws Exception {
         String userId = getUserIdByRequest();
         String reportId = websiteUserOrder.getResearchBriefReportId();
         if (StringUtils.isEmpty(reportId)) {
-            return R.error("简报为空");
+            return R.fail("简报为空");
         }
         String payMethod = websiteUserOrder.getPayMethod();
         if (StringUtils.isEmpty(payMethod)) {
-            return R.error("支付方式为空");
+            return R.fail("支付方式为空");
         }
         if (!Constants.orderPayMethod.ZFB.equals(payMethod) && !Constants.orderPayMethod.WX.equals(payMethod) && !Constants.orderPayMethod.WX_H5.equals(payMethod) && !Constants.orderPayMethod.ZFB_H5.equals(payMethod)) {
-            return R.error("支付方式值无效");
+            return R.fail("支付方式值无效");
         }
         //判断简报是否需要收费
         ResearchBriefReport researchBriefReport = researchBriefReportService.get(reportId);
         if (researchBriefReport == null) {
-            return R.error("简报为空");
+            return R.fail("简报为空");
         }
         if (Constants.enableType.NO.equals(researchBriefReport.getUseDownPay())) {
-            return R.error("简报不需要收费");
+            return R.fail("简报不需要收费");
         }
         if (!websiteUserOrder.getPayPrice().equals(researchBriefReport.getUseDownPayPrice())) {
-            return R.error("支付金额与简报收费金额不一致");
+            return R.fail("支付金额与简报收费金额不一致");
         }
         WebsiteUserOrder orderWhere = new WebsiteUserOrder();
         orderWhere.setWebsiteUserId(userId);
@@ -148,7 +148,7 @@ public class WebsiteUserOrderControllerApi extends AbstractController {
         if (CollectionUtils.isNotEmpty(orders)) {
             List<WebsiteUserOrder> filterOrders = orders.stream().filter(o -> Constants.orderPayStatus.WAIT.equals(o.getPayStatus()) || Constants.orderPayStatus.PAY_SUCCESS.equals(o.getPayStatus())).collect(Collectors.toList());
             if (CollectionUtils.isNotEmpty(filterOrders)) {
-                return R.error("简报存在支付订单,无法重复支付");
+                return R.fail("简报存在支付订单,无法重复支付");
             }
         }
         return websiteUserOrderService.saveAndPay(userId, payMethod, researchBriefReport);

+ 2 - 2
modules/core/src/main/java/com/jeesite/modules/sys/interceptor/WebsiteLoginInterceptor.java

@@ -38,7 +38,7 @@ public class WebsiteLoginInterceptor extends BaseService implements HandlerInter
         if (!StringUtils.hasText(token)) {
             response.setCharacterEncoding("UTF-8"); //设置编码格式
             response.setContentType("application/json");
-            R responseBean = R.error(-400, "访问需要令牌");
+            R responseBean = R.fail(-400, "访问需要令牌");
             response.getWriter().write(JSON.toJSONString(responseBean));
             return false;
         }
@@ -47,7 +47,7 @@ public class WebsiteLoginInterceptor extends BaseService implements HandlerInter
         if (!StringUtils.hasText(uid)) {
             response.setCharacterEncoding("UTF-8"); //设置编码格式
             response.setContentType("application/json");
-            R responseBean = R.error(-400, "访问需要令牌");
+            R responseBean = R.fail(-400, "访问需要令牌");
             response.getWriter().write(JSON.toJSONString(responseBean));
             return false;
         }

+ 76 - 56
modules/core/src/main/java/com/jeesite/modules/sys/utils/R.java

@@ -1,64 +1,84 @@
-/**
- * Copyright (c) 2016-2019 人人开源 All rights reserved.
- *
- * https://www.renren.io
- *
- * 版权所有,侵权必究!
- */
-
 package com.jeesite.modules.sys.utils;
 
-import org.apache.http.HttpStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.io.Serializable;
 
 /**
- * 返回数据
+ * 响应信息主体
  *
- * @author Mark sunlightcs@gmail.com
+ * @author Lion Li
  */
-public class R extends HashMap<String, Object> {
-	private static final long serialVersionUID = 1L;
-
-	public R() {
-		put("code", 200);
-		put("msg", "success");
-	}
-
-	public static R error() {
-		return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
-	}
-
-	public static R error(String msg) {
-		return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
-	}
-
-	public static R error(int code, String msg) {
-		R r = new R();
-		r.put("code", code);
-		r.put("msg", msg);
-		return r;
-	}
-
-	public static R ok(String msg) {
-		R r = new R();
-		r.put("msg", msg);
-		return r;
-	}
-
-	public static R ok(Map<String, Object> map) {
-		R r = new R();
-		r.putAll(map);
-		return r;
-	}
-
-	public static R ok() {
-		return new R();
-	}
-
-	public R put(String key, Object value) {
-		super.put(key, value);
-		return this;
-	}
+@Data
+@NoArgsConstructor
+@ApiModel("请求响应对象")
+public class R<T> implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 成功
+     */
+    public static final int SUCCESS = 200;
+
+    /**
+     * 失败
+     */
+    public static final int FAIL = 500;
+
+    @ApiModelProperty("消息状态码")
+    private int code;
+
+    @ApiModelProperty("消息内容")
+    private String msg;
+
+    @ApiModelProperty("数据对象")
+    private T data;
+
+    public static <T> R<T> ok() {
+        return restResult(null, SUCCESS, "操作成功");
+    }
+
+    public static <T> R<T> ok(T data) {
+        return restResult(data, SUCCESS, "操作成功");
+    }
+
+    public static <T> R<T> ok(String msg) {
+        return restResult(null, SUCCESS, msg);
+    }
+
+    public static <T> R<T> ok(String msg, T data) {
+        return restResult(data, SUCCESS, msg);
+    }
+
+    public static <T> R<T> fail() {
+        return restResult(null, FAIL, "操作失败");
+    }
+
+    public static <T> R<T> fail(String msg) {
+        return restResult(null, FAIL, msg);
+    }
+
+    public static <T> R<T> fail(T data) {
+        return restResult(data, FAIL, "操作失败");
+    }
+
+    public static <T> R<T> fail(String msg, T data) {
+        return restResult(data, FAIL, msg);
+    }
+
+    public static <T> R<T> fail(int code, String msg) {
+        return restResult(null, code, msg);
+    }
+
+    private static <T> R<T> restResult(T data, int code, String msg) {
+        R<T> r = new R<>();
+        r.setCode(code);
+        r.setData(data);
+        r.setMsg(msg);
+        return r;
+    }
+
 }

+ 6 - 7
modules/report/src/main/java/com/jeesite/modules/report/service/WebsiteUserOrderService.java

@@ -18,7 +18,6 @@ import com.jeesite.modules.report.util.AlipayUtil;
 import com.jeesite.modules.sys.utils.R;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -126,9 +125,9 @@ public class WebsiteUserOrderService extends CrudService<WebsiteUserOrderDao, We
 		super.delete(websiteUserOrder);
 	}
 
-	public Map<String, Object> saveAndPay(String userId, String payMethod, ResearchBriefReport researchBriefReport) {
+	public R<String> saveAndPay(String userId, String payMethod, ResearchBriefReport researchBriefReport) {
 		if (researchBriefReport == null) {
-			return R.error("简报为空");
+			return R.fail("简报为空");
 		}
 		WebsiteUserOrder websiteUserOrder = new WebsiteUserOrder();
 		websiteUserOrder.setOrderNumber(generateOrderNumber());
@@ -140,24 +139,24 @@ public class WebsiteUserOrderService extends CrudService<WebsiteUserOrderDao, We
 		//判断下订单号是否存在
 		WebsiteUserOrder findOrder = dao.findByOrderNumber(websiteUserOrder.getOrderNumber());
 		if (findOrder != null) {
-			return R.error("系统异常,请稍后重试");
+			return R.fail("系统异常,请稍后重试");
 		}
 		String payResult = null;
 		if (Constants.orderPayMethod.ZFB.equals(payMethod)) {
 			try {
 				payResult = alipayUtil.pay(websiteUserOrder);
 			} catch (AlipayApiException e) {
-				return R.error(e.getErrCode() + e.getErrMsg());
+				return R.fail(e.getErrCode() + e.getErrMsg());
 			}
 		} else if (Constants.orderPayMethod.ZFB_H5.equals(payMethod)) {
 			try {
 				payResult = alipayUtil.payH5(websiteUserOrder);
 			} catch (AlipayApiException e) {
-				return R.error(e.getErrCode() + e.getErrMsg());
+				return R.fail(e.getErrCode() + e.getErrMsg());
 			}
 		}
 		if (StringUtils.isEmpty(payResult)) {
-			return R.error("支付调用第三方失败");
+			return R.fail("支付调用第三方失败");
 		}
 		super.save(websiteUserOrder);
 		return R.ok(payResult);

+ 4 - 0
modules/report/src/main/java/com/jeesite/modules/report/web/ResearchBriefReportController.java

@@ -90,6 +90,10 @@ public class ResearchBriefReportController extends BaseController {
 		if (CollectionUtils.isEmpty(researchBriefReport.getRelevancies())) {
 			return renderResult(Global.FALSE, text("行业分类为空!"));
 		}
+		long parentLableCount = researchBriefReport.getRelevancies().stream().map(rb -> rb.getParentLableId()).distinct().count();
+		if ((int) parentLableCount != researchBriefReport.getRelevancies().size()) {
+			return renderResult(Global.FALSE, text("一级分类存在重复!"));
+		}
 		if (Constants.enableType.YES.equals(researchBriefReport.getUseChoiceness())) {
 			//判断是否超过两个精选
 			ResearchBriefReport where = new ResearchBriefReport();