Browse Source

nftt的管理与列表

skyfffire 2 tháng trước cách đây
mục cha
commit
aa3d0b5770

+ 197 - 1
src/main/java/modules/nftt/NfttController.java

@@ -14,6 +14,9 @@ import common.utils.http.MyRet;
 import modules.user.UserController;
 
 import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public class NfttController extends MyController {
     @Inject
@@ -126,7 +129,7 @@ public class NfttController extends MyController {
             System.out.println("Nftt Model 的内部数据 (for debug): " + nftt);
 
             if (service.save(nftt)) {
-                renderJson(MyRet.ok("创建成功").setData(service.findNfttById(nftt.getId())));
+                renderJson(MyRet.ok("创建成功").setData(service.findNfttById(nftt.getId().toString())));
             } else {
                 renderJson(MyRet.fail("创建失败,原因未知,请将此日志提供给开发者" + nftt).setData(nftt));
             }            
@@ -139,4 +142,197 @@ public class NfttController extends MyController {
             e.printStackTrace(); // 打印堆栈跟踪,便于调试
         }
     }
+
+    /**
+     * 更新NFT模板的方法,传什么更新什么,不传就不更新,id必须传
+     */
+    @Before(LoginInterceptor.class)
+    @RequiredRoleInterface({UserController.ROLE_CHECK_ADMIN, UserController.ROLE_SUPER_ADMIN})
+    @EmptyInterface({"id"})
+    public void updateByAdmin() {
+        JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
+        String id = requestBodyJson.getString("id");
+
+        Nftt nftt = service.findNfttById(id);
+        
+        if (nftt == null) {
+            renderJson(MyRet.fail("nft模板获取不合法,该id对应的nftt不存在:" + id));
+            return;
+        }
+
+        // 名字
+        String name = requestBodyJson.getString("name");
+        if (StrKit.notBlank(name)) {
+            nftt.set("name", name);
+        }
+        
+        // 价格
+        try {
+            BigDecimal price = requestBodyJson.getBigDecimal("price");
+            if (price != null) {
+                // 可以添加额外的业务校验,例如 price 必须大于 0
+                if (price.compareTo(BigDecimal.ZERO) < 0) {
+                    renderJson(MyRet.fail("售价(price)不能为负数"));
+                    return;
+                }
+
+                nftt.set("price", price);
+            }            
+        } catch (Exception e) {
+            renderJson(MyRet.fail("你传入的 price 有些问题:" + e.getMessage()).setData(requestBodyJson));
+            
+            return;
+        }
+
+        // 预售开始时间
+        try {
+            Long presaleStartTime = requestBodyJson.getLong("presale_start_time");
+            if (presaleStartTime != null) {
+                // 业务校验:时间戳必须是正数或非负数
+                if (presaleStartTime <= 0) {
+                    renderJson(MyRet.fail("预售开始时间(presale_start_time)必须是有效的Unix时间戳"));
+                    return;
+                }
+                nftt.set("presale_start_time", presaleStartTime);
+            }
+        } catch (Exception e) {
+            renderJson(MyRet.fail("你传入的 presale_start_time 有些问题:" + e.getMessage()).setData(requestBodyJson));
+
+            return;
+        }
+
+        // 预售结束时间
+        try {
+            Long presaleEndTime = requestBodyJson.getLong("presale_end_time");
+            if (presaleEndTime != null) {
+                if (presaleEndTime <= 0) {
+                    renderJson(MyRet.fail("预售结束时间(presale_end_time)必须是有效的Unix时间戳"));
+                    return;
+                }
+                nftt.set("presale_end_time", presaleEndTime);
+            }
+        } catch (Exception e) {
+            renderJson(MyRet.fail("你传入的 presale_end_time 有些问题:" + e.getMessage()).setData(requestBodyJson));
+
+            return;
+        }
+
+        // 开始购买时间
+        try {
+            Long buyingStartTime = requestBodyJson.getLong("buying_start_time");
+            if (buyingStartTime != null) {
+                if (buyingStartTime <= 0) {
+                    renderJson(MyRet.fail("开放购买时间(buying_start_time)必须是有效的Unix时间戳"));
+                    return;
+                }
+                nftt.set("buying_start_time", buyingStartTime);
+            }
+        } catch (Exception e) {
+            renderJson(MyRet.fail("你传入的 buying_start_time 有些问题:" + e.getMessage()).setData(requestBodyJson));
+
+            return;
+        }
+
+        // 已购入份数
+        try {
+            Integer purchasedQuantity = requestBodyJson.getInteger("purchased_quantity");
+            if (purchasedQuantity != null) {
+                if (purchasedQuantity <= 0) {
+                    renderJson(MyRet.fail("已购入份数(purchased_quantity)必须是大于0的整数"));
+                    return;
+                }
+                nftt.set("purchased_quantity", purchasedQuantity);
+            }
+        } catch (Exception e) {
+            renderJson(MyRet.fail("你传入的 purchased_quantity 有些问题:" + e.getMessage()).setData(requestBodyJson));
+
+            return;
+        }
+
+        // 最大份数
+        try {
+            Integer maxQuantity = requestBodyJson.getInteger("max_quantity");
+            if (maxQuantity != null) {
+                if (maxQuantity <= 0) {
+                    renderJson(MyRet.fail("最大份数(max_quantity)必须是大于0的整数"));
+                    return;
+                }
+                nftt.set("max_quantity", maxQuantity);
+            }
+        } catch (Exception e) {
+            renderJson(MyRet.fail("你传入的 max_quantity 有些问题:" + e.getMessage()).setData(requestBodyJson));
+
+            return;
+        }
+
+        // 作者修改
+        String author = requestBodyJson.getString("author");
+        if (StrKit.notBlank(author)) {
+            nftt.set("author", author);
+        }
+        
+        // 详情列表
+        JSONArray detailImageListArray = requestBodyJson.getJSONArray("detail_image_list");
+        if (detailImageListArray != null) {
+            nftt.set("detail_image_list", detailImageListArray.toJSONString());
+        }
+        
+        // 最后执行更新
+        if (nftt.update()) {
+            renderJson(MyRet.ok("更新成功").setData(nftt));
+        } else {
+            renderJson(MyRet.fail("更新失败,请将此日志复制给开发者" + nftt).setData(nftt));
+        }
+    }
+    
+    @Before(LoginInterceptor.class)
+    @RequiredRoleInterface({UserController.ROLE_CHECK_ADMIN, UserController.ROLE_SUPER_ADMIN})
+    @EmptyInterface({"page_size", "page_number"})
+    public void nftts() {
+        JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
+        
+        // 页面大小
+        String pageSizeStr = requestBodyJson.getString("page_size");
+        int pageSizeInt;
+        try {
+            pageSizeInt = Integer.parseInt(pageSizeStr);
+
+            if (pageSizeInt <= 0) {
+                renderJson(MyRet.fail("页面大小(page_size)期待是正整数,你传的是: " + pageSizeStr));
+                return;
+            }
+        } catch (Exception e) {
+            renderJson(MyRet.fail("页面大小(page_size)格式不正确: " + e.getMessage()));
+            return;
+        }
+
+        // 页码
+        String pageNumberStr = requestBodyJson.getString("page_number");
+        int pageNumberInt;
+        try {
+            pageNumberInt = Integer.parseInt(pageNumberStr);
+
+            if (pageNumberInt <= 0) {
+                renderJson(MyRet.fail("页码(page_number)期待是正整数,你传的是: " + pageNumberStr));
+                return;
+            }
+        } catch (Exception e) {
+            renderJson(MyRet.fail("页码(page_number)格式不正确: " + e.getMessage()));
+            return;
+        }
+
+        // 最终结果封装
+        List<Nftt> nftts = service.nftts(pageNumberInt, pageSizeInt);
+        Integer totalNftts = service.count();
+
+        Map<String, Object> response = new HashMap<>();
+        response.put("list", nftts);
+        response.put("total_row", nftts.toArray().length);
+        response.put("total_page", 1 + (nftts.toArray().length / pageSizeInt));
+        response.put("page_size", pageSizeInt);
+        response.put("page_number", pageNumberInt);
+        response.put("total_user_count", totalNftts);
+
+        renderJson(MyRet.ok("查询成功").setData(response));
+    }
 }

