Browse Source

feat: uml settings in vscode & docs/uml case

RyaneMax 9 months ago
parent
commit
61771b0a51

+ 2 - 1
.vscode/settings.json

@@ -1,3 +1,4 @@
 {
-  "typescript.preferences.autoImportFileExcludePatterns": ["@ionic/angular/common", "@ionic/angular/standalone"]
+  "typescript.preferences.autoImportFileExcludePatterns": ["@ionic/angular/common", "@ionic/angular/standalone"],
+  "plantuml.server":"http://www.plantuml.com/plantuml"
 }

+ 177 - 0
docs/uml/game-review.md

@@ -0,0 +1,177 @@
+示例:范式设计-游戏评论应用
+====
+
+# 任务简介
+- 项目简介:
+    - 游戏点评类的应用,包含的角色主要是游戏发烧友,针对游戏进行点评,统计点评的情况。
+
+- 任务简介:
+    - 根据该项目,设计合理的数据范式
+
+# 范式Schema设计
+> [项目简介]请您帮我分析该项目相关功能的信息结构,根据数据库三大范式,来合理设计项目所需的数据范式。
+> 具体结果参考Parse.Schema的常用字段类型,唯一识别用String类型的objectId字段,外键关系用Pointer<表名>表示,数据表名用大驼峰,字段名用小驼峰。并将结果用plantuml的类图来表示。
+
+
+为了设计游戏点评类的应用的数据结构,我们可以考虑以下功能和信息结构:
+
+1. 游戏(Game):存储游戏的基本信息,如名称、类型、发行日期等。
+2. 用户(User):存储用户的信息,如用户名、密码、邮箱等。
+3. 点评(Review):存储用户对游戏的点评内容,包括评分、评论内容、点评时间等。
+4. 评论回复(Comment):存储用户对点评的评论回复,包括回复内容、回复时间等。
+
+根据上述功能和信息结构,我们可以设计以下数据范式:
+
+第一范式(1NF):确保每个列都是原子的,不可再分。在设计中要避免重复的列。
+
+- 游戏表(Game):
+  - objectId(唯一标识)
+  - name
+  - type
+  - releaseDate
+
+- 用户表(User):
+  - objectId(唯一标识)
+  - username
+  - password
+  - email
+
+- 点评表(Review):
+  - objectId(唯一标识)
+  - gamePointer(Pointer<Game>,外键关联游戏表)
+  - userPointer(Pointer<User>,外键关联用户表)
+  - rating
+  - content
+  - createdAt
+
+- 评论回复表(Comment):
+  - objectId(唯一标识)
+  - reviewPointer(Pointer<Review>,外键关联点评表)
+  - userPointer(Pointer<User>,外键关联用户表)
+  - content
+  - createdAt
+
+第二范式(2NF):确保非主属性完全依赖于候选键。在设计中要将非主属性移到独立的表中。
+
+在这里,每个表都已经符合第二范式的要求,因为每个表都有一个唯一标识字段作为主键,并且其他字段都完全依赖于该主键。
+
+第三范式(3NF):确保没有传递依赖。在设计中要将非主属性移至独立的表中。
+
+根据上述设计,我们可以使用plantuml的类图来表示这些数据表之间的关系,示例代码如下:
+
+```plantuml
+@startuml
+
+class Game {
+  objectId: String
+  name: String
+  type: String
+  releaseDate: Date
+}
+
+class User {
+  objectId: String
+  username: String
+  password: String
+  email: String
+}
+
+class Review {
+  objectId: String
+  gamePointer: Pointer<Game>
+  userPointer: Pointer<User>
+  rating: Int
+  content: String
+  createdAt: Date
+}
+
+class Comment {
+  objectId: String
+  reviewPointer: Pointer<Review>
+  userPointer: Pointer<User>
+  content: String
+  createdAt: Date
+}
+
+Game "1" -- "0..*" Review
+User "1" -- "0..*" Review
+Review "1" -- "0..*" Comment
+User "1" -- "0..*" Comment
+
+@enduml
+```
+
+以上是一个简单的类图示例,展示了游戏、用户、点评和评论之间的关系。您可以根据这个设计继续完善和优化您的数据库结构。如果您有任何其他问题或需要进一步帮助,请随时告诉我。
+
+# SQL建表和测试数据
+    
+> [数据范式],请帮我用PsotgreSQL及合理的数据结构,设计数据表的CREATE语句。
+    
+    当设计数据表的CREATE语句时,可以根据您提供的数据范式来创建相应的表结构。以下是使用PostgreSQL的CREATE TABLE语句来创建表:
+
+```sql
+CREATE TABLE Game (
+    objectId SERIAL PRIMARY KEY,
+    name VARCHAR(255) NOT NULL,
+    type VARCHAR(100),
+    releaseDate DATE
+);
+
+CREATE TABLE User (
+    objectId SERIAL PRIMARY KEY,
+    username VARCHAR(50) NOT NULL,
+    password VARCHAR(50) NOT NULL,
+    email VARCHAR(100) NOT NULL
+);
+
+CREATE TABLE Review (
+    objectId SERIAL PRIMARY KEY,
+    gamePointer INT REFERENCES Game(objectId),
+    userPointer INT REFERENCES User(objectId),
+    rating INT,
+    content TEXT,
+    createdAt TIMESTAMP
+);
+
+CREATE TABLE Comment (
+    objectId SERIAL PRIMARY KEY,
+    reviewPointer INT REFERENCES Review(objectId),
+    userPointer INT REFERENCES User(objectId),
+    content TEXT,
+    createdAt TIMESTAMP
+);
+```
+
+在上面的SQL语句中,我们使用了SERIAL数据类型来自动递增生成唯一的objectId,同时使用了外键约束来确保Review和Comment表中的gamePointer、userPointer和reviewPointer、userPointer分别引用Game和User表中的objectId。这样可以确保数据的完整性和一致性。
+    
+> [建表语句]请帮我根据以上表结构,多生成一些模拟数据,并创建INSERT语句。内容主要体现国产游戏和国人的评论。
+    
+以下是根据给定的表结构创建的模拟数据和相应的INSERT语句:
+
+```sql
+-- 插入游戏数据
+INSERT INTO Game (name, type, releaseDate) VALUES
+('剑侠情缘', '角色扮演', '2022-05-15'),
+('全民乐舞', '休闲', '2023-08-20'),
+('热血无双', '动作', '2024-01-10');
+
+-- 插入用户数据
+INSERT INTO User (username, password, email) VALUES
+('玩家1', 'password1', 'player1@example.com'),
+('玩家2', 'password2', 'player2@example.com'),
+('玩家3', 'password3', 'player3@example.com');
+
+-- 插入评论数据
+INSERT INTO Review (gamePointer, userPointer, rating, content, createdAt) VALUES
+(1, 1, 5, '这款游戏画面精美,剧情扣人心弦,非常推荐!', '2024-06-01 10:30:00'),
+(2, 2, 4, '音乐很动感,玩起来很有趣,但希望增加更多歌曲选择。', '2024-06-02 15:45:00'),
+(3, 3, 3, '战斗感觉很爽快,但操作稍显复杂,需要一定时间适应。', '2024-06-03 09:20:00');
+
+-- 插入评论数据
+INSERT INTO Comment (reviewPointer, userPointer, content, createdAt) VALUES
+(1, 2, '同意!剑侠情缘的画面确实很棒,而且情节跌宕起伏。', '2024-06-02 16:00:00'),
+(2, 1, '全民乐舞的音乐确实很动感,不过游戏节奏稍微有点快,需要练习。', '2024-06-03 10:00:00'),
+(3, 2, '热血无双的战斗确实很过瘾,我也觉得操作稍微复杂一些,但很有挑战性。', '2024-06-04 11:30:00');
+```
+
+这些INSERT语句将为你的数据库表插入一些模拟数据,展现了国产游戏和国人评论的情况。你可以根据需要进行调整或扩展。

+ 3 - 2
src/modules/study/case-js-module/case-parse-petmarket/pet.service.ts

@@ -6,8 +6,9 @@ import Parse from 'parse';
 })
 export class PetService {
   private Pet = Parse.Object.extend('Pet');
-
-  constructor() {}
+  constructor() {
+ 
+  }
 
   async getPets(queryParams: any): Promise<Parse.Object[]> {
     const query = new Parse.Query(this.Pet);