登录功能就像电影院的检票口,是用户进入系统的第一道关卡。我见过不少项目团队在开发时把登录当作"简单功能"草草了事,结果上线后各种问题频出。实际上,好的登录设计需要考虑完整的业务流程和异常处理。
以电影管理系统为例,登录用例的核心要素包括:
正常流程看似简单:输入→验证→跳转。但实际开发中,我建议至少考虑以下扩展场景:
java复制// 伪代码示例:登录验证核心逻辑
public Response login(String username, String password) {
if (!validateFormat(username, password)) {
return new Response(400, "格式错误");
}
User user = userRepository.findByUsername(username);
if (user == null || !passwordEncoder.matches(password, user.getPassword())) {
return new Response(401, "账号或密码错误");
}
if (user.isLocked()) {
return new Response(403, "账户已锁定");
}
String token = generateToken(user);
return new Response(200, "登录成功", token);
}
添加用户是管理系统的核心功能,我把它比作办理新的会员卡。在电影管理系统里,添加用户不仅仅是保存一条记录,还涉及数据校验、关联处理等复杂逻辑。
关键设计要点:
常见踩坑点:
sql复制-- 用户表设计建议
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(100) NOT NULL, -- 存储加密后的密码
email VARCHAR(100) UNIQUE,
phone VARCHAR(20),
status TINYINT DEFAULT 1, -- 1正常 0锁定
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
删除操作就像退会手续,需要考虑数据关联性。在电影系统里,删除用户可能连带删除其影评、订单等关联数据,这就是典型的级联处理场景。
设计策略对比:
| 处理方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 物理删除 | 彻底清理数据 | 无法恢复历史数据 | 合规要求删除的场景 |
| 逻辑删除 | 保留历史记录 | 需要额外字段标记 | 大多数业务场景 |
| 级联删除 | 自动清理关联数据 | 可能误删重要信息 | 强关联的附属数据 |
我推荐采用逻辑删除+手动清理的组合方案:
java复制// 逻辑删除示例
@Transactional
public void deleteUser(Long userId) {
User user = userRepository.findById(userId);
user.setDeleted(true);
user.setDeletedAt(LocalDateTime.now());
// 可选:清理关联数据
reviewRepository.deleteByUserId(userId);
}
修改用户信息就像更新会员资料,需要考虑变更审计和数据一致性。在电影票务系统中,用户手机号或邮箱的修改可能影响通知送达,需要特别处理。
关键设计模式:
实际项目中,我建议将用户信息分为:
javascript复制// 前端表单校验示例
const validateUserForm = (values) => {
const errors = {};
if (!values.username) {
errors.username = '必填字段';
} else if (values.username.length < 4) {
errors.username = '用户名至少4个字符';
}
if (values.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(values.email)) {
errors.email = '邮箱格式不正确';
}
return errors;
};
查询功能如同会员信息查询台,既要快速响应又要保护隐私。在电影管理系统中,用户查询往往是最频繁的操作,需要特别优化。
性能优化技巧:
对于复杂查询场景,我推荐采用CQRS模式:
python复制# Django查询优化示例
def user_list(request):
# 只查询需要的字段
queryset = User.objects.only('id', 'username', 'email', 'created_at')
# 搜索过滤
if 'search' in request.GET:
queryset = queryset.filter(
Q(username__icontains=request.GET['search']) |
Q(email__icontains=request.GET['search'])
)
# 分页处理
paginator = Paginator(queryset, 20)
page = paginator.get_page(request.GET.get('page'))
return render(request, 'user/list.html', {'page': page})
经过多个项目的实践,我总结出一些提升用例规约质量的实用技巧:
业务异常处理模板:
状态机管理:
对于复杂的用户状态流转(如注册→激活→正常→锁定),建议绘制状态图辅助设计:
code复制[未激活] -- 验证邮箱 --> [已激活]
[已激活] -- 登录 --> [正常使用]
[正常使用] -- 密码错误多次 --> [临时锁定]
[临时锁定] -- 超时或管理员解锁 --> [正常使用]
测试用例设计:
每个业务用例应配套测试用例,覆盖:
在电影票务系统的用户管理模块中,我通常会准备以下测试数据集: