一、需求分析
点名系统是一款简单的学生点名工具,需求主要有以下几个方面:
- 学生名单管理。系统需要有学生名单管理页面,可以添加、删除、修改学生信息;
- 点名功能。系统需要有点名功能,可以在名单中随机选择一个学生进行点名;
- 数据统计。系统需要有数据统计功能,可以统计每个学生点名的次数。
二、系统设计
系统采用了前后端分离的设计方案,前端使用React框架进行开发,后端使用Node.js搭建服务器,使用MongoDB作为数据库存储。
三、前端设计
- 学生名单管理页面。页面采用表格形式展示学生信息,可以进行新增、删除、修改、查询等操作。代码示例:
class StudentList extends React.Component {
state = {
students: [], // 学生列表
showModal: false, // 是否显示模态框
modalType: '', // 模态框类型:新增、编辑、删除
selectedId: '', // 选中的学生id
name: '',
gender: '',
age: '',
};
componentDidMount() {
this.fetchStudents();
}
fetchStudents = () => {
// fetch students from server
// update this.state.students
};
handleAdd = () => {
// show add modal
};
handleEdit = (id) => {
// show edit modal of student with specified id
};
handleDelete = (id) => {
// show delete modal of student with specified id
};
handleSave = () => {
// save student info
// update this.state.students
// hide modal
};
handleCancel = () => {
// hide modal
};
render() {
const columns = [
{ title: '姓名', dataIndex: 'name', key: 'name' },
{ title: '性别', dataIndex: 'gender', key: 'gender' },
{ title: '年龄', dataIndex: 'age', key: 'age' },
{
title: '操作',
dataIndex: 'id',
key: 'id',
render: (id) => (
<span>
<a onClick={() => this.handleEdit(id)}>编辑</a>
<Divider type="vertical" />
<a onClick={() => this.handleDelete(id)}>删除</a>
</span>
),
},
];
return (
<>
<button type="primary" onClick={this.handleAdd}>
新增
</button>
<Table dataSource={this.state.students} columns={columns} />
<AddEditDeleteModal
visible={this.state.showModal}
type={this.state.modalType}
name={this.state.name}
gender={this.state.gender}
age={this.state.age}
onNameChange={this.handleNameChange}
onGenderChange={this.handleGenderChange}
onAgeChange={this.handleAgeChange}
onSave={this.handleSave}
onCancel={this.handleCancel}
/>
</>
);
}
}
- 点名页面。页面上方显示上一个被点到的学生,下方有“点名”按钮,点击后会随机选择一个学生。
class NamePicker extends React.Component {
state = {
name: '', // 上一个被点到的学生姓名
candidates: [], // 参与点名的学生集合
};
componentDidMount() {
this.fetchCandidates();
}
fetchCandidates = () => {
// fetch students from server and update this.state.candidates
};
handlePick = () => {
// randomly pick a student from this.state.candidates
// update this.state.name and remove the student from this.state.candidates
};
render() {
return (
<>
<div>上一个被点到的学生:{this.state.name}</div>
<button type="primary" onClick={this.handlePick}>
点名
</button>
</>
);
}
}
四、后端设计
- 学生信息管理API。通过该API实现学生信息的增删改查,代码示例:
// 添加新学生
app.post('/api/students', async (req, res) => {
try {
const newStudent = new Student(req.body);
await newStudent.save();
res.status(201).json(newStudent.toJSON());
} catch (err) {
console.error(err);
res.status(500).send(err.message);
}
});
// 删除学生
app.delete('/api/students/:id', async (req, res) => {
try {
const id = req.params.id;
await Student.findByIdAndDelete(id);
res.sendStatus(204);
} catch (err) {
console.error(err);
res.status(500).send(err.message);
}
});
// 修改学生信息
app.put('/api/students/:id', async (req, res) => {
try {
const id = req.params.id;
const updates = req.body;
await Student.findByIdAndUpdate(id, updates);
const updatedStudent = await Student.findById(id);
res.json(updatedStudent.toJSON());
} catch (err) {
console.error(err);
res.status(500).send(err.message);
}
});
// 获取所有学生信息
app.get('/api/students', async (_, res) => {
try {
const students = await Student.find({});
res.json(students.map((s) => s.toJSON()));
} catch (err) {
console.error(err);
res.status(500).send(err.message);
}
});
// 获取指定id的学生信息
app.get('/api/students/:id', async (req, res) => {
try {
const id = req.params.id;
const student = await Student.findById(id);
res.json(student.toJSON());
} catch (err) {
console.error(err);
res.status(500).send(err.message);
}
});
- 点名API。通过该API实现随机点名和点名次数统计,代码示例:
// 获取随机学生id
app.get('/api/pick', async (_, res) => {
try {
const students = await Student.find({});
const ids = students.map((s) => s._id);
const pickedId = ids[Math.floor(Math.random() * ids.length)];
const pickedStudent = await Student.findById(pickedId);
res.json(pickedStudent.toJSON());
} catch (err) {
console.error(err);
res.status(500).send(err.message);
}
});
// 获取所有学生的点名次数
app.get('/api/stats', async (_, res) => {
try {
const students = await Student.find({});
const stats = students.reduce((acc, s) => {
acc[s.name] = s.pickedCount;
return acc;
}, {});
res.json(stats);
} catch (err) {
console.error(err);
res.status(500).send(err.message);
}
});
五、总结
点名系统是一款简单实用的学生点名工具,本文主要介绍了其需求分析、系统设计以及前后端代码实现。通过该系统,我们不仅可以快速进行学生点名,还可以方便地管理学生名单和统计每个学生的点名次数。