parent
637739459e
commit
306600c73a
|
@ -0,0 +1,16 @@
|
||||||
|
package io.metersphere.commons.utils;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
public class RsaKey {
|
||||||
|
|
||||||
|
//公钥
|
||||||
|
private String publicKey;
|
||||||
|
|
||||||
|
//私钥
|
||||||
|
private String privateKey;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,224 @@
|
||||||
|
package io.metersphere.commons.utils;
|
||||||
|
|
||||||
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.security.*;
|
||||||
|
import java.security.interfaces.RSAPrivateKey;
|
||||||
|
import java.security.interfaces.RSAPublicKey;
|
||||||
|
import java.security.spec.InvalidKeySpecException;
|
||||||
|
import java.security.spec.PKCS8EncodedKeySpec;
|
||||||
|
import java.security.spec.X509EncodedKeySpec;
|
||||||
|
|
||||||
|
public class RsaUtil {
|
||||||
|
|
||||||
|
public static final String CHARSET = "UTF-8";
|
||||||
|
public static final String RSA_ALGORITHM = "RSA";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建RSA 公钥-私钥
|
||||||
|
*/
|
||||||
|
public static RsaKey createKeys() throws NoSuchAlgorithmException {
|
||||||
|
return createKeys(1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建RSA 公钥-私钥
|
||||||
|
*/
|
||||||
|
public static RsaKey createKeys(int keySize) throws NoSuchAlgorithmException {
|
||||||
|
//为RSA算法创建一个KeyPairGenerator对象
|
||||||
|
KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM);
|
||||||
|
|
||||||
|
//初始化KeyPairGenerator对象,密钥长度
|
||||||
|
kpg.initialize(keySize);
|
||||||
|
//生成密匙对
|
||||||
|
KeyPair keyPair = kpg.generateKeyPair();
|
||||||
|
|
||||||
|
//得到公钥
|
||||||
|
Key publicKey = keyPair.getPublic();
|
||||||
|
|
||||||
|
String publicKeyStr = new String(Base64.encodeBase64(publicKey.getEncoded()));
|
||||||
|
|
||||||
|
//得到私钥
|
||||||
|
Key privateKey = keyPair.getPrivate();
|
||||||
|
String privateKeyStr = new String(Base64.encodeBase64(privateKey.getEncoded()));
|
||||||
|
|
||||||
|
RsaKey rsaKey = new RsaKey();
|
||||||
|
rsaKey.setPublicKey(publicKeyStr);
|
||||||
|
rsaKey.setPrivateKey(privateKeyStr);
|
||||||
|
|
||||||
|
return rsaKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 公钥加密
|
||||||
|
*
|
||||||
|
* @param originalText 原文
|
||||||
|
* @param publicKey 公钥
|
||||||
|
*/
|
||||||
|
public static String publicEncrypt(String originalText, String publicKey) throws NoSuchAlgorithmException {
|
||||||
|
RSAPublicKey rsaPublicKey = getPublicKey(publicKey);
|
||||||
|
return publicEncrypt(originalText, rsaPublicKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 公钥解密
|
||||||
|
*
|
||||||
|
* @param cipherText 密文
|
||||||
|
* @param publicKey 公钥
|
||||||
|
*/
|
||||||
|
public static String publicDecrypt(String cipherText, String publicKey) throws NoSuchAlgorithmException {
|
||||||
|
RSAPublicKey rsaPublicKey = getPublicKey(publicKey);
|
||||||
|
return publicDecrypt(cipherText, rsaPublicKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 私钥加密
|
||||||
|
*
|
||||||
|
* @param originalText 原文
|
||||||
|
* @param privateKey 私钥
|
||||||
|
*/
|
||||||
|
public static String privateEncrypt(String originalText, String privateKey) throws NoSuchAlgorithmException {
|
||||||
|
RSAPrivateKey rsaPrivateKey = getPrivateKey(privateKey);
|
||||||
|
return privateEncrypt(originalText, rsaPrivateKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 私钥解密
|
||||||
|
*
|
||||||
|
* @param cipherText 密文
|
||||||
|
* @param privateKey 私钥
|
||||||
|
*/
|
||||||
|
public static String privateDecrypt(String cipherText, String privateKey) throws NoSuchAlgorithmException {
|
||||||
|
RSAPrivateKey rsaPrivateKey = getPrivateKey(privateKey);
|
||||||
|
return privateDecrypt(cipherText, rsaPrivateKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 得到公钥
|
||||||
|
*
|
||||||
|
* @param publicKey 密钥字符串(经过base64编码)
|
||||||
|
*/
|
||||||
|
private static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException {
|
||||||
|
//通过X509编码的Key指令获得公钥对象
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
|
||||||
|
|
||||||
|
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
|
||||||
|
RSAPublicKey key = null;
|
||||||
|
try {
|
||||||
|
key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
|
||||||
|
} catch (InvalidKeySpecException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 公钥加密
|
||||||
|
*
|
||||||
|
* @param originalText 原文
|
||||||
|
* @param publicKey 公钥
|
||||||
|
*/
|
||||||
|
private static String publicEncrypt(String originalText, RSAPublicKey publicKey) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
|
||||||
|
return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, originalText.getBytes(CHARSET), publicKey.getModulus().bitLength()));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("加密字符串[" + originalText + "]时遇到异常", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 得到私钥
|
||||||
|
*
|
||||||
|
* @param privateKey 密钥字符串(经过base64编码)
|
||||||
|
*/
|
||||||
|
private static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException {
|
||||||
|
//通过PKCS#8编码的Key指令获得私钥对象
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
|
||||||
|
|
||||||
|
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
|
||||||
|
RSAPrivateKey key = null;
|
||||||
|
try {
|
||||||
|
key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
|
||||||
|
} catch (InvalidKeySpecException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 私钥解密
|
||||||
|
*
|
||||||
|
* @param cipherText 密文
|
||||||
|
* @param privateKey 私钥
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static String privateDecrypt(String cipherText, RSAPrivateKey privateKey) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, privateKey);
|
||||||
|
return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(cipherText), privateKey.getModulus().bitLength()), CHARSET);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("解密字符串[" + cipherText + "]时遇到异常", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String privateEncrypt(String originalText, RSAPrivateKey privateKey) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
|
||||||
|
return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, originalText.getBytes(CHARSET), privateKey.getModulus().bitLength()));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("加密字符串[" + originalText + "]时遇到异常", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static String publicDecrypt(String cipherText, RSAPublicKey publicKey) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, publicKey);
|
||||||
|
return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(cipherText), publicKey.getModulus().bitLength()), CHARSET);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("解密字符串[" + cipherText + "]时遇到异常", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize) {
|
||||||
|
int maxBlock;
|
||||||
|
if (opmode == Cipher.DECRYPT_MODE) {
|
||||||
|
maxBlock = keySize / 8;
|
||||||
|
} else {
|
||||||
|
maxBlock = keySize / 8 - 11;
|
||||||
|
}
|
||||||
|
int offSet = 0;
|
||||||
|
byte[] buff;
|
||||||
|
int i = 0;
|
||||||
|
try (
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream()
|
||||||
|
) {
|
||||||
|
while (datas.length > offSet) {
|
||||||
|
if (datas.length - offSet > maxBlock) {
|
||||||
|
buff = cipher.doFinal(datas, offSet, maxBlock);
|
||||||
|
} else {
|
||||||
|
buff = cipher.doFinal(datas, offSet, datas.length - offSet);
|
||||||
|
}
|
||||||
|
out.write(buff, 0, buff.length);
|
||||||
|
i++;
|
||||||
|
offSet = i * maxBlock;
|
||||||
|
}
|
||||||
|
return out.toByteArray();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("加解密阀值为[" + maxBlock + "]的数据时发生异常", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package io.metersphere.config;
|
||||||
|
|
||||||
|
import io.metersphere.commons.utils.RsaKey;
|
||||||
|
import io.metersphere.commons.utils.RsaUtil;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class RsaConfig {
|
||||||
|
@Bean
|
||||||
|
public RsaKey rsaKey() throws NoSuchAlgorithmException {
|
||||||
|
return RsaUtil.createKeys();
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,8 @@ package io.metersphere.controller;
|
||||||
|
|
||||||
import io.metersphere.commons.constants.UserSource;
|
import io.metersphere.commons.constants.UserSource;
|
||||||
import io.metersphere.commons.user.SessionUser;
|
import io.metersphere.commons.user.SessionUser;
|
||||||
|
import io.metersphere.commons.utils.RsaKey;
|
||||||
|
import io.metersphere.commons.utils.RsaUtil;
|
||||||
import io.metersphere.commons.utils.SessionUtils;
|
import io.metersphere.commons.utils.SessionUtils;
|
||||||
import io.metersphere.controller.request.LoginRequest;
|
import io.metersphere.controller.request.LoginRequest;
|
||||||
import io.metersphere.service.BaseDisplayService;
|
import io.metersphere.service.BaseDisplayService;
|
||||||
|
@ -23,6 +25,8 @@ public class LoginController {
|
||||||
private UserService userService;
|
private UserService userService;
|
||||||
@Resource
|
@Resource
|
||||||
private BaseDisplayService baseDisplayService;
|
private BaseDisplayService baseDisplayService;
|
||||||
|
@Resource
|
||||||
|
private RsaKey rsaKey;
|
||||||
|
|
||||||
@GetMapping(value = "/isLogin")
|
@GetMapping(value = "/isLogin")
|
||||||
public ResultHolder isLogin() {
|
public ResultHolder isLogin() {
|
||||||
|
@ -33,7 +37,7 @@ public class LoginController {
|
||||||
}
|
}
|
||||||
return ResultHolder.success(user);
|
return ResultHolder.success(user);
|
||||||
}
|
}
|
||||||
return ResultHolder.error("");
|
return ResultHolder.error(rsaKey.getPublicKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(value = "/signin")
|
@PostMapping(value = "/signin")
|
||||||
|
|
|
@ -1,12 +1,36 @@
|
||||||
package io.metersphere.controller.request;
|
package io.metersphere.controller.request;
|
||||||
|
|
||||||
|
import io.metersphere.commons.utils.CommonBeanFactory;
|
||||||
|
import io.metersphere.commons.utils.RsaKey;
|
||||||
|
import io.metersphere.commons.utils.RsaUtil;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class LoginRequest {
|
public class LoginRequest {
|
||||||
private String username;
|
private String username;
|
||||||
private String password;
|
private String password;
|
||||||
private String authenticate;
|
private String authenticate;
|
||||||
|
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
try {
|
||||||
|
RsaKey rsaKey = CommonBeanFactory.getBean(RsaKey.class);
|
||||||
|
return RsaUtil.privateDecrypt(username, rsaKey.getPrivateKey());
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
try {
|
||||||
|
RsaKey rsaKey = CommonBeanFactory.getBean(RsaKey.class);
|
||||||
|
return RsaUtil.privateDecrypt(password, rsaKey.getPrivateKey());
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,8 @@
|
||||||
"xml-js": "^1.6.11",
|
"xml-js": "^1.6.11",
|
||||||
"yan-progress": "^1.0.3",
|
"yan-progress": "^1.0.3",
|
||||||
"jsonpath": "^1.1.0",
|
"jsonpath": "^1.1.0",
|
||||||
"vue-minder-editor-plus": "^1.0.14"
|
"vue-minder-editor-plus": "^1.0.14",
|
||||||
|
"jsencrypt": "^3.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vue/cli-plugin-babel": "^4.1.0",
|
"@vue/cli-plugin-babel": "^4.1.0",
|
||||||
|
|
|
@ -1,366 +1,378 @@
|
||||||
import {
|
import {
|
||||||
COUNT_NUMBER, COUNT_NUMBER_SHALLOW,
|
COUNT_NUMBER,
|
||||||
LicenseKey, ORIGIN_COLOR, ORIGIN_COLOR_SHALLOW,
|
COUNT_NUMBER_SHALLOW,
|
||||||
PROJECT_ID,
|
LicenseKey,
|
||||||
REFRESH_SESSION_USER_URL,
|
ORIGIN_COLOR,
|
||||||
ROLE_ADMIN,
|
ORIGIN_COLOR_SHALLOW,
|
||||||
ROLE_ORG_ADMIN,
|
PROJECT_ID,
|
||||||
ROLE_TEST_MANAGER,
|
REFRESH_SESSION_USER_URL,
|
||||||
ROLE_TEST_USER,
|
ROLE_ADMIN,
|
||||||
ROLE_TEST_VIEWER,
|
ROLE_ORG_ADMIN,
|
||||||
TokenKey
|
ROLE_TEST_MANAGER,
|
||||||
|
ROLE_TEST_USER,
|
||||||
|
ROLE_TEST_VIEWER,
|
||||||
|
TokenKey
|
||||||
} from "./constants";
|
} from "./constants";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import {jsPDF} from "jspdf";
|
import {jsPDF} from "jspdf";
|
||||||
|
import JSEncrypt from 'jsencrypt';
|
||||||
|
|
||||||
export function hasRole(role) {
|
export function hasRole(role) {
|
||||||
let user = getCurrentUser();
|
let user = getCurrentUser();
|
||||||
let roles = user.roles.map(r => r.id);
|
let roles = user.roles.map(r => r.id);
|
||||||
return roles.indexOf(role) > -1;
|
return roles.indexOf(role) > -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 是否含有某个角色
|
// 是否含有某个角色
|
||||||
export function hasRoles(...roles) {
|
export function hasRoles(...roles) {
|
||||||
let user = getCurrentUser();
|
let user = getCurrentUser();
|
||||||
let rs = user.roles.map(r => r.id);
|
let rs = user.roles.map(r => r.id);
|
||||||
for (let item of roles) {
|
for (let item of roles) {
|
||||||
if (rs.indexOf(item) > -1) {
|
if (rs.indexOf(item) > -1) {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
return false;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function hasRolePermission(role) {
|
export function hasRolePermission(role) {
|
||||||
let user = getCurrentUser();
|
let user = getCurrentUser();
|
||||||
for (let ur of user.userRoles) {
|
for (let ur of user.userRoles) {
|
||||||
if (role === ur.roleId) {
|
if (role === ur.roleId) {
|
||||||
if (ur.roleId === ROLE_ADMIN) {
|
if (ur.roleId === ROLE_ADMIN) {
|
||||||
return true;
|
return true;
|
||||||
} else if (ur.roleId === ROLE_ORG_ADMIN && user.lastOrganizationId === ur.sourceId) {
|
} else if (ur.roleId === ROLE_ORG_ADMIN && user.lastOrganizationId === ur.sourceId) {
|
||||||
return true;
|
return true;
|
||||||
} else if (user.lastWorkspaceId === ur.sourceId) {
|
} else if (user.lastWorkspaceId === ur.sourceId) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
return false
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function hasLicense() {
|
export function hasLicense() {
|
||||||
let v = localStorage.getItem(LicenseKey);
|
let v = localStorage.getItem(LicenseKey);
|
||||||
return v === 'valid';
|
return v === 'valid';
|
||||||
}
|
}
|
||||||
|
|
||||||
//是否含有对应组织或工作空间的角色
|
//是否含有对应组织或工作空间的角色
|
||||||
export function hasRolePermissions(...roles) {
|
export function hasRolePermissions(...roles) {
|
||||||
for (let role of roles) {
|
for (let role of roles) {
|
||||||
if (hasRolePermission(role)) {
|
if (hasRolePermission(role)) {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
return false;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function checkoutCurrentOrganization() {
|
export function checkoutCurrentOrganization() {
|
||||||
// 查看当前用户是否是 lastOrganizationId 的组织管理员
|
// 查看当前用户是否是 lastOrganizationId 的组织管理员
|
||||||
return hasRolePermissions(ROLE_ORG_ADMIN);
|
return hasRolePermissions(ROLE_ORG_ADMIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function checkoutCurrentWorkspace() {
|
export function checkoutCurrentWorkspace() {
|
||||||
// 查看当前用户是否是 lastWorkspaceId 的工作空间用户
|
// 查看当前用户是否是 lastWorkspaceId 的工作空间用户
|
||||||
return hasRolePermissions(ROLE_TEST_MANAGER, ROLE_TEST_USER, ROLE_TEST_VIEWER);
|
return hasRolePermissions(ROLE_TEST_MANAGER, ROLE_TEST_USER, ROLE_TEST_VIEWER);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function checkoutTestManagerOrTestUser() {
|
export function checkoutTestManagerOrTestUser() {
|
||||||
return hasRolePermissions(ROLE_TEST_MANAGER, ROLE_TEST_USER);
|
return hasRolePermissions(ROLE_TEST_MANAGER, ROLE_TEST_USER);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getCurrentOrganizationId() {
|
export function getCurrentOrganizationId() {
|
||||||
let user = getCurrentUser();
|
let user = getCurrentUser();
|
||||||
return user.lastOrganizationId;
|
return user.lastOrganizationId;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getCurrentWorkspaceId() {
|
export function getCurrentWorkspaceId() {
|
||||||
let user = getCurrentUser();
|
let user = getCurrentUser();
|
||||||
return user.lastWorkspaceId;
|
return user.lastWorkspaceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getCurrentUser() {
|
export function getCurrentUser() {
|
||||||
return JSON.parse(localStorage.getItem(TokenKey));
|
return JSON.parse(localStorage.getItem(TokenKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getCurrentProjectID() {
|
export function getCurrentProjectID() {
|
||||||
return localStorage.getItem(PROJECT_ID);
|
return localStorage.getItem(PROJECT_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function saveLocalStorage(response) {
|
export function saveLocalStorage(response) {
|
||||||
// 登录信息保存 cookie
|
// 登录信息保存 cookie
|
||||||
localStorage.setItem(TokenKey, JSON.stringify(response.data));
|
localStorage.setItem(TokenKey, JSON.stringify(response.data));
|
||||||
let rolesArray = response.data.roles;
|
let rolesArray = response.data.roles;
|
||||||
let roles = rolesArray.map(r => r.id);
|
let roles = rolesArray.map(r => r.id);
|
||||||
// 保存角色
|
// 保存角色
|
||||||
localStorage.setItem("roles", roles);
|
localStorage.setItem("roles", roles);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function saveLicense(data) {
|
export function saveLicense(data) {
|
||||||
// 保存License
|
// 保存License
|
||||||
localStorage.setItem(LicenseKey, data);
|
localStorage.setItem(LicenseKey, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function refreshSessionAndCookies(sign, sourceId) {
|
export function refreshSessionAndCookies(sign, sourceId) {
|
||||||
axios.post(REFRESH_SESSION_USER_URL + "/" + sign + "/" + sourceId).then(r => {
|
axios.post(REFRESH_SESSION_USER_URL + "/" + sign + "/" + sourceId).then(r => {
|
||||||
saveLocalStorage(r.data);
|
saveLocalStorage(r.data);
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function jsonToMap(jsonStr) {
|
export function jsonToMap(jsonStr) {
|
||||||
let obj = JSON.parse(jsonStr);
|
let obj = JSON.parse(jsonStr);
|
||||||
let strMap = new Map();
|
let strMap = new Map();
|
||||||
for (let k of Object.keys(obj)) {
|
for (let k of Object.keys(obj)) {
|
||||||
strMap.set(k, obj[k]);
|
strMap.set(k, obj[k]);
|
||||||
}
|
}
|
||||||
return strMap;
|
return strMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function mapToJson(strMap) {
|
export function mapToJson(strMap) {
|
||||||
let obj = Object.create(null);
|
let obj = Object.create(null);
|
||||||
for (let [k, v] of strMap) {
|
for (let [k, v] of strMap) {
|
||||||
obj[k] = v;
|
obj[k] = v;
|
||||||
}
|
}
|
||||||
return JSON.stringify(obj);
|
return JSON.stringify(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 驼峰转换下划线
|
// 驼峰转换下划线
|
||||||
export function humpToLine(name) {
|
export function humpToLine(name) {
|
||||||
return name.replace(/([A-Z])/g, "_$1").toLowerCase();
|
return name.replace(/([A-Z])/g, "_$1").toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
export function downloadFile(name, content) {
|
export function downloadFile(name, content) {
|
||||||
const blob = new Blob([content]);
|
const blob = new Blob([content]);
|
||||||
if ("download" in document.createElement("a")) {
|
if ("download" in document.createElement("a")) {
|
||||||
// 非IE下载
|
// 非IE下载
|
||||||
// chrome/firefox
|
// chrome/firefox
|
||||||
let aTag = document.createElement('a');
|
let aTag = document.createElement('a');
|
||||||
aTag.download = name;
|
aTag.download = name;
|
||||||
aTag.href = URL.createObjectURL(blob);
|
aTag.href = URL.createObjectURL(blob);
|
||||||
aTag.click();
|
aTag.click();
|
||||||
URL.revokeObjectURL(aTag.href)
|
URL.revokeObjectURL(aTag.href)
|
||||||
} else {
|
} else {
|
||||||
// IE10+下载
|
// IE10+下载
|
||||||
navigator.msSaveBlob(blob, name)
|
navigator.msSaveBlob(blob, name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function listenGoBack(callback) {
|
export function listenGoBack(callback) {
|
||||||
//监听浏览器返回操作,关闭该对话框
|
//监听浏览器返回操作,关闭该对话框
|
||||||
if (window.history && window.history.pushState) {
|
if (window.history && window.history.pushState) {
|
||||||
history.pushState(null, null, document.URL);
|
history.pushState(null, null, document.URL);
|
||||||
window.addEventListener('popstate', callback);
|
window.addEventListener('popstate', callback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function removeGoBackListener(callback) {
|
export function removeGoBackListener(callback) {
|
||||||
window.removeEventListener('popstate', callback);
|
window.removeEventListener('popstate', callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const uuid = function () {
|
export const uuid = function () {
|
||||||
let d = new Date().getTime();
|
let d = new Date().getTime();
|
||||||
let d2 = (performance && performance.now && (performance.now() * 1000)) || 0;
|
let d2 = (performance && performance.now && (performance.now() * 1000)) || 0;
|
||||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
||||||
let r = Math.random() * 16;
|
let r = Math.random() * 16;
|
||||||
if (d > 0) {
|
if (d > 0) {
|
||||||
r = (d + r) % 16 | 0;
|
r = (d + r) % 16 | 0;
|
||||||
d = Math.floor(d / 16);
|
d = Math.floor(d / 16);
|
||||||
} else {
|
} else {
|
||||||
r = (d2 + r) % 16 | 0;
|
r = (d2 + r) % 16 | 0;
|
||||||
d2 = Math.floor(d2 / 16);
|
d2 = Math.floor(d2 / 16);
|
||||||
}
|
}
|
||||||
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
|
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export function getUUID() {
|
export function getUUID() {
|
||||||
function S4() {
|
function S4() {
|
||||||
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
|
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
|
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function exportPdf(name, canvasList) {
|
export function exportPdf(name, canvasList) {
|
||||||
|
|
||||||
let pdf = new jsPDF('', 'pt', 'a4');
|
let pdf = new jsPDF('', 'pt', 'a4');
|
||||||
|
|
||||||
// 当前页面的当前高度
|
// 当前页面的当前高度
|
||||||
let currentHeight = 0;
|
let currentHeight = 0;
|
||||||
for (let canvas of canvasList) {
|
for (let canvas of canvasList) {
|
||||||
if (canvas) {
|
if (canvas) {
|
||||||
|
|
||||||
let contentWidth = canvas.width;
|
let contentWidth = canvas.width;
|
||||||
let contentHeight = canvas.height;
|
let contentHeight = canvas.height;
|
||||||
|
|
||||||
//a4纸的尺寸[595.28,841.89]
|
//a4纸的尺寸[595.28,841.89]
|
||||||
let a4Width = 592.28;
|
let a4Width = 592.28;
|
||||||
let a4Height = 841.89;
|
let a4Height = 841.89;
|
||||||
|
|
||||||
// html页面生成的canvas在pdf中图片的宽高
|
// html页面生成的canvas在pdf中图片的宽高
|
||||||
let imgWidth = a4Width;
|
let imgWidth = a4Width;
|
||||||
let imgHeight = a4Width / contentWidth * contentHeight;
|
let imgHeight = a4Width / contentWidth * contentHeight;
|
||||||
|
|
||||||
let pageData = canvas.toDataURL('image/jpeg', 1.0);
|
let pageData = canvas.toDataURL('image/jpeg', 1.0);
|
||||||
|
|
||||||
// 当前图片的剩余高度
|
// 当前图片的剩余高度
|
||||||
let leftHeight = imgHeight;
|
let leftHeight = imgHeight;
|
||||||
|
|
||||||
// 当前页面的剩余高度
|
// 当前页面的剩余高度
|
||||||
let blankHeight = a4Height - currentHeight;
|
let blankHeight = a4Height - currentHeight;
|
||||||
|
|
||||||
if (leftHeight > blankHeight) {
|
if (leftHeight > blankHeight) {
|
||||||
//页面偏移
|
//页面偏移
|
||||||
let position = 0;
|
let position = 0;
|
||||||
while (leftHeight > 0) {
|
while (leftHeight > 0) {
|
||||||
// 本次添加占用的高度
|
// 本次添加占用的高度
|
||||||
let occupation = a4Height - currentHeight;
|
let occupation = a4Height - currentHeight;
|
||||||
pdf.addImage(pageData, 'JPEG', 0, position + currentHeight, imgWidth, imgHeight);
|
pdf.addImage(pageData, 'JPEG', 0, position + currentHeight, imgWidth, imgHeight);
|
||||||
currentHeight = leftHeight;
|
currentHeight = leftHeight;
|
||||||
leftHeight -= occupation;
|
leftHeight -= occupation;
|
||||||
position -= occupation;
|
position -= occupation;
|
||||||
//避免添加空白页
|
//避免添加空白页
|
||||||
if (leftHeight > 0) {
|
if (leftHeight > 0) {
|
||||||
pdf.addPage();
|
pdf.addPage();
|
||||||
currentHeight = 0;
|
currentHeight = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pdf.addImage(pageData, 'JPEG', 0, currentHeight, imgWidth, imgHeight);
|
||||||
|
currentHeight += imgHeight;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
pdf.addImage(pageData, 'JPEG', 0, currentHeight, imgWidth, imgHeight);
|
|
||||||
currentHeight += imgHeight;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
pdf.save(name.replace(" ", "_") + '.pdf');
|
pdf.save(name.replace(" ", "_") + '.pdf');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function windowPrint(id, zoom) {
|
export function windowPrint(id, zoom) {
|
||||||
//根据div标签ID拿到div中的局部内容
|
//根据div标签ID拿到div中的局部内容
|
||||||
let bdhtml = window.document.body.innerHTML;
|
let bdhtml = window.document.body.innerHTML;
|
||||||
let el = document.getElementById(id);
|
let el = document.getElementById(id);
|
||||||
var jubuData = el.innerHTML;
|
var jubuData = el.innerHTML;
|
||||||
document.getElementsByTagName('body')[0].style.zoom = zoom;
|
document.getElementsByTagName('body')[0].style.zoom = zoom;
|
||||||
//把获取的 局部div内容赋给body标签, 相当于重置了 body里的内容
|
//把获取的 局部div内容赋给body标签, 相当于重置了 body里的内容
|
||||||
window.document.body.innerHTML = jubuData;
|
window.document.body.innerHTML = jubuData;
|
||||||
//调用打印功能
|
//调用打印功能
|
||||||
window.print();
|
window.print();
|
||||||
window.document.body.innerHTML = bdhtml;//重新给页面内容赋值;
|
window.document.body.innerHTML = bdhtml;//重新给页面内容赋值;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getBodyUploadFiles(obj, runData) {
|
export function getBodyUploadFiles(obj, runData) {
|
||||||
let bodyUploadFiles = [];
|
let bodyUploadFiles = [];
|
||||||
obj.bodyUploadIds = [];
|
obj.bodyUploadIds = [];
|
||||||
if (runData) {
|
if (runData) {
|
||||||
if (runData instanceof Array) {
|
if (runData instanceof Array) {
|
||||||
runData.forEach(request => {
|
runData.forEach(request => {
|
||||||
_getBodyUploadFiles(request, bodyUploadFiles, obj);
|
_getBodyUploadFiles(request, bodyUploadFiles, obj);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
_getBodyUploadFiles(runData, bodyUploadFiles, obj);
|
_getBodyUploadFiles(runData, bodyUploadFiles, obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
return bodyUploadFiles;
|
||||||
return bodyUploadFiles;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function _getBodyUploadFiles(request, bodyUploadFiles, obj) {
|
export function _getBodyUploadFiles(request, bodyUploadFiles, obj) {
|
||||||
let body = null;
|
let body = null;
|
||||||
if (request.hashTree && request.hashTree.length > 0 && request.hashTree[0].body) {
|
if (request.hashTree && request.hashTree.length > 0 && request.hashTree[0].body) {
|
||||||
body = request.hashTree[0].body;
|
body = request.hashTree[0].body;
|
||||||
} else if (request.body) {
|
} else if (request.body) {
|
||||||
body = request.body;
|
body = request.body;
|
||||||
}
|
|
||||||
if (body) {
|
|
||||||
if (body.kvs) {
|
|
||||||
body.kvs.forEach(param => {
|
|
||||||
if (param.files) {
|
|
||||||
param.files.forEach(item => {
|
|
||||||
if (item.file) {
|
|
||||||
if (!item.id) {
|
|
||||||
let fileId = getUUID().substring(0, 12);
|
|
||||||
item.name = item.file.name;
|
|
||||||
item.id = fileId;
|
|
||||||
}
|
|
||||||
obj.bodyUploadIds.push(item.id);
|
|
||||||
bodyUploadFiles.push(item.file);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
if (body.binary) {
|
if (body) {
|
||||||
body.binary.forEach(param => {
|
if (body.kvs) {
|
||||||
if (param.files) {
|
body.kvs.forEach(param => {
|
||||||
param.files.forEach(item => {
|
if (param.files) {
|
||||||
if (item.file) {
|
param.files.forEach(item => {
|
||||||
if (!item.id) {
|
if (item.file) {
|
||||||
let fileId = getUUID().substring(0, 12);
|
if (!item.id) {
|
||||||
item.name = item.file.name;
|
let fileId = getUUID().substring(0, 12);
|
||||||
item.id = fileId;
|
item.name = item.file.name;
|
||||||
}
|
item.id = fileId;
|
||||||
obj.bodyUploadIds.push(item.id);
|
}
|
||||||
bodyUploadFiles.push(item.file);
|
obj.bodyUploadIds.push(item.id);
|
||||||
}
|
bodyUploadFiles.push(item.file);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (body.binary) {
|
||||||
|
body.binary.forEach(param => {
|
||||||
|
if (param.files) {
|
||||||
|
param.files.forEach(item => {
|
||||||
|
if (item.file) {
|
||||||
|
if (!item.id) {
|
||||||
|
let fileId = getUUID().substring(0, 12);
|
||||||
|
item.name = item.file.name;
|
||||||
|
item.id = fileId;
|
||||||
|
}
|
||||||
|
obj.bodyUploadIds.push(item.id);
|
||||||
|
bodyUploadFiles.push(item.file);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function handleCtrlSEvent(event, func) {
|
export function handleCtrlSEvent(event, func) {
|
||||||
if (event.keyCode === 83 && event.ctrlKey) {
|
if (event.keyCode === 83 && event.ctrlKey) {
|
||||||
// console.log('拦截到 ctrl + s');//ctrl+s
|
// console.log('拦截到 ctrl + s');//ctrl+s
|
||||||
func();
|
func();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.returnValue = false;
|
event.returnValue = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function strMapToObj(strMap) {
|
export function strMapToObj(strMap) {
|
||||||
if (strMap) {
|
if (strMap) {
|
||||||
let obj = Object.create(null);
|
let obj = Object.create(null);
|
||||||
for (let [k, v] of strMap) {
|
for (let [k, v] of strMap) {
|
||||||
obj[k] = v;
|
obj[k] = v;
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
}
|
}
|
||||||
return obj;
|
return null;
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function objToStrMap(obj) {
|
export function objToStrMap(obj) {
|
||||||
let strMap = new Map();
|
let strMap = new Map();
|
||||||
for (let k of Object.keys(obj)) {
|
for (let k of Object.keys(obj)) {
|
||||||
strMap.set(k, obj[k]);
|
strMap.set(k, obj[k]);
|
||||||
}
|
}
|
||||||
return strMap;
|
return strMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getColor() {
|
export function getColor() {
|
||||||
return localStorage.getItem('color');
|
return localStorage.getItem('color');
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setColor(a, b, c, d) {
|
export function setColor(a, b, c, d) {
|
||||||
document.body.style.setProperty('--color', a);
|
document.body.style.setProperty('--color', a);
|
||||||
document.body.style.setProperty('--color_shallow', b);
|
document.body.style.setProperty('--color_shallow', b);
|
||||||
document.body.style.setProperty('--count_number', c);
|
document.body.style.setProperty('--count_number', c);
|
||||||
document.body.style.setProperty('--count_number_shallow', d);
|
document.body.style.setProperty('--count_number_shallow', d);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setOriginColor() {
|
export function setOriginColor() {
|
||||||
setColor(ORIGIN_COLOR, ORIGIN_COLOR_SHALLOW, COUNT_NUMBER, COUNT_NUMBER_SHALLOW);
|
setColor(ORIGIN_COLOR, ORIGIN_COLOR_SHALLOW, COUNT_NUMBER, COUNT_NUMBER_SHALLOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function publicKeyEncrypt(input, publicKey) {
|
||||||
|
|
||||||
|
let jsencrypt = new JSEncrypt({default_key_size: 1024});
|
||||||
|
jsencrypt.setPublicKey(publicKey);
|
||||||
|
|
||||||
|
return jsencrypt.encrypt(input);
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {saveLocalStorage} from '@/common/js/utils';
|
import {publicKeyEncrypt, saveLocalStorage} from '@/common/js/utils';
|
||||||
import {DEFAULT_LANGUAGE} from "@/common/js/constants";
|
import {DEFAULT_LANGUAGE} from "@/common/js/constants";
|
||||||
|
|
||||||
const requireComponent = require.context('@/business/components/xpack/', true, /\.vue$/);
|
const requireComponent = require.context('@/business/components/xpack/', true, /\.vue$/);
|
||||||
|
@ -103,6 +103,8 @@ export default {
|
||||||
|
|
||||||
if (!response.data.success) {
|
if (!response.data.success) {
|
||||||
this.ready = true;
|
this.ready = true;
|
||||||
|
// 保存公钥
|
||||||
|
localStorage.setItem("publicKey", response.data.message);
|
||||||
} else {
|
} else {
|
||||||
let user = response.data.data;
|
let user = response.data.data;
|
||||||
saveLocalStorage(response.data);
|
saveLocalStorage(response.data);
|
||||||
|
@ -159,7 +161,15 @@ export default {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
doLogin() {
|
doLogin() {
|
||||||
this.result = this.$post(this.loginUrl, this.form, response => {
|
let publicKey = localStorage.getItem("publicKey");
|
||||||
|
|
||||||
|
let form = {
|
||||||
|
username: publicKeyEncrypt(this.form.username, publicKey),
|
||||||
|
password: publicKeyEncrypt(this.form.password, publicKey),
|
||||||
|
authenticate: this.form.authenticate
|
||||||
|
};
|
||||||
|
|
||||||
|
this.result = this.$post(this.loginUrl, form, response => {
|
||||||
saveLocalStorage(response);
|
saveLocalStorage(response);
|
||||||
sessionStorage.setItem('loginSuccess', 'true');
|
sessionStorage.setItem('loginSuccess', 'true');
|
||||||
this.getLanguage(response.data.language);
|
this.getLanguage(response.data.language);
|
||||||
|
|
Loading…
Reference in New Issue