Commit 43b77d5285afe6e0ee7212b3c28dddbc54e2dec9
1 parent
4c5fbfc5
增加直播同步接口
Showing
19 changed files
with
763 additions
and
273 deletions
src/main/java/com/cnlive/shenhe/config/MyInterceptor.java
0 → 100644
| 1 | +package com.cnlive.shenhe.config; | |
| 2 | + | |
| 3 | +import org.omg.PortableInterceptor.Interceptor; | |
| 4 | +import org.springframework.stereotype.Component; | |
| 5 | +import org.springframework.web.servlet.HandlerInterceptor; | |
| 6 | +import org.springframework.web.servlet.ModelAndView; | |
| 7 | + | |
| 8 | +import com.cnlive.shenhe.bean.SessionUser; | |
| 9 | +import com.cnlive.shenhe.utils.CommonUtils; | |
| 10 | + | |
| 11 | +import javax.servlet.http.HttpServletRequest; | |
| 12 | +import javax.servlet.http.HttpServletResponse; | |
| 13 | +import javax.servlet.http.HttpSession; | |
| 14 | + | |
| 15 | +@Component | |
| 16 | +public class MyInterceptor implements HandlerInterceptor { | |
| 17 | + @Override | |
| 18 | + public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { | |
| 19 | + HttpSession httpSession=httpServletRequest.getSession(); | |
| 20 | + SessionUser sessionUser = (SessionUser)httpSession.getAttribute(SessionUser.getSessionKey()); | |
| 21 | + if(CommonUtils.isNull(sessionUser)){ | |
| 22 | + httpServletRequest.getRequestDispatcher("/users/login").forward(httpServletRequest, httpServletResponse); | |
| 23 | + return false; | |
| 24 | + } | |
| 25 | + | |
| 26 | + return true; | |
| 27 | + } | |
| 28 | + | |
| 29 | + @Override | |
| 30 | + public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { | |
| 31 | + | |
| 32 | + } | |
| 33 | + | |
| 34 | + @Override | |
| 35 | + public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { | |
| 36 | + | |
| 37 | + } | |
| 38 | +} | ... | ... |
src/main/java/com/cnlive/shenhe/config/SessionFilter.java
0 → 100644
| 1 | +package com.cnlive.shenhe.config; | |
| 2 | +import org.slf4j.LoggerFactory; | |
| 3 | +import org.springframework.web.context.request.RequestContextHolder; | |
| 4 | +import org.springframework.web.context.request.ServletRequestAttributes; | |
| 5 | + | |
| 6 | +import com.cnlive.shenhe.bean.SessionUser; | |
| 7 | + | |
| 8 | +import javax.servlet.*; | |
| 9 | +import javax.servlet.http.HttpServletRequest; | |
| 10 | +import javax.servlet.http.HttpServletResponse; | |
| 11 | +import javax.servlet.http.HttpSession; | |
| 12 | +import java.io.IOException; | |
| 13 | +import java.util.ArrayList; | |
| 14 | +import java.util.List; | |
| 15 | +import java.util.regex.Matcher; | |
| 16 | +import java.util.regex.Pattern; | |
| 17 | + | |
| 18 | +/** | |
| 19 | + * Created by liwei on 2018/08/28. | |
| 20 | + * | |
| 21 | + * 过滤器 | |
| 22 | + */ | |
| 23 | +public class SessionFilter implements Filter { | |
| 24 | + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(SessionFilter.class); | |
| 25 | + HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); | |
| 26 | + HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse(); | |
| 27 | + /** | |
| 28 | + * 封装,不需要过滤的list列表 | |
| 29 | + */ | |
| 30 | + protected static List<Pattern> patterns = new ArrayList<Pattern>(); | |
| 31 | + | |
| 32 | + @Override | |
| 33 | + public void init(FilterConfig filterConfig) throws ServletException { | |
| 34 | + | |
| 35 | + } | |
| 36 | + | |
| 37 | + @Override | |
| 38 | + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { | |
| 39 | + HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; | |
| 40 | + HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; | |
| 41 | + logger.info("进入过滤器"); | |
| 42 | + String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length()); | |
| 43 | + if (url.startsWith("/") && url.length() > 1) { | |
| 44 | + url = url.substring(1); | |
| 45 | + } | |
| 46 | + | |
| 47 | + if (isInclude(url)){ | |
| 48 | + chain.doFilter(httpRequest, httpResponse); | |
| 49 | + return; | |
| 50 | + } else { | |
| 51 | + HttpSession session = httpRequest.getSession(); | |
| 52 | + if (session.getAttribute(SessionUser.getSessionKey()) != null){ | |
| 53 | + // session存在 | |
| 54 | + chain.doFilter(httpRequest, httpResponse); | |
| 55 | + return; | |
| 56 | + } else { | |
| 57 | + // session不存在 准备跳转失败 | |
| 58 | + RequestDispatcher dispatcher = request.getRequestDispatcher("/users/login"); | |
| 59 | + dispatcher.forward(request, response); | |
| 60 | +// chain.doFilter(httpRequest, httpResponse); | |
| 61 | + return; | |
| 62 | + } | |
| 63 | + } | |
| 64 | + | |
| 65 | + | |
| 66 | + } | |
| 67 | + | |
| 68 | + @Override | |
| 69 | + public void destroy() { | |
| 70 | + | |
| 71 | + } | |
| 72 | + | |
| 73 | + | |
| 74 | + /** | |
| 75 | + * 是否需要过滤 | |
| 76 | + * @param url | |
| 77 | + * @return | |
| 78 | + */ | |
| 79 | + private boolean isInclude(String url) { | |
| 80 | + for (Pattern pattern : patterns) { | |
| 81 | + Matcher matcher = pattern.matcher(url); | |
| 82 | + if (matcher.matches()) { | |
| 83 | + return true; | |
| 84 | + } | |
| 85 | + } | |
| 86 | + return false; | |
| 87 | + } | |
| 88 | + | |
| 89 | +} | ... | ... |
src/main/java/com/cnlive/shenhe/config/WebConfiguration.java
| ... | ... | @@ -16,10 +16,10 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; |
| 16 | 16 | @EnableScheduling |
| 17 | 17 | public class WebConfiguration implements WebMvcConfigurer { |
| 18 | 18 | |
| 19 | - /* @Override | |
| 19 | + @Override | |
| 20 | 20 | public void addInterceptors(InterceptorRegistry registry) { |
| 21 | - registry.addInterceptor(new LoginIntercept()).addPathPatterns("/**"); | |
| 22 | - }*/ | |
| 21 | + registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/api/**","/users/login"); | |
| 22 | + } | |
| 23 | 23 | @Override |
| 24 | 24 | public void addResourceHandlers(ResourceHandlerRegistry registry) { |
| 25 | 25 | registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); | ... | ... |
src/main/java/com/cnlive/shenhe/controller/BaseController.java
0 → 100644
| 1 | +package com.cnlive.shenhe.controller; | |
| 2 | + | |
| 3 | +import java.io.IOException; | |
| 4 | + | |
| 5 | +import javax.servlet.http.HttpServletRequest; | |
| 6 | +import javax.servlet.http.HttpServletResponse; | |
| 7 | +import javax.servlet.http.HttpSession; | |
| 8 | + | |
| 9 | +import org.springframework.stereotype.Controller; | |
| 10 | +import org.springframework.web.bind.annotation.GetMapping; | |
| 11 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 12 | +import org.springframework.web.context.request.RequestContextHolder; | |
| 13 | +import org.springframework.web.context.request.ServletRequestAttributes; | |
| 14 | +import org.springframework.web.servlet.ModelAndView; | |
| 15 | + | |
| 16 | +import com.cnlive.shenhe.bean.SessionUser; | |
| 17 | +import com.cnlive.shenhe.utils.CommonUtils; | |
| 18 | + | |
| 19 | +@Controller | |
| 20 | +public class BaseController { | |
| 21 | + | |
| 22 | + | |
| 23 | + /** | |
| 24 | + * 得到request对象 | |
| 25 | + */ | |
| 26 | + public HttpServletRequest getRequest() { | |
| 27 | + HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); | |
| 28 | + return request; | |
| 29 | + } | |
| 30 | + /** | |
| 31 | + * 得到response对象 | |
| 32 | + */ | |
| 33 | + public HttpServletResponse getResponse() { | |
| 34 | + HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse(); | |
| 35 | + return response; | |
| 36 | + } | |
| 37 | + | |
| 38 | + /** | |
| 39 | + * 得到session对象 | |
| 40 | + */ | |
| 41 | + public HttpSession getsession() { | |
| 42 | + HttpSession session = this.getRequest().getSession(); | |
| 43 | + return session; | |
| 44 | + } | |
| 45 | + | |
| 46 | + | |
| 47 | + /** | |
| 48 | + * 获取session中的用户 | |
| 49 | + * @return | |
| 50 | + */ | |
| 51 | + public SessionUser getSessionUser(){ | |
| 52 | + SessionUser sessionUser = (SessionUser) this.getsession().getAttribute(SessionUser.getSessionKey()); | |
| 53 | + return sessionUser; | |
| 54 | + } | |
| 55 | + | |
| 56 | + /** | |
| 57 | + * 获取session中的用户id | |
| 58 | + * @return | |
| 59 | + */ | |
| 60 | + public String getSessionUserId(){ | |
| 61 | + SessionUser sessionUser = getSessionUser(); | |
| 62 | + if(sessionUser != null) return sessionUser.getUserId(); | |
| 63 | + return null; | |
| 64 | + } | |
| 65 | + | |
| 66 | + | |
| 67 | + /** | |
| 68 | + * 设置用户session | |
| 69 | + * @param teacher | |
| 70 | + */ | |
| 71 | + public void setSessionUser(SessionUser sessionUser){ | |
| 72 | + this.getsession().setAttribute("",null); | |
| 73 | + } | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | +} | ... | ... |
src/main/java/com/cnlive/shenhe/controller/LiveController.java
| ... | ... | @@ -295,6 +295,54 @@ public class LiveController { |
| 295 | 295 | } |
| 296 | 296 | |
| 297 | 297 | /** |
| 298 | + * 同步直播云信息 | |
| 299 | + * | |
| 300 | + * @param ids | |
| 301 | + * @param msg | |
| 302 | + * @param session | |
| 303 | + * @return | |
| 304 | + */ | |
| 305 | + @PostMapping("/syncLive") | |
| 306 | + @ResponseBody | |
| 307 | + public ResponseBean syncLive(String ids, HttpSession session) { | |
| 308 | + logger.info("同步直播云信息接口进入"); | |
| 309 | + ResponseBean responseBean = new ResponseBean(); | |
| 310 | + String[] shyLiveIds = ids.split(","); | |
| 311 | + String showMsg = ""; | |
| 312 | + for (String shyLiveId : shyLiveIds) { | |
| 313 | + ShyLive shyLive = liveService.selectByPrimaryKey(Integer.parseInt(shyLiveId)); | |
| 314 | + JSONObject result = null; | |
| 315 | + try { | |
| 316 | + result = Pass.syncLive(shyLive.getActivity_id()); | |
| 317 | + } catch (Exception e) { | |
| 318 | + logger.error("直播云信息同步失败,id==" + shyLiveId, e); | |
| 319 | + showMsg = showMsg + "," + shyLive.getActivity_id() + " 拒绝请求失败"; | |
| 320 | + break; | |
| 321 | + } | |
| 322 | + if (result == null) { | |
| 323 | + logger.error("直播云信息同步失败且接口错误没有返回信息,id==" + shyLiveId); | |
| 324 | + showMsg = showMsg + "," + shyLive.getActivity_id() + " 拒绝请求失败"; | |
| 325 | + break; | |
| 326 | + } | |
| 327 | + Integer code = result.getInteger("errorCode"); | |
| 328 | + if (code != 0) { | |
| 329 | + logger.error("直播云信息同步失败,id:{},code:{}", shyLiveId, code); | |
| 330 | + showMsg = result.getString("errorMessage"); | |
| 331 | + break; | |
| 332 | + } | |
| 333 | + } | |
| 334 | + if (CommonUtils.isNotEmpty(showMsg)) { | |
| 335 | + responseBean.setErrorCode(ErrorEnum.ERROR.getErrorCode()); | |
| 336 | + responseBean.setErrorMessage(showMsg); | |
| 337 | + }else{ | |
| 338 | + showMsg="直播云信息同步成功"; | |
| 339 | + responseBean.setErrorCode(ErrorEnum.SUCCESS.getErrorCode()); | |
| 340 | + responseBean.setErrorMessage(showMsg); | |
| 341 | + } | |
| 342 | + return responseBean; | |
| 343 | + } | |
| 344 | + | |
| 345 | + /** | |
| 298 | 346 | * 根据条件导出excel |
| 299 | 347 | */ |
| 300 | 348 | @GetMapping("excel") | ... | ... |
src/main/java/com/cnlive/shenhe/controller/SitesController.java
| ... | ... | @@ -45,6 +45,9 @@ public class SitesController { |
| 45 | 45 | @GetMapping(value = "/page") |
| 46 | 46 | public String page(Model model, Integer page, Integer pageSize, String orderByClause, String keyword, HttpSession session) { |
| 47 | 47 | SessionUser sessionUser = (SessionUser) session.getAttribute(SessionUser.getSessionKey()); |
| 48 | + if(CommonUtils.isNull(sessionUser)){ | |
| 49 | + return "redirect:/users/login"; | |
| 50 | + } | |
| 48 | 51 | Integer spid = sessionUser.getSpid(); |
| 49 | 52 | if (!sessionUser.isMaster() && spid != 0) { |
| 50 | 53 | return "page/error.html"; | ... | ... |
src/main/java/com/cnlive/shenhe/controller/UsersController.java
| 1 | 1 | package com.cnlive.shenhe.controller; |
| 2 | 2 | |
| 3 | +import com.alibaba.fastjson.JSONObject; | |
| 3 | 4 | import com.cnlive.shenhe.bean.SessionUser; |
| 5 | +import com.cnlive.shenhe.entity.ShySites; | |
| 4 | 6 | import com.cnlive.shenhe.entity.ShyUsers; |
| 7 | +import com.cnlive.shenhe.serviceImpl.SitesServiceImpl; | |
| 5 | 8 | import com.cnlive.shenhe.serviceImpl.UsersServiceImpl; |
| 9 | +import com.cnlive.shenhe.utils.CommonConst; | |
| 6 | 10 | import com.cnlive.shenhe.utils.CommonUtils; |
| 11 | +import com.github.pagehelper.PageInfo; | |
| 12 | + | |
| 7 | 13 | import org.jasig.cas.client.authentication.AttributePrincipal; |
| 8 | 14 | import org.springframework.beans.factory.annotation.Autowired; |
| 9 | 15 | import org.springframework.stereotype.Controller; |
| 16 | +import org.springframework.ui.Model; | |
| 10 | 17 | import org.springframework.web.bind.annotation.GetMapping; |
| 11 | 18 | import org.springframework.web.bind.annotation.PathVariable; |
| 12 | 19 | import org.springframework.web.bind.annotation.RequestMapping; |
| 13 | 20 | import org.springframework.web.bind.annotation.ResponseBody; |
| 14 | 21 | |
| 22 | +import java.util.List; | |
| 23 | + | |
| 15 | 24 | import javax.servlet.http.HttpServletRequest; |
| 16 | 25 | import javax.servlet.http.HttpSession; |
| 17 | 26 | |
| 18 | 27 | /** |
| 19 | - * @Auther: 周伟鹏 | |
| 20 | - * @Date: 2018/11/29 14:22 | |
| 28 | + * @Auther: liwei | |
| 29 | + * @Date: 2019/08/20 14:22 | |
| 21 | 30 | * @Description: |
| 22 | 31 | */ |
| 23 | 32 | @Controller |
| ... | ... | @@ -26,6 +35,8 @@ public class UsersController { |
| 26 | 35 | |
| 27 | 36 | @Autowired |
| 28 | 37 | UsersServiceImpl usersService; |
| 38 | + @Autowired | |
| 39 | + SitesServiceImpl sitesService; | |
| 29 | 40 | |
| 30 | 41 | @GetMapping(value = "/{id}") |
| 31 | 42 | @ResponseBody |
| ... | ... | @@ -65,5 +76,35 @@ public class UsersController { |
| 65 | 76 | return "redirect:https://user.cnlive.com/OpenSSO2/logout?service=http://test.shen.cnlive.com/users/login"; |
| 66 | 77 | } |
| 67 | 78 | |
| 79 | + | |
| 80 | + @GetMapping(value = "/page") | |
| 81 | + public String page(Model model, Integer page, Integer pageSize, String orderByClause, | |
| 82 | + String username, String mobile, Integer sp_id, String company_brief, HttpSession session) { | |
| 83 | + SessionUser sessionUser = (SessionUser) session.getAttribute(SessionUser.getSessionKey()); | |
| 84 | + if(CommonUtils.isNull(sessionUser)){ | |
| 85 | + return "redirect:/users/login"; | |
| 86 | + } | |
| 87 | + Integer spid = sessionUser.getSpid(); | |
| 88 | + if (!sessionUser.isMaster() && spid != 0) { | |
| 89 | + return "page/error.html"; | |
| 90 | + } | |
| 91 | + if (spid == 0) spid = null; | |
| 92 | + if (CommonUtils.isNull(page)) page = 1; | |
| 93 | + if (CommonUtils.isNull(pageSize)) pageSize = 10; | |
| 94 | + PageInfo<ShyUsers> usersPage = usersService.getPage(page, pageSize, orderByClause, username,mobile,sp_id,company_brief); | |
| 95 | + List<ShyUsers> list = usersPage.getList(); | |
| 96 | + if (!list.isEmpty()) { | |
| 97 | + for (ShyUsers users : list) { | |
| 98 | + //显示spid简称 | |
| 99 | + ShySites shySites = sitesService.findspidDescByspid(users.getSp_id()); | |
| 100 | + if (CommonUtils.isNotNull(shySites)) { | |
| 101 | + users.setSp_desc(shySites.getName()); | |
| 102 | + } | |
| 103 | + } | |
| 104 | + } | |
| 105 | + model.addAttribute("usersPage", usersPage); | |
| 106 | + model.addAttribute("pageSize", pageSize); | |
| 107 | + return "page/users.html"; | |
| 108 | + } | |
| 68 | 109 | |
| 69 | 110 | } | ... | ... |
src/main/java/com/cnlive/shenhe/controller/VideosController.java
| ... | ... | @@ -38,7 +38,7 @@ import java.util.List; |
| 38 | 38 | |
| 39 | 39 | @Controller |
| 40 | 40 | @RequestMapping("/videos") |
| 41 | -public class VideosController { | |
| 41 | +public class VideosController extends BaseController { | |
| 42 | 42 | private static Logger logger = LoggerFactory.getLogger(VideosController.class); |
| 43 | 43 | @Autowired |
| 44 | 44 | AuditPass Pass; | ... | ... |
src/main/java/com/cnlive/shenhe/entity/ShyUsers.java
| ... | ... | @@ -63,6 +63,9 @@ public class ShyUsers { |
| 63 | 63 | private Long tm; |
| 64 | 64 | |
| 65 | 65 | private String user_logo; |
| 66 | + | |
| 67 | + @Transient | |
| 68 | + private String sp_desc; | |
| 66 | 69 | |
| 67 | 70 | /** |
| 68 | 71 | * @return id |
| ... | ... | @@ -299,4 +302,13 @@ public class ShyUsers { |
| 299 | 302 | public void setUser_logo(String user_logo) { |
| 300 | 303 | this.user_logo = user_logo; |
| 301 | 304 | } |
| 305 | + | |
| 306 | + public String getSp_desc() { | |
| 307 | + return sp_desc; | |
| 308 | + } | |
| 309 | + | |
| 310 | + public void setSp_desc(String sp_desc) { | |
| 311 | + this.sp_desc = sp_desc; | |
| 312 | + } | |
| 313 | + | |
| 302 | 314 | } |
| 303 | 315 | \ No newline at end of file | ... | ... |
src/main/java/com/cnlive/shenhe/logging/LoggingWSServer.java deleted
100644 → 0
| 1 | -package com.cnlive.shenhe.logging; | |
| 2 | - | |
| 3 | - | |
| 4 | -import org.slf4j.Logger; | |
| 5 | -import org.slf4j.LoggerFactory; | |
| 6 | -import org.springframework.beans.factory.annotation.Value; | |
| 7 | -import org.springframework.stereotype.Component; | |
| 8 | -import org.thymeleaf.util.StringUtils; | |
| 9 | - | |
| 10 | - | |
| 11 | -import javax.websocket.*; | |
| 12 | -import javax.websocket.server.ServerEndpoint; | |
| 13 | -import java.io.BufferedReader; | |
| 14 | -import java.io.FileReader; | |
| 15 | -import java.io.IOException; | |
| 16 | -import java.text.SimpleDateFormat; | |
| 17 | -import java.util.Arrays; | |
| 18 | -import java.util.Date; | |
| 19 | -import java.util.Map; | |
| 20 | -import java.util.concurrent.ConcurrentHashMap; | |
| 21 | - | |
| 22 | -/** | |
| 23 | - * WebSocket获取实时日志并输出到Web页面 | |
| 24 | - */ | |
| 25 | -@Component | |
| 26 | -@ServerEndpoint(value = "/logging/websocket", configurator = MyEndpointConfigure.class) | |
| 27 | -public class LoggingWSServer { | |
| 28 | - private static Logger log = LoggerFactory.getLogger(LoggingWSServer.class); | |
| 29 | - | |
| 30 | - @Value("${spring.application.name}") | |
| 31 | - private String applicationName; | |
| 32 | - | |
| 33 | - @Value("${spring.application.home}") | |
| 34 | - private String applicationHome; | |
| 35 | - | |
| 36 | - /** | |
| 37 | - * 连接集合 | |
| 38 | - */ | |
| 39 | - private static Map<String, Session> sessionMap = new ConcurrentHashMap<String, Session>(); | |
| 40 | - private static Map<String, Integer> lengthMap = new ConcurrentHashMap<String, Integer>(); | |
| 41 | - | |
| 42 | - /** | |
| 43 | - * 连接建立成功调用的方法 | |
| 44 | - */ | |
| 45 | - @OnOpen | |
| 46 | - public void onOpen(Session session) { | |
| 47 | - //添加到集合中 | |
| 48 | - sessionMap.put(session.getId(), session); | |
| 49 | - lengthMap.put(session.getId(), 1);//默认从第一行开始 | |
| 50 | - | |
| 51 | - //获取日志信息 | |
| 52 | - new Thread(() -> { | |
| 53 | - log.info("LoggingWebSocketServer 任务开始"); | |
| 54 | - boolean first = true; | |
| 55 | - while (sessionMap.get(session.getId()) != null) { | |
| 56 | - BufferedReader reader = null; | |
| 57 | - try { | |
| 58 | - //日志文件路径,获取最新的 | |
| 59 | -// String filePath = System.getProperty("user.home") + "/log/" + new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/"+applicationName+".log"; | |
| 60 | - String filePath = applicationHome+ "/" + new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/"+applicationName+".log"; | |
| 61 | - | |
| 62 | - //字符流 | |
| 63 | - reader = new BufferedReader(new FileReader(filePath)); | |
| 64 | - Object[] lines = reader.lines().toArray(); | |
| 65 | - | |
| 66 | - //只取从上次之后产生的日志 | |
| 67 | - Object[] copyOfRange = Arrays.copyOfRange(lines, lengthMap.get(session.getId()), lines.length); | |
| 68 | - | |
| 69 | - //对日志进行着色,更加美观 PS:注意,这里要根据日志生成规则来操作 | |
| 70 | - for (int i = 0; i < copyOfRange.length; i++) { | |
| 71 | - String line = (String) copyOfRange[i]; | |
| 72 | - //先转义 | |
| 73 | - line = line.replaceAll("&", "&") | |
| 74 | - .replaceAll("<", "<") | |
| 75 | - .replaceAll(">", ">") | |
| 76 | - .replaceAll("\"", """); | |
| 77 | - | |
| 78 | - //处理等级 | |
| 79 | - line = line.replace("DEBUG", "<span style='color: blue;'>DEBUG</span>"); | |
| 80 | - line = line.replace("INFO", "<span style='color: green;'>INFO</span>"); | |
| 81 | - line = line.replace("WARN", "<span style='color: orange;'>WARN</span>"); | |
| 82 | - line = line.replace("ERROR", "<span style='color: red;'>ERROR</span>"); | |
| 83 | - | |
| 84 | - //处理类名 | |
| 85 | - String[] split = line.split("]"); | |
| 86 | - if (split.length >= 2) { | |
| 87 | - String[] split1 = split[1].split("-"); | |
| 88 | - if (split1.length >= 2) { | |
| 89 | - line = split[0] + "]" + "<span style='color: #298a8a;'>" + split1[0] + "</span>" + "-" + split1[1]; | |
| 90 | - } | |
| 91 | - } | |
| 92 | - | |
| 93 | - copyOfRange[i] = line; | |
| 94 | - } | |
| 95 | - | |
| 96 | - //存储最新一行开始 | |
| 97 | - lengthMap.put(session.getId(), lines.length); | |
| 98 | - | |
| 99 | - //第一次如果太大,截取最新的200行就够了,避免传输的数据太大 | |
| 100 | - if(first && copyOfRange.length > 200){ | |
| 101 | - copyOfRange = Arrays.copyOfRange(copyOfRange, copyOfRange.length - 200, copyOfRange.length); | |
| 102 | - first = false; | |
| 103 | - } | |
| 104 | - | |
| 105 | - String result = StringUtils.join(copyOfRange, "<br/>"); | |
| 106 | - | |
| 107 | - //发送 | |
| 108 | - send(session, result); | |
| 109 | - | |
| 110 | - //休眠一秒 | |
| 111 | - Thread.sleep(1000); | |
| 112 | - } catch (Exception e) { | |
| 113 | - //捕获但不处理 | |
| 114 | - e.printStackTrace(); | |
| 115 | - } finally { | |
| 116 | - try { | |
| 117 | - reader.close(); | |
| 118 | - } catch (IOException ignored) { | |
| 119 | - } | |
| 120 | - } | |
| 121 | - } | |
| 122 | - log.info("LoggingWebSocketServer 任务结束"); | |
| 123 | - }).start(); | |
| 124 | - } | |
| 125 | - | |
| 126 | - /** | |
| 127 | - * 连接关闭调用的方法 | |
| 128 | - */ | |
| 129 | - @OnClose | |
| 130 | - public void onClose(Session session) { | |
| 131 | - //从集合中删除 | |
| 132 | - sessionMap.remove(session.getId()); | |
| 133 | - lengthMap.remove(session.getId()); | |
| 134 | - } | |
| 135 | - | |
| 136 | - /** | |
| 137 | - * 发生错误时调用 | |
| 138 | - */ | |
| 139 | - @OnError | |
| 140 | - public void onError(Session session, Throwable error) { | |
| 141 | - error.printStackTrace(); | |
| 142 | - } | |
| 143 | - | |
| 144 | - /** | |
| 145 | - * 服务器接收到客户端消息时调用的方法 | |
| 146 | - */ | |
| 147 | - @OnMessage | |
| 148 | - public void onMessage(String message, Session session) { | |
| 149 | - | |
| 150 | - } | |
| 151 | - | |
| 152 | - /** | |
| 153 | - * 封装一个send方法,发送消息到前端 | |
| 154 | - */ | |
| 155 | - private void send(Session session, String message) { | |
| 156 | - try { | |
| 157 | - session.getBasicRemote().sendText(message); | |
| 158 | - } catch (Exception e) { | |
| 159 | - e.printStackTrace(); | |
| 160 | - } | |
| 161 | - } | |
| 162 | -} |
src/main/java/com/cnlive/shenhe/logging/MyEndpointConfigure.java deleted
100644 → 0
| 1 | -package com.cnlive.shenhe.logging; | |
| 2 | - | |
| 3 | -import org.springframework.beans.BeansException; | |
| 4 | -import org.springframework.beans.factory.BeanFactory; | |
| 5 | -import org.springframework.context.ApplicationContext; | |
| 6 | -import org.springframework.context.ApplicationContextAware; | |
| 7 | - | |
| 8 | -import javax.websocket.server.ServerEndpointConfig; | |
| 9 | - | |
| 10 | -/** | |
| 11 | - * 解决注入其他类的问题,详情参考这篇帖子:webSocket无法注入其他类:https://blog.csdn.net/tornadojava/article/details/78781474 | |
| 12 | - */ | |
| 13 | -public class MyEndpointConfigure extends ServerEndpointConfig.Configurator implements ApplicationContextAware { | |
| 14 | - | |
| 15 | - private static volatile BeanFactory context; | |
| 16 | - | |
| 17 | - @Override | |
| 18 | - public <T> T getEndpointInstance(Class<T> clazz){ | |
| 19 | - return context.getBean(clazz); | |
| 20 | - } | |
| 21 | - | |
| 22 | - @Override | |
| 23 | - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { | |
| 24 | - MyEndpointConfigure.context = applicationContext; | |
| 25 | - } | |
| 26 | -} |
src/main/java/com/cnlive/shenhe/logging/WebSocketConfig.java deleted
100644 → 0
| 1 | -package com.cnlive.shenhe.logging; | |
| 2 | - | |
| 3 | -import org.springframework.context.annotation.Bean; | |
| 4 | -import org.springframework.context.annotation.Configuration; | |
| 5 | -import org.springframework.web.socket.server.standard.ServerEndpointExporter; | |
| 6 | - | |
| 7 | -/** | |
| 8 | - * WebSocket配置 | |
| 9 | - */ | |
| 10 | -@Configuration | |
| 11 | -public class WebSocketConfig { | |
| 12 | - | |
| 13 | - | |
| 14 | - /** | |
| 15 | - * 用途:扫描并注册所有携带@ServerEndpoint注解的实例。 @ServerEndpoint("/websocket") | |
| 16 | - * PS:如果使用外部容器 则无需提供ServerEndpointExporter。 | |
| 17 | - */ | |
| 18 | - @Bean | |
| 19 | - public ServerEndpointExporter serverEndpointExporter() { | |
| 20 | - return new ServerEndpointExporter(); | |
| 21 | - } | |
| 22 | - | |
| 23 | - /** | |
| 24 | - * 支持注入其他类 | |
| 25 | - */ | |
| 26 | - @Bean | |
| 27 | - public MyEndpointConfigure newMyEndpointConfigure (){ | |
| 28 | - return new MyEndpointConfigure (); | |
| 29 | - } | |
| 30 | -} |
src/main/java/com/cnlive/shenhe/logging/logging.java deleted
100644 → 0
| 1 | -package com.cnlive.shenhe.logging; | |
| 2 | - | |
| 3 | -import org.slf4j.Logger; | |
| 4 | -import org.slf4j.LoggerFactory; | |
| 5 | -import org.springframework.beans.factory.annotation.Value; | |
| 6 | -import org.springframework.stereotype.Controller; | |
| 7 | -import org.springframework.ui.Model; | |
| 8 | -import org.springframework.web.bind.annotation.GetMapping; | |
| 9 | -import org.springframework.web.bind.annotation.RequestMapping; | |
| 10 | -import org.springframework.web.servlet.ModelAndView; | |
| 11 | - | |
| 12 | - | |
| 13 | -/** | |
| 14 | - * @Auther: 李伟 | |
| 15 | - * @Date: 2019/08/13 10:43 | |
| 16 | - * @Description:log实时日志 | |
| 17 | - */ | |
| 18 | -@Controller | |
| 19 | -@RequestMapping("/logging") | |
| 20 | -public class logging { | |
| 21 | - private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |
| 22 | - /** | |
| 23 | - * 端口 | |
| 24 | - */ | |
| 25 | - @Value("${server.port}") | |
| 26 | - private String port; | |
| 27 | - | |
| 28 | - /** | |
| 29 | - * 跳转实时日志 | |
| 30 | - */ | |
| 31 | - @GetMapping("/") | |
| 32 | - public ModelAndView logging( Model model) { | |
| 33 | - model.addAttribute("port", port); | |
| 34 | - return new ModelAndView("logging/logging.html"); | |
| 35 | - } | |
| 36 | -} |
src/main/java/com/cnlive/shenhe/serviceImpl/UsersServiceImpl.java
| 1 | 1 | package com.cnlive.shenhe.serviceImpl; |
| 2 | 2 | |
| 3 | +import com.cnlive.shenhe.entity.ShySites; | |
| 3 | 4 | import com.cnlive.shenhe.entity.ShyUsers; |
| 4 | 5 | import com.cnlive.shenhe.mapper.ShyUsersMapper; |
| 6 | +import com.cnlive.shenhe.utils.CommonUtils; | |
| 7 | +import com.github.pagehelper.PageHelper; | |
| 8 | +import com.github.pagehelper.PageInfo; | |
| 9 | + | |
| 10 | +import java.util.List; | |
| 11 | + | |
| 5 | 12 | import org.springframework.beans.factory.annotation.Autowired; |
| 6 | 13 | import org.springframework.stereotype.Service; |
| 7 | 14 | import tk.mybatis.mapper.entity.Example; |
| ... | ... | @@ -15,6 +22,33 @@ import tk.mybatis.mapper.entity.Example; |
| 15 | 22 | public class UsersServiceImpl { |
| 16 | 23 | @Autowired |
| 17 | 24 | ShyUsersMapper shyUsersMapper; |
| 25 | + | |
| 26 | + public PageInfo<ShyUsers> getPage(Integer page, Integer pageSize, String orderByClause, | |
| 27 | + String username,String mobile,Integer sp_id,String company_brief) { | |
| 28 | + Example example = new Example(ShyUsers.class); | |
| 29 | + Example.Criteria criteria = example.createCriteria(); | |
| 30 | + if (CommonUtils.isNotEmpty(orderByClause)) { | |
| 31 | + example.setOrderByClause(orderByClause); | |
| 32 | + }else{ | |
| 33 | + example.setOrderByClause("created_at desc"); | |
| 34 | + } | |
| 35 | + if (CommonUtils.isNotEmpty(username)) { | |
| 36 | + criteria.andLike("username", "%" + username + "%"); | |
| 37 | + } | |
| 38 | + if(CommonUtils.isNotEmpty(mobile)){ | |
| 39 | + criteria.andLike("mobile", "%" + mobile + "%" ); | |
| 40 | + } | |
| 41 | + if(CommonUtils.isNotEmpty(company_brief)){ | |
| 42 | + criteria.andLike("company_brief", "%" + company_brief + "%" ); | |
| 43 | + } | |
| 44 | + if(CommonUtils.isNotNull(sp_id)){ | |
| 45 | + criteria.andEqualTo("sp_id", sp_id ); | |
| 46 | + } | |
| 47 | + PageHelper.startPage(page, pageSize, true); | |
| 48 | + List<ShyUsers> ShyUsersList = shyUsersMapper.selectByExample(example); | |
| 49 | + PageInfo<ShyUsers> pageInfo = new PageInfo<ShyUsers>(ShyUsersList); | |
| 50 | + return pageInfo; | |
| 51 | + } | |
| 18 | 52 | |
| 19 | 53 | public ShyUsers get(Integer id) { |
| 20 | 54 | return shyUsersMapper.selectByPrimaryKey(id); | ... | ... |
src/main/java/com/cnlive/shenhe/utils/AuditPass.java
| ... | ... | @@ -23,6 +23,8 @@ public class AuditPass { |
| 23 | 23 | private String platformKey;//点播platformKey |
| 24 | 24 | @Value("${platformValue}") |
| 25 | 25 | private String platformValue;//点播platformValue |
| 26 | + @Value("${live_url}") | |
| 27 | + private String live_url;//直播同步信息 | |
| 26 | 28 | |
| 27 | 29 | /** |
| 28 | 30 | * 点播视频回调 |
| ... | ... | @@ -77,6 +79,20 @@ public class AuditPass { |
| 77 | 79 | Map<String, String> post = httpUtil.post(callBack); |
| 78 | 80 | return JSONObject.parseObject(post.get("result")); |
| 79 | 81 | } |
| 82 | + | |
| 83 | + /** | |
| 84 | + * 直播云信息同步 | |
| 85 | + * @param json | |
| 86 | + * @param callBack | |
| 87 | + * @return | |
| 88 | + */ | |
| 89 | + public JSONObject syncLive(String activity_id) { | |
| 90 | + logger.info("直播云信息同步:activity_id:{}", activity_id); | |
| 91 | + HttpUtil httpUtil = HttpUtil.init(); | |
| 92 | + httpUtil.setParam("activityId", activity_id); | |
| 93 | + Map<String, String> post = httpUtil.post(live_url); | |
| 94 | + return JSONObject.parseObject(post.get("result")); | |
| 95 | + } | |
| 80 | 96 | |
| 81 | 97 | /** |
| 82 | 98 | * 评论审核回调 |
| ... | ... | @@ -106,6 +122,7 @@ public class AuditPass { |
| 106 | 122 | return JSONObject.parseObject(result); |
| 107 | 123 | } |
| 108 | 124 | |
| 125 | + | |
| 109 | 126 | /** |
| 110 | 127 | * 图文审核回调 |
| 111 | 128 | * @param ids | ... | ... |
src/main/resources/application.properties
| ... | ... | @@ -54,6 +54,9 @@ avsmple_appSecret=28ce1e1fbee311e7a2f0fa163e771cf92ea58ebfbee311e7a2f0fa163e771c |
| 54 | 54 | avsmple_url=http://test.transcode.cnlive.com/api/request |
| 55 | 55 | avsmple_callback=http://test.shen.cnlive.com/api/avsample/callback |
| 56 | 56 | |
| 57 | +#\u540c\u6b65\u76f4\u64ad\u4e91\u4fe1\u606f | |
| 58 | +live_url=http://test.bc.cnlive.com/bokong/activity/activityShenHe | |
| 59 | + | |
| 57 | 60 | #\u62bd\u5e27\u5b58\u653ebucket\u548c\u57df\u540d |
| 58 | 61 | qn_bucket=cnlivetest |
| 59 | 62 | qn_domain=http://test.qnvod.cnlive.com | ... | ... |
src/main/resources/templates/common/frame.html
| ... | ... | @@ -75,11 +75,13 @@ line-height: 2em; margin: 0 auto;font-size: 2em" th:text="${session.sessionUser. |
| 75 | 75 | <li><a href="/channel/page?shenhe_status=0&receive=0" id="/channel/page"> 频道审核</a></li> |
| 76 | 76 | </ul> |
| 77 | 77 | </li> |
| 78 | - <li class="treeview" th:if="${session.sessionUser.spid==0 or session.sessionUser.master}"> | |
| 78 | +<!-- <li class="treeview" th:if="${session.sessionUser.spid==0 or session.sessionUser.master}"> --> | |
| 79 | + <li class="treeview" th:if="${session.sessionUser.spid==0 }"> | |
| 79 | 80 | <a href="#"> |
| 80 | 81 | <span class="menu-item-top">系统管理</span> |
| 81 | 82 | </a> |
| 82 | 83 | <ul class="treeview-menu"> |
| 84 | + <li><a href="/users/page" id="/users/page"> 审核用户管理</a></li> | |
| 83 | 85 | <li><a href="/sites/page" id="/sites/page"> 白名单管理</a></li> |
| 84 | 86 | </ul> |
| 85 | 87 | </li> | ... | ... |
src/main/resources/templates/page/live.html
| ... | ... | @@ -270,13 +270,7 @@ |
| 270 | 270 | </button> |
| 271 | 271 | </div> |
| 272 | 272 | |
| 273 | -<!-- <div class="width-10p pull-right padding-r-5"> --> | |
| 274 | -<!-- <button class="btn btn-primary btn-xs btn-block" --> | |
| 275 | -<!-- disabled="disabled" title="日志" --> | |
| 276 | -<!-- onclick="reject('38_09471046aa7f4835a734f1d6208249fc')"> --> | |
| 277 | -<!-- <i class="fa fa-bullseye"></i> --> | |
| 278 | -<!-- </button> --> | |
| 279 | -<!-- </div> --> | |
| 273 | + | |
| 280 | 274 | |
| 281 | 275 | <div class="width-10p pull-right padding-r-5"> |
| 282 | 276 | <button class="btn btn-danger btn-xs btn-block" title="下线直播" |
| ... | ... | @@ -286,14 +280,21 @@ |
| 286 | 280 | <i class="fa fa-arrow-down"></i> |
| 287 | 281 | </button> |
| 288 | 282 | </div> |
| 289 | - | |
| 290 | 283 | <div class="width-10p pull-right padding-r-5"> |
| 291 | - <button class="btn btn-danger btn-xs btn-block" title="下线主播" | |
| 292 | - th:onclick="'offline_anchor('+${live.id}+')'" data-toggle="tooltip" | |
| 293 | - data-placement="top"> | |
| 294 | - <i class="glyphicon glyphicon-user"></i> | |
| 284 | + <button class="btn btn-primary btn-xs btn-block" title="同步直播云" | |
| 285 | + th:onclick="'sync_live('+${live.id}+')'" | |
| 286 | + data-toggle="tooltip" data-placement="top"> | |
| 287 | + <i class="fa fa-bullseye"></i> | |
| 295 | 288 | </button> |
| 296 | 289 | </div> |
| 290 | + | |
| 291 | +<!-- <div class="width-10p pull-right padding-r-5"> --> | |
| 292 | +<!-- <button class="btn btn-danger btn-xs btn-block" title="下线主播" --> | |
| 293 | +<!-- th:onclick="'offline_anchor('+${live.id}+')'" data-toggle="tooltip" --> | |
| 294 | +<!-- data-placement="top"> --> | |
| 295 | +<!-- <i class="glyphicon glyphicon-user"></i> --> | |
| 296 | +<!-- </button> --> | |
| 297 | +<!-- </div> --> | |
| 297 | 298 | </div> |
| 298 | 299 | |
| 299 | 300 | </div> |
| ... | ... | @@ -596,6 +597,20 @@ |
| 596 | 597 | $("#action_note_id").val(id); |
| 597 | 598 | $('#modal_remove').attr('claim', 'claim'); |
| 598 | 599 | } |
| 600 | + /*同步直播云信息*/ | |
| 601 | + function sync_live(id){ | |
| 602 | + var r = confirm("您确定要同步直播云的最新数据吗?"); | |
| 603 | + if (r == true) { | |
| 604 | + $.post("/live/syncLive?ids=" + id, function (data) { | |
| 605 | + if (data.errorCode == 0) { | |
| 606 | + alert(data.errorMessage); | |
| 607 | + location.href = location.href; | |
| 608 | + } else { | |
| 609 | + alert(data.errorMessage); | |
| 610 | + } | |
| 611 | + }) | |
| 612 | + } | |
| 613 | + } | |
| 599 | 614 | |
| 600 | 615 | $("#action_note_no").click(function() { |
| 601 | 616 | $("#action_note").hide(); | ... | ... |
src/main/resources/templates/page/users.html
0 → 100644
| 1 | +<!DOCTYPE html> | |
| 2 | +<html lang="zh" xmlns:th="http://www.thymeleaf.org"> | |
| 3 | + | |
| 4 | +<head th:replace="../templates/common/head::head"></head> | |
| 5 | +<style> | |
| 6 | + .fixed-table-toolbar .bs-bars, .fixed-table-toolbar .columns, .fixed-table-toolbar .search{margin-top: 0px;} | |
| 7 | + .table{margin-bottom:0;} | |
| 8 | + | |
| 9 | +</style> | |
| 10 | +<body class="skin-blue sidebar-mini"> | |
| 11 | + | |
| 12 | +<div class="wrapper"> | |
| 13 | + | |
| 14 | + <div th:replace="../templates/common/frame::frame"></div> | |
| 15 | + | |
| 16 | + <div class="content-wrapper" style="min-height: 788px;"> | |
| 17 | + <section class="content-header"> | |
| 18 | + <h1> | |
| 19 | + 审核用户管理 | |
| 20 | + </h1> | |
| 21 | + <ol class="breadcrumb"> | |
| 22 | + <li>首页</li> | |
| 23 | + <li>系统管理</li> | |
| 24 | + <li class="active">审核用户管理</li> | |
| 25 | + </ol> | |
| 26 | + </section> | |
| 27 | + <section class="content"> | |
| 28 | + <div class="row"> | |
| 29 | + <div class="col-xs-12"> | |
| 30 | + <div class="box box-info"> | |
| 31 | + <div class="box-body"> | |
| 32 | +<!-- <div class="bootstrap-table"> --> | |
| 33 | +<!-- <div class="fixed-table-toolbar"> --> | |
| 34 | +<!-- <div class="bs-bars pull-left"> --> | |
| 35 | +<!-- <div id="toolbar" class="btn-group"> --> | |
| 36 | +<!-- </div> --> | |
| 37 | +<!-- </div> --> | |
| 38 | +<!-- <div class="columns columns-right btn-group pull-right"> --> | |
| 39 | +<!-- <button class="btn btn-default" type="button" name="refresh" title="搜索" id="users_query">搜索</button> --> | |
| 40 | +<!-- </div> --> | |
| 41 | +<!-- </div> --> | |
| 42 | +<!-- <div class="pull-right search"> --> | |
| 43 | +<!-- <input class="form-control" type="text" placeholder="搜索" id="keyword" name="keyword" th:value="${param.keyword}"> --> | |
| 44 | +<!-- </div> --> | |
| 45 | +<!-- <div class="pull-right search"> --> | |
| 46 | +<!-- <input class="form-control" type="text" placeholder="搜索" id="keyword" name="keyword" th:value="${param.keyword}"> --> | |
| 47 | +<!-- </div> --> | |
| 48 | +<!-- </div> --> | |
| 49 | + | |
| 50 | + <div class="btn-group margin-bottom " style="padding: 0;width: 100%;float: left;"> | |
| 51 | + <div class="col-md-5" style="padding: 0;width: 20%;"> | |
| 52 | + <label for="sp_id" class="control-label cb-toolbar" style="font-size:15px;top:8px;font-weight:100;">spId:</label> | |
| 53 | + <div class="col-sm-9" style="padding: 0;"> | |
| 54 | + <input class="form-control" type="text" value="" id="sp_id"> | |
| 55 | + </div> | |
| 56 | + </div> | |
| 57 | + <div class="col-md-6" style="padding: 0;width: 25%;" > | |
| 58 | + <label for="company_brief" class="control-label cb-toolbar" style="font-size:15px;top:8px;font-weight:100;">公司简称:</label> | |
| 59 | + <div class="col-sm-8" style="padding: 0;"> | |
| 60 | + <input class="form-control" type="text" th:value="${param.company_brief}" id="company_brief"> | |
| 61 | + </div> | |
| 62 | + </div> | |
| 63 | + <div class="col-md-6" style="padding: 0;width: 20%;" > | |
| 64 | + <label for="username" class="control-label cb-toolbar" style="font-size:15px;top:8px;font-weight:100;">用户名:</label> | |
| 65 | + <div class="col-sm-8" style="padding: 0;"> | |
| 66 | + <input class="form-control" type="text" value="" id="username"> | |
| 67 | + </div> | |
| 68 | + </div> | |
| 69 | + <div class="col-md-6" style="padding: 0;width: 20%;" > | |
| 70 | + <label for="mobile" class="control-label cb-toolbar" style="font-size:15px;top:8px;font-weight:100;">手机号:</label> | |
| 71 | + <div class="col-sm-7" style="padding: 0;"> | |
| 72 | + <input class="form-control" type="text" value="" id="mobile"> | |
| 73 | + </div> | |
| 74 | + </div> | |
| 75 | + <div class="col-md-6" style="padding: 0;width: 15%;"> | |
| 76 | + <button class="btn btn-default" type="button" name="refresh" title="搜索" id="users_query">搜索</button> | |
| 77 | + </div> | |
| 78 | + </div> | |
| 79 | + | |
| 80 | + | |
| 81 | + <div class="fixed-table-container" style="padding-bottom: 0px;"> | |
| 82 | + <div class="fixed-table-body"> | |
| 83 | + <table data-toggle="table" data-pagination="true" | |
| 84 | + data-search="false" data-show-refresh="true" data-show-toggle="true" | |
| 85 | + data-show-columns="true" data-toolbar="#toolbar" | |
| 86 | + class="table table-hover"> | |
| 87 | + <thead> | |
| 88 | + <tr> | |
| 89 | + <th style="text-align: center; width: 5%; " data-field="sp_id" | |
| 90 | + tabindex="0"> | |
| 91 | + <div class="th-inner ">spID</div> | |
| 92 | + <div class="fht-cell"></div> | |
| 93 | + </th> | |
| 94 | + <th style="text-align: center; width: 12%; " data-field="sp_id_brief" | |
| 95 | + tabindex="0"> | |
| 96 | + <div class="th-inner ">公司简称</div> | |
| 97 | + <div class="fht-cell"></div> | |
| 98 | + </th> | |
| 99 | + <th style="text-align: center; width: 8%; " data-field="type" | |
| 100 | + tabindex="0"> | |
| 101 | + <div class="th-inner ">用户名 | |
| 102 | + </div> | |
| 103 | + <div class="fht-cell"></div> | |
| 104 | + </th> | |
| 105 | + <th style="text-align: center; width: 12%; " data-field="type" | |
| 106 | + tabindex="0"> | |
| 107 | + <div class="th-inner ">邮箱 | |
| 108 | + </div> | |
| 109 | + <div class="fht-cell"></div> | |
| 110 | + </th> | |
| 111 | + <th style="text-align: center; width: 10%; " data-field="type" | |
| 112 | + tabindex="0"> | |
| 113 | + <div class="th-inner ">手机号 | |
| 114 | + </div> | |
| 115 | + <div class="fht-cell"></div> | |
| 116 | + </th> | |
| 117 | + <th style="text-align: center; width: 6%; " data-field="type" | |
| 118 | + tabindex="0"> | |
| 119 | + <div class="th-inner ">是否主账号 | |
| 120 | + </div> | |
| 121 | + <div class="fht-cell"></div> | |
| 122 | + </th> | |
| 123 | + <th style="text-align: center; width: 6%; " data-field="type" | |
| 124 | + tabindex="0"> | |
| 125 | + <div class="th-inner ">用户状态 | |
| 126 | + </div> | |
| 127 | + <div class="fht-cell"></div> | |
| 128 | + </th> | |
| 129 | + <th style="text-align: center; width: 12%; " data-field="upload_time" | |
| 130 | + tabindex="0"> | |
| 131 | + <div class="th-inner ">用户信息创建时间 | |
| 132 | + </div> | |
| 133 | + <div class="fht-cell"></div> | |
| 134 | + </th> | |
| 135 | + <th style="text-align: center; width: 12%; " data-field="updated_at" | |
| 136 | + tabindex="0"> | |
| 137 | + <div class="th-inner ">用户信息更新时间</div> | |
| 138 | + <div class="fht-cell"></div> | |
| 139 | + </th> | |
| 140 | + <th style="text-align: center; width: 10%; " data-field="action" | |
| 141 | + tabindex="0"> | |
| 142 | + <div class="th-inner ">操作 | |
| 143 | + </div> | |
| 144 | + <div class="fht-cell"></div> | |
| 145 | + </th> | |
| 146 | + </tr> | |
| 147 | + </thead> | |
| 148 | + <tbody> | |
| 149 | + <tr th:data-index="${usersStat.index}" th:each="users : ${usersPage.list}"> | |
| 150 | + <td style="text-align: center; width: 5%;" th:text="${users.sp_id}">82</td> | |
| 151 | + <td style="text-align: center; width: 12%;" th:text="${users.company_brief}">视讯中国</td> | |
| 152 | + <td style="text-align: center; width: 8%;" th:text="${users.username}">用户名</td> | |
| 153 | + <td style="text-align: center; width: 12%;" th:text="${users.email}">邮箱</td> | |
| 154 | + <td style="text-align: center; width: 10%;" th:text="${users.mobile}">手机号</td> | |
| 155 | + <td style="text-align: center; width: 6%;" th:text="${users.master== true?'是':'否'}"></td> | |
| 156 | + <td style="text-align: center; width: 6%;" th:if="${users.state==true}"> | |
| 157 | + <span class="label label-success">正常</span> </td> | |
| 158 | + <td style="text-align: center; width: 6%;" th:if="${users.state==false}"> | |
| 159 | + <span class="label label-danger">禁用</span></td> | |
| 160 | + <td style="text-align: center; width: 12%;" th:text="${#dates.format(users.created_at, 'yyyy-MM-dd HH:mm:ss')}">2018-11-22 23:08:48</td> | |
| 161 | + <td style="text-align: center; width: 12%;" th:text="${#dates.format(users.updated_at, 'yyyy-MM-dd HH:mm:ss')}">2016-08-03 14:27:17</td> | |
| 162 | + <td style="text-align: center; width: 10%;"><span> </span><a | |
| 163 | + class="edit" th:href="'javascript:edit('+${users.id}+',\''+${users.company_brief}+'\',\''+${users.state} +'\')'"> | |
| 164 | + <button class="btn btn-primary btn-xs">设置</button> | |
| 165 | + </a><span> </span><span> </span></td> | |
| 166 | + </tr> | |
| 167 | + | |
| 168 | + </tbody> | |
| 169 | + </table> | |
| 170 | + </div> | |
| 171 | + | |
| 172 | + <div class="fixed-table-pagination" style="display: block;"> | |
| 173 | + <div class="pull-left pagination-detail"> | |
| 174 | + <span class="pagination-info" th:text="'共 '+${usersPage.total}+' 条记录,每页显示'">共 0 条记录</span> | |
| 175 | + <select class="" id="pageSize" name="pageSize" onchange="selectPageSize()"> | |
| 176 | + <option value="10" th:selected="${pageSize==10}">10</option> | |
| 177 | + <option value="20" th:selected="${pageSize==20}">20</option> | |
| 178 | + <option value="50" th:selected="${pageSize==50}">50</option> | |
| 179 | + <option value="100" th:selected="${pageSize==100}">100</option> | |
| 180 | + </select> | |
| 181 | + <span class="pagination-info" >条记录</span> | |
| 182 | + </div> | |
| 183 | + <div class="pull-right pagination"> | |
| 184 | + <ul class="pagination" th:if="${usersPage.pages>1}"> | |
| 185 | + <li class="page-pre"><a th:href="'javascript:fanye(1);'">‹‹</a></li> | |
| 186 | + <li class="page-pre" th:if="${!usersPage.isFirstPage}"><a | |
| 187 | + th:onclick="'javascript:fanye(\''+${usersPage.pageNum-1}+'\');'">‹</a> | |
| 188 | + </li> | |
| 189 | + | |
| 190 | + <li class="page-number" th:if="${usersPage.pageNum-3>=1}"><a | |
| 191 | + th:onclick="'javascript:fanye(\''+${usersPage.pageNum-3}+'\');'" | |
| 192 | + th:text="${usersPage.pageNum-3}">2</a></li> | |
| 193 | + <li class="page-number" th:if="${usersPage.pageNum-2>=1}"><a | |
| 194 | + th:onclick="'javascript:fanye(\''+${usersPage.pageNum-2}+'\');'" | |
| 195 | + th:text="${usersPage.pageNum-2}">2</a></li> | |
| 196 | + <li class="page-number" th:if="${usersPage.pageNum-1>=1}"><a | |
| 197 | + th:onclick="'javascript:fanye(\''+${usersPage.pageNum-1}+'\');'" | |
| 198 | + th:text="${usersPage.pageNum-1}">2</a></li> | |
| 199 | + <li class="page-number active"><a href="javaScript:void(0);" | |
| 200 | + th:text="${usersPage.pageNum}">2</a></li> | |
| 201 | + <li class="page-number" th:if="${usersPage.pageNum+1<=usersPage.pages}"><a | |
| 202 | + th:onclick="'javascript:fanye(\''+${usersPage.pageNum+1}+'\');'" | |
| 203 | + th:text="${usersPage.pageNum+1}">2</a></li> | |
| 204 | + <li class="page-number" th:if="${usersPage.pageNum+2<=usersPage.pages}"><a | |
| 205 | + th:onclick="'javascript:fanye(\''+${usersPage.pageNum+2}+'\');'" | |
| 206 | + th:text="${usersPage.pageNum+2}">2</a></li> | |
| 207 | + <li class="page-number" th:if="${usersPage.pageNum+3<=usersPage.pages}"><a | |
| 208 | + th:onclick="'javascript:fanye(\''+${usersPage.pageNum+3}+'\');'" | |
| 209 | + th:text="${usersPage.pageNum+3}">2</a></li> | |
| 210 | + | |
| 211 | + <li class="page-next" th:if="${!usersPage.isLastPage}"><a | |
| 212 | + th:onclick="'javascript:fanye(\''+${usersPage.pageNum+1}+'\');'">›</a> | |
| 213 | + </li> | |
| 214 | + <li class="page-next"><a | |
| 215 | + th:onclick="'javascript:fanye(\''+${usersPage.pages}+'\');'">››</a> | |
| 216 | + </li> | |
| 217 | + </ul> | |
| 218 | + </div> | |
| 219 | + </div> | |
| 220 | + </div> | |
| 221 | + </div> | |
| 222 | + <div class="clearfix"></div> | |
| 223 | + </div> | |
| 224 | + </div> | |
| 225 | + </div> | |
| 226 | + </div> | |
| 227 | + </section> | |
| 228 | + </div> | |
| 229 | + | |
| 230 | +<!-- 模态框(Modal) --> | |
| 231 | +<div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> | |
| 232 | + <div class="modal-dialog"> | |
| 233 | + <div class="modal-content" style="margin-top: 30%;"> | |
| 234 | + <div class="modal-header"> | |
| 235 | + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> | |
| 236 | + <h4 class="modal-title" id="myModalLabel">编辑审核用户</h4> | |
| 237 | + </div> | |
| 238 | + <div class="modal-body"> | |
| 239 | + <div class="form-group"> | |
| 240 | + <label class="control-label col-sm-2" style="font-size: 15px;">sp简称:</label> | |
| 241 | + <div class="col-sm-10" style="margin-top: -5px;margin-bottom: 20px;"> | |
| 242 | + <h5 id="edit_company">视讯中国</h5> | |
| 243 | + </div> | |
| 244 | + </div> | |
| 245 | + | |
| 246 | + <div class="form-group"> | |
| 247 | + <label class="control-label col-sm-2" style="font-size: 15px;">:</label> | |
| 248 | + <form action="/users/write" method="post" id="editWrite"> | |
| 249 | + <input type="text" name="siteId" value="" class="hide" id="edit_id"/> | |
| 250 | + <input type="text" name="redirect_url" value="" class="hide" id="redirect_url"/> | |
| 251 | + <div class="col-sm-10" style="float: left"> | |
| 252 | + <div th:each="bu:${business}" style="padding-right: 30px;" class="write_check"> | |
| 253 | + <span th:text="${bu.value}" style="font-size: 15px"></span> | |
| 254 | + <input type="checkbox" name="write_business" th:value="${bu.key}" th:id="'write_check_'+${bu.key}"> | |
| 255 | + </div> | |
| 256 | + </div> | |
| 257 | + </form> | |
| 258 | + </div> | |
| 259 | + | |
| 260 | + </div> | |
| 261 | + <div class="modal-footer"> | |
| 262 | + <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button> | |
| 263 | +<!-- <button type="button" class="btn btn-primary" onclick="javascript:$('#editWrite').submit();">提交更改</button> --> | |
| 264 | + </div> | |
| 265 | + </div><!-- /.modal-content --> | |
| 266 | + </div><!-- /.modal-dialog --> | |
| 267 | +</div> | |
| 268 | +<!-- /.modal --> | |
| 269 | + <script> | |
| 270 | + //打开编辑窗口 | |
| 271 | + function edit(id,company,write_business){ | |
| 272 | + $("#edit_company").text(company); | |
| 273 | + $("#edit_id").val(id); | |
| 274 | + $("#redirect_url").val(location.pathname+location.search); | |
| 275 | + $(".write_check input").prop("checked",false); | |
| 276 | + if($.trim(write_business)!=''){ | |
| 277 | + var array = write_business.split(",") | |
| 278 | + for (var i=0;i<array.length;i++){ | |
| 279 | + $("#write_check_"+array[i]).prop("checked",true); | |
| 280 | + } | |
| 281 | + } | |
| 282 | + $('#editModal').modal('show'); | |
| 283 | + } | |
| 284 | + | |
| 285 | + //翻页函数 | |
| 286 | + function fanye(page) { | |
| 287 | + var param = location.search; | |
| 288 | + if (param.indexOf("page=") != -1) { | |
| 289 | + var se = param.replace("?", "");//去掉问号,防止问号和要去掉的参数相连 | |
| 290 | + var split = se.split("&"); | |
| 291 | + var h = ""; | |
| 292 | + for (var i = 0; i < split.length; i++) { | |
| 293 | + var s = split[i]; | |
| 294 | + if (s.indexOf("page=") < 0) h = h + "&" + split[i]; | |
| 295 | + } | |
| 296 | + h = h.substring(1, h.length); | |
| 297 | + window.location.href = "/users/page?" + h + "&page=" + page; | |
| 298 | + } else { | |
| 299 | + param = param.substring(1, param.length); | |
| 300 | + window.location.href = "/users/page?" + param + "&page=" + page; | |
| 301 | + } | |
| 302 | + } | |
| 303 | + | |
| 304 | + //选择每页数量触发函数 | |
| 305 | + function selectPageSize(){ | |
| 306 | + var pageSize=$("#pageSize").val(); | |
| 307 | + var param = location.search; | |
| 308 | + if (param.indexOf("pageSize=") != -1) { | |
| 309 | + var se = param.replace("?", "");//去掉问号,防止问号和要去掉的参数相连 | |
| 310 | + var split = se.split("&"); | |
| 311 | + var h = ""; | |
| 312 | + for (var i = 0; i < split.length; i++) { | |
| 313 | + var s = split[i]; | |
| 314 | + if (s.indexOf("pageSize=") < 0 &&s.indexOf("page=") < 0) h = h + "&" + split[i]; | |
| 315 | + } | |
| 316 | + h = h.substring(1, h.length); | |
| 317 | + window.location.href = "/users/page?" + h + "&pageSize=" + pageSize; | |
| 318 | + } else { | |
| 319 | + var se = param.replace("?", "");//去掉问号,防止问号和要去掉的参数相连 | |
| 320 | + var split = se.split("&"); | |
| 321 | + var h = ""; | |
| 322 | + for (var i = 0; i < split.length; i++) { | |
| 323 | + var s = split[i]; | |
| 324 | + if (s.indexOf("page=") < 0) h = h + "&" + split[i]; | |
| 325 | + } | |
| 326 | + h = h.substring(1, h.length); | |
| 327 | + window.location.href = "/users/page?" + h + "&pageSize=" + pageSize; | |
| 328 | + } | |
| 329 | + } | |
| 330 | + | |
| 331 | + //搜索 | |
| 332 | + $('#users_query').click(function () { | |
| 333 | + var company_brief = $("#company_brief").val(); | |
| 334 | + var username = $("#username").val(); | |
| 335 | + var sp_id = $("#sp_id").val(); | |
| 336 | + var mobile = $("#mobile").val(); | |
| 337 | + var pageSize = $("#pageSize").val(); | |
| 338 | + window.location.href = "/users/page?company_brief=" + company_brief + "&username=" + username+ "&sp_id=" + sp_id+ "&mobile=" + mobile+ "&pageSize=" + pageSize; | |
| 339 | + }); | |
| 340 | + | |
| 341 | + </script> | |
| 342 | + | |
| 343 | + <footer th:replace="../templates/common/foot::foot" ></footer> | |
| 344 | + | |
| 345 | + | |
| 346 | + <!-- Add the sidebar's background. This div must be placed | |
| 347 | + immediately after the control sidebar --> | |
| 348 | + <div class="control-sidebar-bg" style="position: fixed; height: auto;"></div> | |
| 349 | + | |
| 350 | +</div><!-- ./wrapper --> | |
| 351 | + | |
| 352 | + | |
| 353 | +<!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip --> | |
| 354 | +<script type="text/javascript"> | |
| 355 | + $('div.alert').not('.alert-danger').delay(3000).slideUp(300); | |
| 356 | +</script> | |
| 357 | + | |
| 358 | +<!-- AdminLTE App --> | |
| 359 | +<script src="../../static/js/app.min.js"></script> | |
| 360 | +<!-- AdminLTE for demo purposes --> | |
| 361 | +<script src="../../static/js/sidebar.js"></script> | |
| 362 | + | |
| 363 | + | |
| 364 | +</body> | |
| 365 | +</html> | |
| 0 | 366 | \ No newline at end of file | ... | ... |