diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..b03bab1 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,269 @@ +# AI Agent 企业级行为策略(Ultimate Edition) + +## 核心目标 + +AI 应: + +* 像高级工程师一样思考 +* 保持智能 +* 保持上下文理解能力 +* 保持组件联动能力 +* 同时避免无意义 token 消耗 + +目标不是限制 AI。 + +目标是: + +* 智能 +* 克制 +* 稳定 +* 高效 + +--- + +# AI 工作模式 + +默认采用: + +Think First +Explore Second +Modify Last + +即: + +1. 先理解需求 +2. 再推理可能相关文件 +3. 再最小化读取 +4. 最后修改代码 + +禁止: + +* 无脑全项目扫描 +* 不经思考直接 grep +* 无限递归读取 + +--- + +# 智能按需扫描(核心规则) + +允许 AI 自动: + +* 分析当前任务 +* 分析 import +* 分析组件依赖 +* 分析 store 依赖 +* 分析 api 依赖 +* 分析 types 依赖 +* 分析 utils 依赖 + +允许: + +* 自动读取直接依赖文件 +* 自动修复 import +* 自动修复类型引用 +* 自动分析运行链路 + +但必须: + +* 最小化扫描范围 +* 最小化 token 消耗 +* 禁止无限递归探索 + +--- + +# 扫描深度限制 + +默认最大依赖深度: + +2 层 + +例如: + +index.vue +-> ProductCard.vue +-> product.ts + +允许读取: + +* ProductCard.vue +* product.ts + +禁止继续无限扫描。 + +如果任务复杂: + +必须先输出分析计划, +等待确认后再扩大扫描范围。 + +--- + +# AI 自由发挥边界 + +允许: + +* 合理重构 +* 合理组件化 +* 合理优化结构 +* 合理优化样式 +* 合理优化复用 +* 合理修复低级问题 +* 合理修复 import +* 合理修复类型错误 + +禁止: + +* 为了炫技重构项目 +* 无意义抽象 +* 过度设计 +* 无意义拆分 +* 无意义新增依赖 +* 自动升级依赖 + +--- + +# Token 经济策略 + +Token 应优先用于: + +* 推理 +* 架构理解 +* 业务逻辑 +* UI 结构优化 +* 类型安全 +* 组件联动 + +禁止浪费在: + +* 全项目 grep +* 重复读取 +* 重复输出 +* 重复解释 +* 输出完整项目 +* 输出未修改代码 + +--- + +# 页面生成规则(Figma / uni-app) + +允许: + +* 自动组件化 +* 自动布局优化 +* 自动结构优化 +* 自动提取公共组件 + +优先: + +* flex 布局 +* 可维护性 +* uni-app 最佳实践 +* 低嵌套结构 +* 高复用结构 + +禁止: + +* div 套 div +* 全 absolute 页面 +* 垃圾 HTML +* 无意义嵌套 +* 内联 style 泛滥 + +--- + +# uni-app 规则 + +必须: + +* 使用 view/text/image +* px 转 rpx +* 使用 script setup +* scoped scss +* 兼容: + + * H5 + * 微信小程序 + * App + +--- + +# 大任务策略 + +复杂任务: + +必须: + +1. 先分析 +2. 先规划 +3. 先输出方案 +4. 等待确认 + +再: + +5. 编码 + +禁止直接进入大规模代码生成。 + +--- + +# 修改策略 + +优先: + +* diff 修改 +* 小范围 patch +* 保持现有架构 +* 保持现有组件体系 +* 保持现有 API 结构 + +允许: + +* 小范围智能优化 + +禁止: + +* 全项目重构 +* 无关文件修改 + +--- + +# 高级工程师行为模式 + +AI 应像高级工程师: + +* 先思考 +* 再探索 +* 再修改 + +而不是: + +* 无脑扫描器 +* Token 消耗机器 +* 低级代码生成器 + +AI 应主动: + +* 控制扫描范围 +* 控制输出长度 +* 控制修改范围 +* 控制复杂度 + +同时保持: + +* 智能 +* 联动能力 +* 架构理解能力 + +--- + +# 默认输出规则 + +默认: + +* 仅输出修改部分 +* 不重复未修改代码 +* 少解释 +* 优先 patch +* 优先 diff + +除非用户明确要求: +否则不要输出完整项目。 diff --git a/src/apis.js b/src/apis.js index 1907015..0259878 100644 --- a/src/apis.js +++ b/src/apis.js @@ -6,8 +6,8 @@ try { switch (envVersion) { case "develop": // 开发版 - BASE_URL = "http://localhost:8000/api/shoot"; - // BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot"; + // BASE_URL = "http://localhost:8000/api/shoot"; + BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot"; break; case "trial": // 体验版 BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot"; @@ -496,3 +496,63 @@ export const kickPlayerAPI = (number, userId) => { userId, }); }; + +// 获取赛季列表 +export const getSeasonList = () => { + return request("GET", "/index/season/list"); +}; + +// 获取赛季统计 +export const getSeasonStats = (seasonId) => { + const data = {}; + if (seasonId !== undefined && seasonId !== null) data.seasonId = seasonId; + return request("GET", "/index/season/stats", data); +}; + +//获取积分榜 +export const getScoreRankList = (seasonId, page, perPage) => { + return request("GET", "/index/score/rank/list", { + seasonId, + page, + perPage + }); +}; + +// 获取10环排行榜 +export const getTenRingRankList = (seasonId, page, perPage) => { + return request("GET", "/index/tenRing/rank/list", { + seasonId, + page, + perPage + }); +}; + +// 获取MVP排行榜 +export const getMvpRankList = (seasonId, page, perPage) => { + return request("GET", "/index/mvp/rank/list", { + seasonId, + page, + perPage + }); +}; + +// 获取我的积分排名 +export const getMyScoreRank = (seasonId) => { + const data = {}; + if (seasonId !== undefined && seasonId !== null) data.seasonId = seasonId; + return request("GET", "/index/myScoreRank", data); +}; + +// 获取我的MVP排名 +export const getMyMvpRank = (seasonId) => { + const data = {}; + if (seasonId !== undefined && seasonId !== null) data.seasonId = seasonId; + return request("GET", "/index/myMvpRank", data); +}; + +// 获取我的10环排名 +export const getMyTenRingRank = (seasonId) => { + const data = {}; + if (seasonId !== undefined && seasonId !== null) data.seasonId = seasonId; + return request("GET", "/index/myTenRingRank", data); +}; diff --git a/src/components/AppBackground.vue b/src/components/AppBackground.vue index ae678c3..134b66e 100644 --- a/src/components/AppBackground.vue +++ b/src/components/AppBackground.vue @@ -18,31 +18,31 @@ const props = defineProps({ + @@ -67,7 +73,7 @@ const props = defineProps({ .bg-image { width: 100%; - height: 100%; + /* height: 100%; */ } .bg-overlay { diff --git a/src/pages/device-intro.vue b/src/pages/device-intro.vue index 01f4e51..2af5013 100644 --- a/src/pages/device-intro.vue +++ b/src/pages/device-intro.vue @@ -33,7 +33,7 @@ const onScrollView = (e) => { > diff --git a/src/pages/index.vue b/src/pages/index.vue index c670356..72944f5 100644 --- a/src/pages/index.vue +++ b/src/pages/index.vue @@ -13,7 +13,7 @@ import { getDeviceBatteryAPI, getHomeData, getMyDevicesAPI, - getRankListAPI, + getScoreRankList, silentLoginAPI, } from "@/apis"; import {topThreeColors} from "@/constants"; @@ -26,15 +26,23 @@ const { updateConfig, updateUser, updateDevice, - updateRank, getLvlName, getLvlNameByScore, updateOnline, } = store; -const {user, device, rankData, online, game} = storeToRefs(store); +const {user, device, online, game} = storeToRefs(store); const showModal = ref(false); const showGuide = ref(false); +const scoreRankList = ref([]); + +// 提取积分榜接口返回的榜单数组,兼容数组和对象两种返回格式。 +const getScoreRankData = (result) => { + if (Array.isArray(result)) return result; + if (Array.isArray(result?.list)) return result.list; + if (Array.isArray(result?.items)) return result.items; + return []; +}; const toPage = async (path) => { if (!user.value.id) { @@ -84,15 +92,15 @@ onShow(async () => { } } - const promises = [getRankListAPI()]; + const promises = [getScoreRankList(undefined, 1, 10)]; if (token || user.value.id) { promises.push(getHomeData()); } const [rankList, homeData] = await Promise.all(promises); - console.log("排行数据", rankList); - updateRank(rankList); + console.log("积分榜数据", rankList); + scoreRankList.value = getScoreRankData(rankList).slice(0, 10); if (homeData) { console.log("首页数据:", homeData); @@ -216,7 +224,7 @@ onShareTimeline(() => { class="player-avatar" :style="{ zIndex: 8 - i, - borderColor: rankData.rank[i - 1] + borderColor: scoreRankList[i - 1] ? topThreeColors[i - 1] || '#000' : '#000', }" @@ -227,15 +235,15 @@ onShareTimeline(() => { {{ i }} - {{ rankData.rank.length }} + {{ scoreRankList.length }} diff --git a/src/pages/point-book-detail-share.vue b/src/pages/point-book-detail-share.vue index 1283484..e03eb1d 100644 --- a/src/pages/point-book-detail-share.vue +++ b/src/pages/point-book-detail-share.vue @@ -107,7 +107,7 @@ const targetTypeName = computed(() => {