Commit d3c206b4 by Ford

添加了用户画像的创建和查询相关世界的用户画像

parent fb5e23a9
......@@ -211,7 +211,7 @@
},
"npc_role_detail_translations": {
"roleName": "角色名",
"roleName": "角色名",
"introduction": "简介",
"consumptionExpectations": "消费心理预期",
"psychologicalTraits": "心理特征",
......
package controllers
import (
"WorldEpcho/src/config"
"WorldEpcho/src/config/e"
database "WorldEpcho/src/datasource"
"WorldEpcho/src/models"
"WorldEpcho/src/service"
"WorldEpcho/src/utils"
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
......@@ -33,38 +35,17 @@ import (
*/
//创建角色画像的请求体
type NpcRoleRequest struct {
Name string `json:"name"` // 名称
Details Details `json:"details"` //详情
Gender string `json:"gender"` //性别
Tags string `json:"tags"` //世界标签集
RelatedWorlds string `json:"relatedWorlds"` //相关世界
UpdateTime int64 `json:"updateTime"` //更新时间
CreateTime int64 `json:"createTime"` //构造时间
ServiceProviderId string `json:"authId,omitempty"` // ServiceProviderId
Name string `json:"name"` // 名称
Details models.Details `json:"details"` //详情
Gender string `json:"gender"` //性别
Tags string `json:"tags"` //世界标签集
RelatedWorlds string `json:"relatedWorlds"` //相关世界
UpdateTime int64 `json:"updateTime"` //更新时间
CreateTime int64 `json:"createTime"` //构造时间
ServiceProviderId string `json:"authId,omitempty"` // ServiceProviderId
}
// Detail 用于解析详细信息中的 JSON 字符串
type Details struct {
RoleName string `json:"roleName"` //角色名称
Introduction Introduction `json:"introduction"` //简介
ConsumptionExpectations []string `json:"consumptionExpectations"` //消费心理预期
PsychologicalTraits []string `json:"psychologicalTraits"` //心理特征
Appearance string `json:"appearance"` //外观
Personality string `json:"personality"` //性格
DecisionMakingStyle string `json:"decisionMakingStyle"` //决策风格
RiskPreference string `json:"riskPreference"` //风险偏好
AttitudeTowardsUsers string `json:"attitudeTowardsUsers"` //对用户的态度
}
//个人传记 Personal profile
type Introduction struct {
EducationLevel string `json:"educationLevel"` //教育水平
ProfessionalBackground string `json:"professionalBackground"` //职业背景
Purpose string `json:"purpose"` //目的性
KnownInformation string `json:"knownInformation"` //已知信息
}
//创建Npc用户画像的接口
func CreateNpcUserPortrait(ctx *gin.Context) {
......@@ -138,24 +119,22 @@ func CreateNpcUserPortrait(ctx *gin.Context) {
/* configData 英文键转换为中文 */
/*
var data map[string]interface{}
if err := json.Unmarshal([]byte(string(detailsJSON)), &data); err != nil {
ctx.JSON(http.StatusOK, gin.H{"code": e.ParamParseError, "data": nil, "message": "解析用户画像详细信息数据出错"})
return
}
// 转换键名 => 英文转中文
NpcRoleDetailTranslations := config.Conf.NpcRoleDetailTranslations
translatedData := utils.TranslateKeysEnglishToChinese(NpcRoleDetailTranslations, data)
translatedJSON, err := json.MarshalIndent(translatedData, "", " ")
if err != nil {
fmt.Println("Error marshalling JSON:", err)
ctx.JSON(http.StatusOK, gin.H{"code": e.ParamParseError, "data": nil, "message": "解析用户画像详细信息数据出错"})
return
}
fmt.Println(" Details translatedJSON ==> ", string(translatedJSON))
*/
var data map[string]interface{}
if err := json.Unmarshal([]byte(string(detailsJSON)), &data); err != nil {
ctx.JSON(http.StatusOK, gin.H{"code": e.ParamParseError, "data": nil, "message": "解析用户画像详细信息数据出错"})
return
}
// 转换键名 => 英文转中文
NpcRoleDetailTranslations := config.Conf.NpcRoleDetailTranslations
translatedData := utils.TranslateKeysEnglishToChinese(NpcRoleDetailTranslations, data)
translatedJSON, err := json.MarshalIndent(translatedData, "", " ")
if err != nil {
fmt.Println("Error marshalling JSON:", err)
ctx.JSON(http.StatusOK, gin.H{"code": e.ParamParseError, "data": nil, "message": "解析用户画像详细信息数据出错"})
return
}
fmt.Println(" Details translatedJSON ==> ", string(translatedJSON))
// 创建一个空切片存储相关世界
relatedWorldIds := []int64{}
......@@ -178,16 +157,18 @@ func CreateNpcUserPortrait(ctx *gin.Context) {
}
//用户画像详情信息
// 将Details结构体转换为 JSON
jsonData, err := json.Marshal(NpcRequest.Details)
if err != nil {
fmt.Println("Error:", err)
return
}
/*
// 将Details结构体转换为 JSON
jsonData, err := json.Marshal(NpcRequest.Details)
if err != nil {
fmt.Println("Error:", err)
return
}
*/
npcUserRole := &models.NpcRole{
Name: NpcRequest.Name,
Details: string(jsonData),
Details: string(translatedJSON),
Gender: NpcRequest.Gender,
Tags: matchingTags,
RelatedWorlds: relatedWorldIds,
......@@ -296,6 +277,30 @@ func QueryNpcRoleInfo(ctx *gin.Context) {
fmt.Println("根据相关世界ID查询用户画像信息出错")
return
}
/*
转换世界配置信息中的英文字段
*/
var data map[string]interface{}
for i, npcRole := range npcRoles {
if err := json.Unmarshal([]byte(npcRole.Details), &data); err != nil {
ctx.JSON(http.StatusOK, gin.H{"code": e.ParamParseError, "data": nil, "message": "解析用户画像详情信息数据出错"})
return
}
// 转换键名
// 中文转英文
ReverseTranslations := config.Conf.NpcRoleDetailReverseTranslations
translatedData := utils.TranslateKeysChineseToEnglish(ReverseTranslations, data)
translatedJSON, err := json.MarshalIndent(translatedData, "", " ")
if err != nil {
fmt.Println("Error marshalling JSON:", err)
ctx.JSON(http.StatusOK, gin.H{"code": e.ParamParseError, "data": nil, "message": "解析用户画像详情信息数据出错"})
return
}
npcRoles[i].Details = string(translatedJSON)
fmt.Println(" configData translatedJSON ==> ", string(translatedJSON))
}
//提交事务
err = session.Commit()
if err != nil {
......
......@@ -4,7 +4,6 @@ import (
"WorldEpcho/src/config"
"WorldEpcho/src/datasource"
"WorldEpcho/src/https_auth"
"WorldEpcho/src/models"
"WorldEpcho/src/routers"
"WorldEpcho/src/service"
"WorldEpcho/src/utils"
......@@ -25,10 +24,10 @@ func main() {
config.RandInit()
datasource.InitMysql()
// 同步结构体与数据库表
err := datasource.Engine.Sync2(new(models.NpcRole))
if err != nil {
fmt.Printf("创建表失败:", err)
}
//err := datasource.Engine.Sync2(new(models.NpcRole))
//if err != nil {
// fmt.Printf("创建表失败:", err)
//}
//生成一个9位的邀请码
//println("生成一个9位的邀请码: ", utils.GenerateInviteCode(1))
......
......@@ -20,6 +20,27 @@ type NpcRole struct {
ServiceProviderId string `xorm:"-" json:"authId,omitempty"` // ServiceProviderId 在数据库中忽略
}
// Detail 用于解析详细信息中的 JSON 字符串
type Details struct {
RoleName string `json:"roleName"` //角色名称
Introduction Introduction `json:"introduction"` //简介
ConsumptionExpectations []string `json:"consumptionExpectations"` //消费心理预期
PsychologicalTraits []string `json:"psychologicalTraits"` //心理特征
Appearance string `json:"appearance"` //外观
Personality string `json:"personality"` //性格
DecisionMakingStyle string `json:"decisionMakingStyle"` //决策风格
RiskPreference string `json:"riskPreference"` //风险偏好
AttitudeTowardsUsers string `json:"attitudeTowardsUsers"` //对用户的态度
}
//个人传记 Personal profile
type Introduction struct {
EducationLevel string `json:"educationLevel"` //教育水平
ProfessionalBackground string `json:"professionalBackground"` //职业背景
Purpose string `json:"purpose"` //目的性
KnownInformation string `json:"knownInformation"` //已知信息
}
// 增加一个新的 NPC 角色
func CreateNpcRole(session *xorm.Session, npcRole *NpcRole) (*NpcRole, error) {
_, err := session.Insert(npcRole)
......@@ -62,7 +83,7 @@ func UpdateNpcRole(npcRole *NpcRole) error {
}
// 根据 ID 查询单个 NPC 角色
func GetNpcRoleByID(id int) (*NpcRole, error) {
func GetNpcRoleByID(id int64) (*NpcRole, error) {
npcRole := new(NpcRole)
has, err := datasource.Engine.ID(id).Get(npcRole)
if err != nil {
......
......@@ -126,7 +126,8 @@ type WorldErrorMessage struct {
// Wrapper 结构体仅包含一个字符串字段,用于存储 JSON 字符串
type Wrapper struct {
ConfigData map[string]interface{} `json:"ConfigData"`
ConfigData map[string]interface{} `json:"ConfigData"`
EmbeddingNpcs []map[string]interface{} `json:"EmbeddingNpcs" `
}
//世界websocket控制器
......@@ -245,6 +246,7 @@ func WorldWsHandler(ctx *gin.Context) {
world_Id := ctx.Query("worldId")
var world *models.WorldInfo
var userInfo string
var roleInfo *models.NpcRole
if worldName != "" {
world, err = models.GetWorldInfoByName(worldName)
......@@ -279,6 +281,20 @@ func WorldWsHandler(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{"code": e.NotFound, "data": nil, "message": "世界名称不存在"})
return
}
NpcRoleId := ctx.Query("NpcRoleId")
if NpcRoleId != "" {
NpcRole_Id, err := strconv.ParseInt(NpcRoleId, 10, 64)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户画像ID类型转换出错"})
return
}
roleInfo, err = models.GetNpcRoleByID(NpcRole_Id)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户画像ID查询画像信息出错"})
return
}
}
if b || SP != nil {
fmt.Println("ServiceProvider ===> ", SP)
......@@ -287,6 +303,7 @@ func WorldWsHandler(ctx *gin.Context) {
if user_info != "" {
userInfo = user_info
}
//拼接会话主题
//ConversationTitle = "用户Id为" + user_Id + "的用户和数字人" + strings.Join(DpNames, "和") + "开始会话"
//fmt.Println("ConversationTitle: ", ConversationTitle)
......@@ -295,10 +312,22 @@ func WorldWsHandler(ctx *gin.Context) {
BgInfo = world.Background
}
if user_info == "" {
// 创建 Wrapper 实例并将 JSON 字符串封装
//var details models.Details
//若用户画像存在
// 创建 Wrapper 实例并将 JSON 字符串封装
wrapper := Wrapper{ConfigData: make(map[string]interface{})}
fmt.Println("world.ConfigData ==> ", world.ConfigData)
if roleInfo != nil {
var npcMap map[string]interface{}
err = json.Unmarshal([]byte(roleInfo.Details), &npcMap)
if err != nil {
log.Fatalf("Error unmarshalling JSON: %v", err)
}
wrapper.EmbeddingNpcs = append(wrapper.EmbeddingNpcs, npcMap)
}
// 将 JSON 字符串解析为 map[string]interface{}
//err := json.Unmarshal([]byte(world.ConfigData), &wrapper.ConfigData)
err := json.Unmarshal([]byte(world.ConfigData), &wrapper.ConfigData)
if err != nil {
log.Printf("Error parsing JSON: %v", err)
......@@ -307,7 +336,6 @@ func WorldWsHandler(ctx *gin.Context) {
// 打印解析后的数据
//fmt.Printf("Wrapper ConfigData: %+v\n", wrapper.ConfigData)
// 序列化 Wrapper 实例以生成所需的最终 JSON 输出
finalJSON, err := json.Marshal(wrapper)
if err != nil {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment