下面我们看下我们的需求吧,有个文章系统,我们先统计当月的访问次数和当年的访问次数。怎么办呢,我们可以把年和月当成一个键。例如年--2016 月--201608。
下面看下数据库设计吧
business_ranking(用户排行榜表)
属性 | 数据库字段 | 数据类型 | 描述 |
id | id | Long |
|
排行码 | code | varchar(50) | 例如2015,201508,20150901 |
分类 | catalog | int |
|
数量 | quantity | int |
|
用户 | member_id | Long | 用户 |
business_ranking_alias(用户排行别名)
属性 | 数据库字段 | 数据类型 | 描述 |
id | id | Long |
|
排名 | ranking | int | 例如1,2,3,4,5,6 |
分类 | catalog | int |
|
图标 | icon | varchar(50) |
|
名称 | name | varchar(10) |
|
/**
* 更新排行榜
* @param code 排行日期 例如2015 201508
* @param catalog 什么排行榜
* @param member 用户
* @param num 数量
* @return
*/
@Override
public Ranking ranking(String code, int catalog, Long member, Integer num) {
Ranking result = null;
Finder finder = Finder.create();
finder.append("from Ranking r where r.code=:code ");
finder.setParam("code", code);
finder.append(" and r.catalog=:catalog");
finder.setParam("catalog", catalog);
finder.append(" and r.member.id=:member");
finder.setParam("member", member);
result = findOne(finder);
if (result == null) {
result = new Ranking();
Member m = new Member();
m.setId(member);
result.setMember(m);
result.setCatalog(catalog);
result.setCode(code);
result.setQuantity(num);
save(result);
} else {
int q = result.getQuantity();
int fnum = q + num;
result.setQuantity(fnum);
result.setLastDate(new Date());
}
return result;
}
/**
* 查询某个排行榜
* @param code 排行日期 例如2015 201508
* @param catalog 什么排行榜
* @param num 排行的数量
* @return
*/
@Override
public List<Ranking> ranking(String code, int catalog, int num) {
List<Ranking> result = null;
Finder finder = Finder.create();
finder.append("from Ranking r where r.code=:code ");
finder.setParam("code", code);
finder.append(" and r.catalog=:catalog");
finder.setParam("catalog", catalog);
finder.append(" order by r.quantity desc");
finder.setMaxResults(num);
result = find(finder);
return result;
}
@Service
@Transactional
public class RankingWork {
@Autowired
RankingDao rankingDao;
@Autowired
RankingAliasWork rankingAliasWork;
public List<RankingVo> task() {
return ranking(ScoreEnum.TaskYear.ordinal(),ScoreEnum.TaskMonth.ordinal());
}
public List<RankingVo> warn() {
return ranking(ScoreEnum.WarnYear.ordinal(),ScoreEnum.WarnMonth.ordinal());
}
public List<RankingVo> like() {
return ranking(ScoreEnum.LikeYear.ordinal(),ScoreEnum.LikeMonth.ordinal());
}
public List<RankingVo> quality() {
return ranking(ScoreEnum.QualityYear.ordinal(),ScoreEnum.QualityMonth.ordinal());
}
/**
* 幸福豆排行榜
*
* @return
*/
public List<RankingVo> standard() {
return ranking(ScoreEnum.StandardYear.ordinal(),ScoreEnum.StandardMonth.ordinal());
}
public List<RankingVo> ranking(int yearindex,int monthindex) {
List<RankingVo> result = new ArrayList<RankingVo>();
List<Ranking> years = rankingDao.ranking(CodeUtils.year(), yearindex, 15);
List<Ranking> months = rankingDao.ranking(CodeUtils.year(), monthindex, 15);
if (years != null) {
for (int i = 0; i < years.size(); i++) {
Ranking ranking = years.get(i);
Ranking month = months.get(i);
RankingVo temp = new RankingVo();
int index = i + 1;
temp.setNum(index);
temp.setMontName(month.getMember().getName());
temp.setYearName(ranking.getMember().getName());
AliasDatas yeardatas = rankingAliasWork.catalog(yearindex);
AliasDatas mondatas = rankingAliasWork.catalog(monthindex);
temp.setMonthAlias(mondatas.get(index));
temp.setYearAlias(yeardatas.get(index));
result.add(temp);
}
}
return result;
}
}