package com.yihu.hos.common;
import com.fasterxml.jackson.core.type.TypeReference;
import com.yihu.ehr.agModel.app.AppFeatureModel;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.core.http.HTTPResponse;
import com.yihu.hos.core.http.HttpClientKit;
import com.yihu.hos.remoteManage.service.RemoteShellService;
import com.yihu.hos.system.model.SystemUser;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.tenant.service.AuthenticateService;
import com.yihu.hos.web.framework.model.AccessToken;
import com.yihu.hos.web.framework.model.Envelop;
import com.yihu.hos.web.framework.model.EnvelopExt;
import com.yihu.hos.web.framework.util.controller.BaseController;
import io.swagger.annotations.ApiParam;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
/**
* 数据采集配置页面
* Created by hzp on 2015/8/12.
*/
@RequestMapping("/")
@Controller("commonPageController")
public class CommonPageController extends BaseController {
@Value("${spring.administrators}")
private String saasAdmin;
@Value("${spring.clientId}")
private String clientId;
@Value("${service-gateway.adminUrl}")
public String adminUrl;
@Value("${service-gateway.portalUrl}")
public String portalUrl;
@Autowired
private AuthenticateService authenticateService;
private RemoteShellService remoteShellService;
/*
登录页面
*/
@RequestMapping("loginPage")
public String login(Model model, HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
try {
boolean auth = authenticateService.auth(session, saasAdmin);
if (!auth) {
//授权失败
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-type", "text/html;charset=UTF-8");
PrintWriter out = null;
try {
out = response.getWriter();
out.print("");
response.sendRedirect("/esb/loginPage");
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(out);
}
} else {
remoteShellService.start();
}
} catch (Exception e) {
e.printStackTrace();
}
model.addAttribute("contentPage", "/common/login");
return "pageView";
}
/**
* 租户登录页面
*
* @param model
* @param tenantName
* @param request
* @return
*/
@RequestMapping("{tenantName}/loginPage")
public String tenantLogin(Model model,
@PathVariable(name = "tenantName") String tenantName,
HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpSession session = request.getSession();
boolean auth = false;
try {
auth = authenticateService.auth(session, tenantName);
System.out.println("auth: " + auth);
if (!auth) {
//授权失败,切换回管理平台数据库
auth = authenticateService.auth(session, saasAdmin);
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-type", "text/html;charset=UTF-8");
PrintWriter out = null;
try {
out = response.getWriter();
out.print("");
response.sendRedirect("/esb/loginPage");
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(out);
}
} else {
remoteShellService.start();
}
} catch (Exception e) {
e.printStackTrace();
}
model.addAttribute("contentPage", "/common/login");
return "pageView";
}
/*
首页页面
*/
@RequestMapping("indexPage")
public String index(HttpServletRequest request, Model model) {
HttpSession session = request.getSession();
SystemUser user = (SystemUser) session.getAttribute("userInfo");
TenantSession tenantSession = (TenantSession) session.getAttribute(ContextAttributes.TENANT_SESSION);
model.addAttribute("userName", user.getUserName());
model.addAttribute("tenant", tenantSession.getTenant());
//获取菜单
String menu = "[{id: 1, text: '任务管理',icon:'${staticRoot}/images/index/menu2_icon.png'},\n" +
" {id: 11, pid: 1, text: '任务跟踪', url: '${contextRoot}/datacollect/trackJob',targetType:'1'},\n" +
" {id: 12, pid: 1, text: '任务补采', url: '${contextRoot}/datacollect/repeatDatacollect'},\n" +
" {id: 13, pid: 1, text: '任务配置', url: '${contextRoot}/datacollect/configJob'},\n" +
" {id: 2, text: '标准管理',icon:'${staticRoot}/images/index/menu3_icon.png'},\n" +
" {id: 21, pid: 2, text: '集成标准', url: '${contextRoot}/integration/initial/standard'},\n" +
" {id: 22, pid: 2, text: '应用标准', url: '${contextRoot}/integration/initial/application'},\n" +
" {id: 23, pid: 2, text: '适配方案', url: '${contextRoot}/adapterPlan/initial'},\n" +
" {id: 3, text: '资源管理',icon:'${staticRoot}/images/index/menu4_icon.png'},\n" +
" {id: 31, pid: 3, text: '资源注册', url: '${contextRoot}/resource/resource/initial'},\n" +
" {id: 32, pid: 3, text: '资源浏览', url: '${contextRoot}/resource/resourcePage'},\n" +
" {id: 34, pid: 3, text: '资源分类', url: '${contextRoot}/resource/rsCategory/initial'},\n" +
" {id: 35, pid: 3, text: '业务资源', url: '${contextRoot}/resourceRest/initial'},\n" +
" {id: 4, text: '维度管理',icon:'${staticRoot}/images/index/menu5_icon.png'},\n" +
" {id: 41, pid: 4, text: '维度配置', url: '${contextRoot}/dimension/dimension'},\n" +
" {id: 42, pid: 4, text: '维度类别配置', url: '${contextRoot}/dimension/dimensioncatetory'},\n" +
" {id: 9, text: '系统配置',icon:'${staticRoot}/images/index/menu6_icon.png'},\n" +
" {id: 91, pid: 9, text: '机构配置', url: '${contextRoot}/org/initial'},\n" +
" {id: 92, pid: 9, text: '数据源配置', url: '${contextRoot}/datasource/configSources'},\n" +
" {id: 93, pid: 9, text: '菜单配置', url: '${contextRoot}/menu/initial'},\n" +
" {id: 100, pid: 9, text: '菜单按钮配置', url: '${contextRoot}/menu/menuAction/initial'},\n" +
" {id: 94, pid: 9, text: '用户管理', url: '${contextRoot}/user/initial'},\n" +
" {id: 95, pid: 9, text: '角色管理', url: '${contextRoot}/role/initial'},\n" +
" {id: 96, pid: 9, text: '权限管理', url: '${contextRoot}/authority/initial'},\n" +
" {id: 97, pid: 9, text: '字典管理', url: '${contextRoot}/dict/initial' },\n" +
" {id: 98, pid: 9, text: '系统参数', url: '${contextRoot}/param/initial'},\n" +
" {id: 99, pid: 9, text: '', url: '${contextRoot}/app/initial'}]";
model.addAttribute("menu", menu);
model.addAttribute("contentPage", "/common/index");
return "pageView";
}
/**
* oauth2 自动登录后首页
*
* @param tenantName 租户名称
* @param request
* @param model
* @return
*/
@RequestMapping("{tenantName}/oauth2/index")
public String tenantIndex(
@PathVariable(name = "tenantName") String tenantName,
HttpServletRequest request, Model model) {
HttpSession session = request.getSession();
boolean auth = false;
String clientId = request.getParameter(ContextAttributes.CLIENTID);
String token = request.getParameter(ContextAttributes.ACCESSTOKEN);
String loginName = request.getParameter(ContextAttributes.LOGIN_NAME);
//TODO 根据token和clientId 获取用户信息
SystemUser userInfo = new SystemUser();
userInfo.setLoginCode(loginName);
userInfo.setUserName("管理员");
session.setAttribute("userInfo", userInfo);
try {
auth = authenticateService.auth(session, tenantName);
if (!auth) {
model.addAttribute("contentPage", "/common/tokenValidFail");
return "pageView";
}
} catch (Exception e) {
e.printStackTrace();
}
model.addAttribute("userName", "admin");
model.addAttribute("tenant", tenantName);
//获取菜单
String menu = "[{id: 1, text: '任务管理',icon:'${staticRoot}/images/index/menu2_icon.png'},\n" +
" {id: 11, pid: 1, text: '任务跟踪', url: '${contextRoot}/datacollect/trackJob',targetType:'1'},\n" +
" {id: 12, pid: 1, text: '任务补采', url: '${contextRoot}/datacollect/repeatDatacollect'},\n" +
" {id: 13, pid: 1, text: '任务配置', url: '${contextRoot}/datacollect/configJob'},\n" +
" {id: 2, text: '标准管理',icon:'${staticRoot}/images/index/menu3_icon.png'},\n" +
" {id: 21, pid: 2, text: '集成标准', url: '${contextRoot}/integration/initial/standard'},\n" +
" {id: 22, pid: 2, text: '应用标准', url: '${contextRoot}/integration/initial/application'},\n" +
" {id: 23, pid: 2, text: '适配方案', url: '${contextRoot}/adapterPlan/initial'},\n" +
" {id: 3, text: '资源管理',icon:'${staticRoot}/images/index/menu4_icon.png'},\n" +
" {id: 31, pid: 3, text: '资源注册', url: '${contextRoot}/resource/resource/initial'},\n" +
" {id: 32, pid: 3, text: '资源浏览', url: '${contextRoot}/resource/resourcePage'},\n" +
" {id: 34, pid: 3, text: '资源分类', url: '${contextRoot}/resource/rsCategory/initial'},\n" +
" {id: 35, pid: 3, text: '业务资源', url: '${contextRoot}/resourceRest/initial'},\n" +
" {id: 4, text: '维度管理',icon:'${staticRoot}/images/index/menu5_icon.png'},\n" +
" {id: 41, pid: 4, text: '维度配置', url: '${contextRoot}/dimension/dimension'},\n" +
" {id: 42, pid: 4, text: '维度类别配置', url: '${contextRoot}/dimension/dimensioncatetory'},\n" +
" {id: 9, text: '系统配置',icon:'${staticRoot}/images/index/menu6_icon.png'},\n" +
" {id: 91, pid: 9, text: '机构配置', url: '${contextRoot}/org/initial'},\n" +
" {id: 92, pid: 9, text: '数据源配置', url: '${contextRoot}/datasource/configSources'},\n" +
" {id: 93, pid: 9, text: '菜单配置', url: '${contextRoot}/menu/initial'},\n" +
" {id: 100, pid: 9, text: '菜单按钮配置', url: '${contextRoot}/menu/menuAction/initial'},\n" +
" {id: 94, pid: 9, text: '用户管理', url: '${contextRoot}/user/initial'},\n" +
" {id: 95, pid: 9, text: '角色管理', url: '${contextRoot}/role/initial'},\n" +
" {id: 96, pid: 9, text: '权限管理', url: '${contextRoot}/authority/initial'},\n" +
" {id: 97, pid: 9, text: '字典管理', url: '${contextRoot}/dict/initial' },\n" +
" {id: 98, pid: 9, text: '系统参数', url: '${contextRoot}/param/initial'},\n" +
" {id: 99, pid: 9, text: '', url: '${contextRoot}/app/initial'}]";
model.addAttribute("menu", menu);
model.addAttribute("contentPage", "/common/index");
return "pageView";
}
/**
* oauth2 自动登陆中间页
*
* @param model
* @param tenantName
* @return
*/
@RequestMapping(value = "{tenantName}/oauth2/signin")
public String signin(Model model,
@PathVariable(name = "tenantName") String tenantName) {
model.addAttribute("tenantName", tenantName);
model.addAttribute("contentPage", "common/signin");
model.addAttribute("successFlg", true);
return "pageView";
}
/*
* oauth2 自动登录
*/
@RequestMapping(value = "oauth2/autoLogin", method = RequestMethod.POST)
@ResponseBody
public Envelop autoLogin(Model model,
HttpServletRequest request,
@ApiParam(name = "token")
@RequestParam String token) throws Exception {
Envelop result = new Envelop();
try {
Map params = new HashMap<>();
params.put("clientId", clientId);
params.put("accessToken", token);
HTTPResponse response = HttpClientKit.post(portalUrl + "/oauth/validToken", params);
if (response.getStatusCode() != 200) {
System.out.println("获取 token 请求失败!");
return null;
}
Map map = objectMapper.readValue(response.getBody(), Map.class);
if ((Boolean) map.get("successFlg")) {
AccessToken accessToken = objectMapper.readValue(objectMapper.writeValueAsString(map.get("data")), AccessToken.class);
String loginName = accessToken.getUser();
//验证通过。赋值session中的用户信息
HTTPResponse userResponse = HttpClientKit.get(adminUrl + "/users/" + loginName, params);
result = (Envelop) this.objectMapper.readValue(userResponse.getBody(), Envelop.class);
Collection gas = new ArrayList<>();
if (result.isSuccessFlg()) {
String ex = this.objectMapper.writeValueAsString(result.getObj());
Map userMap = objectMapper.readValue(ex, Map.class);
//TODO 设置当前登录用户
String userId = userMap.get("id").toString();
List features = getUserFeatures(userId);
if (features != null) {
for (int i = 0; i < features.size(); i++) {
String url = features.get(i).getUrl();
if (!StringUtils.isEmpty(url))
gas.add(new SimpleGrantedAuthority(url));
}
}
} else {
return failed(result.getErrorMsg());
}
//生成认证token
Authentication AuthenticationToken = new UsernamePasswordAuthenticationToken(loginName, "", gas);
//将信息存放到SecurityContext
SecurityContextHolder.getContext().setAuthentication(AuthenticationToken);
return success(accessToken);
} else {
String msg = String.valueOf(map.get("message"));
return failed(msg);
}
} catch (Exception e) {
e.printStackTrace();
return failed(e.getMessage());
}
}
/*
系统主页
*/
@RequestMapping("homePage")
public String home(Model model) {
model.addAttribute("contentPage", "/common/home");
return "partView";
}
private List getUserFeatures(String userId) throws Exception {
Map params = new HashMap<>();
params.put("user_id", userId);
HTTPResponse resultStr = HttpClientKit.get(adminUrl + "/roles/user/features", params);
EnvelopExt envelop =
(EnvelopExt) objectMapper.readValue(resultStr.getBody(), new TypeReference>() {
});
if (envelop.isSuccessFlg()) {
return envelop.getDetailModelList();
}
throw new Exception(resultStr.getBody());
}
@Autowired
public void setRemoteShellService(RemoteShellService remoteShellService) {
this.remoteShellService = remoteShellService;
}
}