import-data.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. /*const { CloudQuery, CloudObject } = require("../lib/ncloud");
  2. const { QuestionnaireResultList, QuestionnaireList, QuestionList, OptionList, UserInterestProfileList } = require("./data");
  3. importData();
  4. let DataMap = {
  5. QuestionnaireResult: {},
  6. Questionnaire: {},
  7. Question: {},
  8. Option: {},
  9. UserInterestProfile: {}
  10. }
  11. async function importData() {
  12. // 导入问卷结果数据
  13. let questionnaireResultList = QuestionnaireResultList;
  14. for (let index = 0; index < questionnaireResultList.length; index++) {
  15. let result = questionnaireResultList[index];
  16. result = await importObject("QuestionnaireResult", result);
  17. }
  18. // 导入问卷数据
  19. let questionnaireList = QuestionnaireList;
  20. for (let index = 0; index < questionnaireList.length; index++) {
  21. let questionnaire = questionnaireList[index];
  22. questionnaire = await importObject("Questionnaire", questionnaire);
  23. }
  24. // 导入问题数据
  25. let questionList = QuestionList;
  26. for (let index = 0; index < questionList.length; index++) {
  27. let question = questionList[index];
  28. question = await importObject("Question", question);
  29. }
  30. // 导入选项数据
  31. let optionList = OptionList;
  32. for (let index = 0; index < optionList.length; index++) {
  33. let option = optionList[index];
  34. option = await importObject("Option", option);
  35. }
  36. // 导入用户兴趣画像数据
  37. let userInterestProfileList = UserInterestProfileList;
  38. for (let index = 0; index < userInterestProfileList.length; index++) {
  39. let profile = userInterestProfileList[index];
  40. profile = await importObject("UserInterestProfile", profile);
  41. }
  42. // console.log(DataMap)
  43. }
  44. async function importObject(className, data) {
  45. // 获取类名对应的 ID 字段名称(如 OptionId, QuestionnaireId 等)
  46. let idField = `${className}Id`;
  47. let srcId = data[idField]; // 使用 classnameId 作为 srcId 的值
  48. // 查重:查找是否已经存在相同 srcId 的数据
  49. let query = new CloudQuery(className);
  50. query.equalTo("srcId", srcId);
  51. let importObj = await query.first();
  52. console.log(importObj);
  53. // 导入前批量处理 Pointer 类型数据,进行重定向
  54. Object.keys(data)?.forEach(key => {
  55. let field = data[key];
  56. let fieldSrcId = field?.objectId || field?.OptionId || field?.QuestionId || field?.UserInterestProfileId;
  57. if (fieldSrcId) { // 是 Pointer 类型
  58. if (key === "userId" || key === "questionnaireId" || key === "questionId") {
  59. // 确保插入的是一个 Pointer 对象,而不是直接的 id
  60. data[key] = {
  61. "__type": "Pointer",
  62. "className": key.replace("Id", ""),
  63. "objectId": DataMap?.[key.replace("Id", "")]?.[fieldSrcId]?.id || fieldSrcId
  64. };
  65. } else if (Array.isArray(field)) {
  66. data[key] = field.map(item => {
  67. return {
  68. "__type": "Pointer",
  69. "className": item.className,
  70. "objectId": DataMap?.[item.className]?.[item.objectId]?.id || item.objectId
  71. };
  72. });
  73. }
  74. }
  75. });
  76. // 若未添加,则创建新对象并保存
  77. if (!importObj?.id) {
  78. importObj = new CloudObject(className);
  79. }
  80. // 保存或更新数据
  81. data.srcId = srcId; // 将 srcId 设置为与 classnameId 相同的值
  82. importObj.set(data);
  83. importObj = await importObj.save();
  84. // 更新 DataMap,确保 srcId 和 classnameId 保持一致
  85. DataMap[className][srcId] = importObj;
  86. }
  87. // 展示当前问卷内的问题及其选项
  88. async function displayQuestionnaireDetails(questionnaireId) {
  89. // 查询问卷
  90. let questionnaireQuery = new CloudQuery("Questionnaire");
  91. questionnaireQuery.equalTo("objectId", questionnaireId);
  92. let questionnaire = await questionnaireQuery.first();
  93. // 检查问卷是否存在
  94. if (!questionnaire) {
  95. console.log("问卷未找到,无法展示问题和选项。");
  96. return;
  97. }
  98. console.log(`问卷标题: ${questionnaire.title}`);
  99. console.log(`问卷状态: ${questionnaire.status}`);
  100. console.log("问题列表:");
  101. // 查询问题
  102. let questionQuery = new CloudQuery("Question");
  103. questionQuery.equalTo("questionnaireId", {
  104. "__type": "Pointer",
  105. "className": "Questionnaire",
  106. "objectId": questionnaireId
  107. });
  108. let questions = await questionQuery.find();
  109. // 检查是否有问题
  110. if (questions.length === 0) {
  111. console.log("当前问卷没有问题。");
  112. return;
  113. }
  114. // 遍历问题并查询选项
  115. for (let question of questions) {
  116. // 检查问题是否存在
  117. if (!question) {
  118. console.log("问题未找到,无法展示选项。");
  119. continue; // 跳过当前循环,继续下一个问题
  120. }
  121. console.log(` 问题: ${question.questionText}`);
  122. // 查询选项
  123. let optionQuery = new CloudQuery("Option");
  124. optionQuery.equalTo("questionId", {
  125. "__type": "Pointer",
  126. "className": "Question",
  127. "objectId": question.objectId
  128. });
  129. let options = await optionQuery.find();
  130. // 输出选项
  131. console.log(" 选项:");
  132. if (options.length === 0) {
  133. console.log(" - 此问题没有选项。");
  134. } else {
  135. for (let option of options) {
  136. console.log(` - ${option.optionText} (已选: ${option.isSelected})`);
  137. }
  138. }
  139. console.log(""); // 添加空行以便于阅读
  140. }
  141. }
  142. // 示例调用
  143. displayQuestionnaireDetails("jbg6EYXk3G");
  144. */
  145. const { CloudQuery, CloudObject } = require("../lib/ncloud");
  146. const { QuestionnaireResultList, QuestionnaireList, QuestionList, OptionList, UserInterestProfileList, WorkList, CommentList } = require("./data");
  147. importData();
  148. let DataMap = {
  149. QuestionnaireResult: {},
  150. Questionnaire: {},
  151. Question: {},
  152. Option: {},
  153. UserInterestProfile: {},
  154. Work: {},
  155. Comment: {}
  156. };
  157. async function importData() {
  158. // 确保 UserInterestProfileList 已经加载
  159. if (!UserInterestProfileList || UserInterestProfileList.length === 0) {
  160. console.log("UserInterestProfileList 数据为空或未定义!");
  161. return;
  162. }
  163. /*
  164. // 导入问卷结果数据
  165. let questionnaireResultList = QuestionnaireResultList;
  166. for (let index = 0; index < questionnaireResultList.length; index++) {
  167. let result = questionnaireResultList[index];
  168. result = await importObject("QuestionnaireResult", result);
  169. }
  170. // 导入问卷数据
  171. let questionnaireList = QuestionnaireList;
  172. for (let index = 0; index < questionnaireList.length; index++) {
  173. let questionnaire = questionnaireList[index];
  174. questionnaire = await importObject("Questionnaire", questionnaire);
  175. }
  176. // 导入问题数据
  177. let questionList = QuestionList;
  178. for (let index = 0; index < questionList.length; index++) {
  179. let question = questionList[index];
  180. question = await importObject("Question", question);
  181. }
  182. // 导入选项数据
  183. let optionList = OptionList;
  184. for (let index = 0; index < optionList.length; index++) {
  185. let option = optionList[index];
  186. option = await importObject("Option", option);
  187. }
  188. // 导入用户兴趣画像数据
  189. let userInterestProfileList = UserInterestProfileList;
  190. for (let index = 0; index < userInterestProfileList.length; index++) {
  191. let profile = userInterestProfileList[index];
  192. profile = await importObject("UserInterestProfile", profile);
  193. }*/
  194. // 导入Work数据
  195. let workList = WorkList; // 假设 WorkList 是包含工作数据的数组
  196. for (let index = 0; index < workList.length; index++) {
  197. let work = workList[index];
  198. work = await importObject("Work", work);
  199. }
  200. /*
  201. // 导入Comment数据
  202. let commentList = CommentList; // 假设 CommentList 是包含评论数据的数组
  203. for (let index = 0; index < commentList.length; index++) {
  204. let comment = commentList[index];
  205. comment = await importObject("Comment", comment);
  206. }*/
  207. // console.log(DataMap);
  208. }
  209. async function importObject(className, data) {
  210. // 获取类名对应的 ID 字段名称(如 OptionId, QuestionnaireId 等)
  211. let idField = `${className}Id`;
  212. let srcId = data[idField]; // 使用 classnameId 作为 srcId 的值
  213. // 查重:查找是否已经存在相同 srcId 的数据
  214. let query = new CloudQuery(className);
  215. query.equalTo("srcId", srcId);
  216. let importObj = await query.first();
  217. console.log(importObj);
  218. // 导入前批量处理 Array 类型数据,进行重定向
  219. Object.keys(data)?.forEach(key => {
  220. let field = data[key];
  221. let fieldSrcId = field?.objectId || field?.OptionId || field?.QuestionId || field?.UserInterestProfileId || field?.workId || field?.commentId;;
  222. if (fieldSrcId) { // 是 Pointer 类型的字段
  223. if (key === "userIds" || key === "questionnaireIds" || key === "questionIds") {
  224. // 确保插入的是一个数组而不是 Pointer 对象
  225. data[key] = Array.isArray(field) ? field.map(item => {
  226. return {
  227. className: item.className,
  228. srcId: DataMap?.[item.className]?.[item.srcId]?.id || item.srcId
  229. };
  230. }) : [{
  231. className: key.replace("Ids", ""),
  232. srcId: DataMap?.[key.replace("Ids", "")]?.[fieldSrcId]?.id || fieldSrcId
  233. }];
  234. } else if (Array.isArray(field)) {
  235. data[key] = field.map(item => {
  236. return {
  237. className: item.className,
  238. srcId: DataMap?.[item.className]?.[item.srcId]?.id || item.srcId
  239. };
  240. });
  241. }
  242. }
  243. });
  244. // 若未添加,则创建新对象并保存
  245. if (!importObj?.id) {
  246. importObj = new CloudObject(className);
  247. }
  248. // 保存或更新数据
  249. data.srcId = srcId; // 将 srcId 设置为与 classnameId 相同的值
  250. importObj.set(data);
  251. importObj = await importObj.save();
  252. // 更新 DataMap,确保 srcId 和 classnameId 保持一致
  253. DataMap[className][srcId] = importObj;
  254. }
  255. // 展示当前问卷内的问题及其选项
  256. async function displayQuestionnaireDetails(questionnaireId) {
  257. // 查询问卷
  258. let questionnaireQuery = new CloudQuery("Questionnaire");
  259. questionnaireQuery.equalTo("QuestionnaireId", questionnaireId); // 使用 QuestionnaireId 查询
  260. let questionnaire = await questionnaireQuery.first();
  261. // 检查问卷是否存在
  262. if (!questionnaire) {
  263. console.log("问卷未找到,无法展示问题和选项。");
  264. return;
  265. }
  266. console.log(`问卷标题: ${questionnaire.get('title')}`);
  267. console.log(`问卷状态: ${questionnaire.get('status')}`);
  268. console.log("问题列表:");
  269. // 获取问题 IDs(数组字段)
  270. let questionIds = questionnaire.get('questions');
  271. // 查询所有相关问题
  272. let questionQuery = new CloudQuery("Question");
  273. questionQuery.containedIn("QuestionId", questionIds); // 查询 QuestionId 在问题 ID 列表中的问题
  274. let questions = await questionQuery.find();
  275. // 检查是否有问题
  276. if (questions.length === 0) {
  277. console.log("当前问卷没有问题。");
  278. return;
  279. }
  280. // 遍历问题并查询选项
  281. for (let question of questions) {
  282. // 检查问题是否存在
  283. if (!question) {
  284. console.log("问题未找到,无法展示选项。");
  285. continue; // 跳过当前循环,继续下一个问题
  286. }
  287. console.log(` 问题: ${question.questionText}`);
  288. // 获取问题中的选项 IDs(数组字段)
  289. let optionIds = question.options;
  290. // 查询所有相关选项
  291. let optionQuery = new CloudQuery("Option");
  292. optionQuery.containedIn("OptionId", optionIds); // 查询 OptionId 在选项 ID 列表中的选项
  293. let options = await optionQuery.find();
  294. // 输出选项
  295. console.log(" 选项:");
  296. if (options.length === 0) {
  297. console.log(" - 此问题没有选项。");
  298. } else {
  299. for (let option of options) {
  300. console.log(` - ${option.optionText} (已选: ${option.isSelected ? "是" : "否"})`);
  301. }
  302. }
  303. console.log(""); // 添加空行以便于阅读
  304. }
  305. }
  306. // 展示帖子以及其评论的函数
  307. async function displayWorkDetails(workId) {
  308. // 查询帖子数据
  309. let workQuery = new CloudQuery("Work");
  310. workQuery.equalTo("WorkId", workId); // 使用 WorkId 查询
  311. let work = await workQuery.first();
  312. // 检查帖子是否存在
  313. if (!work) {
  314. console.log("帖子未找到,无法展示详情。");
  315. return;
  316. }
  317. console.log(`帖子标题: ${work.get('title')}`);
  318. console.log(`帖子描述: ${work.get('description')}`);
  319. console.log(`点赞数: ${work.get('likesCount')}`);
  320. console.log(`评论数: ${work.get('commentsCount')}`);
  321. console.log("评论列表:");
  322. // 获取评论 IDs(数组字段)
  323. let commentIds = work.get('comments');
  324. // 查询所有相关评论
  325. let commentQuery = new CloudQuery("Comment");
  326. commentQuery.containedIn("CommentId", commentIds); // 查询 CommentId 在评论 ID 列表中的评论
  327. let comments = await commentQuery.find();
  328. // 检查是否有评论
  329. if (comments.length === 0) {
  330. console.log("当前帖子没有评论。");
  331. return;
  332. }
  333. // 输出评论
  334. for (let comment of comments) {
  335. // 打印评论对象,检查结构
  336. console.log(comment); // 打印出完整的评论对象
  337. // 如果是 CloudObject,使用 get 方法
  338. if (comment instanceof CloudObject) {
  339. console.log(` 评论人: ${comment.get('userName')}`);
  340. console.log(` 评论内容: ${comment.get('description')}`);
  341. console.log(` 评论点赞数: ${comment.get('likesCount')}`);
  342. console.log(` 评论时间: ${comment.get('createdAt')}`);
  343. } else {
  344. // 否则,直接使用属性
  345. console.log(` 评论人: ${comment.userName}`);
  346. console.log(` 评论内容: ${comment.description}`);
  347. console.log(` 评论点赞数: ${comment.likesCount}`);
  348. console.log(` 评论时间: ${comment.createdAt}`);
  349. }
  350. console.log(""); // 添加空行以便于阅读
  351. }
  352. }
  353. // 示例调用
  354. //displayQuestionnaireDetails("q1");
  355. // 示例调用
  356. displayWorkDetails("w4");