From 5b018d5147cc17f662cd4789c82fd0e291bd36fc Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Mon, 10 Jul 2023 17:37:51 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20updateByMap=20?= =?UTF-8?q?=E9=87=8D=E8=BD=BD=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mybatisflex/core/BaseMapper.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java index 83b505f8..bd04a868 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java @@ -300,6 +300,19 @@ public interface BaseMapper { return updateByQuery(entity, QueryWrapper.create().where(whereConditions)); } + /** + * 根据 Map 构建的条件来更新数据。 + * + * @param entity 实体类 + * @param ignoreNulls 是否忽略 {@code null} 数据 + * @param whereConditions 条件 + * @return 受影响的行数 + */ + default int updateByMap(T entity, boolean ignoreNulls, Map whereConditions) { + FlexAssert.notEmpty(whereConditions, "updateByMap is not allow empty map."); + return updateByQuery(entity, ignoreNulls, QueryWrapper.create().where(whereConditions)); + } + /** * 根据查询条件来更新数据。 * @@ -598,7 +611,7 @@ public interface BaseMapper { */ default List selectListByQueryAs(QueryWrapper queryWrapper, Class asType) { if (Number.class.isAssignableFrom(asType) - || String.class == asType) { + || String.class == asType) { return selectObjectListByQueryAs(queryWrapper, asType); } @@ -650,7 +663,7 @@ public interface BaseMapper { */ default List selectListWithRelationsByQueryAs(QueryWrapper queryWrapper, Class asType) { if (Number.class.isAssignableFrom(asType) - || String.class == asType) { + || String.class == asType) { return selectObjectListByQueryAs(queryWrapper, asType); } @@ -774,7 +787,7 @@ public interface BaseMapper { } else if (selectColumns.get(0) instanceof FunctionQueryColumn) { // COUNT 函数必须在第一列 if (!FuncName.COUNT.equalsIgnoreCase( - ((FunctionQueryColumn) selectColumns.get(0)).getFnName() + ((FunctionQueryColumn) selectColumns.get(0)).getFnName() )) { // 第一个查询列不是 COUNT 函数,使用 COUNT(*) 替换所有的查询列 queryWrapper.select(count()); From 8f1a0f6601c985c431aeb32b0a8b3135644b2123 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Mon, 10 Jul 2023 17:38:21 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20true=5F()=20fa?= =?UTF-8?q?lse=5F()=20=E5=B8=B8=E9=87=8F=E6=9E=84=E5=BB=BA=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatisflex/core/query/QueryMethods.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java index fe2c2b55..d125283f 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java @@ -2387,6 +2387,20 @@ public class QueryMethods { // === 构建 column 列 === + /** + * 构建 TRUE 常量。 + */ + public static QueryColumn true_() { + return new StringQueryColumn("TRUE"); + } + + /** + * 构建 FALSE 常量。 + */ + public static QueryColumn false_() { + return new StringQueryColumn("FALSE"); + } + /** * 构建 NULL 常量。 */ From e60b17ef7146d6abe1eb7949dfae38979d3dabcd Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Mon, 10 Jul 2023 23:51:37 +0800 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=20BaseMapper?= =?UTF-8?q?=20=E6=96=87=E6=A1=A3=E7=94=9F=E6=88=90=E5=99=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis-flex-native-test/pom.xml | 9 +- .../mybatisflex/test/BaseMapperDocsGen.java | 164 ------------------ .../mybatisflex/test/BaseMapperDocsGen.java | 130 ++++++++++++++ 3 files changed, 138 insertions(+), 165 deletions(-) delete mode 100644 mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/BaseMapperDocsGen.java create mode 100644 mybatis-flex-test/mybatis-flex-native-test/src/test/java/com/mybatisflex/test/BaseMapperDocsGen.java diff --git a/mybatis-flex-test/mybatis-flex-native-test/pom.xml b/mybatis-flex-test/mybatis-flex-native-test/pom.xml index dc41d794..6ca28c6a 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/pom.xml +++ b/mybatis-flex-test/mybatis-flex-native-test/pom.xml @@ -124,7 +124,14 @@ junit junit - + + + + + com.github.javaparser + javaparser-symbol-solver-core + 3.25.4 + test diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/BaseMapperDocsGen.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/BaseMapperDocsGen.java deleted file mode 100644 index 9222c7f5..00000000 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/BaseMapperDocsGen.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.mybatisflex.test; - -import com.alibaba.fastjson2.JSON; -import com.mybatisflex.core.util.StringUtil; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; - -public class BaseMapperDocsGen { - - public static void main(String[] args) throws IOException { - - List methodInfos = readBaseMapperMethodsInfo(); - - StringBuilder insertMethods = new StringBuilder(); - StringBuilder deleteMethods = new StringBuilder(); - StringBuilder updateMethods = new StringBuilder(); - StringBuilder selectMethods = new StringBuilder(); - StringBuilder relationMethods = new StringBuilder(); - StringBuilder paginateMethods = new StringBuilder(); - - for (MethodInfo methodInfo : methodInfos) { - if (methodInfo.name.startsWith("insert")) { - insertMethods.append("- **`").append(methodInfo.getName()).append("`**: ").append(methodInfo.desc).append("\n"); - } else if (methodInfo.name.startsWith("delete")) { - deleteMethods.append("- **`").append(methodInfo.getName()).append("`**: ").append(methodInfo.desc).append("\n"); - } else if (methodInfo.name.startsWith("update")) { - updateMethods.append("- **`").append(methodInfo.getName()).append("`**: ").append(methodInfo.desc).append("\n"); - } else if (methodInfo.name.startsWith("select")) { - selectMethods.append("- **`").append(methodInfo.getName()).append("`**: ").append(methodInfo.desc).append("\n"); - if (methodInfo.name.contains("WithRelation")){ - relationMethods.append("- **`").append(methodInfo.getName()).append("`**: ").append(methodInfo.desc).append("\n"); - } - }else if (methodInfo.name.startsWith("paginate")) { - paginateMethods.append("- **`").append(methodInfo.getName()).append("`**: ").append(methodInfo.desc).append("\n"); - if (methodInfo.name.contains("WithRelation")){ - relationMethods.append("- **`").append(methodInfo.getName()).append("`**: ").append(methodInfo.desc).append("\n"); - } - } - } - - String mdDir = System.getProperty("user.dir") + "/docs/zh/base/parts/"; - writeString(new File(mdDir, "base-mapper-insert-methods.md"), insertMethods.toString()); - writeString(new File(mdDir, "base-mapper-delete-methods.md"), deleteMethods.toString()); - writeString(new File(mdDir, "base-mapper-update-methods.md"), updateMethods.toString()); - writeString(new File(mdDir, "base-mapper-query-methods.md"), selectMethods.toString()); - writeString(new File(mdDir, "base-mapper-relation-methods.md"), relationMethods.toString()); - writeString(new File(mdDir, "base-mapper-paginate-methods.md"), paginateMethods.toString()); - - - ///Users/michael/work/git/mybatis-flex/docs/zh/base/parts/base-mapper-insert-methods.md - - System.out.println(JSON.toJSON(methodInfos)); - } - - private static List readBaseMapperMethodsInfo() throws IOException { - List methodInfos = new ArrayList<>(); - String path = System.getProperty("user.dir") + "/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java"; - BufferedReader br = new BufferedReader(new FileReader(path)); - String line; - MethodInfo methodInfo = null; - while ((line = br.readLine()) != null) { - line = line.trim(); - if (line.equals("/**")) { - methodInfo = new MethodInfo(); - } else { - if (methodInfo != null && line.length() > 3 && line.startsWith("*") && line.charAt(2) != '@') { - methodInfo.addDesc(line.substring(1)); - } else if (methodInfo != null && !line.contains("=") && (line.startsWith("default") - || line.startsWith("int") - || line.startsWith("T ") - || line.startsWith("List ") - )) { - String[] tokens = line.split(" "); - int methodTokenIndex = 1; - if (line.contains("default")) { - methodTokenIndex++; - } - if (line.contains("")) { - methodTokenIndex++; - } - String methodToken = tokens[methodTokenIndex]; - methodInfo.setName(line.substring(line.indexOf(methodToken))); - methodInfos.add(methodInfo); - } - } - } - - br.close(); - return methodInfos; - } - - - public static void writeString(File file, String content) throws IOException { - FileOutputStream fos = null; - try { - fos = new FileOutputStream(file, false); - fos.write(content.getBytes(StandardCharsets.UTF_8)); - } catch (Exception e) { - e.printStackTrace(); - } finally { - fos.close(); - } - } - - public static class MethodInfo { - private String name; - private String desc; - - public String getName() { - return name; - } - - public void setName(String name) { - if (name.endsWith("{") || name.endsWith(";")) { - name = name.substring(0, name.length() - 1); - } - - name = name.trim(); - String paramsString = name.substring(name.indexOf("(") + 1, name.lastIndexOf(")")); - if (paramsString.length() > 0) { - String[] params = paramsString.split(","); - for (int i = 0; i < params.length; i++) { - String[] paramInfos = params[i].split(" "); - params[i] = paramInfos[paramInfos.length - 1]; - } - paramsString = StringUtil.join(", ", params); - name = name.substring(0, name.indexOf("(") + 1) + paramsString + ")"; - this.name = name; - } else { - this.name = name; - } - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } - - public void addDesc(String desc) { - if (this.desc == null) { - this.desc = desc.trim(); - } else { - this.desc += desc.trim(); - } - if (this.desc.contains("{@code")){ - this.desc = this.desc.replace("{@code ","`").replace("}","`"); - } - } - - @Override - public String toString() { - return "MethodInfo{" + - "name='" + name + '\'' + - ", desc='" + desc + '\'' + - '}'; - } - } -} diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/test/java/com/mybatisflex/test/BaseMapperDocsGen.java b/mybatis-flex-test/mybatis-flex-native-test/src/test/java/com/mybatisflex/test/BaseMapperDocsGen.java new file mode 100644 index 00000000..77e08234 --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-native-test/src/test/java/com/mybatisflex/test/BaseMapperDocsGen.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mybatisflex.test; + +import com.github.javaparser.JavaParser; +import com.github.javaparser.ParseResult; +import com.github.javaparser.ParserConfiguration; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.comments.JavadocComment; +import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName; +import com.github.javaparser.javadoc.Javadoc; +import com.github.javaparser.javadoc.description.JavadocDescription; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class BaseMapperDocsGen { + + public static void main(String[] args) throws IOException { + String mapperPath = System.getProperty("user.dir") + "/mybatis-flex-core/src/main/java/com/mybatisflex/core/BaseMapper.java"; + + List methodDescriptions = getMethodDescriptions(mapperPath); + + List insertMethods = new LinkedList<>(); + List deleteMethods = new LinkedList<>(); + List updateMethods = new LinkedList<>(); + List selectMethods = new LinkedList<>(); + List relationMethods = new LinkedList<>(); + List paginateMethods = new LinkedList<>(); + + methodDescriptions.stream() + .map(e -> e.replace("
", "")) + .map(e -> e.replace("\r\n", "")) + .map(e -> e.replaceFirst("\\{@code ", "`")) + .map(e -> e.replaceFirst("}", "`")) + .map(e -> e.replace("`}", "}`")) + .forEach(methodDescription -> { + if (methodDescription.contains("insert")) { + insertMethods.add(methodDescription); + } + if (methodDescription.contains("delete")) { + deleteMethods.add(methodDescription); + } + if (methodDescription.contains("update")) { + updateMethods.add(methodDescription); + } + if (methodDescription.contains("select")) { + selectMethods.add(methodDescription); + } + if (methodDescription.contains("Relation")) { + relationMethods.add(methodDescription); + } + if (methodDescription.contains("paginate")) { + paginateMethods.add(methodDescription); + } + }); + + String mdDir = System.getProperty("user.dir") + "/docs/zh/base/parts/"; + + writeString(new File(mdDir, "base-mapper-insert-methods.md"), insertMethods); + writeString(new File(mdDir, "base-mapper-delete-methods.md"), deleteMethods); + writeString(new File(mdDir, "base-mapper-update-methods.md"), updateMethods); + writeString(new File(mdDir, "base-mapper-query-methods.md"), selectMethods); + writeString(new File(mdDir, "base-mapper-relation-methods.md"), relationMethods); + writeString(new File(mdDir, "base-mapper-paginate-methods.md"), paginateMethods); + } + + public static void writeString(File file, List contents) throws IOException { + try (FileWriter fw = new FileWriter(file, false); + BufferedWriter bw = new BufferedWriter(fw)) { + for (String content : contents) { + bw.write(content); + bw.newLine(); + } + } + } + + public static List getMethodDescriptions(String mapperPath) throws IOException { + ParserConfiguration parserConfiguration = new ParserConfiguration(); + parserConfiguration.setLanguageLevel(ParserConfiguration.LanguageLevel.JAVA_8); + JavaParser javaParser = new JavaParser(); + ParseResult parseResult = javaParser.parse(Paths.get(mapperPath)); + Optional compilationUnitOpt = parseResult.getResult(); + List methodDescriptions = new LinkedList<>(); + if (compilationUnitOpt.isPresent()) { + CompilationUnit compilationUnit = compilationUnitOpt.get(); + List methodDeclarations = compilationUnit.stream() + .filter(e -> e instanceof MethodDeclaration) + .map(e -> (MethodDeclaration) e) + .collect(Collectors.toList()); + for (MethodDeclaration methodDeclaration : methodDeclarations) { + String methodName = methodDeclaration.getNameAsString(); + String params = methodDeclaration.getParameters() + .stream() + .map(NodeWithSimpleName::getNameAsString) + .collect(Collectors.joining(", ", "(", ")")); + String comment = methodDeclaration.getJavadocComment() + .map(JavadocComment::parse) + .map(Javadoc::getDescription) + .map(JavadocDescription::toText) + .orElse(""); + methodDescriptions.add("- **`" + methodName + params + "`**:" + comment); + } + } + return methodDescriptions; + } + +} From d161eb45ef9472a0b3045d2bacd6ac11f475b5e4 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Mon, 10 Jul 2023 23:51:51 +0800 Subject: [PATCH 4/5] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=20BaseMapper=20?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/parts/base-mapper-delete-methods.md | 12 ++-- .../base/parts/base-mapper-insert-methods.md | 23 +++---- .../parts/base-mapper-paginate-methods.md | 40 ++++++------ .../base/parts/base-mapper-query-methods.md | 64 +++++++++++-------- .../parts/base-mapper-relation-methods.md | 36 +++++------ .../base/parts/base-mapper-update-methods.md | 23 ++++--- 6 files changed, 105 insertions(+), 93 deletions(-) diff --git a/docs/zh/base/parts/base-mapper-delete-methods.md b/docs/zh/base/parts/base-mapper-delete-methods.md index c9d4182e..73c2139f 100644 --- a/docs/zh/base/parts/base-mapper-delete-methods.md +++ b/docs/zh/base/parts/base-mapper-delete-methods.md @@ -1,6 +1,6 @@ -- **`deleteById(id)`**: 根据主键删除数据。如果是多个主键的情况下,需要传入数组,例如:`new Integer[]{100,101``。 -- **`deleteBatchByIds(ids)`**: 根据多个主键批量删除数据。 -- **`deleteBatchByIds(ids, size)`**: 根据多个主键批量删除数据。 -- **`deleteByMap(Map`QueryWrapper.create().select(ACCOUNT.id).where(...);` -- **`selectObjectByQueryAs(queryWrapper, asType)`**: 查询第一列返回的数据,QueryWrapper 执行的结果应该只有 1 列,例如:
`QueryWrapper.create().select(ACCOUNT.id).where(...);` -- **`selectObjectListByQueryAs(queryWrapper, asType)`**: 查询第一列返回的数据集合,QueryWrapper 执行的结果应该只有 1 列,例如:
`QueryWrapper.create().select(ACCOUNT.id).where(...);` -- **`selectCountByQuery(queryWrapper)`**: 查询数据量。 -- **`selectCountByCondition(whereConditions)`**: 根据条件查询数据总量。 +- **`selectOneById(id)`**:根据主键查询数据。 +- **`selectOneByMap(whereConditions)`**:根据 Map 构建的条件来查询数据。 +- **`selectOneByCondition(whereConditions)`**:根据查询条件查询数据。 +- **`selectOneByQuery(queryWrapper)`**:根据查询条件来查询 1 条数据。 +- **`selectOneByQueryAs(queryWrapper, asType)`**:根据查询条件来查询 1 条数据。 +- **`selectOneWithRelationsByMap(whereConditions)`**:根据 Map 构建的条件来查询 1 条数据。 +- **`selectOneWithRelationsByCondition(whereConditions)`**:根据查询条件查询 1 条数据。 +- **`selectOneWithRelationsByQuery(queryWrapper)`**:根据查询条件来查询 1 条数据。 +- **`selectOneWithRelationsByQueryAs(queryWrapper, asType)`**:根据查询条件来查询 1 条数据。 +- **`selectListByIds(ids)`**:根据多个主键来查询多条数据。 +- **`selectListByMap(whereConditions)`**:根据 Map 来构建查询条件,查询多条数据。 +- **`selectListByMap(whereConditions, count)`**:根据 Map 来构建查询条件,查询多条数据。 +- **`selectListByCondition(whereConditions)`**:根据查询条件查询多条数据。 +- **`selectListByCondition(whereConditions, count)`**:根据查询条件查询多条数据。 +- **`selectListByQuery(queryWrapper)`**:根据查询条件查询数据列表。 +- **`selectListByQuery(queryWrapper, consumers)`**:根据查询条件查询数据列表。 +- **`selectCursorByQuery(queryWrapper)`**:根据查询条件查询游标数据,该方法必须在事务中才能正常使用,非事务下无法获取数据。 +- **`selectRowsByQuery(queryWrapper)`**:根据查询条件查询 Row 数据。 +- **`selectListByQueryAs(queryWrapper, asType)`**:根据查询条件查询数据列表,要求返回的数据为 asType。这种场景一般用在 left + join 时,有多出了实体类本身的字段内容,可以转换为 dto、vo 等场景。 +- **`selectListByQueryAs(queryWrapper, asType, consumers)`**:根据查询条件查询数据列表,要求返回的数据为 asType 类型。 +- **`selectListWithRelationsByQuery(queryWrapper)`**:查询实体类及其 Relation 注解字段。 +- **`selectListWithRelationsByQueryAs(queryWrapper, asType)`**:查询实体类及其 Relation 注解字段。 +- **`selectListWithRelationsByQueryAs(queryWrapper, asType, consumers)`**:查询实体类及其 Relation 注解字段。 +- **`selectAll()`**:查询全部数据。 +- **`selectAllWithRelations()`**:查询全部数据,及其 Relation 字段内容。 +- **`selectObjectByQuery(queryWrapper)`**:查询第一列返回的数据,QueryWrapper 执行的结果应该只有 1 + 列,例如:`QueryWrapper.create().select(ACCOUNT.id).where(...);` +- **`selectObjectByQueryAs(queryWrapper, asType)`**:查询第一列返回的数据,QueryWrapper 执行的结果应该只有 1 + 列,例如:`QueryWrapper.create().select(ACCOUNT.id).where(...);` +- **`selectObjectListByQuery(queryWrapper)`**:查询第一列返回的数据集合,QueryWrapper 执行的结果应该只有 1 + 列,例如:`QueryWrapper.create().select(ACCOUNT.id).where(...);` +- **`selectObjectListByQueryAs(queryWrapper, asType)`**:查询第一列返回的数据集合,QueryWrapper 执行的结果应该只有 1 + 列,例如:`QueryWrapper.create().select(ACCOUNT.id).where(...);` +- **`selectCountByQuery(queryWrapper)`**:查询数据量。 +- **`selectCountByCondition(whereConditions)`**:根据条件查询数据总量。 diff --git a/docs/zh/base/parts/base-mapper-relation-methods.md b/docs/zh/base/parts/base-mapper-relation-methods.md index 494a75df..24088fdf 100644 --- a/docs/zh/base/parts/base-mapper-relation-methods.md +++ b/docs/zh/base/parts/base-mapper-relation-methods.md @@ -1,18 +1,18 @@ -- **`selectOneWithRelationsByMap(Map Date: Mon, 10 Jul 2023 23:53:03 +0800 Subject: [PATCH 5/5] =?UTF-8?q?doc:=20changeLog=20=E6=94=BE=E5=88=B0?= =?UTF-8?q?=E9=A6=96=E9=A1=B5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vitepress/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 09e3d79b..0364cfe1 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -28,13 +28,13 @@ export default defineConfig({ {text: '帮助文档', link: '/zh/intro/what-is-mybatisflex'}, {text: '🔥常见问题', link: '/zh/faq'}, {text: '周边', link: '/zh/awesome-things'}, + {text: 'ChangeLog', link: 'https://gitee.com/mybatis-flex/mybatis-flex/blob/main/changes.md'}, { text: '获取源码', items: [ {text: 'Gitee', link: 'https://gitee.com/mybatis-flex/mybatis-flex'}, {text: 'Github', link: 'https://github.com/mybatis-flex/mybatis-flex'}, {text: '示例代码', link: 'https://gitee.com/mybatis-flex/mybatis-flex-samples'}, {text: '性能测试代码', link: 'https://gitee.com/mybatis-flex/mybatis-benchmark'}, - {text: 'ChangeLog', link: 'https://gitee.com/mybatis-flex/mybatis-flex/blob/main/changes.md'}, ] }, ],