提交 58b7ab67 编写于 作者: 街头小贩's avatar 街头小贩

更新会员在线功能相关的代码

上级 f805365a
......@@ -74,6 +74,7 @@ public class MemberOnlineDaoImpl implements MemberOnlineDao{
}
return i;
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void save(MemberOnline entity) {
......@@ -81,9 +82,10 @@ public class MemberOnlineDaoImpl implements MemberOnlineDao{
}
@Override
public Optional<MemberOnline> findOne(Long primaryKey) {
public Optional<MemberOnline> findOne(String primaryKey) {
return Optional.ofNullable(entityManager.find(MemberOnline.class, primaryKey));
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public Optional<Boolean> edit(MemberOnline updateEntity) {
......@@ -111,4 +113,32 @@ public class MemberOnlineDaoImpl implements MemberOnlineDao{
}
return 0L;
}
@Override
public MemberOnline findOneByMember(long memberId) {
try{
return entityManager.createQuery("SELECT mo FROM MemberOnline mo WHERE mo.mid > 0 AND mo.mid = ?1", MemberOnline.class).setParameter(1, memberId).getSingleResult();
}catch(javax.persistence.NoResultException e){
if(logger.isDebugEnabled()){
logger.debug("查看非游客的在线记录失败", e);
}
}
return null;
}
@Override
public MemberOnline findOneByMember(long memberId, String names, String nickname) {
try{
return entityManager.createQuery("SELECT mo FROM MemberOnline mo WHERE mo.mid = ?1 AND mo.memberNames = ?2 AND mo.memberNickname = ?3", MemberOnline.class)
.setParameter(1, memberId)
.setParameter(1, names)
.setParameter(3, nickname)
.getSingleResult();
}catch(javax.persistence.NoResultException e){
if(logger.isDebugEnabled()){
logger.debug("查看会员的在线记录失败", e);
}
}
return null;
}
}
\ No newline at end of file
......@@ -51,13 +51,16 @@ public class MemberOnlineServiceImpl implements MemberOnlineService{
@Override
public Optional<MemberOnline> get(long memberId) {
return memberOnlineDao.findOne(memberId);
if(memberId>0){
return Optional.ofNullable(memberOnlineDao.findOneByMember(memberId));
}
return Optional.empty();
}
@Override
public Optional<Long> create(MemberOnline memberOnline) {
Optional<MemberOnline> obj = get(memberOnline.getMid());
if (!obj.isPresent()) {
MemberOnline obj = memberOnlineDao.findOneByMember(memberOnline.getMid(), memberOnline.getMemberNames(), memberOnline.getMemberNickname());
if (null == obj) {
try {
memberOnlineDao.save(memberOnline);
return Optional.of(memberOnline.getMid());
......@@ -67,10 +70,9 @@ public class MemberOnlineServiceImpl implements MemberOnlineService{
}
}
} else {
MemberOnline data = obj.get();
data.setAction(memberOnline.getAction());
data.setActiveDateTime(memberOnline.getActiveDateTime());
memberOnlineDao.edit(data);
obj.setAction(memberOnline.getAction());
obj.setActiveDateTime(memberOnline.getActiveDateTime());
memberOnlineDao.edit(obj);
}
return Optional.empty();
}
......
......@@ -23,7 +23,7 @@ public class MemberSessionBeanBuilder {
private String signature = "";
private String nickname = Member.GUEST_NAMES;
private LocalDateTime registeDateTime = null;
private String names = "*";
private String names = "guest";
//
private MemberSessionBeanBuilder() {
}
......
......@@ -12,7 +12,7 @@ import java.util.stream.Stream;
* @author xiaofanku
* @since 20200515
*/
public interface MemberOnlineDao extends DataRepository<MemberOnline, Long> {
public interface MemberOnlineDao extends DataRepository<MemberOnline, String> {
/**
* 查看指定会员的在线记录
*
......@@ -46,4 +46,21 @@ public interface MemberOnlineDao extends DataRepository<MemberOnline, Long> {
* @return
*/
int batchSave(List<MemberOnline> entities);
/**
* 查看指定会员(非游客)的在线记录
*
* @param memberId 会员ID
* @return
*/
MemberOnline findOneByMember(long memberId);
/**
* 查看指定会员(支持游客)的在线记录
* @param memberId 会员ID
* @param names 会员的登录帐号
* @param nickname 会员的昵称
* @return
*/
MemberOnline findOneByMember(long memberId, String names, String nickname);
}
\ No newline at end of file
......@@ -4,11 +4,13 @@ import com.apobates.forum.event.elderly.ForumActionEnum;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
/**
* 会员在线记录
......@@ -17,14 +19,20 @@ import javax.persistence.Table;
* @since 20200514
*/
@Entity
@Table(name = "apo_member_online")
@Table(name = "apo_member_online", uniqueConstraints = {@UniqueConstraint(columnNames = {"mid", "memberNames", "memberNickname"})})
public class MemberOnline implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(nullable = false, length = 32, columnDefinition="CHAR NOT NULL")
private String id;
/**
* 会员ID
*/
@Id
private long mid;
/**
* 会员的登录帐号
*/
private String memberNames;
/**
* 会员昵称
*/
......@@ -43,11 +51,13 @@ public class MemberOnline implements Serializable {
public MemberOnline() {
}
public MemberOnline(long memberId, String memberNickname, ForumActionEnum action) {
public MemberOnline(String sessionId, long memberId, String memberNames, String memberNickname, ForumActionEnum action) {
this.action = action;
this.mid = memberId;
this.memberNames = memberNames;
this.memberNickname = memberNickname;
this.activeDateTime = LocalDateTime.now();
this.id = sessionId;
}
public long getMid() {
......@@ -81,4 +91,21 @@ public class MemberOnline implements Serializable {
public void setActiveDateTime(LocalDateTime activeDateTime) {
this.activeDateTime = activeDateTime;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMemberNames() {
return memberNames;
}
public void setMemberNames(String memberNames) {
this.memberNames = memberNames;
}
}
\ No newline at end of file
......@@ -5,6 +5,7 @@ import com.apobates.forum.core.ImageIOMeta;
import com.apobates.forum.member.storage.OnlineMemberStorage;
import com.apobates.forum.member.storage.cookie.CookieMetaConfig;
import com.apobates.forum.thrones.controller.helper.AuthenticationInterceptor;
import com.apobates.forum.thrones.controller.helper.MemberOnlineInterceptor;
import com.apobates.forum.thrones.controller.helper.RegisteChannelInterceptor;
import com.apobates.forum.thrones.rss.TopicRssView;
import org.springframework.beans.factory.annotation.Value;
......@@ -67,6 +68,11 @@ public class ThronesFrontConfig implements WebMvcConfigurer {
public RegisteChannelInterceptor getRegisInter() {
return new RegisteChannelInterceptor();
}
//
@Bean
public MemberOnlineInterceptor getMemberOLInter() {
return new MemberOnlineInterceptor();
}
/**
* 配置请求视图映射
*
......@@ -127,6 +133,8 @@ public class ThronesFrontConfig implements WebMvcConfigurer {
registry.addInterceptor(getAuthInter()).excludePathPatterns("/member/home/board/active/json", "/member/home/topic/publish/json", "/member/home/topic/reply/json").addPathPatterns("/member/home/**", "/message/**", "/topic/create", "/posts/create", "/posts/reply", "/search/");
// 注册通道检查拦截器
registry.addInterceptor(getRegisInter()).addPathPatterns("/member/register");
// 在线拦截器
registry.addInterceptor(getMemberOLInter()).addPathPatterns("/**").excludePathPatterns("/static/**");
}
//HV && BV
@Override
......
......@@ -24,7 +24,6 @@ public class RegisteForm extends ActionForm {
private String pswdConfirm;
// 验证码
// private String capture;
//@HVInviteCode(allow=true)
private String inviteCode;
public String getNames() {
......
package com.apobates.forum.thrones.controller.helper;
import com.apobates.forum.member.entity.MemberOnline;
import com.apobates.forum.member.service.MemberOnlineService;
import com.apobates.forum.member.storage.OnlineMemberStorage;
import com.apobates.forum.member.storage.core.MemberSessionBean;
import com.apobates.forum.member.storage.core.MemberSessionBeanBuilder;
import com.apobates.forum.utils.Commons;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.SmartView;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
* 在线会员记录拦截器
*
* @author xiaofanku
* @since 20200607
*/
public class MemberOnlineInterceptor extends HandlerInterceptorAdapter{
@Autowired
private OnlineMemberStorage onlineMemberStorage;
@Autowired
private MemberOnlineService memberOnlineService;
private final static Logger logger = LoggerFactory.getLogger(MemberOnlineInterceptor.class);
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("[MOI][AFT]after handle start");
}
/**
* Executed before after handler is executed.If view is a redirect view, we don't need to execute postHandle
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws java.lang.Exception
**/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("[MOI][PST]post handle start");
if (modelAndView != null && !isRedirectView(modelAndView)) {
logger.info(String.format("[MOI][PST]mapping view:%s", modelAndView.getViewName()));
//------------------------------------------会员在线记录
MemberSessionBean mbean = getMemberBean(request);
memberOnlineService.create(new MemberOnline(request.getSession().getId(), mbean.getMid(), mbean.getNames(), mbean.getNickname(), null));
//------------------------------------------
}
}
/**
* Executed before actual handler is executed
* @param request
* @param response
* @param handler
* @return
* @throws java.lang.Exception
**/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info(String.format("[MOI][PRE]request uri:%s", request.getRequestURI()));
return true;
}
private MemberSessionBean getMemberBean(HttpServletRequest request){
MemberSessionBean mbean = onlineMemberStorage.getInstance(request, "MemberOnlineInterceptor").orElse(null);
if (null == mbean || !mbean.isOnline()) {
String ipAddr = Commons.getRequestIp(request);
String gnick = String.format("Guest#%d", Commons.ipHashcode(ipAddr));
mbean = MemberSessionBeanBuilder.empty().setNickname(gnick).build(Commons.getRequestIp(request), "MOI");
}
return mbean;
}
public static boolean isRedirectView(ModelAndView mv) {
String viewName = mv.getViewName();
if (viewName.startsWith("redirect:/")) {
return true;
}
View view = mv.getView();
return (view != null && view instanceof SmartView && ((SmartView) view).isRedirectView());
}
}
\ No newline at end of file
......@@ -31,7 +31,7 @@ site.theme=/WEB-INF/layout/page/default/
site.appname=Orion jForum
site.logo=static/img/logo.svg
site.pageSize=20
site.sessionSymbol=fxost
# site.sessionSymbol=fxost
site.cookieSymbol=fx_ost
# \u672c\u5730\u6d4b\u8bd5\u7528\u7684\u53d8\u91cf\u5f00\u59cb[cookie]
site.cookieDomain=center.test.com
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册