《姓铭堂人类大学APP》全套代码架构(上)

《姓铭堂人类大学APP》全套代码架构(上)
由于完整应用代码量巨大(预计数百万行),现提供初步的技术架构、核心模块设计、关键代码示例和部署方案,便于开发团队实施。
一、技术架构总览
1.1 整体架构图
text
┌─────────────────────────────────────────────────────┐ │ 客户端层(多端) │ ├─────────┬─────────┬────────────┬─────────┬─────────┤ │ iOS App │ Android │ Web Portal │ VR Client │ AR App │ └─────────┴─────────┴────────────┴─────────┴─────────┘ │ ┌─────────────────────────────────────────────────────┐ │ 网关层(API Gateway) │ ├─────────────────────────────────────────────────────┤ │ 负载均衡 │ 身份认证 │ 请求路由 │ 限流熔断 │ 监控日志 │ └─────────────────────────────────────────────────────┘ │ ┌─────────────────────────────────────────────────────┐ │ 微服务层(Spring Cloud) │ ├─────┬──────┬──────┬──────┬──────┬──────┬──────┬────┤ │用户服务│学习服务│社交服务│场景服务│AI服务│资产服务│支付服务│治理服务│ └─────┴──────┴──────┴──────┴──────┴──────┴──────┴────┘ │ ┌─────────────────────────────────────────────────────┐ │ 基础设施层 │ ├──────┬──────┬──────┬──────┬──────┬──────┬──────┬────┤ │ MySQL │ Redis │ MongoDB │ Elastic │ Kafka │ MinIO │区块链│ AI平台 │ └──────┴──────┴──────┴──────┴──────┴──────┴──────┴────┘
1.2 技术栈选择
yaml
前端技术栈:-移动端: React Native + TypeScript -Web端: Next.js + React + Three.js (3D场景) -元宇宙: Unity + WebGL + WebXR -状态管理: Redux + Redux Saga -UI框架: Ant Design Mobile + Tailwind CSS后端技术栈:-主框架: Spring Boot 3.x + Spring Cloud -语言: Java 17 + Kotlin (部分) -API网关: Spring Cloud Gateway -服务注册: Nacos -配置中心: Apollo -消息队列: Kafka + RabbitMQ -任务调度: XXL-JOB数据库:-关系型: MySQL 8.0 (用户核心数据) -文档型: MongoDB 6.0 (内容、日志) -缓存: Redis 7.0 + Redis Cluster -搜索引擎: Elasticsearch 8.x -时序数据库: InfluxDB (监控数据) -图数据库: Neo4j (社交关系)AI/区块链:-AI平台: TensorFlow Serving + PyTorch -NLP: Hugging Face Transformers -语音: Whisper + VITS -区块链: Ethereum + IPFS (数字资产) -智能合约: Solidity基础设施:-容器: Docker + Kubernetes -CI/CD: Jenkins + GitLab CI -监控: Prometheus + Grafana + ELK -云服务: 阿里云/腾讯云混合部署

