1. 数据库设计
首先,设计一个简单的表来存储访问数据:
CREATE TABLE visit_count (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
date DATE UNIQUE,
count BIGINT DEFAULT 0
);
在这个表中,date
字段表示日期,count
字段表示当天的访问量。
2. Mapper层
创建一个Mapper接口以及其XML配置,用于实现访问数据库的操作:
VisitCountMapper.java:
public interface VisitCountMapper {
// 获取指定日期的访问量
Long getVisitCountByDate(LocalDate date);
// 为指定日期的访问量增加一
void increaseVisitCount(LocalDate date);
// 如果指定日期的记录不存在,则插入一条新记录
void insertVisitCount(LocalDate date);
}
VisitCountMapper.xml:
<mapper namespace="your.package.VisitCountMapper">
<select id="getVisitCountByDate" resultType="Long">
SELECT count FROM visit_count WHERE date = #{date}
</select>
<update id="increaseVisitCount">
UPDATE visit_count SET count = count + 1 WHERE date = #{date}
</update>
<insert id="insertVisitCount">
INSERT INTO visit_count (date, count) VALUES (#{date}, 0)
</insert>
</mapper>
3. Service层
接下来,编写Service层的代码来处理业务逻辑:
VisitCountService.java:
public interface VisitCountService {
void recordVisit();
}
@Service
public class VisitCountServiceImpl implements VisitCountService {
@Autowired
private VisitCountMapper visitCountMapper;
@Override
public Long recordVisit() {
LocalDate today = LocalDate.now();
Long visits = visitCountMapper.getVisitCountByDate(today);
if (visits == null) {
// 当天记录不存在,插入新记录
visitCountMapper.insertVisitCount(today);
}
// 为当天的访问量加一
visitCountMapper.increaseVisitCount(today);
return visits;
}
}
4. Controller层
在Controller层,可以处理HTTP请求并调用recordVisit
方法:
VisitCountController.java:
@RestController
public class VisitCountController {
@Autowired
private VisitCountService visitCountService;
// 此处将访问首页的次数作为访问量
@GetMapping("/home")
public Result countVisit() {
Long res = visitCountService.recordVisit();
return new Result(1,"访问量+1",res);//res即为当日首页的访问量
}
}
每当/home
接口被调用时,访问量就会被记录下来。
不过,实际应用中,访问量更多被用于每篇文章或帖子的访问量,针对每个页面都写一个代码未免有些繁琐,大家可以在Service层或用Spring的@ControllerAdvice
结合HandlerInterceptor
在Controller层中的每个请求处理中统一调用recordVisit()
方法,从而达到统计所有页面访问量的目的。