zhangyan 3 månader sedan
förälder
incheckning
d893550e52

+ 0 - 0
card/newCards/nanning1/AGENTS.md → card/newCards/nanning/AGENTS.md


+ 0 - 0
card/newCards/nanning1/API.md → card/newCards/nanning/API.md


+ 37 - 31
card/newCards/nanning1/API_SERVER.md → card/newCards/nanning/API_SERVER.md

@@ -47,8 +47,8 @@
 #### 1. 卡片与配置
 
 *   **1.1 卡片基本信息查询**
-    *   **API 方法**: `API.getCardBase(ecId, pageName)`
-    *   **参数**: `ecId` (int), `pageName` (string)
+    *   **API 方法**: `API.getCardBase(ecId)`
+    *   **参数**: `ecId` (int)
     *   **返回数据**:
         ```json
         {
@@ -144,8 +144,8 @@
         ```
 
 *   **2.5 线上赛报名页面信息详情**
-    *   **API 方法**: `API.getOnlineMcSignUpDetail(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getOnlineMcSignUpDetail(ecId, mcId)`
+    *   **参数**: `ecId` (int), `mcId` (int)
     *   **返回数据**:
         ```json
         {
@@ -160,8 +160,8 @@
 
 
 *   **2.6 卡片对应线上赛多个活动查询 (用户赛事结果详情)**
-    *   **API 方法**: `API.getMatchRsDetail(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getMatchRsDetail(ecId, ocaId)`
+    *   **参数**: `ecId` (int), `ocaId` (int)
     *   **返回数据**: (Array) - 返回用户在卡片关联的各个赛事中的具体成绩详情
         ```json
         [
@@ -199,8 +199,8 @@
 #### 3. 排名与成就
 
 *   **3.1 排名查询**
-    *   **API 方法**: `API.getRankDetail(mcIdListStr, mcType, dispArrStr)`
-    *   **参数**: `mcIdListStr` (string), `mcType` (int), `dispArrStr` (string)
+    *   **API 方法**: `API.getRankDetail(mcIdListStr, mcType, ocaId, dispArrStr)`
+    *   **参数**: `mcIdListStr` (string), `mcType` (int), `ocaId` (int), `dispArrStr` (string)
     *   **返回数据**:
         ```json
         {
@@ -218,7 +218,7 @@
           ```
 
 *   **3.1.1 月挑战排名查询 (月榜)**
-    *   **API 方法**: `API.getMonthRankDetail({ year, month, dispArrStr })`
+    *   **API 方法**: `API.getMonthRankDetail(year, month, dispArrStr)`
     *   **参数**:
         *   `year` (int): 年份,如 2025
         *   `month` (int): 月份,1-12
@@ -287,8 +287,8 @@
         ```
 
 *   **3.5 赛事总成绩统计查询**
-    *   **API 方法**: `API.getCompStatistic(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getCompStatistic(mcId)`
+    *   **参数**: `mcId` (int)
     *   **返回数据**:
         ```json
         {
@@ -350,8 +350,8 @@
     *   **返回数据**: `{}` (成功)
 
 *   **4.4 玩家兑换记录查询**
-    *   **API 方法**: `API.getExchangeList(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getExchangeList()`
+    *   **参数**: 
     *   **返回数据**: (Array)
         ```json
         [
@@ -365,8 +365,8 @@
         ```
 
 *   **4.5 玩家兑换详情查询**
-    *   **API 方法**: `API.getExchangeDetail(ecId, exchangeId)`
-    *   **参数**: `ecId` (int), `exchangeId` (int)
+    *   **API 方法**: `API.getExchangeDetail(oarId)`
+    *   **参数**: `oarId` (int)
     *   **返回数据**:
         ```json
         {
@@ -471,8 +471,8 @@
 #### 7. 电子证书
 
 *   **7.1 查询电子证书样式**
-    *   **API 方法**: `API.getCertStyle(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getCertStyle(certStyleType)`
+    *   **参数**: `certStyleType` (int)
     *   **返回数据**:
         ```json
         {
@@ -487,8 +487,8 @@
         ```
 
 *   **7.2 查询电子证书成就对应用户基本信息**
-    *   **API 方法**: `API.getUserBaseInCertificate(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getUserBaseInCertificate(oarId)`
+    *   **参数**: `oarId` (int)
     *   **返回数据**:
         ```json
         {
@@ -499,9 +499,10 @@
         ```
 
 *   **7.3 根据成就信息确认生成电子证书**
-    *   **API 方法**: `API.createCertificate(data)`
+    *   **API 方法**: `API.createCertificate(nickName, oarId)`
     *   **参数**:
-        *   `data` (object): 包含生成证书所需的所有参数,通常包括 `ecId`, `certStyleId`, `userName`, `activityName`, `completionTime` 等。具体结构请参考后端文档或 `api.js` 源码中的请求示例。
+        *   `nickName` (string): 用户昵称
+        *   `oarId` (int): 订单活动记录ID
     *   **返回数据**:
         ```json
         {
@@ -522,8 +523,8 @@
         }
         ```
 *   **8.2 卡片对应地图列表详情查询**
-    *   **API 方法**: `API.getMapList(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getMapList(mcId)`
+    *   **参数**: `mcId` (int)
     *   **返回数据**: (Array)
         ```json
         [
@@ -539,18 +540,23 @@
         ]
         ```
 
-*   **8.3 卡片URI查询**
-    *   **API 方法**: `API.getCardUri(ecId)`
-    *   **参数**: `ecId` (int)
-    *   **返回数据**: `{}` (待定)
+*   **8.3 卡片URL查询**
+    *   **API 方法**: `API.getCardUrl(actId, matchType)`
+    *   **参数**: `actId` (int), `matchType` (int)
+    *   **返回数据**:
+        ```json
+        {
+            "url": "http://example.com/card/detail.html?id=123" // 卡片对应的H5页面URL
+        }
+        ```
 
 *   **8.4 赛事完赛信息查询**
-    *   **API 方法**: `API.getMatchFinishInfo(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getMatchFinishInfo(actId, matchType)`
+    *   **参数**: `actId` (int), `matchType` (int)
     *   **返回数据**: `{}` (待定)
 
 *   **8.5 Redis 重建 (管理接口)**
-    *   **API 方法**: `API.redisRebuild(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.redisRebuild(compId)`
+    *   **参数**: `compId` (int)
     *   **返回数据**: `{}` (待定)
 

+ 0 - 0
card/newCards/nanning1/GUIDE.md → card/newCards/nanning/GUIDE.md


+ 1 - 1
card/newCards/nanning1/PROJECT_INSIGHTS.md → card/newCards/nanning/PROJECT_INSIGHTS.md

@@ -8,7 +8,7 @@
 *   **核心功能**: 为 ColorMapRun App 提供嵌入式的 H5 卡片页面,用于展示活动详情、排行榜、报名、游戏互动等功能。
 *   **技术栈**:
     *   **前端框架**: Vue.js (UniApp 风格,但在 SDK 模式下使用了原生 HTML/JS/CSS)。
-    *   **构建环境**: 似乎是基于 UniApp 的工程结构,但在 `sdk/` 目录下维护了一套独立的、无框架依赖的原生 H5 页面,用于嵌入 App。
+    *   **构建环境**: 老版本是基于 UniApp 的工程结构,但在 `sdk/` 目录下维护了一套独立的、无框架依赖的原生 H5 页面,用于嵌入 App。
     *   **通信协议**: 自定义 JSBridge (`bridge.js`) 与 Native App (Flutter) 交互。
     *   **样式**: CSS3, Flexbox, FontAwesome (部分页面)。
 

+ 48 - 25
card/newCards/nanning1/api.js → card/newCards/nanning/api.js

@@ -1,3 +1,9 @@
+/**
+ * 请任何自动化工具每次更新本文档,要再下面的版本号自动加1,并更新日期
+ * 
+ * 版本号:1
+ * 日期:2025-12-4 16:14:00
+*/
 (function (window) {
     'use strict';
 
@@ -60,6 +66,7 @@
         'CardDetailQuery': {
             mcId: 101,
             mcName: '[Mock]线上马拉松',
+            nickName: '[Mock]用户昵称', // Added as per user request
             mcType: 1,
             beginSecond: Date.now() / 1000 - 86400 * 2,
             endSecond: Date.now() / 1000 + 86400 * 5,
@@ -68,10 +75,26 @@
             coiName: '个人组',
             ocaId: 201 // Mocked ocaId
         },
-        'MatchRsDetailQuery': [
-            { id: 1, name: '[Mock]活动1', status: 1 },
-            { id: 2, name: '[Mock]活动2', status: 0 }
-        ],
+        'MatchRsDetailQuery': { 
+            id: 1, 
+            name: '[Mock]活动1', 
+            status: 1, 
+            totalSysPoint: 100,
+            mcType: 1,
+            mcId: 101,
+            mcName: '[Mock]线上马拉松',
+            beginSecond: Date.now() / 1000 - 86400 * 2,
+            endSecond: Date.now() / 1000 + 86400 * 5,
+            nickName: '[Mock]用户昵称',
+            totalNum: 10,
+            totalDistanct: 5000,
+            totalDistanctRankNum: 5,
+            totalCp: 20,
+            totalCpRankNum: 3,
+            totalSysPointRankNum: 10,
+            fastPace: 300,
+            fastPaceRankNum: 8
+        },
         'CardRankDetailQuery': {
             totalRankRs: [
                 { nickName: 'Mock张三', score: 10000, headUrl: 'https://picsum.photos/40/40?random=1', rankNum: 1 },
@@ -192,9 +215,9 @@
                 { orderNum: 2, isComplete: 0, showName: '未完2', relationType: 1, ocaId: 11, longitude: 117.2, latitude: 36.7, popupImg: 'https://picsum.photos/100/100?random=20' }
             ]
         },
-        'CardUriQuery': {}, // 暂无 Mock 结构
-        'MatchFinishInfoQuery': {}, // 暂无 Mock 结构
-        'RedisRebuild': {} // 暂无 Mock 结构
+        'CardUrlQuery': { url: 'https://mock-uri.colormaprun.com/card/nanning1/index.html'}, // 暂无 Mock 结构  
+        'MatchFininshInfoQuery': {}, // 暂无 Mock 结构
+        'RedisRebulid': {} // 暂无 Mock 结构
     };
 
     var API = {
@@ -263,16 +286,16 @@
         // ==============================
 
         // 1. 卡片基本信息查询
-        getCardBase: function(ecId, pageName) { return this.request('CardBaseQuery', { ecId: ecId, pageName: pageName }); },
+        getCardBase: function(ecId) { return this.request('CardBaseQuery', { ecId: ecId }); },
 
         // 2. 卡片对应活动或赛事详情查询
         getCardDetail: function(ecId) { return this.request('CardDetailQuery', { ecId: ecId }); },
 
         // 3. 卡片对应线上赛多个活动查询
-        getMatchRsDetail: function(ecId) { return this.request('MatchRsDetailQuery', { ecId: ecId }); },
+        getMatchRsDetail: function(ecId, ocaId) { return this.request('MatchRsDetailQuery', { ecId: ecId, ocaId: ocaId }); },
 
         // 4. 排名查询
-        getRankDetail: function(mcIdListStr, mcType, dispArrStr) { return this.request('CardRankDetailQuery', { mcIdListStr: mcIdListStr, mcType: mcType, dispArrStr: dispArrStr }); },
+        getRankDetail: function(mcIdListStr, mcType, ocaId, dispArrStr) { return this.request('CardRankDetailQuery', { mcIdListStr: mcIdListStr, mcType: mcType, ocaId: ocaId, dispArrStr: dispArrStr }); },
 
         // 5. 卡片用户当前排名查询
         getUserCurrentRank: function(ecId) { return this.request('UserCurrentRankNumQuery', { ecId: ecId }); },
@@ -284,7 +307,7 @@
         isNewUserInCardComp: function(ecId) { return this.request('IsNewUserInCardComp', { ecId: ecId }); },
 
         // 8. 线上赛报名页面信息详情
-        getOnlineMcSignUpDetail: function(ecId) { return this.request('OnlineMcSignUpDetail', { ecId: ecId }); },
+        getOnlineMcSignUpDetail: function(ecId, mcId) { return this.request('OnlineMcSignUpDetail', { ecId: ecId, mcId: mcId }); },
 
         // 9. 线上赛报名(重新分组)
         signUpOnline: function(mcId, coiId, selectTeam, nickName) { 
@@ -295,7 +318,7 @@
         isAllowMcSignUp: function(ecId) { return this.request('IsAllowMcSignUp', { ecId: ecId }); },
 
         // 11. 玩家当前月挑战记录查询
-        getCurrentMonthlyChallenge: function() { return this.request('CurrentMonthlyChallengeQuery', {}); },
+        getCurrentMonthlyChallenge: function(year, month) { return this.request('CurrentMonthlyChallengeQuery', {year: year, month: month}); },
 
         // 12. 卡片配置信息查询
         getCardConfig: function(ecId, pageName) { return this.request('CardConfigQuery', { ecId: ecId, pageName: pageName }); },
@@ -307,16 +330,16 @@
         getMonthlyChallenge: function() { return this.request('MonthlyChallengeQuery', {}); },
 
         // 15. 月挑战排名查询
-        getMonthRankDetail: function() { return this.request('MonthRankDetailQuery', {}); },
+        getMonthRankDetail: function(year, month, dispArrStr) { return this.request('MonthRankDetailQuery', {year: year, month: month, dispArrStr: dispArrStr}); },
 
         // 16. 玩家活动成就查询
         getAchievement: function() { return this.request('AchievementQuery', {}); },
 
         // 17. 玩家兑换记录查询
-        getExchangeList: function(ecId) { return this.request('ExchangeListQuery', { ecId: ecId }); },
+        getExchangeList: function() { return this.request('ExchangeListQuery', {}); },
 
         // 18. 玩家兑换详情查询
-        getExchangeDetail: function(ecId, exchangeId) { return this.request('ExchangeDetailQuery', { ecId: ecId, exchangeId: exchangeId }); },
+        getExchangeDetail: function(oarId) { return this.request('ExchangeDetailQuery', { oarId: oarId}); },
 
         // 19. 未读消息列表查询
         getUnReadMessages: function(relationId, relationType) { return this.request('UnReadMessageQuery', { relationId: relationId, relationType: relationType || 2 }); },
@@ -325,22 +348,22 @@
         readMessage: function(mqIdListStr) { return this.request('ReadMessage', { mqIdListStr: mqIdListStr }); },
 
         // 21. 卡片对应地图列表详情查询
-        getMapList: function(ecId) { return this.request('MapListQuery', { ecId: ecId }); },
+        getMapList: function(mcId) { return this.request('MapListQuery', { mcId: mcId }); },
 
         // 22. 赛事总成绩统计查询
-        getCompStatistic: function(ecId) { return this.request('CompStatisticQuery', { ecId: ecId }); },
+        getCompStatistic: function(mcId) { return this.request('CompStatisticQuery', { mcId: mcId }); },
 
         // 23. 警告列表查询
         getWarnMessage: function(ecId) { return this.request('WarnMessageQuery', { ecId: ecId }); },
 
         // 24. 查询电子证书样式
-        getCertStyle: function(ecId) { return this.request('CertStyleQuery', { ecId: ecId }); },
+        getCertStyle: function(certStyleType) { return this.request('CertStyleQuery', { certStyleType: certStyleType }); },
 
         // 25. 查询电子证书成就对应用户基本信息
-        getUserBaseInCertificate: function(ecId) { return this.request('UserBaseQueryInCertificate', { ecId: ecId }); },
+        getUserBaseInCertificate: function(oarId) { return this.request('UserBaseQueryInCertificate', { oarId: oarId }); },
 
         // 26. 根据成就信息确认生成电子证书
-        createCertificate: function(data) { return this.request('CertificateCreateByUserAi', data); },
+        createCertificate: function(nickName,oarId) { return this.request('CertificateCreateByUserAi', {nickName: nickName, oarId: oarId}); },
 
         // 27. 卡片内可用积分查询
         getScore: function(ecId) { return this.request('OnlineScoreQuery', { ecId: ecId }); },
@@ -349,10 +372,10 @@
         getGoodsList: function(ecId) { return this.request('CanExchangeGoodsList', { ecId: ecId }); },
 
         // 29. 积分可兑换商品详情
-        getGoodsDetail: function(goodsId) { return this.request('CanExchangeGoodsDetail', { goodsId: goodsId }); },
+        getGoodsDetail: function(ecId, goodsId) { return this.request('CanExchangeGoodsDetail', {ecid: ecId, goodsId: goodsId }); },
 
         // 30. 积分兑换商品
-        exchangeGoods: function(ecId, goodsId) { return this.request('ScoreExchangeGoods', { ecId: ecId, goodsId: goodsId }); },
+        exchangeGoods: function(ecId, goodsId, exchNum) { return this.request('ScoreExchangeGoods', { ecId: ecId, goodsId: goodsId, exchNum: exchNum }); },
 
         // 31. 用户基本信息查询
         getUserInfo: function() { return this.request('UserBasicInformationQuery', {}); },
@@ -361,13 +384,13 @@
         getGrids: function(ecId) { return this.request('GridsQuery', { ecId: ecId }); },
 
         // 33. 卡片URI查询
-        getCardUri: function(ecId) { return this.request('CardUriQuery', { ecId: ecId }); },
+        getCardUrl: function(actId, matchType) { return this.request('CardUrlQuery', { actId: actId, matchType: matchType }); },
 
         // 34. 赛事完赛信息查询
-        getMatchFinishInfo: function(ecId) { return this.request('MatchFinishInfoQuery', { ecId: ecId }); },
+        getMatchFinishInfo: function(actId, matchType) { return this.request('MatchFininshInfoQuery', { actId, matchType }); },
 
         // 35. Redis 重建 (管理接口)
-        redisRebuild: function(ecId) { return this.request('RedisRebuild', { ecId: ecId }); }
+        redisRebuild: function(compId) { return this.request('RedisRebulid', { compId: compId }); }
     };
 
     window.API = API;

+ 0 - 0
card/newCards/nanning1/bd.png → card/newCards/nanning/bd.png


+ 0 - 0
card/newCards/nanning1/bridge.js → card/newCards/nanning/bridge.js


+ 0 - 0
card/newCards/nanning1/css/all.min.css → card/newCards/nanning/css/all.min.css


+ 0 - 0
card/newCards/nanning1/gd.png → card/newCards/nanning/gd.png


+ 0 - 0
card/newCards/nanning1/index.html → card/newCards/nanning/index.html


+ 0 - 0
card/newCards/nanning1/js/multiavatar.min.js → card/newCards/nanning/js/multiavatar.min.js


+ 0 - 0
card/newCards/nanning1/mock_flutter.js → card/newCards/nanning/mock_flutter.js


+ 164 - 4
card/newCards/nanning1/ranklist.html → card/newCards/nanning/ranklist.html

@@ -61,8 +61,8 @@
             <div class="bg-black/40 backdrop-blur-md rounded-full py-1.5 px-3 flex items-center gap-2 overflow-hidden border border-white/10 shadow-lg">
                 <i class="fas fa-bullhorn text-yellow-300 text-xs shrink-0"></i>
                 <div class="flex-1 overflow-hidden relative h-4">
-                    <div class="absolute whitespace-nowrap text-[10px] text-white animate-marquee leading-4">
-                        当前总题目: 1500道 | 总里程: 5024km | 总打点数: 8900个 | 距离比赛结束还有 1天 5小时 | 加油!冲鸭!
+                    <div id="marqueeTextContainer" class="absolute whitespace-nowrap text-[10px] text-white animate-marquee leading-4">
+                        总里程: 5024km | 总打点数: 8900个 | 答题正确率: 1500道 | 距离比赛结束还有 1天 5小时 | 加油!冲鸭!
                     </div>
                 </div>
             </div>
@@ -91,7 +91,7 @@
                 </div>
             </div>
             <div class="text-center pl-4 border-l border-gray-100">
-                <div class="text-2xl font-black text-primary font-mono leading-none">120</div>
+                <div id="currentScoreDisplay" class="text-2xl font-black text-primary font-mono leading-none">120</div>
                 <div class="text-[10px] text-gray-400 mt-1">当前积分</div>
             </div>
         </div>
@@ -254,6 +254,8 @@
         </div>
     </div>
 
+    <script src="./bridge.js"></script>
+    <script src="./api.js"></script>
     <script>
         // --- 核心状态 ---
         let currentTab = 'team';
@@ -491,7 +493,165 @@
             });
         }
 
-        window.onload = renderLeaderboard;
+        window.onload = function() {
+            renderLeaderboard();
+
+            // Helper function to get URL query parameters (local to this script)
+            function getQueryParam(name) {
+                const params = new URLSearchParams(window.location.search);
+                return params.get(name);
+            }
+
+            // Helper function to format remaining time (seconds timestamp)
+            function formatRemainingTime(endSecond) {
+                if (endSecond === undefined) return 'N/A';
+
+                const now = Date.now() / 1000; // Current Unix timestamp in seconds
+                const diffSeconds = endSecond - now;
+
+                if (diffSeconds <= 0) {
+                    return '已结束';
+                }
+
+                const days = Math.floor(diffSeconds / (3600 * 24));
+                const hours = Math.floor((diffSeconds % (3600 * 24)) / 3600);
+                
+                let timeStr = '';
+                if (days > 0) {
+                    timeStr += `${days}天 `;
+                }
+                timeStr += `${hours}小时`;
+                
+                return timeStr.trim();
+            }
+
+            // Get external parameters
+            const token = getQueryParam('token');
+            const ecId = getQueryParam('id'); // Use 'id' from URL as ecId
+
+            // State for Marquee Data
+            let marqueeData = {
+                totalCp: 'N/A',
+                totalDistanceKm: 'N/A',
+                totalAnswerNum: 'N/A',
+                remainingTimeStr: 'N/A'
+            };
+
+            function updateMarquee() {
+                const marqueeTextContainer = document.getElementById('marqueeTextContainer');
+                if (marqueeTextContainer) {
+                    marqueeTextContainer.innerText =
+                        `总打点数: ${marqueeData.totalCp}个 | 总里程: ${marqueeData.totalDistanceKm}km | 答题数: ${marqueeData.totalAnswerNum}道 | 距离比赛结束还有 ${marqueeData.remainingTimeStr} | 加油!冲鸭!`;
+                }
+            }
+
+            // Set token if available
+            if (token && window.API && window.API.setToken) {
+                window.API.setToken(token);
+                console.log('API Token set:', token);
+            } else {
+                console.warn('Token not found in URL or API.setToken not available.');
+            }
+
+            // Call API with ecId and ocaId (using a dummy ocaId for now)
+            if (window.API && ecId) {
+                // Assuming ocaId is also passed, or a default value for demonstration
+                // For demonstration, using a static ocaId=1. In a real scenario, this might also come from URL or other logic.
+                // const ocaId = 1; // Not needed for getCardDetail
+
+                API.getCardDetail(ecId).then(res => {
+                    console.log('API Response for ecId=' + ecId + ' (getCardDetail):', res);
+
+                    // Update nickname and team from API response
+                    const profileNameElement = document.getElementById('profileName');
+                    const profileTeamElement = document.getElementById('profileTeam');
+
+                    if (profileNameElement && res.nickName) { // Use nickName as per user clarification
+                        profileNameElement.innerText = res.nickName;
+                    }
+                    if (profileTeamElement && res.coiName) {
+                        profileTeamElement.innerText = res.coiName;
+                    }
+
+                    // Store mcId and ocaId in local storage, differentiated by ecId
+                    if (res.mcId !== undefined && res.ocaId !== undefined && ecId) {
+                        const storageKey = `cardData_${ecId}`;
+                        const dataToStore = {
+                            mcId: res.mcId,
+                            ocaId: res.ocaId
+                        };
+                        try {
+                            localStorage.setItem(storageKey, JSON.stringify(dataToStore));
+                            console.log(`Stored mcId and ocaId for ecId ${ecId}:`, dataToStore);
+                        } catch (e) {
+                            console.error('Failed to save to localStorage:', e);
+                        }
+                    } else {
+                        console.warn('mcId, ocaId, or ecId missing from API response or URL. Not storing to localStorage.');
+                    }
+
+                    // Call API.getMatchRsDetail if mcId and ocaId are available
+                    if (res.mcId !== undefined && res.ocaId !== undefined) {
+                         
+                        API.getMatchRsDetail(ecId, res.ocaId).then(matchRes => {
+                             console.log('API Response for ecId=' + ecId + ', ocaId=' + res.ocaId + ' (getMatchRsDetail):', matchRes);
+
+                            const currentScoreDisplayElement = document.getElementById('currentScoreDisplay');
+                            if (currentScoreDisplayElement && matchRes && matchRes.totalSysPoint !== undefined) {
+                                currentScoreDisplayElement.innerText = matchRes.totalSysPoint;
+                                console.log('Updated current score with totalSysPoint:', matchRes.totalSysPoint);
+                            } else {
+                                console.warn('totalSysPoint not found in getMatchRsDetail response or element not found.');
+                            }
+
+                            // Update endSecond for marquee
+                            if (matchRes.endSecond !== undefined) {
+                                marqueeData.remainingTimeStr = formatRemainingTime(matchRes.endSecond);
+                                updateMarquee();
+                            }
+
+                        }).catch(matchErr => {
+                             console.error('API Error (getMatchRsDetail):', matchErr);
+                        });
+
+                        // New: Call API.getCompStatistic
+                        if (res.mcId !== undefined) { // Check if mcId is available from getCardDetail response
+                            API.getCompStatistic(res.mcId).then(compStatsRes => {
+                                console.log('API Response for mcId=' + res.mcId + ' (getCompStatistic):', compStatsRes);
+
+                                if (compStatsRes) {
+                                    if (compStatsRes.totalDistance !== undefined) {
+                                        marqueeData.totalDistanceKm = Math.round(compStatsRes.totalDistance / 1000);
+                                    }
+                                    if (compStatsRes.totalAnswerNum !== undefined) {
+                                        marqueeData.totalAnswerNum = compStatsRes.totalAnswerNum;
+                                    }
+                                    if (compStatsRes.totalCp !== undefined) {
+                                        marqueeData.totalCp = compStatsRes.totalCp;
+                                    }
+                                    
+                                    updateMarquee();
+                                    console.log('Updated marquee text with CompStatistic data.');
+                                } else {
+                                    console.warn('CompStatistic data not found.');
+                                }
+                            }).catch(compStatsErr => {
+                                console.error('API Error (getCompStatistic):', compStatsErr);
+                            });
+                        } else {
+                            console.warn('mcId not available for API.getCompStatistic call.');
+                        }
+                    }
+
+                }).catch(err => {
+                    console.error('API Error:', err);
+                });
+            } else if (!ecId) {
+                console.warn('URL parameter "id" (ecId) not found. API call skipped.');
+            } else {
+                console.warn('API not loaded. API call skipped.');
+            }
+        };
     </script>
 </body>
 </html>

+ 0 - 0
card/newCards/nanning1/signup.html → card/newCards/nanning/signup.html


+ 0 - 0
card/newCards/nanning1/webfonts/fa-brands-400.woff2 → card/newCards/nanning/webfonts/fa-brands-400.woff2


+ 0 - 0
card/newCards/nanning1/webfonts/fa-regular-400.woff2 → card/newCards/nanning/webfonts/fa-regular-400.woff2


+ 0 - 0
card/newCards/nanning1/webfonts/fa-solid-900.woff2 → card/newCards/nanning/webfonts/fa-solid-900.woff2


+ 37 - 31
card/sdk/API_SERVER.md

@@ -47,8 +47,8 @@
 #### 1. 卡片与配置
 
 *   **1.1 卡片基本信息查询**
-    *   **API 方法**: `API.getCardBase(ecId, pageName)`
-    *   **参数**: `ecId` (int), `pageName` (string)
+    *   **API 方法**: `API.getCardBase(ecId)`
+    *   **参数**: `ecId` (int)
     *   **返回数据**:
         ```json
         {
@@ -144,8 +144,8 @@
         ```
 
 *   **2.5 线上赛报名页面信息详情**
-    *   **API 方法**: `API.getOnlineMcSignUpDetail(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getOnlineMcSignUpDetail(ecId, mcId)`
+    *   **参数**: `ecId` (int), `mcId` (int)
     *   **返回数据**:
         ```json
         {
@@ -160,8 +160,8 @@
 
 
 *   **2.6 卡片对应线上赛多个活动查询 (用户赛事结果详情)**
-    *   **API 方法**: `API.getMatchRsDetail(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getMatchRsDetail(ecId, ocaId)`
+    *   **参数**: `ecId` (int), `ocaId` (int)
     *   **返回数据**: (Array) - 返回用户在卡片关联的各个赛事中的具体成绩详情
         ```json
         [
@@ -199,8 +199,8 @@
 #### 3. 排名与成就
 
 *   **3.1 排名查询**
-    *   **API 方法**: `API.getRankDetail(mcIdListStr, mcType, dispArrStr)`
-    *   **参数**: `mcIdListStr` (string), `mcType` (int), `dispArrStr` (string)
+    *   **API 方法**: `API.getRankDetail(mcIdListStr, mcType, ocaId, dispArrStr)`
+    *   **参数**: `mcIdListStr` (string), `mcType` (int), `ocaId` (int), `dispArrStr` (string)
     *   **返回数据**:
         ```json
         {
@@ -218,7 +218,7 @@
           ```
 
 *   **3.1.1 月挑战排名查询 (月榜)**
-    *   **API 方法**: `API.getMonthRankDetail({ year, month, dispArrStr })`
+    *   **API 方法**: `API.getMonthRankDetail(year, month, dispArrStr)`
     *   **参数**:
         *   `year` (int): 年份,如 2025
         *   `month` (int): 月份,1-12
@@ -287,8 +287,8 @@
         ```
 
 *   **3.5 赛事总成绩统计查询**
-    *   **API 方法**: `API.getCompStatistic(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getCompStatistic(mcId)`
+    *   **参数**: `mcId` (int)
     *   **返回数据**:
         ```json
         {
@@ -350,8 +350,8 @@
     *   **返回数据**: `{}` (成功)
 
 *   **4.4 玩家兑换记录查询**
-    *   **API 方法**: `API.getExchangeList(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getExchangeList()`
+    *   **参数**: 
     *   **返回数据**: (Array)
         ```json
         [
@@ -365,8 +365,8 @@
         ```
 
 *   **4.5 玩家兑换详情查询**
-    *   **API 方法**: `API.getExchangeDetail(ecId, exchangeId)`
-    *   **参数**: `ecId` (int), `exchangeId` (int)
+    *   **API 方法**: `API.getExchangeDetail(oarId)`
+    *   **参数**: `oarId` (int)
     *   **返回数据**:
         ```json
         {
@@ -471,8 +471,8 @@
 #### 7. 电子证书
 
 *   **7.1 查询电子证书样式**
-    *   **API 方法**: `API.getCertStyle(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getCertStyle(certStyleType)`
+    *   **参数**: `certStyleType` (int)
     *   **返回数据**:
         ```json
         {
@@ -487,8 +487,8 @@
         ```
 
 *   **7.2 查询电子证书成就对应用户基本信息**
-    *   **API 方法**: `API.getUserBaseInCertificate(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getUserBaseInCertificate(oarId)`
+    *   **参数**: `oarId` (int)
     *   **返回数据**:
         ```json
         {
@@ -499,9 +499,10 @@
         ```
 
 *   **7.3 根据成就信息确认生成电子证书**
-    *   **API 方法**: `API.createCertificate(data)`
+    *   **API 方法**: `API.createCertificate(nickName, oarId)`
     *   **参数**:
-        *   `data` (object): 包含生成证书所需的所有参数,通常包括 `ecId`, `certStyleId`, `userName`, `activityName`, `completionTime` 等。具体结构请参考后端文档或 `api.js` 源码中的请求示例。
+        *   `nickName` (string): 用户昵称
+        *   `oarId` (int): 订单活动记录ID
     *   **返回数据**:
         ```json
         {
@@ -522,8 +523,8 @@
         }
         ```
 *   **8.2 卡片对应地图列表详情查询**
-    *   **API 方法**: `API.getMapList(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getMapList(mcId)`
+    *   **参数**: `mcId` (int)
     *   **返回数据**: (Array)
         ```json
         [
@@ -539,18 +540,23 @@
         ]
         ```
 
-*   **8.3 卡片URI查询**
-    *   **API 方法**: `API.getCardUri(ecId)`
-    *   **参数**: `ecId` (int)
-    *   **返回数据**: `{}` (待定)
+*   **8.3 卡片URL查询**
+    *   **API 方法**: `API.getCardUrl(actId, matchType)`
+    *   **参数**: `actId` (int), `matchType` (int)
+    *   **返回数据**:
+        ```json
+        {
+            "url": "http://example.com/card/detail.html?id=123" // 卡片对应的H5页面URL
+        }
+        ```
 
 *   **8.4 赛事完赛信息查询**
-    *   **API 方法**: `API.getMatchFinishInfo(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.getMatchFinishInfo(actId, matchType)`
+    *   **参数**: `actId` (int), `matchType` (int)
     *   **返回数据**: `{}` (待定)
 
 *   **8.5 Redis 重建 (管理接口)**
-    *   **API 方法**: `API.redisRebuild(ecId)`
-    *   **参数**: `ecId` (int)
+    *   **API 方法**: `API.redisRebuild(compId)`
+    *   **参数**: `compId` (int)
     *   **返回数据**: `{}` (待定)
 

+ 49 - 26
card/sdk/api.js

@@ -1,3 +1,9 @@
+/**
+ * 请任何自动化工具每次更新本文档,要再下面的版本号自动加1,并更新日期
+ * 
+ * 版本号:1
+ * 日期:2025-12-4 16:14:00
+*/
 (function (window) {
     'use strict';
 
@@ -60,6 +66,7 @@
         'CardDetailQuery': {
             mcId: 101,
             mcName: '[Mock]线上马拉松',
+            nickName: '[Mock]用户昵称', // Added as per user request
             mcType: 1,
             beginSecond: Date.now() / 1000 - 86400 * 2,
             endSecond: Date.now() / 1000 + 86400 * 5,
@@ -68,10 +75,26 @@
             coiName: '个人组',
             ocaId: 201 // Mocked ocaId
         },
-        'MatchRsDetailQuery': [
-            { id: 1, name: '[Mock]活动1', status: 1 },
-            { id: 2, name: '[Mock]活动2', status: 0 }
-        ],
+        'MatchRsDetailQuery': { 
+            id: 1, 
+            name: '[Mock]活动1', 
+            status: 1, 
+            totalSysPoint: 100,
+            mcType: 1,
+            mcId: 101,
+            mcName: '[Mock]线上马拉松',
+            beginSecond: Date.now() / 1000 - 86400 * 2,
+            endSecond: Date.now() / 1000 + 86400 * 5,
+            nickName: '[Mock]用户昵称',
+            totalNum: 10,
+            totalDistanct: 5000,
+            totalDistanctRankNum: 5,
+            totalCp: 20,
+            totalCpRankNum: 3,
+            totalSysPointRankNum: 10,
+            fastPace: 300,
+            fastPaceRankNum: 8
+        },
         'CardRankDetailQuery': {
             totalRankRs: [
                 { nickName: 'Mock张三', score: 10000, headUrl: 'https://picsum.photos/40/40?random=1', rankNum: 1 },
@@ -159,7 +182,7 @@
         'MapListQuery': [
             { mapId: 1, mapName: '[Mock]公园地图', latitude: 36.6, longitude: 117.0, activityList: [] }
         ],
-        'CompStatisticQuery': { totalDistance: 123.45, totalPeople: 1000 },
+        'CompStatisticQuery': { totalDistance: 5024, totalPeople: 1000, totalAnswerNum: 1500, totalCp: 8900 },
         'WarnMessageQuery': [
             { warnType: 1, warnTitle: '[Mock]黄牌警告', warnMessage: '您的成绩异常', iconUrl: 'https://picsum.photos/50/50?random=10' }
         ],
@@ -192,9 +215,9 @@
                 { orderNum: 2, isComplete: 0, showName: '未完2', relationType: 1, ocaId: 11, longitude: 117.2, latitude: 36.7, popupImg: 'https://picsum.photos/100/100?random=20' }
             ]
         },
-        'CardUriQuery': {}, // 暂无 Mock 结构
-        'MatchFinishInfoQuery': {}, // 暂无 Mock 结构
-        'RedisRebuild': {} // 暂无 Mock 结构
+        'CardUrlQuery': { url: 'https://mock-uri.colormaprun.com/card/nanning1/index.html'}, // 暂无 Mock 结构  
+        'MatchFininshInfoQuery': {}, // 暂无 Mock 结构
+        'RedisRebulid': {} // 暂无 Mock 结构
     };
 
     var API = {
@@ -263,16 +286,16 @@
         // ==============================
 
         // 1. 卡片基本信息查询
-        getCardBase: function(ecId, pageName) { return this.request('CardBaseQuery', { ecId: ecId, pageName: pageName }); },
+        getCardBase: function(ecId) { return this.request('CardBaseQuery', { ecId: ecId }); },
 
         // 2. 卡片对应活动或赛事详情查询
         getCardDetail: function(ecId) { return this.request('CardDetailQuery', { ecId: ecId }); },
 
         // 3. 卡片对应线上赛多个活动查询
-        getMatchRsDetail: function(ecId) { return this.request('MatchRsDetailQuery', { ecId: ecId }); },
+        getMatchRsDetail: function(ecId, ocaId) { return this.request('MatchRsDetailQuery', { ecId: ecId, ocaId: ocaId }); },
 
         // 4. 排名查询
-        getRankDetail: function(mcIdListStr, mcType, dispArrStr) { return this.request('CardRankDetailQuery', { mcIdListStr: mcIdListStr, mcType: mcType, dispArrStr: dispArrStr }); },
+        getRankDetail: function(mcIdListStr, mcType, ocaId, dispArrStr) { return this.request('CardRankDetailQuery', { mcIdListStr: mcIdListStr, mcType: mcType, ocaId: ocaId, dispArrStr: dispArrStr }); },
 
         // 5. 卡片用户当前排名查询
         getUserCurrentRank: function(ecId) { return this.request('UserCurrentRankNumQuery', { ecId: ecId }); },
@@ -284,7 +307,7 @@
         isNewUserInCardComp: function(ecId) { return this.request('IsNewUserInCardComp', { ecId: ecId }); },
 
         // 8. 线上赛报名页面信息详情
-        getOnlineMcSignUpDetail: function(ecId) { return this.request('OnlineMcSignUpDetail', { ecId: ecId }); },
+        getOnlineMcSignUpDetail: function(ecId, mcId) { return this.request('OnlineMcSignUpDetail', { ecId: ecId, mcId: mcId }); },
 
         // 9. 线上赛报名(重新分组)
         signUpOnline: function(mcId, coiId, selectTeam, nickName) { 
@@ -295,7 +318,7 @@
         isAllowMcSignUp: function(ecId) { return this.request('IsAllowMcSignUp', { ecId: ecId }); },
 
         // 11. 玩家当前月挑战记录查询
-        getCurrentMonthlyChallenge: function() { return this.request('CurrentMonthlyChallengeQuery', {}); },
+        getCurrentMonthlyChallenge: function(year, month) { return this.request('CurrentMonthlyChallengeQuery', {year: year, month: month}); },
 
         // 12. 卡片配置信息查询
         getCardConfig: function(ecId, pageName) { return this.request('CardConfigQuery', { ecId: ecId, pageName: pageName }); },
@@ -307,16 +330,16 @@
         getMonthlyChallenge: function() { return this.request('MonthlyChallengeQuery', {}); },
 
         // 15. 月挑战排名查询
-        getMonthRankDetail: function() { return this.request('MonthRankDetailQuery', {}); },
+        getMonthRankDetail: function(year, month, dispArrStr) { return this.request('MonthRankDetailQuery', {year: year, month: month, dispArrStr: dispArrStr}); },
 
         // 16. 玩家活动成就查询
         getAchievement: function() { return this.request('AchievementQuery', {}); },
 
         // 17. 玩家兑换记录查询
-        getExchangeList: function(ecId) { return this.request('ExchangeListQuery', { ecId: ecId }); },
+        getExchangeList: function() { return this.request('ExchangeListQuery', {}); },
 
         // 18. 玩家兑换详情查询
-        getExchangeDetail: function(ecId, exchangeId) { return this.request('ExchangeDetailQuery', { ecId: ecId, exchangeId: exchangeId }); },
+        getExchangeDetail: function(oarId) { return this.request('ExchangeDetailQuery', { oarId: oarId}); },
 
         // 19. 未读消息列表查询
         getUnReadMessages: function(relationId, relationType) { return this.request('UnReadMessageQuery', { relationId: relationId, relationType: relationType || 2 }); },
@@ -325,22 +348,22 @@
         readMessage: function(mqIdListStr) { return this.request('ReadMessage', { mqIdListStr: mqIdListStr }); },
 
         // 21. 卡片对应地图列表详情查询
-        getMapList: function(ecId) { return this.request('MapListQuery', { ecId: ecId }); },
+        getMapList: function(mcId) { return this.request('MapListQuery', { mcId: mcId }); },
 
         // 22. 赛事总成绩统计查询
-        getCompStatistic: function(ecId) { return this.request('CompStatisticQuery', { ecId: ecId }); },
+        getCompStatistic: function(mcId) { return this.request('CompStatisticQuery', { mcId: mcId }); },
 
         // 23. 警告列表查询
         getWarnMessage: function(ecId) { return this.request('WarnMessageQuery', { ecId: ecId }); },
 
         // 24. 查询电子证书样式
-        getCertStyle: function(ecId) { return this.request('CertStyleQuery', { ecId: ecId }); },
+        getCertStyle: function(certStyleType) { return this.request('CertStyleQuery', { certStyleType: certStyleType }); },
 
         // 25. 查询电子证书成就对应用户基本信息
-        getUserBaseInCertificate: function(ecId) { return this.request('UserBaseQueryInCertificate', { ecId: ecId }); },
+        getUserBaseInCertificate: function(oarId) { return this.request('UserBaseQueryInCertificate', { oarId: oarId }); },
 
         // 26. 根据成就信息确认生成电子证书
-        createCertificate: function(data) { return this.request('CertificateCreateByUserAi', data); },
+        createCertificate: function(nickName,oarId) { return this.request('CertificateCreateByUserAi', {nickName: nickName, oarId: oarId}); },
 
         // 27. 卡片内可用积分查询
         getScore: function(ecId) { return this.request('OnlineScoreQuery', { ecId: ecId }); },
@@ -349,10 +372,10 @@
         getGoodsList: function(ecId) { return this.request('CanExchangeGoodsList', { ecId: ecId }); },
 
         // 29. 积分可兑换商品详情
-        getGoodsDetail: function(goodsId) { return this.request('CanExchangeGoodsDetail', { goodsId: goodsId }); },
+        getGoodsDetail: function(ecId, goodsId) { return this.request('CanExchangeGoodsDetail', {ecid: ecId, goodsId: goodsId }); },
 
         // 30. 积分兑换商品
-        exchangeGoods: function(ecId, goodsId) { return this.request('ScoreExchangeGoods', { ecId: ecId, goodsId: goodsId }); },
+        exchangeGoods: function(ecId, goodsId, exchNum) { return this.request('ScoreExchangeGoods', { ecId: ecId, goodsId: goodsId, exchNum: exchNum }); },
 
         // 31. 用户基本信息查询
         getUserInfo: function() { return this.request('UserBasicInformationQuery', {}); },
@@ -361,13 +384,13 @@
         getGrids: function(ecId) { return this.request('GridsQuery', { ecId: ecId }); },
 
         // 33. 卡片URI查询
-        getCardUri: function(ecId) { return this.request('CardUriQuery', { ecId: ecId }); },
+        getCardUrl: function(actId, matchType) { return this.request('CardUrlQuery', { actId: actId, matchType: matchType }); },
 
         // 34. 赛事完赛信息查询
-        getMatchFinishInfo: function(ecId) { return this.request('MatchFinishInfoQuery', { ecId: ecId }); },
+        getMatchFinishInfo: function(actId, matchType) { return this.request('MatchFininshInfoQuery', { actId, matchType }); },
 
         // 35. Redis 重建 (管理接口)
-        redisRebuild: function(ecId) { return this.request('RedisRebuild', { ecId: ecId }); }
+        redisRebuild: function(compId) { return this.request('RedisRebulid', { compId: compId }); }
     };
 
     window.API = API;

+ 1919 - 0
card/sdk/client.yaml

@@ -0,0 +1,1919 @@
+/*
+ * OpenAPI Petstore
+ *
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * API version: 1.0.0
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"io"
+	"net/http"
+	"os"
+	"path"
+	"server/errors"
+	"server/service"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type ApiAPI struct {
+}
+type GenVerifyPicReq struct {
+	Height     int    `json:"height"`
+	Width      int    `json:"width"`
+	NoiseCount int    `json:"noiseCount"`
+	Length     int    `json:"length"`
+	Source     string `json:"source"`
+}
+type Response struct {
+	Code    int         `json:"code"`
+	Message interface{} `json:"message"`
+	Data    interface{} `json:"data"`
+}
+
+
+func (api *ApiAPI) ApiCardCardRankDetailQueryPost(context *gin.Context) {
+	//fmt.Println("mcIdListStr", context.PostForm("mcIdListStr"))
+	//fmt.Println("mcType", context.PostForm("mcType"))
+	mcIdArrStr := context.PostForm("mcIdListStr") //活动id逗号分隔字符串
+	var mcIdArr []string
+	if mcIdArrStr != "" {
+		mcIdArr = strings.Split(mcIdArrStr, ",")
+
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -2,
+			"message": "传入参数mcIdArrStr不正确",
+			"data":    nil,
+		})
+		return
+	}
+	if len(mcIdArr) > 1 {
+		context.JSON(200, gin.H{
+			"code":    -2,
+			"message": "传入参数mcIdArrStr不正确",
+			"data":    nil,
+		})
+		return
+	}
+
+	compId, err_ := strconv.Atoi(mcIdArr[0])
+	if err_ != nil {
+		context.JSON(200, gin.H{
+			"code":    -2,
+			"message": "传入参数mcIdArrStr不正确",
+			"data":    nil,
+		})
+		return
+	}
+	mcType := api.postInt(context, "mcType")
+	ocaId := api.postInt(context, "ocaId")
+	dispArrStr := context.PostForm("dispArrStr")
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	//fmt.Println("userId:", userId)
+	r, msg, err_ := service.Card{}.CardRankDetailQuery(compId, dispArrStr, userId, mcType, ocaId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+func (api *ApiAPI) ApiCardCardBaseQueryPost(context *gin.Context) {
+	ecId := api.postInt(context, "ecId") //卡片id
+	r, msg, err_ := service.Card{}.CarBaseQuery(ecId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+func (api *ApiAPI) ApiCardCardDetailQueryPost(context *gin.Context) {
+	ecId := api.postInt(context, "ecId") //卡片id
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	//if userId == 0 {
+	//	context.JSON(401, gin.H{
+	//		"code":    -2,
+	//		"message": "用户未登录",
+	//		"data":    nil,
+	//	})
+	//	return
+	//}
+	r, msg, err_ := service.Card{}.CardDetailQuery(ecId, userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardOnlineMcSignUpDetailPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	//if userId == 0 {
+	//	context.JSON(401, gin.H{
+	//		"code":    -2,
+	//		"message": "用户未登录",
+	//		"data":    nil,
+	//	})
+	//	return
+	//}
+	mcId := api.postInt(context, "mcId") //赛事id
+	r, msg, err_ := service.To{}.CardOnlineMcSignUpDetail(mcId, userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardOnlineMcSignUpPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	mcId := api.postInt(context, "mcId")             //
+	coiId := api.postInt(context, "coiId")           //
+	selectTeam := api.postInt(context, "selectTeam") //
+	nickName := context.PostForm("nickName")
+	//_ = service.AppLogCreate(token, "ApiCardOnlineMcSignUpPost", "mcId="+strconv.Itoa(mcId), ",nickName="+nickName, 1, userId, "")
+	msg, err_ := service.To{}.OnlineMcSignUp(userId, mcId, coiId, selectTeam, nickName)
+	if err_ == nil {
+		//生成排行榜
+		_ = service.Card{}.OnlineGameRankInit(userId, mcId)
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    nil,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardUserJoinCardQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	ecId := api.postInt(context, "ecId") //卡片id
+	isJoin, msg, err_ := service.To{}.UserJoinCardQuery(userId, ecId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": msg,
+			"data":    isJoin,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "未报名",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardAchievementQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	isJoin, msg, err_ := service.To{}.CardAchievementQuery(userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": msg,
+			"data":    isJoin,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "未报名",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardMonthlyChallengeQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	r, msg, err_ := service.To{}.MonthlyChallengeQuery(userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": msg,
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "未报名",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardCurrentMonthlyChallengeQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	year := api.postInt(context, "year")
+	month := api.postInt(context, "month")
+	r, msg, err_ := service.To{}.CurrentMonthlyChallengeQuery(userId, year, month)
+	if err_ == nil {
+		if userId == 0 {
+			context.JSON(401, gin.H{
+				"code":    0,
+				"message": msg,
+				"data":    r,
+			})
+		} else {
+			context.JSON(200, gin.H{
+				"code":    0,
+				"message": msg,
+				"data":    r,
+			})
+		}
+
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "未报名",
+			"data":    nil,
+		})
+	}
+}
+func (api *ApiAPI) ApiCardExchangeListQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	r, msg, err_ := service.Verf{}.UserExchangeListQuery(userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": msg,
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "未报名",
+			"data":    nil,
+		})
+	}
+}
+func (api *ApiAPI) ApiCardExchangeDetailQueryPost(context *gin.Context) {
+	oarId := api.postInt(context, "oarId")
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	r, msg, err_ := service.Card{}.ExchangeDetailQuery(oarId, userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+func (api *ApiAPI) ApiCardCardConfigQueryPost(context *gin.Context) {
+	//fmt.Println("=========================ecId===============", context.PostForm("ecId"))
+	ecId := api.postInt(context, "ecId") //卡片id
+	pageName := context.PostForm("pageName")
+	if pageName == "all" {
+		r, msg, err_ := service.Card{}.CarConfigAllQuery(ecId, pageName)
+		if err_ == nil {
+			context.JSON(200, gin.H{
+				"code":    0,
+				"message": "success",
+				"data":    r,
+			})
+		} else {
+			context.JSON(200, gin.H{
+				"code":    -1,
+				"message": msg,
+				"data":    nil,
+			})
+		}
+	} else {
+		r, msg, err_ := service.Card{}.CarConfigQuery(ecId, pageName)
+		if err_ == nil {
+			context.JSON(200, gin.H{
+				"code":    0,
+				"message": "success",
+				"data":    r,
+			})
+		} else {
+			context.JSON(200, gin.H{
+				"code":    -1,
+				"message": msg,
+				"data":    nil,
+			})
+		}
+	}
+
+}
+
+func (api *ApiAPI) ApiCardReadMessagePost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	mqIdListStr := context.PostForm("mqIdListStr") //已读消息id逗号分隔字符串
+	msg, err_ := service.Card{}.CardReadMessage(userId, mqIdListStr)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    nil,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardUnReadMessageQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	relationType := api.postInt(context, "relationType") //消息类型 1成就 2 卡片
+	relationId := api.postInt(context, "relationId")     //消息类型 1成就 2 卡片
+	r, msg, err_ := service.Card{}.CardUnReadMessageQuery(userId, relationType, relationId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardCurrentRankNumQueryPost(context *gin.Context) {
+
+}
+
+func (api *ApiAPI) ApiCardUserCurrentRankNumQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	ecId := api.postInt(context, "ecId") //卡片id
+	rankNum, err_ := service.To{}.CardCurrentRankNumQuery(userId, ecId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    rankNum,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "未报名",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardIsAllowMcSignUpPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	ecId := api.postInt(context, "ecId") //卡片id
+	isAllowMcSignUp, err_ := service.To{}.IsAllowMcSignUpQuery(userId, ecId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    isAllowMcSignUp,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "未报名",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiShopVerfSignInPost(context *gin.Context) {
+	phone := context.PostForm("username")
+	vfCode := context.PostForm("password")
+	Ip := context.ClientIP()
+	loginReply, msg, err_ := service.Verf{}.VerfSignIn(phone, vfCode, Ip)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    loginReply,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiShopVerfExchangePost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	userId, err_ := service.Verf{}.GetUserIdByToken(token)
+	if err_ != nil {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	qrCode := context.PostForm("qrCode")
+
+	msg, err_ := service.Verf{}.VerfExchange(userId, qrCode)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    nil,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiShopVerfExchangedListQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	userId, err_ := service.Verf{}.GetUserIdByToken(token)
+	if err_ != nil {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	yearMonth := context.PostForm("yearMonth")
+	rs, err_ := service.Verf{}.VerfExchangedListQuery(userId, yearMonth)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    rs,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "未报名",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardMatchRsDetailQueryPost(context *gin.Context) {
+	ecId := api.postInt(context, "ecId")   //卡片id
+	ocaId := api.postInt(context, "ocaId") //关联关系id
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	r, msg, err_ := service.Card{}.MatchRsDetail(ecId, ocaId, userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) GetWxJsSdkConfig(c *gin.Context) {
+	url := c.PostForm("url")
+	r, msg, err_ := service.WxPay{}.GetJssdkConfig(url)
+	if err_ == nil {
+		c.JSON(200, gin.H{
+			"code":    0,
+			"data":    r,
+			"message": "sucess",
+		})
+
+	} else {
+		c.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardAchievementDetailQueryPost(context *gin.Context) {
+
+}
+
+func (api *ApiAPI) ApiCardCompStatisticQueryPost(context *gin.Context) {
+	mcId := api.postInt(context, "mcId")
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	r, msg, err_ := service.Card{}.CompStatisticQuery(mcId, userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardMapListQueryPost(context *gin.Context) {
+	mcId := api.postInt(context, "mcId")
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	r, msg, err_ := service.Card{}.MapListQuery(mcId, userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardCardUrlQueryPost(context *gin.Context) {
+	actId := api.postInt(context, "actId")
+	matchType := api.postInt(context, "matchType")
+	token := context.GetHeader("token")
+	//fmt.Println("查询url的token:" + token)
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	r, msg, err_ := service.Card{}.CardUrlQuery(actId, matchType, userId)
+
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardWarnMessageQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	ecId := api.postInt(context, "ecId") // 2 卡片
+	r, msg, err_ := service.Card{}.CardWarnMessageQuery(userId, ecId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardCertStyleQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	certStyleType := context.PostForm("certStyleType") //证书样式
+	//certStyleType := api.postInt(context, "certStyleType") // 2 卡片
+	r, msg, err_ := service.Card{}.CardCertStyleQuery(userId, certStyleType)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardCertificateCreateByUserAiPost(context *gin.Context) {
+
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	nickName := context.PostForm("nickName") //证书样式
+	oarId := api.postInt(context, "oarId")   // 2 卡片
+	msg, err_ := service.Card{}.UpdateCertificateIssued(userId, oarId, nickName)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardUserBaseQueryInCertificatePost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	//nickName := context.PostForm("nickName") //证书样式
+	oarId := api.postInt(context, "oarId") // 2 卡片
+	r, msg, err_ := service.Card{}.CardCertificateCreateByUserAi(userId, oarId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardCanExchangeGoodsDetailPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	goodsId := api.postInt(context, "goodsId") // 商品
+	ecId := api.postInt(context, "ecId")       // 2 卡片
+	r, msg, err_ := service.Card{}.CardCanExchangeGoodsDetail(userId, ecId, goodsId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardCanExchangeGoodsListPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	ecId := api.postInt(context, "ecId") // 2 卡片
+	r, msg, err_ := service.Card{}.CardCanExchangeGoodsList(userId, ecId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardOnlineScoreQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	ecId := api.postInt(context, "ecId") // 2 卡片
+	r, msg, err_ := service.Card{}.CardOnlineScoreQuery(userId, ecId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardScoreExchangeGoodsPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	goodsId := api.postInt(context, "goodsId") // 商品
+	ecId := api.postInt(context, "ecId")       // 2 卡片
+	exchNum := api.postInt(context, "exchNum") // 2 卡片
+	msg, err_ := service.Card{}.CardScoreExchangeGoods(userId, ecId, goodsId, exchNum)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    nil,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiShopVerfSignOutPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	userId, err_ := service.Verf{}.GetUserIdByToken(token)
+	if err_ != nil {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	err_ = service.Verf{}.VerfSignOut(userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    nil,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardIsNewUserInCardCompPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	ecId := api.postInt(context, "ecId") //卡片id
+	isNew, msg, err_ := service.Card{}.IsNewUserInCardComp(userId, ecId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": msg,
+			"data":    isNew,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardRedisRebulidPost(context *gin.Context) {
+	compId := api.postInt(context, "compId") //卡片id
+	err_ := service.Card{}.OnlineGameRankAddGenerate(compId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "",
+			"data":    nil,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardMatchFininshInfoQueryPost(context *gin.Context) {
+	actId := api.postInt(context, "actId")
+	matchType := api.postInt(context, "matchType")
+	token := context.GetHeader("token")
+	//fmt.Println("查询url的token:" + token)
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	r, msg, err_ := service.Card{}.MatchFininshInfoQuery(actId, matchType, userId)
+
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiActMgtSignInPost(context *gin.Context) {
+	username := context.PostForm("username")
+	vfCode := context.PostForm("vfCode")
+	Ip := context.ClientIP()
+	loginReply, msg, err_ := service.ActMgt{}.ActGmtSignInV2(username, vfCode, Ip)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    loginReply,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiActMgtSignOutPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	userId, err_ := service.ActMgt{}.GetUserIdByToken(token)
+	if err_ != nil {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	err_ = service.ActMgt{}.SignOut(userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    nil,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiActMgtSignUpPost(c *gin.Context) {
+	phone := c.PostForm("phone")
+	vfCode := c.PostForm("vfCode")
+	password := c.PostForm("password")
+	username := c.PostForm("username")
+	msg, err_ := service.ActMgt{}.SignUp(phone, vfCode, password, username)
+	if err_ == nil {
+		loginReply, msg2, err2_ := service.ActMgt{}.ActGmtSignIn(username, password, "")
+		if err2_ == nil {
+			c.JSON(200, gin.H{
+				"code":    0,
+				"message": "success",
+				"data":    loginReply,
+			})
+		} else {
+			c.JSON(200, gin.H{
+				"code":    -1,
+				"message": msg2,
+				"data":    nil,
+			})
+		}
+	} else {
+		c.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiActMgtSmsSendPost(c *gin.Context) {
+	phone := c.PostForm("phone")
+	//smsType := api.postInt(c, "smsType")
+
+	msg, err_ := service.ActMgt{}.ToSendSms(phone, 1)
+	if err_ == nil {
+		c.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    nil,
+		})
+	} else {
+		c.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+
+}
+
+func (api *ApiAPI) ApiActMgtCompInfoAddPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.ActMgt{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	inJson := context.PostForm("inJson")
+	prodId := api.postInt(context, "prodId")
+	if prodId == 0 {
+		prodId = 1
+	}
+	msg, err_ := service.ActMgt{}.ActMgtCompInfoAdd(userId, inJson, prodId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "",
+			"data":    nil,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiActMgtCompInfoQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.ActMgt{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	prodId := api.postInt(context, "prodId")
+	if prodId == 0 {
+		prodId = 1
+	}
+	r, err_ := service.ActMgt{}.ApiActMgtCompInfoQueryPost(userId, prodId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "查询失败",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiActMgtGetSelfInfoPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.ActMgt{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	r, err_ := service.ActMgt{}.ActMgtGetSelfInfo(userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "查询失败",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiActMgtSelectMapQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.ActMgt{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	prodId := api.postInt(context, "prodId")
+	if prodId == 0 {
+		prodId = 1
+	}
+	selectOption, msg, err_ := service.ActMgt{}.MapSelect(userId, prodId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "",
+			"data":    selectOption,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiActMgtSelectPlanQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.ActMgt{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	mapId := api.postInt(context, "mapId")
+	prodId := api.postInt(context, "prodId")
+	if prodId == 0 {
+		prodId = 1
+	}
+	selectOption, msg, err_ := service.ActMgt{}.PlanSelect(mapId, prodId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "",
+			"data":    selectOption,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiActMgtSelectSsctQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.ActMgt{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	prodId := api.postInt(context, "prodId")
+	if prodId == 0 {
+		prodId = 1
+	}
+	selectOption, msg, err_ := service.ActMgt{}.SsctSelect(userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "",
+			"data":    selectOption,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+func (api *ApiAPI) ApiActMgtUploadFilesPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.ActMgt{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	// 文件处理
+	file, err := context.FormFile("uploadFile")
+	if err != nil {
+		//fmt.Println(err)
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "上传文件不能为空",
+			"data":    nil,
+		})
+		return
+	}
+	ext := path.Ext(file.Filename)
+	originalName := file.Filename
+	file.Open()
+	uploadData := make([]byte, file.Size)
+	dst := "tmp/" + file.Filename
+	err = context.SaveUploadedFile(file, dst)
+	if err != nil {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "上传文件失败",
+			"data":    nil,
+		})
+		return
+	}
+	f, err := os.Open(dst)
+	if err != nil {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "上传文件失败",
+			"data":    nil,
+		})
+		return
+	}
+	defer f.Close()
+
+	uploadData, err = io.ReadAll(f)
+	if err != nil {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "上传文件失败",
+			"data":    nil,
+		})
+		return
+	}
+	picUrl, msg, err_ := service.ActMgt{}.GenUpload(userId, ext, originalName, uploadData)
+	if err_ != nil {
+		context.JSON(200, Response{
+			Code:    -1,
+			Message: msg,
+			Data:    nil,
+		})
+		return
+	}
+	context.JSON(http.StatusOK, Response{
+		Code:    0,
+		Message: "success",
+		Data: map[string]interface{}{
+			"url": picUrl,
+		},
+	})
+}
+func (api *ApiAPI) ApiActMgtUploadFilesPostOld(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.ActMgt{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+
+	// 文件处理
+	file, err := context.FormFile("uploadFile")
+	if err != nil || file == nil {
+		//fmt.Println(err)
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "上传文件不能为空",
+			"data":    nil,
+		})
+		return
+	}
+	ext := path.Ext(file.Filename)
+	originalName := file.Filename
+	file.Open()
+	uploadData := make([]byte, file.Size)
+	dst := "tmp/" + file.Filename
+	err = context.SaveUploadedFile(file, dst)
+	if err != nil {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "上传文件失败",
+			"data":    nil,
+		})
+		return
+	}
+	f, err := os.Open(dst)
+	if err != nil {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "上传文件失败",
+			"data":    nil,
+		})
+		return
+	}
+	defer f.Close()
+	uploadData, err = readAndProcessFile(f)
+	if err != nil {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "上传文件失败",
+			"data":    nil,
+		})
+		return
+	}
+	picUrl, msg, err_ := service.ActMgt{}.GenUpload(userId, ext, originalName, uploadData)
+	if err_ != nil {
+		context.JSON(http.StatusInternalServerError, Response{
+			Code:    -1,
+			Message: msg,
+			Data:    nil,
+		})
+		return
+	}
+	context.JSON(http.StatusOK, Response{
+		Code:    0,
+		Message: "success",
+		Data: map[string]interface{}{
+			"url": picUrl,
+		},
+	})
+}
+func (api *ApiAPI) ApiActMgtCardRankDetailQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.ActMgt{}.GetUserIdByTokenAllowNil(token)
+	}
+	var code int
+	if userId == 0 {
+		code = 601
+	} else {
+		code = 0
+	}
+	//fmt.Println("compId:" + context.PostForm("compId"))
+	compId := api.postInt(context, "compId")
+	ocaId := api.postInt(context, "ocaId")
+	dispArrStr := context.PostForm("dispArrStr")
+
+	r, msg, err_ := service.Card{}.CardRankDetailQuery(compId, dispArrStr, userId, 3, ocaId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    code,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+func readAndProcessFile(f *os.File) (allData []byte, err error) {
+	// 确保文件在函数返回前被关闭
+	defer f.Close()
+
+	// 分块读取文件,而不是一次性读入所有内容到内存
+	buf := make([]byte, 1024)
+	//var allData []byte
+	for {
+		// 读取数据块
+		n, err_ := f.Read(buf[:cap(buf)])
+		allData = append(allData, buf[:n]...)
+
+		// 处理错误情况
+		if err_ != nil {
+			if err == io.EOF {
+				break // 正常结束,读取完所有数据
+			}
+			// 打印错误并处理,例如返回错误
+			fmt.Println(err)
+			return
+		}
+	}
+
+	// 这里可以添加对allData的处理逻辑,例如打印或进一步处理数据
+	// fmt.Println(string(allData))
+
+	// 没有发生错误,返回nil
+	return
+}
+
+// Get /api/card/UserBasicInformationQuery
+// App设置中“个人信息收集清单”-用户基本信息查询
+func (api *ApiAPI) ApiCardUserBasicInformationQueryGet(c *gin.Context) {
+	userId, err := validateTokenByApp(c)
+	if err != nil {
+		c.JSON(http.StatusUnauthorized, Response{
+			Code:    -1,
+			Message: "token失效",
+			Data:    nil,
+		})
+		return
+	}
+	list, msg, err := service.User{}.GetUserBasicInformation(userId)
+	if err != nil {
+		c.JSON(http.StatusInternalServerError, Response{
+			Code:    -1,
+			Message: msg,
+			Data:    nil,
+		})
+		return
+	}
+	c.JSON(http.StatusOK, Response{
+		Code:    0,
+		Message: "success",
+		Data: map[string]interface{}{
+			"list": list,
+		},
+	})
+}
+
+func (api *ApiAPI) ApiCardMonthRankDetailQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+	dispArrStr := context.PostForm("dispArrStr")
+	year := api.postInt(context, "year")
+	month := api.postInt(context, "month")
+	r, msg, err_ := service.Card{}.MonthRankDetailQuery(year, month, userId, dispArrStr)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardGridsQueryPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	ecId := api.postInt(context, "ecId") //卡片id
+	var userId int
+	if token == "" {
+		userId = 0
+
+	} else {
+		userId = service.User{}.GetUserIdByTokenAllowNil(token)
+	}
+
+	r, err_ := service.Card{}.CardGridsQuery(ecId, userId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiActMgtCompInfoDetailPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.ActMgt{}.GetUserIdByTokenAllowNil(token)
+	}
+	var code int
+	if userId == 0 {
+		code = 601
+	} else {
+		code = 0
+	}
+	compId := api.postInt(context, "compId")
+	r, err_ := service.ActMgt{}.ApiActMgtCompInfoDetailPost(userId, compId)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    code,
+			"message": "",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": "查询失败",
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiActMgtCompInfoEditPost(context *gin.Context) {
+	token := context.GetHeader("token")
+	var userId int
+	if token == "" {
+		userId = 0
+	} else {
+		userId = service.ActMgt{}.GetUserIdByTokenAllowNil(token)
+	}
+	if userId == 0 {
+		context.JSON(401, gin.H{
+			"code":    -2,
+			"message": "用户未登录",
+			"data":    nil,
+		})
+		return
+	}
+	compId := api.postInt(context, "compId")
+	inJson := context.PostForm("inJson")
+	msg, err_ := service.ActMgt{}.ActMgtCompInfoEdit(userId, compId, inJson)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "",
+			"data":    nil,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+}
+
+func (api *ApiAPI) ApiCardUserConfigQueryPost(context *gin.Context) {
+	ecId := api.postInt(context, "ecId") //卡片id
+	pageName := context.PostForm("pageName")
+
+	r, msg, err_ := service.Card{}.UserConfigQuery(ecId, pageName)
+	if err_ == nil {
+		context.JSON(200, gin.H{
+			"code":    0,
+			"message": "success",
+			"data":    r,
+		})
+	} else {
+		context.JSON(200, gin.H{
+			"code":    -1,
+			"message": msg,
+			"data":    nil,
+		})
+	}
+
+}