二、核心模块代码结构
2.1 项目整体目录结构
text
surname-university-app/ ├── frontend/ # 前端代码 │ ├── mobile/ # React Native移动端 │ ├── web/ # Next.js Web端 │ └── unity/ # Unity元宇宙客户端 ├── backend/ # 后端微服务 │ ├── surname-user-service/ # 用户服务 │ ├── surname-learning-service/ # 学习服务 │ ├── surname-social-service/ # 社交服务 │ ├── surname-scene-service/ # 场景服务 │ ├── surname-ai-service/ # AI服务 │ ├── surname-asset-service/ # 资产服务 │ ├── surname-payment-service/ # 支付服务 │ └── surname-governance-service/ # 治理服务 ├── ai-models/ # AI模型训练 ├── blockchain/ # 智能合约 ├── infrastructure/ # 基础设施 └── docs/ # 文档
2.2 用户服务核心代码示例
2.2.1 用户实体设计
java
// User.java - 用户核心实体@Entity@Table(name ="users")@Data@NoArgsConstructor@AllArgsConstructorpublicclassUser{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;@Column(unique =true, nullable =false)privateString uid;// 用户唯一标识privateString username;privateString email;privateString phone;// 姓氏相关privateString surname;privateString surnameOrigin;privateString surnameStory;privateString surnameTribe;// 所属部落// 文明成长指标@EmbeddedprivateCivilizationIndex civilizationIndex;// 四段人生进度@EmbeddedprivateLifeProgress lifeProgress;// 八阶关系统计@EmbeddedprivateRelationshipStats relationshipStats;privateLocalDateTime createTime;privateLocalDateTime updateTime;}// CivilizationIndex.java - 文明指数@Embeddable@DatapublicclassCivilizationIndex{privateInteger learningIndex =0;// 学习指数privateInteger socialIndex =0;// 社交指数privateInteger creationIndex =0;// 创造指数privateInteger heritageIndex =0;// 传承指数privateInteger civilizationEnergy =0;// 文明能量值// 九步文明进度 (0-100)privateMap<String,Integer> civilizationSteps =newHashMap<>();}// LifeProgress.java - 人生进度@Embeddable@DatapublicclassLifeProgress{// 修身阶段进度privateInteger selfCultivationProgress =0;privateSet<String> completedSelfTasks =newHashSet<>();// 齐家阶段进度privateInteger familyHarmonyProgress =0;privateSet<String> completedFamilyTasks =newHashSet<>();// 治业阶段进度privateInteger careerDevelopmentProgress =0;privateSet<String> completedCareerTasks =newHashSet<>();// 平宇宙阶段进度privateInteger universePeaceProgress =0;privateSet<String> completedUniverseTasks =newHashSet<>();}
2.2.2 用户注册接口
java
// UserController.java@RestController@RequestMapping("/api/v1/users")@Slf4jpublicclassUserController{@AutowiredprivateUserService userService;@PostMapping("/register")publicApiResponse<UserVO>register(@RequestBody@ValidUserRegisterDTO dto){try{UserVO userVO = userService.register(dto);returnApiResponse.success(userVO);}catch(BusinessException e){ log.error("用户注册失败: {}", e.getMessage());returnApiResponse.error(e.getCode(), e.getMessage());}}@PostMapping("/complete-surname-info")publicApiResponse<UserVO>completeSurnameInfo(@RequestHeader("X-User-Id")Long userId,@RequestBodySurnameInfoDTO surnameInfo){UserVO userVO = userService.completeSurnameInfo(userId, surnameInfo);returnApiResponse.success(userVO);}}// UserService.java@Service@Slf4jpublicclassUserService{@AutowiredprivateUserRepository userRepository;@AutowiredprivateGrowthTreeService growthTreeService;@AutowiredprivateCivilizationService civilizationService;@TransactionalpublicUserVOregister(UserRegisterDTO dto){// 检查用户是否已存在if(userRepository.existsByEmail(dto.getEmail())){thrownewBusinessException(ErrorCode.USER_EMAIL_EXIST);}// 创建用户User user =newUser(); user.setUid(generateUid()); user.setUsername(dto.getUsername()); user.setEmail(dto.getEmail()); user.setPhone(dto.getPhone()); user.setSurname(dto.getSurname()); user.setCreateTime(LocalDateTime.now());// 初始化文明指数CivilizationIndex index =newCivilizationIndex(); index.setCivilizationSteps(initCivilizationSteps()); user.setCivilizationIndex(index);// 保存用户User savedUser = userRepository.save(user);// 创建成长树 growthTreeService.createGrowthTree(savedUser.getId());// 初始化学习任务 civilizationService.initLearningTasks(savedUser.getId());returnconvertToVO(savedUser);}privateMap<String,Integer>initCivilizationSteps(){Map<String,Integer> steps =newHashMap<>(); steps.put("图腾崇拜",10);// 初始完成10% steps.put("部落标识",0); steps.put("象形造字",0); steps.put("姓氏传承",5);// 已选择姓氏,完成5%// ... 其他步骤初始化为0return steps;}}
2.3 成长树服务核心代码
2.3.1 成长树实体与逻辑
java
// GrowthTree.java@Entity@Table(name ="growth_trees")@DatapublicclassGrowthTree{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;@Column(name ="user_id", unique =true)privateLong userId;// 根系系统@EmbeddedprivateRootSystem rootSystem;// 树干系统@EmbeddedprivateTrunkSystem trunkSystem;// 枝叶系统@OneToMany(cascade =CascadeType.ALL)@JoinColumn(name ="tree_id")privateList<Branch> branches =newArrayList<>();// 果实系统@OneToMany(cascade =CascadeType.ALL)@JoinColumn(name ="tree_id")privateList<Fruit> fruits =newArrayList<>();privateInteger totalEnergy =0;privateLocalDateTime lastUpdateTime;}// GrowthTreeService.java@Service@Slf4jpublicclassGrowthTreeService{@AutowiredprivateGrowthTreeRepository growthTreeRepository;@AutowiredprivateEventPublisher eventPublisher;publicGrowthTreecreateGrowthTree(Long userId){GrowthTree tree =newGrowthTree(); tree.setUserId(userId);// 初始化根系RootSystem rootSystem =newRootSystem(); rootSystem.setSurnameDepth(10);// 初始深度 rootSystem.setCultureDepth(5); rootSystem.setBloodlineDepth(0); tree.setRootSystem(rootSystem);// 初始化树干TrunkSystem trunkSystem =newTrunkSystem(); trunkSystem.setSelfCultivationRings(1); trunkSystem.setFamilyHarmonyRings(0); trunkSystem.setCareerDevelopmentRings(0); trunkSystem.setUniversePeaceRings(0); tree.setTrunkSystem(trunkSystem);// 初始化枝叶 tree.getBranches().add(createBranch("同姓宗亲")); tree.getBranches().add(createBranch("互为语伴")); tree.setLastUpdateTime(LocalDateTime.now());return growthTreeRepository.save(tree);}@TransactionalpublicvoidupdateGrowthTree(Long userId,GrowthUpdateDTO update){GrowthTree tree = growthTreeRepository.findByUserId(userId).orElseThrow(()->newBusinessException(ErrorCode.GROWTH_TREE_NOT_FOUND));// 更新根系if(update.getSurnameDepthIncrement()>0){ tree.getRootSystem().addSurnameDepth(update.getSurnameDepthIncrement());}// 更新树干if(update.getLifeStageProgress()!=null){updateTrunkSystem(tree, update.getLifeStageProgress());}// 更新枝叶if(update.getRelationshipUpdates()!=null){updateBranches(tree, update.getRelationshipUpdates());}// 添加能量if(update.getEnergyIncrement()>0){ tree.setTotalEnergy(tree.getTotalEnergy()+ update.getEnergyIncrement());// 检查是否可以结果checkFruitProduction(tree);} tree.setLastUpdateTime(LocalDateTime.now()); growthTreeRepository.save(tree);// 发布成长事件 eventPublisher.publishGrowthEvent(userId, update);}privatevoidcheckFruitProduction(GrowthTree tree){int energy = tree.getTotalEnergy();// 每1000能量产生一个果实int expectedFruits = energy /1000;int currentFruits = tree.getFruits().size();while(currentFruits < expectedFruits){Fruit fruit =generateFruit(tree); tree.getFruits().add(fruit); currentFruits++;// 发布果实生成事件 eventPublisher.publishFruitGeneratedEvent(tree.getUserId(), fruit);}}privateFruitgenerateFruit(GrowthTree tree){Fruit fruit =newFruit(); fruit.setType(determineFruitType(tree)); fruit.setRarity(calculateRarity(tree)); fruit.setEnergyValue(100+(int)(Math.random()*400)); fruit.setCreateTime(LocalDateTime.now());// 生成数字资产NFTString nftId =generateNFTForFruit(fruit); fruit.setNftId(nftId);return fruit;}}
2.4 学习服务核心代码
2.4.1 学习任务系统
java
// LearningTask.java@Entity@Table(name ="learning_tasks")@Data@NoArgsConstructor@AllArgsConstructorpublicclassLearningTask{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;privateString taskId;// 任务唯一标识privateString title;privateString description;@Enumerated(EnumType.STRING)privateTaskType type;// DAILY, MAIN, CHALLENGE, EVENT@Enumerated(EnumType.STRING)privateTaskCategory category;// CHINESE, CULTURE, SOCIAL, CREATION// 任务目标@EmbeddedprivateTaskTarget target;// 任务奖励@EmbeddedprivateTaskReward reward;// 任务条件privateString prerequisites;// JSON格式的前置条件privateInteger minLevel =1;// 关联的《人铭》章节privateInteger humanMingChapter;privateLocalDateTime createTime;privateLocalDateTime updateTime;privateBoolean active =true;}// LearningService.java@Service@Slf4jpublicclassLearningService{@AutowiredprivateLearningTaskRepository taskRepository;@AutowiredprivateUserTaskRepository userTaskRepository;@AutowiredprivateAIAssistantService aiAssistantService;publicList<LearningTaskVO>getRecommendedTasks(Long userId){// 获取用户信息User user =getUser(userId);// 获取用户已完成任务Set<String> completedTasks =getCompletedTaskIds(userId);// 获取可用的任务List<LearningTask> availableTasks = taskRepository.findAvailableTasks( user.getCivilizationIndex(), user.getLifeProgress(), completedTasks );// 使用AI推荐算法排序List<LearningTask> recommendedTasks = aiAssistantService.recommendTasks( user, availableTasks );returnconvertToVO(recommendedTasks);}@TransactionalpublicTaskCompletionResultcompleteTask(Long userId,String taskId,TaskCompletionData completionData){// 获取任务LearningTask task = taskRepository.findByTaskId(taskId).orElseThrow(()->newBusinessException(ErrorCode.TASK_NOT_FOUND));// 验证任务完成条件validateTaskCompletion(userId, task, completionData);// 记录任务完成UserTask userTask =newUserTask(); userTask.setUserId(userId); userTask.setTaskId(taskId); userTask.setCompletionData(completionData.toJson()); userTask.setCompleteTime(LocalDateTime.now()); userTask.setRewardClaimed(false); userTaskRepository.save(userTask);// 发放奖励TaskReward reward =distributeRewards(userId, task.getReward());// 更新用户成长updateUserProgress(userId, task, completionData);// 检查是否解锁新内容checkUnlockables(userId, task);returnTaskCompletionResult.builder().success(true).reward(reward).message("任务完成成功!").build();}privateTaskRewarddistributeRewards(Long userId,TaskReward reward){// 发放文明能量 civilizationService.addCivilizationEnergy(userId, reward.getEnergy());// 发放数字资产if(reward.getDigitalAssets()!=null){ assetService.issueAssets(userId, reward.getDigitalAssets());}// 发放实物奖励(如果适用)if(reward.getPhysicalRewards()!=null){ rewardService.schedulePhysicalDelivery(userId, reward.getPhysicalRewards());}return reward;}}
2.4.2 AI语伴系统
python
# ai_language_companion.pyimport torchimport torch.nn as nnfrom transformers import BertModel, BertTokenizerfrom typing import Dict, List, Optionalimport numpy as npclassAILanguageCompanion:def__init__(self, model_path:str): self.device = torch.device("cuda"if torch.cuda.is_available()else"cpu") self.tokenizer = BertTokenizer.from_pretrained(model_path) self.model = BertModel.from_pretrained(model_path) self.model.to(self.device) self.model.eval()# 文化知识库 self.culture_knowledge = self.load_culture_knowledge()defgenerate_response(self, user_input:str, user_context: Dict, language_level:str="intermediate", culture_background:str="western")-> Dict:""" 生成AI语伴回复 """# 分析用户输入 analysis = self.analyze_user_input(user_input, user_context)# 根据用户水平调整回复难度 adjusted_level = self.adjust_language_level( analysis['language_complexity'], language_level )# 生成回复if analysis['needs_cultural_explanation']: response = self.generate_cultural_response( user_input, analysis, culture_background )elif analysis['needs_grammar_correction']: response = self.generate_correction_response( user_input, analysis )else: response = self.generate_conversational_response( user_input, analysis, adjusted_level )# 添加学习建议 learning_tips = self.generate_learning_tips(analysis) response['learning_tips']= learning_tips return response defanalyze_user_input(self, text:str, context: Dict)-> Dict:""" 分析用户输入,检测语法错误、文化误解等 """# 编码输入 inputs = self.tokenizer(text, return_tensors="pt", truncation=True, max_length=512) inputs ={k: v.to(self.device)for k, v in inputs.items()}# 前向传播with torch.no_grad(): outputs = self.model(**inputs)# 提取特征 embeddings = outputs.last_hidden_state.mean(dim=1).cpu().numpy()# 语法检测 grammar_errors = self.detect_grammar_errors(text)# 文化内容识别 cultural_elements = self.identify_cultural_elements(text)# 语言水平评估 language_complexity = self.assess_language_complexity(text)return{'embeddings': embeddings,'grammar_errors': grammar_errors,'cultural_elements': cultural_elements,'language_complexity': language_complexity,'needs_correction':len(grammar_errors)>0,'needs_cultural_explanation':len(cultural_elements)>0}defdetect_grammar_errors(self, text:str)-> List[Dict]:""" 使用规则+模型检测语法错误 """ errors =[]# 规则检测if"的得地"in text:# 检查的得地使用pass# 模型检测# TODO: 使用训练好的语法检测模型return errors defgenerate_cultural_response(self, user_input:str, analysis: Dict, culture_background:str)-> Dict:""" 生成包含文化解释的回复 """ cultural_elements = analysis['cultural_elements']# 构建回复 response ={'type':'cultural_explanation','original_input': user_input,'explanations':[]}for element in cultural_elements: explanation = self.get_cultural_explanation( element, culture_background ) response['explanations'].append(explanation)# 生成类比(帮助理解) analogy = self.generate_cultural_analogy( element, culture_background )if analogy: response['explanations'][-1]['analogy']= analogy # 生成正确用法示例 corrected_example = self.generate_correct_example( user_input, cultural_elements ) response['corrected_example']= corrected_example return response
2.5 社交关系服务核心代码
2.5.1 关系图谱服务
java
// RelationshipGraphService.java@Service@Slf4jpublicclassRelationshipGraphService{@AutowiredprivateNeo4jTemplate neo4jTemplate;@AutowiredprivateRelationshipRuleEngine ruleEngine;publicRelationshipGraphbuildUserGraph(Long userId){String query =""" MATCH (u:User {id: $userId}) OPTIONAL MATCH (u)-[r:RELATES_TO]->(other:User) RETURN u, r, other """;Map<String,Object> parameters =Map.of("userId", userId.toString());List<Record> records = neo4jTemplate.query(query, parameters).all();RelationshipGraph graph =newRelationshipGraph(); graph.setUserId(userId);for(Record record : records){Node otherUser = record.get("other").asNode();Relationship relationship = record.get("r").asRelationship();RelationshipEdge edge =newRelationshipEdge(); edge.setTargetUserId(Long.parseLong(otherUser.get("id").asString())); edge.setType(relationship.get("type").asString()); edge.setLevel(relationship.get("level",1)); edge.setIntensity(relationship.get("intensity",0.0)); edge.setLastInteraction(relationship.get("lastInteraction").asLocalDateTime()); graph.addEdge(edge);}return graph;}@TransactionalpublicRelationshipUpgradeResultupgradeRelationship(Long userId,Long targetUserId,String upgradeType){// 检查当前关系Relationship current =getRelationship(userId, targetUserId);// 验证升级条件UpgradeValidation validation = ruleEngine.validateUpgrade( userId, targetUserId, upgradeType, current );if(!validation.isValid()){returnRelationshipUpgradeResult.failure(validation.getReasons());}// 执行升级String newLevel =calculateNewLevel(current.getLevel(), upgradeType);// 更新图数据库updateRelationshipInGraph(userId, targetUserId, newLevel);// 创建升级记录createUpgradeRecord(userId, targetUserId, current.getLevel(), newLevel);// 触发升级事件publishUpgradeEvent(userId, targetUserId, newLevel);// 更新成长树 growthTreeService.updateRelationshipBranch(userId, targetUserId, newLevel);returnRelationshipUpgradeResult.success(newLevel, validation.getRewards());}publicList<Long>recommendFriends(Long userId,RecommendationCriteria criteria){// 基于多维度推荐算法// 1. 基于姓氏文化相似度List<Long> surnameMatches =recommendBySurname(userId, criteria);// 2. 基于语言学习互补性List<Long> languageMatches =recommendByLanguage(userId, criteria);// 3. 基于兴趣相似度List<Long> interestMatches =recommendByInterest(userId, criteria);// 4. 基于社交网络拓扑List<Long> networkMatches =recommendByNetwork(userId, criteria);// 5. 基于AI模型预测List<Long> aiMatches =recommendByAI(userId, criteria);// 融合排序Map<Long,Double> scores =newHashMap<>();// 加权融合for(Long match : surnameMatches){ scores.put(match, scores.getOrDefault(match,0.0)+0.2);}for(Long match : languageMatches){ scores.put(match, scores.getOrDefault(match,0.0)+0.25);}for(Long match : interestMatches){ scores.put(match, scores.getOrDefault(match,0.0)+0.25);}for(Long match : networkMatches){ scores.put(match, scores.getOrDefault(match,0.0)+0.15);}for(Long match : aiMatches){ scores.put(match, scores.getOrDefault(match,0.0)+0.15);}// 过滤已存在的关系Set<Long> existingRelations =getExistingRelations(userId); scores.keySet().removeAll(existingRelations);// 按分数排序返回return scores.entrySet().stream().sorted(Map.Entry.<Long,Double>comparingByValue().reversed()).limit(criteria.getLimit()).map(Map.Entry::getKey).collect(Collectors.toList());}}
2.5.2 关系升级仪式系统
java
// RelationshipCeremonyService.java@Service@Slf4jpublicclassRelationshipCeremonyService{@AutowiredprivateMetaverseSceneService sceneService;@AutowiredprivateNFTService nftService;@AutowiredprivateEventPublisher eventPublisher;publicCeremonyResultperformCeremony(Long userId1,Long userId2,String ceremonyType){// 获取仪式配置CeremonyConfig config =getCeremonyConfig(ceremonyType);// 创建仪式场景MetaverseScene scene = sceneService.createCeremonyScene( ceremonyType,Arrays.asList(userId1, userId2));// 生成仪式NFTString nftId = nftService.mintCeremonyNFT(userId1, userId2, ceremonyType);// 执行仪式流程CeremonyFlow flow =executeCeremonyFlow(scene, userId1, userId2, config);// 记录仪式recordCeremony(userId1, userId2, ceremonyType, nftId, flow.getResult());// 发布仪式完成事件 eventPublisher.publishCeremonyCompleteEvent( userId1, userId2, ceremonyType, nftId );returnCeremonyResult.success(nftId, flow.getRewards());}privateCeremonyFlowexecuteCeremonyFlow(MetaverseScene scene,Long userId1,Long userId2,CeremonyConfig config){CeremonyFlow flow =newCeremonyFlow();// 阶段1: 入场 flow.addStep(ceremonyStepFactory.createEntranceStep(scene, userId1, userId2));// 阶段2: 誓言交换 flow.addStep(ceremonyStepFactory.createOathStep(scene, userId1, userId2, config));// 阶段3: 信物交换if(config.hasTokenExchange()){ flow.addStep(ceremonyStepFactory.createTokenExchangeStep(scene, userId1, userId2));}// 阶段4: 见证与祝福 flow.addStep(ceremonyStepFactory.createWitnessStep(scene, userId1, userId2));// 阶段5: 庆祝 flow.addStep(ceremonyStepFactory.createCelebrationStep(scene, userId1, userId2));// 执行流程return flow.execute();}}// 金兰之交仪式示例@Component@Slf4jpublicclassGoldenOrchidCeremonyimplementsCeremony{@OverridepublicCeremonyResultexecute(Long userId1,Long userId2){ log.info("开始金兰之交仪式: {} 与 {}", userId1, userId2);// 1. 创建桃园场景MetaverseScene peachGarden =createPeachGardenScene();// 2. 用户进入场景enterScene(peachGarden, userId1, userId2);// 3. 宣读誓言String oath =generateGoldenOrchidOath(userId1, userId2);reciteOath(peachGarden, userId1, userId2, oath);// 4. 交换信物String token1 =createGoldenOrchidToken(userId1, userId2);String token2 =createGoldenOrchidToken(userId2, userId1);exchangeTokens(peachGarden, userId1, token1, userId2, token2);// 5. 焚香结义performRitual(peachGarden,"incense_burning");// 6. 生成金兰谱NFTString goldenOrchidNFT =mintGoldenOrchidNFT(userId1, userId2, oath);// 7. 完成仪式completeCeremony(peachGarden, userId1, userId2);returnCeremonyResult.builder().success(true).nftId(goldenOrchidNFT).rewards(calculateRewards(userId1, userId2)).build();}privateStringgenerateGoldenOrchidOath(Long userId1,Long userId2){returnString.format("今日我%s与%s,在此桃园结为金兰之交。"+"不求同年同月同日生,但求同心同德同前行。"+"共学中文,共传文明,共创事业,共向宇宙。"+"天地为证,日月为鉴,此誓永恒!",getUserName(userId1),getUserName(userId2));}}
2.6 元宇宙场景服务核心代码
2.6.1 3D场景管理
javascript
// SceneManager.js - Three.js场景管理import*asTHREEfrom'three';import{ GLTFLoader }from'three/examples/jsm/loaders/GLTFLoader';import{ VRButton }from'three/examples/jsm/webxr/VRButton';classSceneManager{constructor(containerId){this.container = document.getElementById(containerId);this.scenes =newMap();this.currentScene =null;// 初始化Three.jsthis.initThree();// 加载场景资源this.loadSceneResources();}initThree(){// 创建场景this.scene =newTHREE.Scene();// 创建相机this.camera =newTHREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight,0.1,1000);this.camera.position.set(0,1.6,3);// 创建渲染器this.renderer =newTHREE.WebGLRenderer({antialias:true});this.renderer.setSize(window.innerWidth, window.innerHeight);this.renderer.setPixelRatio(window.devicePixelRatio);this.renderer.xr.enabled =true;// 添加到容器this.container.appendChild(this.renderer.domElement);// 添加VR支持this.container.appendChild(VRButton.createButton(this.renderer));// 添加灯光this.addLights();// 开始动画循环this.animate();}asyncloadScene(sceneId, userId){// 从服务器获取场景配置const sceneConfig =awaitthis.fetchSceneConfig(sceneId, userId);// 创建场景实例const sceneInstance =this.createSceneInstance(sceneConfig);// 加载3D模型awaitthis.loadSceneModels(sceneInstance, sceneConfig.models);// 设置交互this.setupSceneInteractions(sceneInstance);// 添加用户虚拟形象awaitthis.addUserAvatar(sceneInstance, userId);// 存储场景this.scenes.set(sceneId, sceneInstance);// 切换到该场景this.switchToScene(sceneId);return sceneInstance;}createSceneInstance(config){const scene ={id: config.id,type: config.type,objects:newMap(),interactions:[],users:newMap(),ambientSound:null};// 根据场景类型设置环境switch(config.type){case'ANCESTRAL_TEMPLE': scene.background =this.createTempleBackground(); scene.ambientSound =this.loadTempleAmbience();break;case'TEA_HOUSE': scene.background =this.createTeaHouseBackground(); scene.ambientSound =this.loadTeaHouseAmbience();break;case'STAR_OBSERVATORY': scene.background =this.createStarfieldBackground(); scene.ambientSound =this.loadSpaceAmbience();break;}return scene;}asyncaddUserAvatar(sceneInstance, userId){// 获取用户虚拟形象配置const avatarConfig =awaitthis.fetchAvatarConfig(userId);// 加载虚拟形象模型const avatar =awaitthis.loadAvatarModel(avatarConfig);// 设置位置和动画 avatar.position.set(0,0,0); avatar.name =`user_${userId}`;// 添加到场景 sceneInstance.scene.add(avatar); sceneInstance.objects.set(`avatar_${userId}`, avatar); sceneInstance.users.set(userId, avatar);// 设置控制器this.setupAvatarControls(avatar, userId);return avatar;}setupSceneInteractions(sceneInstance){const raycaster =newTHREE.Raycaster();const mouse =newTHREE.Vector2();// 点击交互 window.addEventListener('click',(event)=>{ mouse.x =(event.clientX / window.innerWidth)*2-1; mouse.y =-(event.clientY / window.innerHeight)*2+1; raycaster.setFromCamera(mouse,this.camera);const interactables =this.getInteractableObjects(sceneInstance);const intersects = raycaster.intersectObjects(interactables);if(intersects.length >0){const object = intersects[0].object;this.handleObjectInteraction(object, sceneInstance);}});// VR控制器交互if(this.renderer.xr.isPresenting){this.setupVRInteractions(sceneInstance);}}handleObjectInteraction(object, sceneInstance){const interaction = object.userData.interaction;if(!interaction)return;switch(interaction.type){case'INFO_PANEL':this.showInfoPanel(object.userData.info);break;case'DIALOG_START':this.startDialog(object.userData.dialogId);break;case'MINI_GAME':this.startMiniGame(object.userData.gameId);break;case'TELEPORT':this.teleportAvatar(object.userData.target);break;}}// 数字宗祠场景createAncestralTempleScene(){const scene ={id:'ancestral_temple',type:'ANCESTRAL_TEMPLE',objects:newMap()};// 创建宗祠建筑const temple =this.createTempleBuilding(); scene.objects.set('temple', temple);// 创建牌位const memorialTablets =this.createMemorialTablets(); scene.objects.set('tablets', memorialTablets);// 创建香炉const incenseBurner =this.createIncenseBurner(); scene.objects.set('incense_burner', incenseBurner);// 创建家谱卷轴const genealogyScroll =this.createGenealogyScroll(); scene.objects.set('genealogy', genealogyScroll);// 设置交互点this.addInteractions(scene,[{object: incenseBurner,interaction:{type:'RITUAL',action:'burn_incense',reward:50}},{object: genealogyScroll,interaction:{type:'INFO_PANEL',info:'查看家谱'}}]);return scene;}}
2.7 区块链与数字资产服务
2.7.1 智能合约代码(Solidity)
solidity
// SurnameNFT.sol - 姓氏文化NFT智能合约pragmasolidity^0.8.19;import"@openzeppelin/contracts/token/ERC721/ERC721.sol";import"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";import"@openzeppelin/contracts/access/Ownable.sol";import"@openzeppelin/contracts/utils/Counters.sol";contractSurnameNFTis ERC721, ERC721URIStorage, Ownable {usingCountersfor Counters.Counter; Counters.Counter private _tokenIdCounter;// 元数据结构structSurnameMetadata{string surname;string originStory;string migrationPath;uint256 creationDate;address creator;uint256 generation;// 代际uint256 energyValue;// 文明能量值}// 映射:tokenId -> 元数据mapping(uint256=> SurnameMetadata)public surnameMetadata;// 映射:姓氏 -> tokenId列表mapping(string=>uint256[])public surnameToTokens;// 映射:用户地址 -> 拥有的tokenId列表mapping(address=>uint256[])public ownerTokens;// 事件eventSurnameNFTCreated(uint256indexed tokenId,string surname,address creator,uint256 timestamp );eventSurnameNFTTransferred(uint256indexed tokenId,addressfrom,address to,uint256 timestamp );eventSurnameEnergyIncreased(uint256indexed tokenId,uint256 oldEnergy,uint256 newEnergy,address operator );constructor()ERC721("SurnameCultureNFT","SCNFT"){}// 铸造姓氏NFTfunctionmintSurnameNFT(address to,stringmemory surname,stringmemory originStory,stringmemory ipfsHash )public onlyOwner returns(uint256){uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment();// 铸造NFT_safeMint(to, tokenId);_setTokenURI(tokenId,string(abi.encodePacked("ipfs://", ipfsHash)));// 设置元数据 SurnameMetadata memory metadata =SurnameMetadata({ surname: surname, originStory: originStory, migrationPath:"", creationDate: block.timestamp, creator: msg.sender, generation:1, energyValue:100// 初始能量值}); surnameMetadata[tokenId]= metadata; surnameToTokens[surname].push(tokenId); ownerTokens[to].push(tokenId);emitSurnameNFTCreated(tokenId, surname, msg.sender, block.timestamp);return tokenId;}// 增加NFT能量值functionincreaseEnergy(uint256 tokenId,uint256 amount)public{require(_exists(tokenId),"Token does not exist");require(ownerOf(tokenId)== msg.sender,"Not token owner"); SurnameMetadata storage metadata = surnameMetadata[tokenId];uint256 oldEnergy = metadata.energyValue; metadata.energyValue += amount;emitSurnameEnergyIncreased( tokenId, oldEnergy, metadata.energyValue, msg.sender );}// 转移NFT(增加代际记录)functionsafeTransferFrom(addressfrom,address to,uint256 tokenId,bytesmemory data )public override { super.safeTransferFrom(from, to, tokenId, data);// 更新代际 surnameMetadata[tokenId].generation +=1;// 更新拥有者映射_removeFromOwnerList(from, tokenId); ownerTokens[to].push(tokenId);emitSurnameNFTTransferred(tokenId,from, to, block.timestamp);}// 查询用户的所有姓氏NFTfunctiongetTokensByOwner(address owner)publicviewreturns(uint256[]memory){return ownerTokens[owner];}// 查询姓氏的所有NFTfunctiongetTokensBySurname(stringmemory surname)publicviewreturns(uint256[]memory){return surnameToTokens[surname];}// 获取NFT完整信息functiongetNFTDetails(uint256 tokenId)publicviewreturns(SurnameMetadata memory metadata,stringmemory tokenURI){require(_exists(tokenId),"Token does not exist"); metadata = surnameMetadata[tokenId]; tokenURI =tokenURI(tokenId);return(metadata, tokenURI);}// 内部函数:从拥有者列表中移除tokenfunction_removeFromOwnerList(address owner,uint256 tokenId)private{uint256[]storage tokens = ownerTokens[owner];for(uint256 i =0; i < tokens.length; i++){if(tokens[i]== tokenId){ tokens[i]= tokens[tokens.length -1]; tokens.pop();break;}}}// 重写父类函数function_burn(uint256 tokenId)internaloverride(ERC721, ERC721URIStorage){ super._burn(tokenId);// 清理元数据delete surnameMetadata[tokenId];}functiontokenURI(uint256 tokenId)publicviewoverride(ERC721, ERC721URIStorage)returns(stringmemory){return super.tokenURI(tokenId);}functionsupportsInterface(bytes4 interfaceId)publicviewoverride(ERC721, ERC721URIStorage)returns(bool){return super.supportsInterface(interfaceId);}}// RelationshipNFT.sol - 关系NFT合约contractRelationshipNFTis ERC721URIStorage {usingCountersfor Counters.Counter; Counters.Counter private _tokenIdCounter;enumRelationshipType{ SameSurname,// 同姓宗亲 LanguagePartner,// 互为语伴 InterestFriend,// 同趣好友 BusinessPartner,// 合作伙伴 GoldenOrchid,// 金兰之交 Marriage,// 婚恋一家 Innovation,// 创新发展 SoulMate // 灵魂伴侣}structRelationshipData{ RelationshipType rType;address partyA;address partyB;uint256 establishedDate;uint256 level;string oath;string tokenURI;bool active;}mapping(uint256=> RelationshipData)public relationships;// 铸造关系NFTfunctionmintRelationshipNFT( RelationshipType rType,address partyB,stringmemory oath,stringmemory metadataURI )publicreturns(uint256){uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment();_safeMint(msg.sender, tokenId);_setTokenURI(tokenId, metadataURI); RelationshipData memory data =RelationshipData({ rType: rType, partyA: msg.sender, partyB: partyB, establishedDate: block.timestamp, level:1, oath: oath, tokenURI: metadataURI, active:true}); relationships[tokenId]= data;return tokenId;}// 升级关系等级functionupgradeRelationship(uint256 tokenId,uint256 newLevel)public{require(ownerOf(tokenId)== msg.sender,"Not owner");require(relationships[tokenId].active,"Relationship not active"); relationships[tokenId].level = newLevel;}}
2.7.2 数字资产服务
java
// DigitalAssetService.java@Service@Slf4jpublicclassDigitalAssetService{@AutowiredprivateWeb3j web3j;@AutowiredprivateIPFSService ipfsService;@Value("${blockchain.contract.surname-nft}")privateString surnameNFTContractAddress;@Value("${blockchain.contract.relationship-nft}")privateString relationshipNFTContractAddress;@Value("${blockchain.account.private-key}")privateString privateKey;publicDigitalAssetmintSurnameNFT(Long userId,SurnameNFTData data){try{// 准备元数据String metadataJson =buildSurnameMetadata(data);// 上传到IPFSString ipfsHash = ipfsService.uploadJson(metadataJson);// 调用智能合约Credentials credentials =Credentials.create(privateKey);SurnameNFT contract =SurnameNFT.load( surnameNFTContractAddress, web3j, credentials,Contract.GAS_PRICE,Contract.GAS_LIMIT);// 获取用户区块链地址String userAddress =getUserBlockchainAddress(userId);// 执行铸造TransactionReceipt receipt = contract.mintSurnameNFT(newAddress(userAddress), data.getSurname(), data.getOriginStory(), ipfsHash ).send();// 解析事件获取tokenIdList<SurnameNFT.SurnameNFTCreatedEventResponse> events = contract.getSurnameNFTCreatedEvents(receipt);if(!events.isEmpty()){BigInteger tokenId = events.get(0).tokenId;// 创建数字资产记录DigitalAsset asset =newDigitalAsset(); asset.setUserId(userId); asset.setType(DigitalAssetType.SURNAME_NFT); asset.setContractAddress(surnameNFTContractAddress); asset.setTokenId(tokenId.toString()); asset.setTokenURI("ipfs://"+ ipfsHash); asset.setMetadata(metadataJson); asset.setCreateTime(LocalDateTime.now());returnsaveAsset(asset);}}catch(Exception e){ log.error("铸造姓氏NFT失败", e);thrownewBusinessException(ErrorCode.NFT_MINT_FAILED);}returnnull;}publicDigitalAssetmintRelationshipNFT(Long userId1,Long userId2,RelationshipType type,RelationshipNFTData data){try{// 构建关系元数据String metadata =buildRelationshipMetadata(userId1, userId2, type, data);// 上传IPFSString ipfsHash = ipfsService.uploadJson(metadata);// 调用合约Credentials credentials =Credentials.create(privateKey);RelationshipNFT contract =RelationshipNFT.load( relationshipNFTContractAddress, web3j, credentials,Contract.GAS_PRICE,Contract.GAS_LIMIT);String userAddress1 =getUserBlockchainAddress(userId1);String userAddress2 =getUserBlockchainAddress(userId2);// 转换为合约枚举BigInteger contractType =convertToContractType(type);TransactionReceipt receipt = contract.mintRelationshipNFT( contractType,newAddress(userAddress2), data.getOath(),"ipfs://"+ ipfsHash ).send();// 创建数字资产记录(双方都记录)DigitalAsset asset1 =createRelationshipAsset( userId1, userId2, type, ipfsHash, metadata );DigitalAsset asset2 =createRelationshipAsset( userId2, userId1, type, ipfsHash, metadata );saveAsset(asset1);saveAsset(asset2);return asset1;}catch(Exception e){ log.error("铸造关系NFT失败", e);thrownewBusinessException(ErrorCode.RELATIONSHIP_NFT_MINT_FAILED);}}privateStringbuildSurnameMetadata(SurnameNFTData data){JSONObject metadata =newJSONObject(); metadata.put("name", data.getSurname()+"姓氏文化NFT"); metadata.put("description", data.getOriginStory()); metadata.put("surname", data.getSurname()); metadata.put("origin_story", data.getOriginStory()); metadata.put("migration_path", data.getMigrationPath()); metadata.put("historical_figures", data.getHistoricalFigures()); metadata.put("generation",1); metadata.put("energy_value",100); metadata.put("created_at",LocalDateTime.now().toString()); metadata.put("image","ipfs://"+ data.getImageHash()); metadata.put("animation_url","ipfs://"+ data.getAnimationHash()); metadata.put("attributes",buildSurnameAttributes(data));return metadata.toString();}privateJSONArraybuildSurnameAttributes(SurnameNFTData data){JSONArray attributes =newJSONArray();// 稀有度属性JSONObject rarity =newJSONObject(); rarity.put("trait_type","稀有度"); rarity.put("value",calculateSurnameRarity(data.getSurname())); attributes.add(rarity);// 历史长度属性JSONObject historyLength =newJSONObject(); historyLength.put("trait_type","历史长度"); historyLength.put("value", data.getHistoryLength()); historyLength.put("max_value",5000); attributes.add(historyLength);// 分布广度属性JSONObject distribution =newJSONObject(); distribution.put("trait_type","分布广度"); distribution.put("value", data.getDistribution()); attributes.add(distribution);return attributes;}}
——大长征•人类铭作者
《大长征 · 宇宙人类学》主编,
大长征•人类铭作者简介
王光杰——
中华姓氏非遗大工匠,
中央电视台财富新榜样,
央视专访链接:
https://mp.weixin.qq.com/s/BOyboPxxkEgEhgzejQVHuw
深圳市姓铭堂文化中心创始人
世享华文(深圳)智能公司董事长
姓铭堂人类大学
总策划、发起人,
百佳诗人,优秀作家,
工艺美术师,南粤改革先锋,
微信公众号“大长征GLM”主笔,
代表作——
《大长征•人类铭》
《大长征•宇宙人类学》、
《大长征•中国时代》、
《大长征•中华姓氏学》
《大长征•自主健康学》等,
香港-台北-上海-深圳四城文化交流年会主讲嘉宾,
北京大学中美总栽博士班客座教授,
北京中华文化促进会华祖文化使者,
国家拜祖大典贵宾(河南新郑)
国家公祭黄帝大典贵宾(陕西黄陵)
中国共产党优秀党员,
中华职业教育社社员,
深圳十大杰出青年候选人,
青春中华·中国青年文化周-中华民族特色精品展示会特邀青年艺术家,
中国青少年读书周特邀老师,
深圳市文化创意产业协会副会长,
深圳市工艺美术行业协会副会长,
深圳风云会副主席,
深圳市福顺公益基金会党支部书记,
湾区元宇宙创始委员
荣获:
中华姓氏非遗大工匠奖,
中国工艺美术百花奖金奖,
深圳旅游纪念品设计大赛金奖,
深圳版权金奖(作品奖),
北京文博会最佳展示奖,
杭州西湖博览会国际艺术精品暨中国工艺美术大师作品优秀奖,
丝路精神传承人/千人走戈壁风采领袖奖等
经国家文物局批准,
王光杰先生主创的作品“中华姓氏故乡国学系列文创精品”被北京中华民族艺术珍品博物馆永久收藏;
另,美国硅谷亚洲文化中心、北京炎黄艺术馆、北京大观园管理委员会/北京红楼文化艺术博物馆、北戴河中央别墅、深圳图书馆等众多场馆、酒店、会所和超四十万家庭、企业收藏了王光杰先生主创的文化艺术精品。


夜雨聆风









