diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..52f30edef0c129bca134c38f3a88f14e69f0989b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# Ask Data
+借助大语言模型, 通过提问对话方式, 获取数据图表.
diff --git a/pom.xml b/pom.xml
index cfad9098af32e5bee5837686aae6cb107598320c..975658c4bb5355357acc6fd0d1ca1c8f78dc9376 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,7 +76,15 @@
commons-text
1.9
-
+
+ mysql
+ mysql-connector-java
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 2.1.0
+
org.springframework.boot
spring-boot-starter-web
diff --git a/src/main/java/org/enthusa/askdata/config/MapperConfiguration.java b/src/main/java/org/enthusa/askdata/config/MapperConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..389f6a31fe78360ddc78f7f853403c9ea1907043
--- /dev/null
+++ b/src/main/java/org/enthusa/askdata/config/MapperConfiguration.java
@@ -0,0 +1,40 @@
+package org.enthusa.askdata.config;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.enthusa.avatar.mybatis.helper.MapperHelper;
+import org.enthusa.avatar.mybatis.helper.PageInterceptor;
+import org.enthusa.avatar.mybatis.mapper.SqlMapper;
+import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author henry
+ * @date 2023/6/24
+ */
+@Configuration
+@AutoConfigureAfter(MybatisAutoConfiguration.class)
+public class MapperConfiguration {
+ @Resource
+ private List sqlSessionFactoryList;
+
+ @Resource
+ private ApplicationContext applicationContext;
+
+ @PostConstruct
+ public void addMapperInterceptor() {
+ MapperHelper mapperHelper = new MapperHelper();
+ PageInterceptor interceptor = new PageInterceptor();
+ applicationContext.getBeansOfType(SqlMapper.class);
+ mapperHelper.registerMapper(SqlMapper.class);
+ for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) {
+ sqlSessionFactory.getConfiguration().addInterceptor(interceptor);
+ mapperHelper.processConfiguration(sqlSessionFactory.getConfiguration());
+ }
+ }
+}
diff --git a/src/main/java/org/enthusa/askdata/controller/BiPostController.java b/src/main/java/org/enthusa/askdata/controller/BiPostController.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac4f12dfe114e6a33567459955569e9f59b64506
--- /dev/null
+++ b/src/main/java/org/enthusa/askdata/controller/BiPostController.java
@@ -0,0 +1,69 @@
+package org.enthusa.askdata.controller;
+
+import org.enthusa.askdata.entity.BiPost;
+import org.enthusa.askdata.mapper.BiPostMapper;
+import org.enthusa.avatar.face.type.PageModel;
+import org.enthusa.avatar.face.type.Result;
+import org.enthusa.avatar.face.utils.ResultUtil;
+import org.enthusa.avatar.face.utils.Validate;
+import org.springframework.beans.BeanUtils;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api")
+public class BiPostController {
+ @Resource
+ private BiPostMapper biPostMapper;
+
+ @GetMapping("/posts")
+ public Result index(
+ @RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
+ @RequestParam(value = "pageSize", required = false, defaultValue = "20") Integer pageSize
+ ) {
+ PageModel pageModel = new PageModel<>();
+ pageModel.setPageAndPageSize(page, pageSize);
+ List postList = biPostMapper.selectByPage(pageModel);
+ pageModel.setList(postList);
+ return ResultUtil.success(pageModel);
+ }
+
+ @GetMapping("/posts/{id}")
+ public Result show(@PathVariable("id") Integer id) {
+ Validate.idValid("id", id);
+ BiPost post = biPostMapper.selectByPrimaryKey(id);
+ Validate.hasRecord("id", id, post);
+ return ResultUtil.success(post);
+ }
+
+ @PostMapping("/posts")
+ public Result create(@RequestBody @Valid BiPost biPost, BindingResult bindingResult) {
+ if (bindingResult.hasErrors()) {
+ Validate.isRecord(true, bindingResult.getFieldError().getDefaultMessage());
+ }
+
+ BiPost post = new BiPost();
+ BeanUtils.copyProperties(biPost, post);
+ biPostMapper.insertSelective(post);
+ return ResultUtil.success(post);
+ }
+
+ @PutMapping("/posts/{id}")
+ public Result update(@PathVariable("id") Integer id, @RequestBody @Valid BiPost biPost, BindingResult bindingResult) {
+ if (bindingResult.hasErrors()) {
+ Validate.isRecord(true, bindingResult.getFieldError().getDefaultMessage());
+ }
+
+ Validate.idValid("id", id);
+ BiPost post = biPostMapper.selectByPrimaryKey(id);
+ Validate.hasRecord("id", id, post);
+
+ BeanUtils.copyProperties(biPost, post);
+ biPostMapper.updateByPrimaryKey(post);
+ return ResultUtil.success(post);
+ }
+}
diff --git a/src/main/java/org/enthusa/askdata/entity/BiPost.java b/src/main/java/org/enthusa/askdata/entity/BiPost.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e2c5c75a88016682abf2e9920f44bd6040e956f
--- /dev/null
+++ b/src/main/java/org/enthusa/askdata/entity/BiPost.java
@@ -0,0 +1,32 @@
+package org.enthusa.askdata.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class BiPost {
+ /**
+ * id
+ */
+ private Integer id;
+
+ /**
+ * title
+ */
+ private String title;
+
+ /**
+ * create_time
+ */
+ private Date createTime;
+
+ /**
+ * update_time
+ */
+ private Date updateTime;
+
+ public void setTitle(String title) {
+ this.title = title == null ? null : title.trim();
+ }
+}
diff --git a/src/main/java/org/enthusa/askdata/mapper/BiPostMapper.java b/src/main/java/org/enthusa/askdata/mapper/BiPostMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..08b28dfa68b1d4847bf511097c50b9f9c8f6ab76
--- /dev/null
+++ b/src/main/java/org/enthusa/askdata/mapper/BiPostMapper.java
@@ -0,0 +1,12 @@
+package org.enthusa.askdata.mapper;
+
+import org.enthusa.askdata.entity.BiPost;
+import org.apache.ibatis.annotations.Mapper;
+import org.enthusa.avatar.mybatis.mapper.SqlMapper;
+
+@Mapper
+public interface BiPostMapper extends SqlMapper {
+ int insertSelective(BiPost record);
+
+ int updateByPrimaryKeySelective(BiPost record);
+}
diff --git a/src/main/resources/import.sql b/src/main/resources/import.sql
new file mode 100644
index 0000000000000000000000000000000000000000..c7e613136217c21ca720467bd7913209374232a2
--- /dev/null
+++ b/src/main/resources/import.sql
@@ -0,0 +1,6 @@
+CREATE TABLE bi_post (
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ title VARCHAR(255),
+ create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
+);
diff --git a/src/main/resources/org/enthusa/askdata/mapper/BiPostMapper.xml b/src/main/resources/org/enthusa/askdata/mapper/BiPostMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d208fbb0dd14c1b1e0752c993d01ff7443ca5e41
--- /dev/null
+++ b/src/main/resources/org/enthusa/askdata/mapper/BiPostMapper.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+ id, title, create_time, update_time
+
+
+ insert into bi_post
+
+
+ title,
+
+
+
+
+ #{title,jdbcType=VARCHAR},
+
+
+
+
+ update bi_post
+
+
+ title = #{title,jdbcType=VARCHAR},
+
+
+ where id = #{id,jdbcType=INTEGER}
+
+
diff --git a/src/test/java/org/enthusa/askdata/AbstractTest.java b/src/test/java/org/enthusa/askdata/AbstractTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a4d8e63c2ea88c5d203ba0c5db375a4960c4600
--- /dev/null
+++ b/src/test/java/org/enthusa/askdata/AbstractTest.java
@@ -0,0 +1,14 @@
+package org.enthusa.askdata;
+
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author henry
+ * @date 2023/6/24
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public abstract class AbstractTest {
+}
diff --git a/src/test/java/org/enthusa/askdata/mapper/BiPostMapperTest.java b/src/test/java/org/enthusa/askdata/mapper/BiPostMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c5c4cf6aadf5ee35e38b87f8a14fded4bdc950c1
--- /dev/null
+++ b/src/test/java/org/enthusa/askdata/mapper/BiPostMapperTest.java
@@ -0,0 +1,25 @@
+package org.enthusa.askdata.mapper;
+
+import org.enthusa.askdata.AbstractTest;
+import org.enthusa.askdata.entity.BiPost;
+import org.enthusa.avatar.face.type.PageModel;
+import org.junit.Test;
+
+import javax.annotation.Resource;
+
+/**
+ * @author henry
+ * @date 2023/6/24
+ */
+public class BiPostMapperTest extends AbstractTest {
+ @Resource
+ private BiPostMapper biPostMapper;
+
+ @Test
+ public void test() {
+ PageModel pageModel = new PageModel<>();
+ pageModel.setOrders("id");
+ biPostMapper.selectByPage(pageModel).forEach(System.out::println);
+
+ }
+}