+ 24 - 1
src/main/java/modules/nftt/NfttService.java

@@ -1,7 +1,10 @@
 package modules.nftt;
 
+import com.jfinal.plugin.activerecord.Db;
 import common.model.Nftt;
 
+import java.util.List;
+
 public class NfttService {
     public String hello() {
         return "Hello Nftt";
@@ -11,7 +14,27 @@ public class NfttService {
         return nftt.save();
     }
     
-    public Nftt findNfttById(Integer id) {
+    public Nftt findNfttById(String id) {
         return Nftt.dao.findById(id);
     }
+
+    public Integer count() {
+        String sql = "SELECT COUNT(1) FROM t_nftt";
+
+        return Db.queryInt(sql);
+    }
+
+    public List<Nftt> nftts(int pageNumber, int pageSize) {
+        // limit 的第一个参数是偏移量,第二个参数是查询数量
+        // 正确的 limit 是 LIMIT offset, count
+        // offset = (pageNumber - 1) * pageSize
+        // count = pageSize
+        int offset = (pageNumber - 1) * pageSize;
+        
+        String sql = "SELECT COUNT(1) FROM t_nftt";
+        String columns = "*";
+        String baseSql = "select " + columns + " from t_nftt order by buying_start_time desc limit ?, ?";
+
+        return Nftt.dao.find(baseSql, offset, pageSize);
+    }
 }

+ 12 - 12
src/main/java/modules/user/UserController.java

@@ -211,7 +211,7 @@ public class UserController extends MyController {
 
         // 检查用户合法性
         if (user == null) {
-            renderJson(MyRet.fail("用户获取不合法,该id对应的用户不存在,不要乱传参数。"));
+            renderJson(MyRet.fail("用户获取不合法,该id对应的用户不存在,不要乱传参数。id: " + id));
             return;
         }
         
@@ -248,9 +248,9 @@ public class UserController extends MyController {
                 } else {
                     user.set("role", roleInt);
                 }
-            } catch (NumberFormatException e) {
+            } catch (Exception e) {
                 // 处理转换失败的情况,例如记录日志,或者返回错误信息给前端
-                renderJson(MyRet.fail("角色值格式不正确"));
+                renderJson(MyRet.fail("role 格式不正确" + e.getMessage()));
                 return; // 中断后续操作
             }
         }
@@ -261,8 +261,8 @@ public class UserController extends MyController {
             try {
                 long referrerIdLong = Long.parseLong(referrerIdStr); // 或者 int,根据数据库字段大小
                 user.set("referrer_id", referrerIdLong);
-            } catch (NumberFormatException e) {
-                renderJson(MyRet.fail("推荐人ID格式不正确"));
+            } catch (Exception e) {
+                renderJson(MyRet.fail("referrer_id 格式不正确: " + e.getMessage()));
                 return;
             }
         }
@@ -273,8 +273,8 @@ public class UserController extends MyController {
             try {
                 int integralInt = Integer.parseInt(integralStr);
                 user.set("integral", integralInt);
-            } catch (NumberFormatException e) {
-                renderJson(MyRet.fail("积分值格式不正确"));
+            } catch (Exception e) {
+                renderJson(MyRet.fail("integral 格式不正确: " + e.getMessage()));
                 return;
             }
         }
@@ -286,7 +286,7 @@ public class UserController extends MyController {
         if (user.update()) {
             renderJson(MyRet.ok("用户更新成功").setData(service.findUserByMobileNumber(user.getMobileNumber())));
         } else {
-            renderJson(MyRet.fail("用户更新失败"));
+            renderJson(MyRet.fail("用户更新失败,请将此日志复制给开发者" + user));
         }
     }
 
@@ -312,8 +312,8 @@ public class UserController extends MyController {
                 renderJson(MyRet.fail("页面大小(page_size)期待是正整数,你传的是: " + pageSizeStr));
                 return;
             }
-        } catch (NumberFormatException e) {
-            renderJson(MyRet.fail("页面大小(page_size)格式不正确: " + pageSizeStr));
+        } catch (Exception e) {
+            renderJson(MyRet.fail("页面大小(page_size)格式不正确: " + e.getMessage()));
             return;
         }
 
