From 4ac36abfe39718eeda732ebf1765fb504940c669 Mon Sep 17 00:00:00 2001 From: Kunagisa <1549184870@qq.com> Date: Tue, 24 Jun 2025 22:54:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E6=9F=A5=E8=AF=A2=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/centre_maps.js | 17 +++ src/utils/MapQuery.js | 221 ++++++++++++++++++++++++++++++++ src/views/index/EditorsMaps.vue | 91 ++++++++----- 3 files changed, 299 insertions(+), 30 deletions(-) create mode 100644 src/utils/MapQuery.js diff --git a/src/api/centre_maps.js b/src/api/centre_maps.js index cc0b9a6..51be2fc 100644 --- a/src/api/centre_maps.js +++ b/src/api/centre_maps.js @@ -92,3 +92,20 @@ export const getAllMapRating = async () => { } }; +/** + * 依据条件搜索地图 + * @param {Object} params - 查询参数对象,键为参数名,值为参数值 + * @returns {Promise} 返回一个包含地图信息的Promise对象 + */ +export const searchMapsByConditions = async (params) => { + try { + // 构建查询字符串 + const query = new URLSearchParams(params).toString(); + const response = await axiosInstance.get(`/map/search?${query}`); + return response.data; + } catch (error) { + console.error('依据条件搜索地图失败:', error); + throw error; + } +}; + diff --git a/src/utils/MapQuery.js b/src/utils/MapQuery.js new file mode 100644 index 0000000..96efdaf --- /dev/null +++ b/src/utils/MapQuery.js @@ -0,0 +1,221 @@ +/** + * 地图查询构造器 + * 提供链式API来构建 /map/search 的查询参数. + * + * 根据API要求,不同字段适用不同的查询方法: + * - **直接等值查询 (无前缀)**: `id`, `name`, `user` 等. 请使用 `.eq()` 或专用方法如 `.user()`. + * - **带规则查询 (有前缀)**: `size`, `player_count`, `download_count`, `favourite_count`. 请使用 `.equ()`, `.lss()`, `.geq()` 等方法. + * - **多值查询**: `tags`. 请使用 `.in()` 方法. + * + * **用法示例:** + * const params = new MapQuery() + * .user('张三') + * .leq('download_count', 100) + * .like('name', '测试') + * .in('tags', ['PVP', '特殊']) + * .build(); + */ +export default class MapQuery { + constructor() { + this.params = {}; + } + + /** + * 设置 id + * @param {number} value + * @returns {MapQuery} + */ + id(value) { + return this.eq('id', value); + } + + /** + * 设置 name + * @param {string} value + * @returns {MapQuery} + */ + name(value) { + return this.eq('name', value); + } + + /** + * 设置 chinese_name + * @param {string} value + * @returns {MapQuery} + */ + chineseName(value) { + return this.eq('chinese_name', value); + } + + /** + * 设置 user + * @param {string} value + * @returns {MapQuery} + */ + user(value) { + return this.eq('user', value); + } + + /** + * 设置 create_time + * @param {string} value + * @returns {MapQuery} + */ + createTime(value) { + return this.eq('create_time', value); + } + + /** + * 设置 author + * @param {string} value + * @returns {MapQuery} + */ + author(value) { + return this.eq('author', value); + } + + /** + * 设置 img_file + * @param {string} value + * @returns {MapQuery} + */ + imgFile(value) { + return this.eq('img_file', value); + } + + /** + * 设置 thumbnail + * @param {string} value + * @returns {MapQuery} + */ + thumbnail(value) { + return this.eq('thumbnail', value); + } + + /** + * 设置 zip_file + * @param {string} value + * @returns {MapQuery} + */ + zipFile(value) { + return this.eq('zip_file', value); + } + + /** + * 设置 file_name + * @param {string} value + * @returns {MapQuery} + */ + fileName(value) { + return this.eq('file_name', value); + } + + /** + * 设置 verify_status + * @param {string} value + * @returns {MapQuery} + */ + verifyStatus(value) { + return this.eq('verify_status', value); + } + + /** + * 等于 (e.g., `user='张三'`) + * @param {string} key - 参数名 + * @param {string|number} value - 参数值 + * @returns {MapQuery} + */ + eq(key, value) { + this.params[key] = value; + return this; + } + /** + * 等于 (带EQU前缀, e.g., `player_count='EQU4'`) + * @param {string} key - 参数名 + * @param {string|number} value - 参数值 + * @returns {MapQuery} + */ + equ(key, value) { + this.params[key] = `EQU${value}`; + return this; + } + /** + * 不等于 (e.g., `download_count='NEQ100'`) + * @param {string} key - 参数名 + * @param {string|number} value - 参数值 + * @returns {MapQuery} + */ + neq(key, value) { + this.params[key] = `NEQ${value}`; + return this; + } + /** + * 小于 (Less Than) + * @param {string} key - 参数名 + * @param {number} value - 参数值 + * @returns {MapQuery} + */ + lss(key, value) { + this.params[key] = `LSS${value}`; + return this; + } + /** + * 小于等于 (Less Than or Equal) + * @param {string} key - 参数名 + * @param {number} value - 参数值 + * @returns {MapQuery} + */ + leq(key, value) { + this.params[key] = `LEQ${value}`; + return this; + } + /** + * 大于 (Greater Than) + * @param {string} key - 参数名 + * @param {number} value - 参数值 + * @returns {MapQuery} + */ + gtr(key, value) { + this.params[key] = `GTR${value}`; + return this; + } + /** + * 大于等于 (Greater Than or Equal) + * @param {string} key - 参数名 + * @param {number} value - 参数值 + * @returns {MapQuery} + */ + geq(key, value) { + this.params[key] = `GEQ${value}`; + return this; + } + /** + * 模糊匹配 + * @param {string} key - 参数名 + * @param {string} value - 参数值 + * @returns {MapQuery} + */ + like(key, value) { + this.params[key] = `LIKE${value}`; + return this; + } + /** + * 包含于 (用于 tags) + * @param {string} key - 参数名 + * @param {Array} arr - 参数值数组 + * @returns {MapQuery} + */ + in(key, arr) { + if (Array.isArray(arr)) { + this.params[key] = arr.join(','); + } + return this; + } + /** + * 构建最终的参数对象 + * @returns {Object} + */ + build() { + return { ...this.params }; + } +} \ No newline at end of file diff --git a/src/views/index/EditorsMaps.vue b/src/views/index/EditorsMaps.vue index 40f1f9c..5cb8faf 100644 --- a/src/views/index/EditorsMaps.vue +++ b/src/views/index/EditorsMaps.vue @@ -4,7 +4,16 @@ 返回 +
+
+ + +
@@ -92,7 +101,9 @@