小明: 嘿,小李,最近我在研究数字化校园的项目,想做一个试用系统,你有什么建议吗?
小李: 试用系统?听起来挺有意思的。你是想让用户在正式使用之前先体验一下功能吗?
小明: 对,就是这个意思。比如学生或者老师可以先试用某个课程管理系统,然后再决定是否购买或注册。
小李: 那么你需要设计一个试用机制,可能包括时间限制、功能限制,或者用户认证方式。
小明: 是的,我打算用Spring Boot和Vue.js来搭建系统。前端用Vue,后端用Spring Boot,这样比较方便。
小李: 很好,这种前后端分离的架构非常适合现代应用。那试用系统的逻辑怎么实现呢?
小明: 我想在数据库里加一个字段,表示是否是试用用户,然后根据这个字段控制功能访问。
小李: 这个思路不错。那你可以用Spring Security来做权限控制,结合JWT令牌验证用户身份。
小明: 对,我之前也考虑过JWT。不过试用用户可能不需要登录,可以直接生成一个临时的token。
小李: 没错,这样用户体验更好。那你有没有想过试用期的时间限制?比如只能用7天。

小明: 有,我打算在用户注册时设置一个试用开始时间,然后每天检查一次,超过7天就自动停用。
小李: 那你可以用定时任务来处理,比如用Spring的@Scheduled注解,每天执行一次。
小明: 好的,那我先写一个简单的例子,看看能不能运行起来。
小李: 不错,先从基础做起。下面我给你一个简单的试用系统代码示例,你可以参考一下。
小明: 太好了,我正需要这个!
小李: 那我们来看看后端代码。首先是一个简单的Spring Boot项目结构:
src/
├── main/
│ ├── java/
│ │ └── com.example.trial/
│ │ ├── DemoApplication.java
│ │ ├── controller/
│ │ │ └── TrialController.java
│ │ ├── service/
│ │ │ └── TrialService.java
│ │ └── model/
│ │ └── User.java
│ └── resources/
│ └── application.properties
小明: 看起来很清晰。那User模型应该包含哪些字段呢?
小李: 通常会有用户名、邮箱、创建时间、试用状态等字段。比如:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String email;
private LocalDateTime createTime;
private boolean isTrial;
private LocalDateTime trialEndDate;
// getters and setters
}
小明: 明白了。那试用状态和结束时间要怎么处理呢?
小李: 试用状态可以用布尔值表示,而结束时间则记录试用到期的时间。比如用户注册后,试用期为7天,那么trialEndDate = createTime.plusDays(7)。
小明: 那我需要一个服务类来处理这些逻辑,对吧?
小李: 对,比如TrialService中可以有一个方法来判断用户是否处于试用状态。
public boolean isTrialUser(User user) {
if (user.isTrial()) {
return user.getTrialEndDate().isAfter(LocalDateTime.now());
}
return false;
}
小明: 这个方法很好,能直接判断用户是否还在试用期内。
小李: 是的。接下来,我们可以写一个控制器,用于注册试用用户。
@RestController
@RequestMapping("/api/trial")
public class TrialController {
@Autowired
private TrialService trialService;
@PostMapping("/register")
public ResponseEntity registerTrialUser(@RequestBody User user) {
user.setCreateTime(LocalDateTime.now());
user.setIsTrial(true);
user.setTrialEndDate(user.getCreateTime().plusDays(7));
trialService.saveUser(user);
return ResponseEntity.ok("试用用户注册成功!");
}
@GetMapping("/check")
public ResponseEntity checkTrialStatus(@RequestParam String username) {
User user = trialService.getUserByUsername(username);
if (trialService.isTrialUser(user)) {
return ResponseEntity.ok("您当前处于试用期,剩余时间:" +
Duration.between(LocalDateTime.now(), user.getTrialEndDate()).toDays() + "天");
} else {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("试用期已过,请注册正式账号!");
}
}
}
小明: 这个控制器看起来很完整。那前端怎么调用呢?
小李: 前端可以用Axios或者Fetch API发送请求。比如注册试用用户时,发送POST请求到/api/trial/register。
小明: 好的,那我可以先用Vue写一个简单的界面,测试一下。
小李: 对,你可以用Vue组件来展示注册表单和试用状态检查结果。
小明: 那前端代码大致是怎样的?
小李: 比如,一个简单的注册页面,包含用户名和邮箱输入框,点击提交后调用API注册试用用户。
试用用户注册
{{ message }}
小明: 这个前端代码很简洁,适合快速上手。
小李: 是的,不过你还可以添加一些错误提示和加载状态,让用户体验更好。
小明: 对,我之后会完善这些细节。
小李: 另外,你还得考虑试用用户的权限问题。比如,试用用户只能访问部分功能,不能进行敏感操作。
小明: 是的,我打算用Spring Security来控制访问权限,只允许试用用户访问特定的接口。
小李: 很好。那你可以用@PreAuthorize注解来设置访问条件。

@GetMapping("/courses")
@PreAuthorize("hasRole('TRIAL') or hasRole('USER')")
public ResponseEntity> getAvailableCourses() {
return ResponseEntity.ok(courseService.findAll());
}
小明: 这样就能区分不同角色的用户权限了。
小李: 对,同时你也可以在登录时根据用户类型返回不同的数据。
小明: 好的,我觉得现在这个试用系统的基础已经差不多了。
小李: 是的,接下来你可以测试一下流程,确保注册、试用、权限控制等功能都能正常运行。
小明: 了解,谢谢你的帮助,小李!

小李: 不客气,有问题随时来找我!
小明: 一定!
