feat: 添加数据库支持,保存测算记录

- 添加Spring Data JPA和H2/MySQL数据库依赖
- 创建DeductRecord实体类,保存测算记录
- 创建DeductRecordRepository和DeductRecordService
- 创建RecordController,提供记录查询和删除API
- 修改BaZiController,保存测算结果到数据库
- 配置H2数据库用于开发,MySQL用于生产环境
This commit is contained in:
H1d3rOne committed 2026-03-07 22:54:02 +08:00
1 parent 251a49d810
commit 683f55e4ca
7 files changed
+338

No files matched your search

+17
View File
@@ -106,6 +106,23 @@
<artifactId>okhttp</artifactId>
<version>4.9.3</version>
</dependency>
<!-- Spring Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- H2 Database (for development) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
@@ -1,12 +1,16 @@
package xuan.controller;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import xuan.core.bazi.BaZi;
import xuan.core.bazi.settings.BaZiJiChuSetting;
import xuan.core.bazi.settings.BaZiShenShaSetting;
import xuan.core.bazi.settings.BaZiGanZhiLiuYiSetting;
import xuan.entity.DeductRecord;
import xuan.service.HunYuanAiService;
import xuan.service.PromptTemplates;
import xuan.service.DeductRecordService;
import java.util.HashMap;
import java.util.Map;
@@ -16,6 +20,9 @@ import java.util.Map;
public class BaZiController {
private final HunYuanAiService aiService = new HunYuanAiService();
@Autowired
private DeductRecordService recordService;
@PostMapping("/paipan")
public Map<String, Object> paiPan(@RequestBody BaZiRequest request) {
@@ -49,6 +56,20 @@ public class BaZiController {
);
data.put("aiAnalysis", aiAnalysis);
DeductRecord record = new DeductRecord();
record.setUserId(request.getUserId() != null ? request.getUserId() : "default_user");
record.setType("bazi");
record.setName(request.getName() != null ? request.getName() : "某人");
record.setOccupy(request.getOccupy());
record.setSex(request.getSex());
record.setInputDate(request.getDate());
record.setInputData(JSON.toJSONString(request));
record.setResultData(JSON.toJSONString(data));
record.setAiAnalysis(aiAnalysis);
recordService.saveRecord(record);
data.put("recordId", record.getId());
result.put("success", true);
result.put("data", data);
} catch (Exception e) {
@@ -94,6 +115,7 @@ public class BaZiController {
}
public static class BaZiRequest {
private String userId;
private String name;
private String occupy;
private Integer sex;
@@ -109,6 +131,8 @@ public class BaZiController {
private Integer monthGanZhiType;
private Integer dayGanZhiType;
public String getUserId() { return userId; }
public void setUserId(String userId) { this.userId = userId; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getOccupy() { return occupy; }
@@ -0,0 +1,110 @@
package xuan.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import xuan.entity.DeductRecord;
import xuan.service.DeductRecordService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@RestController
@RequestMapping("/api/records")
public class RecordController {
@Autowired
private DeductRecordService recordService;
@GetMapping("/list")
public Map<String, Object> getRecords(@RequestParam String userId) {
Map<String, Object> result = new HashMap<>();
try {
List<DeductRecord> records = recordService.findByUserId(userId);
result.put("success", true);
result.put("data", records);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@GetMapping("/recent")
public Map<String, Object> getRecentRecords(@RequestParam String userId) {
Map<String, Object> result = new HashMap<>();
try {
List<DeductRecord> records = recordService.findRecentByUserId(userId);
result.put("success", true);
result.put("data", records);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@GetMapping("/type")
public Map<String, Object> getRecordsByType(
@RequestParam String userId,
@RequestParam String type) {
Map<String, Object> result = new HashMap<>();
try {
List<DeductRecord> records = recordService.findByUserIdAndType(userId, type);
result.put("success", true);
result.put("data", records);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@GetMapping("/detail")
public Map<String, Object> getRecordDetail(@RequestParam Long id) {
Map<String, Object> result = new HashMap<>();
try {
Optional<DeductRecord> record = recordService.findById(id);
if (record.isPresent()) {
result.put("success", true);
result.put("data", record.get());
} else {
result.put("success", false);
result.put("error", "记录不存在");
}
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@DeleteMapping("/delete")
public Map<String, Object> deleteRecord(@RequestParam Long id) {
Map<String, Object> result = new HashMap<>();
try {
recordService.deleteById(id);
result.put("success", true);
result.put("message", "删除成功");
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@DeleteMapping("/clear")
public Map<String, Object> clearRecords(@RequestParam String userId) {
Map<String, Object> result = new HashMap<>();
try {
recordService.deleteByUserId(userId);
result.put("success", true);
result.put("message", "清空成功");
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
}
@@ -0,0 +1,90 @@
package xuan.entity;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "deduct_record")
public class DeductRecord {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String userId;
@Column(nullable = false)
private String type;
@Column(nullable = false)
private String name;
private String occupy;
private Integer sex;
@Column(nullable = false)
private String inputDate;
@Column(columnDefinition = "TEXT")
private String inputData;
@Column(columnDefinition = "TEXT")
private String resultData;
@Column(columnDefinition = "TEXT")
private String aiAnalysis;
@Column(nullable = false, updatable = false)
private LocalDateTime createTime;
private LocalDateTime updateTime;
@PrePersist
protected void onCreate() {
createTime = LocalDateTime.now();
updateTime = createTime;
}
@PreUpdate
protected void onUpdate() {
updateTime = LocalDateTime.now();
}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getUserId() { return userId; }
public void setUserId(String userId) { this.userId = userId; }
public String getType() { return type; }
public void setType(String type) { this.type = type; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getOccupy() { return occupy; }
public void setOccupy(String occupy) { this.occupy = occupy; }
public Integer getSex() { return sex; }
public void setSex(Integer sex) { this.sex = sex; }
public String getInputDate() { return inputDate; }
public void setInputDate(String inputDate) { this.inputDate = inputDate; }
public String getInputData() { return inputData; }
public void setInputData(String inputData) { this.inputData = inputData; }
public String getResultData() { return resultData; }
public void setResultData(String resultData) { this.resultData = resultData; }
public String getAiAnalysis() { return aiAnalysis; }
public void setAiAnalysis(String aiAnalysis) { this.aiAnalysis = aiAnalysis; }
public LocalDateTime getCreateTime() { return createTime; }
public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; }
public LocalDateTime getUpdateTime() { return updateTime; }
public void setUpdateTime(LocalDateTime updateTime) { this.updateTime = updateTime; }
}
@@ -0,0 +1,20 @@
package xuan.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import xuan.entity.DeductRecord;
import java.util.List;
@Repository
public interface DeductRecordRepository extends JpaRepository<DeductRecord, Long> {
List<DeductRecord> findByUserIdOrderByCreateTimeDesc(String userId);
List<DeductRecord> findByUserIdAndTypeOrderByCreateTimeDesc(String userId, String type);
@Query("SELECT d FROM DeductRecord d WHERE d.userId = :userId ORDER BY d.createTime DESC LIMIT 10")
List<DeductRecord> findTop10ByUserIdOrderByCreateTimeDesc(@Param("userId") String userId);
}
@@ -0,0 +1,49 @@
package xuan.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import xuan.entity.DeductRecord;
import xuan.repository.DeductRecordRepository;
import java.util.List;
import java.util.Optional;
@Service
public class DeductRecordService {
@Autowired
private DeductRecordRepository recordRepository;
@Transactional
public DeductRecord saveRecord(DeductRecord record) {
return recordRepository.save(record);
}
public Optional<DeductRecord> findById(Long id) {
return recordRepository.findById(id);
}
public List<DeductRecord> findByUserId(String userId) {
return recordRepository.findByUserIdOrderByCreateTimeDesc(userId);
}
public List<DeductRecord> findByUserIdAndType(String userId, String type) {
return recordRepository.findByUserIdAndTypeOrderByCreateTimeDesc(userId, type);
}
public List<DeductRecord> findRecentByUserId(String userId) {
return recordRepository.findTop10ByUserIdOrderByCreateTimeDesc(userId);
}
@Transactional
public void deleteById(Long id) {
recordRepository.deleteById(id);
}
@Transactional
public void deleteByUserId(String userId) {
List<DeductRecord> records = recordRepository.findByUserIdOrderByCreateTimeDesc(userId);
recordRepository.deleteAll(records);
}
}
+28
View File
@@ -1,2 +1,30 @@
server.port=8080
spring.application.name=xuan-utils-pro
# H2 Database Configuration (Development)
spring.datasource.url=jdbc:h2:file:./data/xuan;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# JPA Configuration
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
# H2 Console (Development only)
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
# MySQL Configuration (Production - uncomment when needed)
#spring.datasource.url=jdbc:mysql://localhost:3306/xuan_deduct?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
#spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
#spring.datasource.username=root
#spring.datasource.password=your_password
#spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
#spring.jpa.hibernate.ddl-auto=update
# Logging
logging.level.xuan=DEBUG
logging.level.org.hibernate.SQL=DEBUG