@@ -327,8 +327,8 @@ public class UserController extends MyController {
                 renderJson(MyRet.fail("页码(page_number)期待是正整数,你传的是: " + pageNumberStr));
                 return;
             }
-        } catch (NumberFormatException e) {
-            renderJson(MyRet.fail("页码(page_number)格式不正确: " + pageNumberStr));
+        } catch (Exception e) {
+            renderJson(MyRet.fail("页码(page_number)格式不正确: " + e.getMessage()));
             return;
         }
 

+ 19 - 5
src/test/rest/NfttControllerTest.http

@@ -19,20 +19,34 @@ dl-token: {{dl_token_var}}
   ]
 }
 
-### 【超级管理员】统计已注册用户数量,用于分页
-POST {{ baseUrl }}/nftt/update
+### 【审核管理员、超级管理员】修改nftt,传什么字段更新什么,id必传
+POST {{ baseUrl }}/nftt/updateByAdmin
 Content-Type: application/json
 dl-token: {{dl_token_var}}
 
-### 【超级管理员】获取用户列表,keywords当前版本支持手机号、id、昵称的模糊查询
+{
+  "id": 1,
+  "name": "张三丰假迹",
+  "author": "张四丰",
+  "presale_start_time": "a1756797150932",
+  "presale_end_time": "1756797150932",
+  "buying_start_time": "1756797150932",
+  "purchased_quantity": 10,
+  "max_quantity": 200,
+  "detail_image_list": [
+    "https://jfinal.com/upload/img/share/0/61566_20201109163639.jpg",
+    "https://jfinal.com/upload/img/share/0/61566_20201109163400.jpg"
+  ]
+}
+
+### 【超级管理员】获取nftts列表,当前版本没有搜索条件
 POST {{ baseUrl }}/nftt/nftts
 Content-Type: application/json
 dl-token: {{dl_token_var}}
 
 {
   "page_number": 1,
-  "page_size": 100,
-  "keywords": "177"
+  "page_size": 100
 }
 ### 返回值解释
 ### list 分页结果的实际列表数据 

+ 2 - 2
src/test/rest/UploadControllerTest.http

@@ -4,8 +4,8 @@ Content-Type: multipart/form-data; boundary=WebAppBoundary
 dl-token: {{dl_token_var}}
 
 --WebAppBoundary
-Content-Disposition: form-data; name="file"; filename="PixPin_2025-09-02_15-45-17.png"
+Content-Disposition: form-data; name="file"; filename="PixPin_2025-09-03_14-30-46.png"
  
-< D:/PixPin_2025-09-02_15-45-17.png
+< D:/PixPin_2025-09-03_14-30-46.png
 
 --WebAppBoundary--