0nlineTek Web 2024 年度核心成员考核
下面的所有题目中,任选一道完成即可(不限制前后端),如有余力可以完成多道。
如有任何疑惑,可以在群里提问。
目录
前端题目
需要用到的后端的 API 文档可以点击这里查看。
题目 1. ITEMS CRUD: 办公室物资清单维护
难度评级:★★★★☆
涉及到的数据类型和说明:
// 物资分类
type ItemCategory = {
// 分类 ID
id: string;
// 分类的名称,长度 [1, 64]
name: string;
};
type Item = {
// 物资 ID
id: string;
// 物资名称,长度 [1, 64]
name: string;
// 物资对应的分类的 ID
categoryId: string;
// 物资的数量,必须为非负数
quantity: string;
// 物资是否可以外借
lendable: boolean;
// 备注,长度 [0, 1024]
notes: string;
// 添加时间
createdAt: Date;
};
初步要求
- 使用表格展示数据
- 可以单独查看某一条的详细信息
- 分页
进阶 1
- 新条目添加、更新和删除
- 排序
- 按创建时间(API 默认行为)
- 按数量
- 升序/降序
- 筛选条件
- 按分类
- 按是否可外借
- 按名字模糊查询
进阶 2
- 为条目的添加和更新添加前端表单校验
- 完善错误处理
题目 2. AUTH: 用户鉴权和个人信息维护
难度评级:★★★☆☆
涉及到的数据类型和说明:
type User = {
// 用户 ID
id: string;
// 用户名字,长度 [1, 32]
name: string | undefined;
// 用户邮箱,必须符合邮箱的格式
email: string;
// 手机号,长度 [11, 11]
phone: string | undefined;
// 头像的 URL
avatarUrl: string | undefined;
// 个人简介, 长度 [0, 1024]
bio: string | undefined;
// 生日
birthday: Date | undefined;
// 用户注册的时间
createdAt: Date;
};
初步要求
- 登录和注册页面
- 个人信息查看
进阶 1
- 个人信息修改
进阶 2
- 添加表单校验
- 添加用户头像上传(自行寻找图床 API)
题目 3. CANVAS: 使用 canvas 实现一个简单的画板
难度评级:★★★☆☆
初步要求
- 画笔
- 橡皮
进阶
自行拓展
后端题目
基本需求
- 能根据实际业务,构建对应的API接口,接口的使用要符合直觉
- 尽可能使用RESTful的接口设计模式
- 有基本的安全性和隐私性考虑,接口尽可能不要返回多余“所需”的数据,并且尽可能不要存留不必要的数据
- 所有超级管理员都是账户Admin密码Passwd
1 物资台账管理系统接口
有一个仓库,里面有大量物资。一开始大家都在手动使用Excel,但是后来发现实在是麻烦,于是准备建立一个系统。
假设一个物品有包括但不限于以下属性
-
名称
-
价值(当然这个可能是未知,但是不可能为负数)
-
加入仓库的日期
-
物品来源(比如某活动的剩余,或者谁的赠予)
-
图片(这个也可能没有)
-
摆放的位置
-
其他备注 此外,由于物品可能需要被拿出去使用,还需要登记
-
使用目的
-
使用人
-
(预计)使用时间(某年某月某日几点到某年某月某日几点)
-
批准人
-
状态(等待批准/未批准/已批准未借出/正在使用/已归还/逾期/已赔偿)
为了完成借用,用户可以提交申请,然后由有权限的管理员审核,并登记状态变更。特别地,折旧报废,赠出等,使用时间的截止日期为空或者一个咱都活不到的时间,比如1000年后。
管理员可以自己记录台账,这些内容要求可以选择不公开,只能由管理员的Token查询这个记录ID。有关API用Token鉴权。最后提交的时候应给出生成Token的方式以供调试,但是不必为此专门写一个登录和用户管理系统。
修改状态只有两种情况:批准、借出、归还和结算赔偿。同时,借出时更新使用时间的起始值,归还和结算赔偿时更新终止值
为了方便起见,我们用户填写借阅申请不需要登录,所有用户递交的申请具体情况都向外公开,因此需要一个接口,获取所有的物资借用申请的情况(要求分页,可选一页10个/20个/50个);并能由某一个特定申请单号查询。
-
2 用户管理
众所周知,在世一大有一个统一认证,通过学号和密码可以登录。现在我们需要创建一个应用程序,通过这个方式认证登入,而管理用户。
注意,我们不允许存放用户密码,也不容易向学校申请接入那个系统!因此,需要想一个办法去调用能够外部的统一认证接口,从而确定输入的账户和密码是不是正确的;然后我们可以根据这个创建令牌放在Cookies里面,在我们自己的应用程序里面使用,这样就不需要总是调用那个接口了。
至于如何调用那个接口...感谢这个民间项目:https://github.com/Jenway/SDU_login_API
现在我们需要建立一个系统,允许如下操作:
- 用户输入SDU SSO的账户密码登入。
- 登入成功完成之后可以获取一个Token
我们还需要建立一个API让前端可以获得用户的个人信息(学号和姓名), 但是为了隐私的考虑我们不允许以任何方式缓存这个具体信息!
此外,我们虽然不缓存这个具体信息,但是我们需要保存每个用户在这个程序使用过程中产生的数据。以一个最简单的程序为例,我们允许用户提交字符串并保存在服务器内,后续可以根据字符串的ID重新获取自己此前提交的字符串内容。此外,如果用户愿意公开,这个字符串可以由其他的用户也读取到;但是如果不愿意公开,那么只有自己允许获取。此外,用户自己可以获取自己所有提交的字符串ID并且修改、删除其中的某一部分。
这个程序基本上就完工了,但是我们还需要在里面创建一个后门,所谓超级管理员,他有权限、有办法修改数据库里面的一切用户数据,比如说,把某个用户的字符串内容改掉或者删掉。这个管理员的登录也需要使用相同的登录API获取Token,但是这个token允许操作一切用户数据,不只是他自己的。
全栈题目
题目 1. CHAT BOX: 一个简单的网页聊天室
难度评级:★★★★☆
围绕题目,自由发挥即可。
基本要求
- 单个房间
- 可以采用 轮询/ WebSocket 实现
进阶 1
- 多个房间
- 使用 WebSocket 实现