Commit d3c206b4 by Ford

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

parent fb5e23a9
...@@ -211,7 +211,7 @@ ...@@ -211,7 +211,7 @@
}, },
"npc_role_detail_translations": { "npc_role_detail_translations": {
"roleName": "角色名", "roleName": "角色名",
"introduction": "简介", "introduction": "简介",
"consumptionExpectations": "消费心理预期", "consumptionExpectations": "消费心理预期",
"psychologicalTraits": "心理特征", "psychologicalTraits": "心理特征",
......
package controllers package controllers
import ( import (
"WorldEpcho/src/config"
"WorldEpcho/src/config/e" "WorldEpcho/src/config/e"
database "WorldEpcho/src/datasource" database "WorldEpcho/src/datasource"
"WorldEpcho/src/models" "WorldEpcho/src/models"
"WorldEpcho/src/service" "WorldEpcho/src/service"
"WorldEpcho/src/utils"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
...@@ -34,7 +36,7 @@ import ( ...@@ -34,7 +36,7 @@ import (
//创建角色画像的请求体 //创建角色画像的请求体
type NpcRoleRequest struct { type NpcRoleRequest struct {
Name string `json:"name"` // 名称 Name string `json:"name"` // 名称
Details Details `json:"details"` //详情 Details models.Details `json:"details"` //详情
Gender string `json:"gender"` //性别 Gender string `json:"gender"` //性别
Tags string `json:"tags"` //世界标签集 Tags string `json:"tags"` //世界标签集
RelatedWorlds string `json:"relatedWorlds"` //相关世界 RelatedWorlds string `json:"relatedWorlds"` //相关世界
...@@ -44,27 +46,6 @@ type NpcRoleRequest struct { ...@@ -44,27 +46,6 @@ type NpcRoleRequest struct {
} }
// 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用户画像的接口 //创建Npc用户画像的接口
func CreateNpcUserPortrait(ctx *gin.Context) { func CreateNpcUserPortrait(ctx *gin.Context) {
...@@ -138,7 +119,6 @@ func CreateNpcUserPortrait(ctx *gin.Context) { ...@@ -138,7 +119,6 @@ func CreateNpcUserPortrait(ctx *gin.Context) {
/* configData 英文键转换为中文 */ /* configData 英文键转换为中文 */
/*
var data map[string]interface{} var data map[string]interface{}
if err := json.Unmarshal([]byte(string(detailsJSON)), &data); err != nil { if err := json.Unmarshal([]byte(string(detailsJSON)), &data); err != nil {
ctx.JSON(http.StatusOK, gin.H{"code": e.ParamParseError, "data": nil, "message": "解析用户画像详细信息数据出错"}) ctx.JSON(http.StatusOK, gin.H{"code": e.ParamParseError, "data": nil, "message": "解析用户画像详细信息数据出错"})
...@@ -155,7 +135,6 @@ func CreateNpcUserPortrait(ctx *gin.Context) { ...@@ -155,7 +135,6 @@ func CreateNpcUserPortrait(ctx *gin.Context) {
return return
} }
fmt.Println(" Details translatedJSON ==> ", string(translatedJSON)) fmt.Println(" Details translatedJSON ==> ", string(translatedJSON))
*/
// 创建一个空切片存储相关世界 // 创建一个空切片存储相关世界
relatedWorldIds := []int64{} relatedWorldIds := []int64{}
...@@ -178,16 +157,18 @@ func CreateNpcUserPortrait(ctx *gin.Context) { ...@@ -178,16 +157,18 @@ func CreateNpcUserPortrait(ctx *gin.Context) {
} }
//用户画像详情信息 //用户画像详情信息
/*
// 将Details结构体转换为 JSON // 将Details结构体转换为 JSON
jsonData, err := json.Marshal(NpcRequest.Details) jsonData, err := json.Marshal(NpcRequest.Details)
if err != nil { if err != nil {
fmt.Println("Error:", err) fmt.Println("Error:", err)
return return
} }
*/
npcUserRole := &models.NpcRole{ npcUserRole := &models.NpcRole{
Name: NpcRequest.Name, Name: NpcRequest.Name,
Details: string(jsonData), Details: string(translatedJSON),
Gender: NpcRequest.Gender, Gender: NpcRequest.Gender,
Tags: matchingTags, Tags: matchingTags,
RelatedWorlds: relatedWorldIds, RelatedWorlds: relatedWorldIds,
...@@ -296,6 +277,30 @@ func QueryNpcRoleInfo(ctx *gin.Context) { ...@@ -296,6 +277,30 @@ func QueryNpcRoleInfo(ctx *gin.Context) {
fmt.Println("根据相关世界ID查询用户画像信息出错") fmt.Println("根据相关世界ID查询用户画像信息出错")
return 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() err = session.Commit()
if err != nil { if err != nil {
......
...@@ -4,7 +4,6 @@ import ( ...@@ -4,7 +4,6 @@ import (
"WorldEpcho/src/config" "WorldEpcho/src/config"
"WorldEpcho/src/datasource" "WorldEpcho/src/datasource"
"WorldEpcho/src/https_auth" "WorldEpcho/src/https_auth"
"WorldEpcho/src/models"
"WorldEpcho/src/routers" "WorldEpcho/src/routers"
"WorldEpcho/src/service" "WorldEpcho/src/service"
"WorldEpcho/src/utils" "WorldEpcho/src/utils"
...@@ -25,10 +24,10 @@ func main() { ...@@ -25,10 +24,10 @@ func main() {
config.RandInit() config.RandInit()
datasource.InitMysql() datasource.InitMysql()
// 同步结构体与数据库表 // 同步结构体与数据库表
err := datasource.Engine.Sync2(new(models.NpcRole)) //err := datasource.Engine.Sync2(new(models.NpcRole))
if err != nil { //if err != nil {
fmt.Printf("创建表失败:", err) // fmt.Printf("创建表失败:", err)
} //}
//生成一个9位的邀请码 //生成一个9位的邀请码
//println("生成一个9位的邀请码: ", utils.GenerateInviteCode(1)) //println("生成一个9位的邀请码: ", utils.GenerateInviteCode(1))
......
...@@ -20,6 +20,27 @@ type NpcRole struct { ...@@ -20,6 +20,27 @@ type NpcRole struct {
ServiceProviderId string `xorm:"-" json:"authId,omitempty"` // ServiceProviderId 在数据库中忽略 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 角色 // 增加一个新的 NPC 角色
func CreateNpcRole(session *xorm.Session, npcRole *NpcRole) (*NpcRole, error) { func CreateNpcRole(session *xorm.Session, npcRole *NpcRole) (*NpcRole, error) {
_, err := session.Insert(npcRole) _, err := session.Insert(npcRole)
...@@ -62,7 +83,7 @@ func UpdateNpcRole(npcRole *NpcRole) error { ...@@ -62,7 +83,7 @@ func UpdateNpcRole(npcRole *NpcRole) error {
} }
// 根据 ID 查询单个 NPC 角色 // 根据 ID 查询单个 NPC 角色
func GetNpcRoleByID(id int) (*NpcRole, error) { func GetNpcRoleByID(id int64) (*NpcRole, error) {
npcRole := new(NpcRole) npcRole := new(NpcRole)
has, err := datasource.Engine.ID(id).Get(npcRole) has, err := datasource.Engine.ID(id).Get(npcRole)
if err != nil { if err != nil {
......
...@@ -127,6 +127,7 @@ type WorldErrorMessage struct { ...@@ -127,6 +127,7 @@ type WorldErrorMessage struct {
// Wrapper 结构体仅包含一个字符串字段,用于存储 JSON 字符串 // Wrapper 结构体仅包含一个字符串字段,用于存储 JSON 字符串
type Wrapper struct { type Wrapper struct {
ConfigData map[string]interface{} `json:"ConfigData"` ConfigData map[string]interface{} `json:"ConfigData"`
EmbeddingNpcs []map[string]interface{} `json:"EmbeddingNpcs" `
} }
//世界websocket控制器 //世界websocket控制器
...@@ -245,6 +246,7 @@ func WorldWsHandler(ctx *gin.Context) { ...@@ -245,6 +246,7 @@ func WorldWsHandler(ctx *gin.Context) {
world_Id := ctx.Query("worldId") world_Id := ctx.Query("worldId")
var world *models.WorldInfo var world *models.WorldInfo
var userInfo string var userInfo string
var roleInfo *models.NpcRole
if worldName != "" { if worldName != "" {
world, err = models.GetWorldInfoByName(worldName) world, err = models.GetWorldInfoByName(worldName)
...@@ -279,6 +281,20 @@ func WorldWsHandler(ctx *gin.Context) { ...@@ -279,6 +281,20 @@ func WorldWsHandler(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{"code": e.NotFound, "data": nil, "message": "世界名称不存在"}) ctx.JSON(http.StatusOK, gin.H{"code": e.NotFound, "data": nil, "message": "世界名称不存在"})
return 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 { if b || SP != nil {
fmt.Println("ServiceProvider ===> ", SP) fmt.Println("ServiceProvider ===> ", SP)
...@@ -287,6 +303,7 @@ func WorldWsHandler(ctx *gin.Context) { ...@@ -287,6 +303,7 @@ func WorldWsHandler(ctx *gin.Context) {
if user_info != "" { if user_info != "" {
userInfo = user_info userInfo = user_info
} }
//拼接会话主题 //拼接会话主题
//ConversationTitle = "用户Id为" + user_Id + "的用户和数字人" + strings.Join(DpNames, "和") + "开始会话" //ConversationTitle = "用户Id为" + user_Id + "的用户和数字人" + strings.Join(DpNames, "和") + "开始会话"
//fmt.Println("ConversationTitle: ", ConversationTitle) //fmt.Println("ConversationTitle: ", ConversationTitle)
...@@ -295,10 +312,22 @@ func WorldWsHandler(ctx *gin.Context) { ...@@ -295,10 +312,22 @@ func WorldWsHandler(ctx *gin.Context) {
BgInfo = world.Background BgInfo = world.Background
} }
if user_info == "" { if user_info == "" {
// 创建 Wrapper 实例并将 JSON 字符串封装 //var details models.Details
//若用户画像存在
// 创建 Wrapper 实例并将 JSON 字符串封装
wrapper := Wrapper{ConfigData: make(map[string]interface{})} 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{} // 将 JSON 字符串解析为 map[string]interface{}
//err := json.Unmarshal([]byte(world.ConfigData), &wrapper.ConfigData)
err := json.Unmarshal([]byte(world.ConfigData), &wrapper.ConfigData) err := json.Unmarshal([]byte(world.ConfigData), &wrapper.ConfigData)
if err != nil { if err != nil {
log.Printf("Error parsing JSON: %v", err) log.Printf("Error parsing JSON: %v", err)
...@@ -307,7 +336,6 @@ func WorldWsHandler(ctx *gin.Context) { ...@@ -307,7 +336,6 @@ func WorldWsHandler(ctx *gin.Context) {
// 打印解析后的数据 // 打印解析后的数据
//fmt.Printf("Wrapper ConfigData: %+v\n", wrapper.ConfigData) //fmt.Printf("Wrapper ConfigData: %+v\n", wrapper.ConfigData)
// 序列化 Wrapper 实例以生成所需的最终 JSON 输出 // 序列化 Wrapper 实例以生成所需的最终 JSON 输出
finalJSON, err := json.Marshal(wrapper) finalJSON, err := json.Marshal(wrapper)
if err != nil { 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