Module 3 - 任务列表
单人部分 (Individual Tasks)
第一步:安装 MySQL 和 phpMyAdmin
- 在 EC2 实例上 安装 (opens in a new tab) MySQL 和 phpMyAdmin,跟着老师的步骤走完。
第二步:设置数据库
- 创建一个名为
wustl
的数据库。
CREATE DATABASE wustl;
- 创建一个名为
wustl_inst
的用户,密码为wustl_pass
。并且刷新权限表以确保所有更改生效
CREATE USER 'wustl_inst'@'localhost' IDENTIFIED BY 'wustl_pass';
GRANT ALL PRIVILEGES ON wustl.* TO 'wustl_inst'@'localhost';
FLUSH PRIVILEGES;
第三步:创建表
使用 InnoDB 存储引擎创建所有表,以支持外键约束。如果需要,可以使用 ALTER TABLE
更改存储引擎。适当时定义字段为 NOT NULL
以避免插入不完整的数据。
- 请阅读 MySQL Schema and State (opens in a new tab) 这一节,学习所有sql语句。我会提供所有的sql语句,但是请不要直接复制粘贴,先自己写写看。
当你有了myphpadmin只有可以直接在这里跑sql语句!不用再去终端跑sql语句啦 yay~
点击上方的sql 把自己的sql语句放进去点 Go
就可以运行了,下方就可以看到运行结果,请注意这里点了 Go
之后是真的会影响你的数据库无论是插入还是删除修改操作都是会生效的,请谨慎使用!!!
students
表
创建一个名为 students
的表,包含以下字段:
id
:适当大小的无符号整数类型(例如INT UNSIGNED
)。first_name
:类型为VARCHAR(50)
。last_name
:类型为VARCHAR(50)
。email_address
:类型为VARCHAR(50)
。
主键应为 id
字段。
CREATE TABLE students (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email_address VARCHAR(50) NOT NULL
) ENGINE=InnoDB;
departments
表
创建一个名为 departments
的表,包含以下字段:
school_code
:类型为ENUM('L', 'B', 'A', 'F', 'E', 'T', 'I', 'W', 'S', 'U', 'M')
。dept_id
:适当大小的无符号整数类型(例如INT UNSIGNED
)。abbreviation
:类型为VARCHAR(9)
。dept_name
:类型为VARCHAR(200)
。
主键应为 school_code
和 dept_id
字段。
CREATE TABLE departments (
school_code ENUM('L', 'B', 'A', 'F', 'E', 'T', 'I', 'W', 'S', 'U', 'M') NOT NULL,
dept_id INT UNSIGNED NOT NULL,
abbreviation VARCHAR(9) NOT NULL,
dept_name VARCHAR(200) NOT NULL,
PRIMARY KEY (school_code, dept_id)
) ENGINE=InnoDB;
courses
表
创建一个名为 courses
的表,包含以下字段:
school_code
:类型为ENUM
(与departments
表中的school_code
ENUM 相匹配)。dept_id
:与departments
表中相同的整数类型。course_code
:类型为CHAR(5)
。name
:类型为VARCHAR(150)
。
确保适当字段引用 departments
表的外键。选择合适的字段作为主键。
CREATE TABLE courses (
school_code ENUM('L', 'B', 'A', 'F', 'E', 'T', 'I', 'W', 'S', 'U', 'M') NOT NULL,
dept_id INT UNSIGNED NOT NULL,
course_code CHAR(5) NOT NULL,
name VARCHAR(150) NOT NULL,
PRIMARY KEY (school_code, dept_id, course_code),
FOREIGN KEY (school_code, dept_id) REFERENCES departments(school_code, dept_id) ON DELETE CASCADE
) ENGINE=InnoDB;
grades
表
创建一个名为 grades
的表,包含以下字段:
pk_grade_ID
:适当大小的无符号整数类型(例如BIGINT UNSIGNED
),设置为AUTO_INCREMENT
并作为主键。student_id
:与students
表中相同的整数类型。grade
:类型为DECIMAL(5,2)
。school_code
:类型为ENUM
。dept_id
:与其他表中相同的整数类型。course_code
:与courses
表中相同的类型。
将外键添加到 students
表和 courses
表。
CREATE TABLE grades (
pk_grade_ID BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
student_id INT UNSIGNED NOT NULL,
grade DECIMAL(5,2) NOT NULL,
school_code ENUM('L', 'B', 'A', 'F', 'E', 'T', 'I', 'W', 'S', 'U', 'M') NOT NULL,
dept_id INT UNSIGNED NOT NULL,
course_code CHAR(5) NOT NULL,
FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE,
FOREIGN KEY (school_code, dept_id, course_code) REFERENCES courses(school_code, dept_id, course_code) ON DELETE CASCADE
) ENGINE=InnoDB;
记得每一个表使用一次
SHOW CREATE TABLE <TableName>
并且把你的表结构保存为 tablename.sql
文件,放进你的GitHub仓库以便老师检查
第四步:导入数据
- 从以下文件下载并将数据加载到表中:
这里建议使用我提供的文件,支持 myphpadmin 一键导入,老师的提供的需要你自己调整从服务器上导入。这里打开我准备的文件后右键保存为 txt 即可。
-
使用 phpMyAdmin 导入数据
-
打开 phpMyAdmin,选择你要导入的表,这里由于老师要求我们使用外键链接,所以需要按照顺序导入,
students
->departments
->courses
->grades
-
选择完表后点击上方的import 按钮
-
上传我提供的对应的csv文件,Format 选择
CSV
,然后点击Import
按钮
-
第五步:插入更多数据
- 插入学校的课程
CSE 330S
,CSE 131
, 和CSE 260M
. 这里你可以思考以下如何找到department code
. 我把sql语句放在下面,如果实在想不出来的话再使用
SELECT school_code, dept_id, abbreviation, dept_name
FROM departments
WHERE abbreviation = 'CSE';
-
插入老师提供的这些数据 (opens in a new tab),老师说到的这些数据不在一个表内,所以我们需要在对应的表里使用插入语句,这里有外键限制所以需要按顺序插入哦~ 这里同样建议先尝试自己写一下再使用我的sql语句。
- 插入课程数据
INSERT INTO courses (school_code, dept_id, course_code, name) VALUES ('E', '81', '330S', 'Rapid Prototype Development and Creative Programming'), ('E', '81', '131', 'Introduction to Computer Science'), ('E', '81', '260M', 'Introduction to Digital Logic and Computer Design');
- 插入学生数据
INSERT INTO students (id, first_name, last_name, email_address) VALUES (88, 'Ben', 'Harper', 'bharper@ffym.com'), (202, 'Matt', 'Freeman', 'mfreeman@kickinbassist.net'), (115, 'Marc', 'Roberge', 'mroberge@ofarevolution.us');
- 插入成绩数据
INSERT INTO grades (student_id, grade, school_code, dept_id, course_code) VALUES (88, 35.5, 'E', '81', '330S'), (88, 0, 'E', '81', '131'), (88, 95, 'E', '81', '260M'), (202, 100, 'E', '81', '330S'), (202, 90.5, 'E', '81', '131'), (202, 94.8, 'E', '81', '260M'), (115, 75, 'E', '81', '330S'), (115, 37, 'E', '81', '131'), (115, 45.5, 'E', '81', '260M');
第六步:查询数据
-
运行以下查询 (opens in a new tab),并将结果保存到文本文件中(例如 query1.txt、query2.txt 等)这里总共有五个查询,所以总共要提交五个txt到你的github仓库哦!同样的,请先试试再使用我都sql语句~
- 选择整个 grades 表
SELECT * FROM grades;
- 选择描述 College of Arts & Sciences(学校代码 L)提供的所有课程的字段
SELECT * FROM courses WHERE school_code = 'L';
- 列出所有学生的姓名、学生 ID 和 CSE330 成绩(涉及连接)
SELECT students.first_name, students.last_name, grades.student_id, grades.grade FROM students JOIN grades ON students.id = grades.student_id WHERE grades.course_code = '330S';
- 列出平均成绩低于 50 的学生的姓名、电子邮件和平均成绩(使用聚合函数和 HAVING)
SELECT students.first_name, students.last_name, students.email_address, AVG(grades.grade) AS average_grade FROM students JOIN grades ON students.id = grades.student_id GROUP BY students.id HAVING AVG(grades.grade) < 50;
- 生成 Jack Johnson 的个人报告卡,仅显示他的学生 ID、电子邮件地址和平均成绩(使用连接和聚合函数)
⚠️这里要注意搜索要用名字而不是
students.id
SELECT students.id, students.email_address, AVG(grades.grade) AS average_grade FROM students JOIN grades ON students.id = grades.student_id WHERE students.first_name = 'Jack' AND students.last_name = 'Johnson' GROUP BY students.id;
个人项目评分标准 (Grading)
MySQL 查询 (MySQL Queries)- 25 分
-
MySQL 服务器连接截图(2 分)
- 在您的存储库中放入连接到 MySQL 服务器的终端截图。
-
表字段和结构(8 分)
- 确保表的字段,包括数据类型和外键,都是正确的。
- 通过提交包含
SHOW CREATE TABLE <TableName>
命令输出的文本文件来演示表的结构。 - 每个表的文件应以
tablename.sql
的形式命名(例如,students.sql
)。
-
查询输出(15 分)
- 每个查询的输出都是正确的,每个查询值 3 分。
- 通过提交包含查询的完整结果(包括查询及记录数)来演示查询的输出。
- 查询 1 的文件应命名为
query1.txt
,查询 2 的文件应命名为query2.txt
,以此类推。
请确保在作业截止时间前将代码提交到 GitHub。尽早并频繁提交代码, 不然可能导致评分为0。
多人部分 (Group Tasks)
你的任务是合作构建一个具有用户和内容管理功能的新闻网站。虽然在这部分我没有太多可以教的,但学习的最佳方式就是亲自去做。祝你好运,确保和小组成员一起探索并找出解决方案。
我在使用不同的技术栈来完成我的部分。如果你感兴趣,可以查看我的 在线演示 (opens in a new tab) 和 代码仓库 (opens in a new tab)
用户管理
- 会话管理:用户登录时会创建会话。
- 用户注册:新用户可以注册。
- 密码管理:密码必须使用加盐和哈希,并安全地进行验证。
注意:如果你使用 ==
或 ===
来比较密码哈希,或者使用 crypt
或 md5
函数,你将得到 0 分。
- 用户登出:用户可以登出。
- 用户权限管理:用户可以编辑和删除自己的故事和评论,但不能编辑或删除其他用户的内容。
故事与评论管理
- 数据库管理:使用正确的数据类型和外键配置关系数据库。
- 故事发布:用户可以发布故事。
- 链接关联:每个故事可以关联一个链接,存储在单独的数据库列中。
- 评论发布:用户可以发布评论并关联到某个故事。
- 故事与评论的编辑和删除:用户可以编辑和删除自己的故事和评论。
提交一个 tables.sql
文件,展示所有表的结构。
最佳实践
- 代码质量:代码格式良好,易于阅读,并有适当的注释。
- SQL 注入防护:网站需防止 SQL 注入攻击。
- 遵循 FIEO 哲学:遵循 "First In, Early Out" 哲学。
- W3C 验证:所有页面需通过 W3C 的 HTML 和 CSS 验证。
- CSRF 保护:创建、编辑、删除评论和故事时,需传递 CSRF 令牌。
可用性
- 用户体验:网站易于使用和导航。
- 视觉吸引力:网站设计应具有视觉吸引力。
多人项目评分标准 (Grading)
用户管理 (User Management) - 20 分
-
会话管理(3 分)
- 用户登录时创建会话。
-
用户注册(3 分)
- 新用户可以注册。
-
密码安全(3 分)
- 密码必须使用加盐和哈希进行安全验证。
-
用户登出(3 分)
- 用户可以登出。
-
用户权限(8 分)
- 用户可以编辑和删除自己的故事和评论,但不能编辑或删除他人的内容。
故事与评论管理 (Story and Comment Management) - 20 分
- 数据库结构(4 分)
- 数据库配置正确,包括数据类型和外键。
记得提交一个 使用 SHOW CREATE TABLE <TableName>
命令输出的 tables.sql
文件,展示所有表的结构
-
故事发布(3 分)
- 用户可以发布故事。
-
链接关联(3 分)
- 每个故事可以关联一个链接,并存储在数据库中。
-
评论发布(4 分)
- 用户可以发布与故事相关的评论。
-
编辑与删除(6 分)
- 用户可以编辑和删除故事及评论。
最佳实践 (Best Practices) - 15 分
-
代码格式(3 分)
- 代码格式良好并有适当的注释。
-
SQL 注入安全(2 分)
- 网站应防止 SQL 注入攻击。
-
FIEO 哲学(3 分)
- 遵循 "First In, Early Out" 哲学。
-
W3C 验证(2 分)
- 所有页面需通过 W3C 的 HTML 和 CSS 验证。
-
CSRF 保护(5 分)
- 在创建、编辑和删除评论及故事时,传递 CSRF 令牌。
可用性 (Usability) - 5 分
-
用户体验(4 分)
- 网站易于使用和导航。
-
视觉吸引力(1 分)
- 网站设计应具有视觉吸引力。
创意部分 (Creative Portion) - 15 分
- 在项目中实现有创意的功能或设计,向 TA 展示如何让网站脱颖而出。
确保你的 GitHub 仓库中包含以下内容:
- README.md 文件,包含:
- 小组成员的姓名和学号。
- 网站主页的链接。
- 你在创意部分实现的内容的简短描述。
- 任何 TA 需要的额外登录信息。