Compare commits
47 Commits
f874da1011
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 8683252a6b | |||
| 0875ca1055 | |||
| 0f42fd58ae | |||
| b880c8d7ff | |||
| 047f54bfcf | |||
| 569e7bb94e | |||
| 6a650e3389 | |||
| f2038f1bc3 | |||
| f811a20f64 | |||
| 2810e9fbec | |||
| 7cb725895b | |||
| 71749a880c | |||
| dbcea6d985 | |||
| 202bfc6e84 | |||
| 775bddd82c | |||
| f288f15b34 | |||
| f90b99cffd | |||
| 06d87ae670 | |||
| 68d956e96c | |||
| 8051ecbea9 | |||
| 1ac56f3307 | |||
| ac992342bd | |||
| 0286cc354e | |||
| 6df505011a | |||
| bbde0eceec | |||
| 9cc545f219 | |||
| ee0eb342d5 | |||
| 590e9d8838 | |||
| 1d75beab34 | |||
| 366078f4b9 | |||
| 4826c68fb2 | |||
| 54e41876a6 | |||
| 31079a4174 | |||
| 31ba6463ba | |||
| 9e30b4de2f | |||
| dee00e0d5a | |||
| 0b5e0df1e5 | |||
| 4513de73eb | |||
| eb59a4935a | |||
| 2fb79c9d87 | |||
| 589b9c1f30 | |||
| 4061e7b1a0 | |||
| 4d6cb0ec44 | |||
| a5d793a90f | |||
| 5e9a59e173 | |||
| da8ee84613 | |||
| 9450789043 |
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/.idea/
|
||||
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
6
.idea/misc.xml
generated
Normal file
6
.idea/misc.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JavaScriptSettings">
|
||||
<option name="languageLevel" value="ES6" />
|
||||
</component>
|
||||
</project>
|
||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/xin-launcher.iml" filepath="$PROJECT_DIR$/.idea/xin-launcher.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
14
.idea/xin-launcher.iml
generated
Normal file
14
.idea/xin-launcher.iml
generated
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="xin-launcher" level="project" />
|
||||
<orderEntry type="library" name="xin-admin" level="project" />
|
||||
<orderEntry type="library" name="xin-launcher" level="project" />
|
||||
<orderEntry type="library" name="xin-admin" level="project" />
|
||||
<orderEntry type="library" name="xin-launcher" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
83
ReadMe.md
Normal file
83
ReadMe.md
Normal file
@ -0,0 +1,83 @@
|
||||
2023-02-06
|
||||
|
||||
Xin-Laucher包更新后,下载的框架内容初始化登录账号密码已修改
|
||||
旧账号密码: admin/111111
|
||||
新账号密码: admin/CRTECH@2023laucher
|
||||
|
||||
2023-10-09
|
||||
|
||||
Xin-laucher包更新后,需要在配置文件 xin-launcher > conf > XinLauncher.ini 中加上配置 product_version=2.0
|
||||
以上配置实时更新,下载此包时需要查看
|
||||
|
||||
2024-03-06
|
||||
|
||||
Xin-launcher包更新后解决部分服务搭载机器硬盘码获取为空或者切换硬件后对应硬盘编码不一致导致必须重新授权的问题(最新包首次启用时会将对应机器硬盘编码录入注册表)
|
||||
|
||||
2024-08-20
|
||||
|
||||
Xin-Launcher版本更新
|
||||
- 在原有基础上,补充BS/CS信息补充至注册表
|
||||
- XinLauncher.ini文件补充字段 product_group_code 对应授权产品分组标识,为空时不进行拦截,不为空时会拦截相关授权产品信息是否为正确产品分组内容
|
||||
- 优化记录日志信息
|
||||
- 优化返回授权码授权异常信息提示
|
||||
- 建议使用管理员身份启动,避免由于权限原因导致信息写入注册表失败
|
||||
|
||||
2024-09-03
|
||||
|
||||
运行命令更新
|
||||
|
||||
2024-11-20
|
||||
|
||||
XinLauncher.ini文件新增配置项
|
||||
- is_client 该配置为 1 时 标识不加载对应鉴权数据模块 为空或其他值时进行校验
|
||||
- product_group_code 产品分组标识 为空时不进行校验 存在值时将进行产品分组数据信息校验 不一致时鉴权不通过
|
||||
|
||||
|
||||
2024-12-17
|
||||
|
||||
优化本机授权码读取手段
|
||||
- 新增自动生成二维码,允许截图或复制扫码内容(返回结果即为授权码信息)
|
||||
- 初始化及重新授权均补充二维码内容
|
||||
|
||||
2025-01-02
|
||||
|
||||
优化配置过滤处理逻辑
|
||||
|
||||
2025-01-03
|
||||
|
||||
修复配置过滤后重复跳转导致静态资源获取失败的异常
|
||||
|
||||
2025-02-24
|
||||
|
||||
调整授权时对应注册表处理逻辑
|
||||
|
||||
2025-03-03
|
||||
|
||||
根据Cooperop-Mix逻辑调整对应产品加载功能并优化重启处理逻辑
|
||||
|
||||
2025-07-11
|
||||
|
||||
1. 调整授权产品查看界面(补充二维码)
|
||||
2. 调整授权校验(注册表存在必要信息后仅校验运行目录即可)
|
||||
3. 追加 path_key 配置,配置为空时系统启动自动创建随机码并记录
|
||||
|
||||
2025-07-15
|
||||
|
||||
1. 优化全局过滤功能,区分已授权与未授权状态(前者自动跳转登录界面,后者自动跳转授权界面)
|
||||
2. 修复全局过滤功能在项目重启后无法正确处理相应拦截的异常
|
||||
|
||||
2025-09-28
|
||||
|
||||
1. 大版本更新,后续代码版本为3.0
|
||||
2. 注册表存储随机字符串由机械码及下发授权文件决定
|
||||
|
||||
2025-11-17
|
||||
|
||||
1. 修复部分服务器硬件不存在导致每次启动授权码均变化的异常
|
||||
2. 替换TOMCAT版本
|
||||
3. 补充部分日志输出,方便后续比对
|
||||
|
||||
2026-03-02
|
||||
|
||||
1. xinadmin界面新增配置文件读取/设置保存弹窗
|
||||
2. 新增相关工具函数,实现配置文件读取、加密及解密对象获取
|
||||
183
documents/LauncherCommonFunc工具函数释义-202509928.md
Normal file
183
documents/LauncherCommonFunc工具函数释义-202509928.md
Normal file
@ -0,0 +1,183 @@
|
||||
# LauncherCommonFunc工具函数释义
|
||||
|
||||
本文档用于解释新增LauncherCommonFunc工具函数的使用释义,开发使用。
|
||||
本文档书写事件:2025-09-28 对应 xinlauncher_20250928.zip 。
|
||||
|
||||
## 简介
|
||||
|
||||
该类统一了鉴权通用的静态资源(路径、命名规范等)及通用的调用功能函数。
|
||||
|
||||
## 调用函数
|
||||
|
||||
基于外部调用,针对每一个函数进行调用释义。
|
||||
注意:该内容需要跟随版本进行修改,查看文档时请注意是否为对应版本包及文档。
|
||||
|
||||
1. 静态资源
|
||||
|
||||
定义内容以表格信息展示:
|
||||
|
||||
| 资源名称 | 调用 | 调用方式 | 释义 |
|
||||
| --------------------------- | ---- | ------------------------------ | ---------------------- |
|
||||
| BaseBoradSN | Y | LauncherCommonFunc.BaseBoradSN | 主板序列号 |
|
||||
| CpuSN | Y | LauncherCommonFunc.CpuSN | CPU序列号 |
|
||||
| DiskSN | Y | LauncherCommonFunc.DiskSN | 硬盘S/N |
|
||||
| UD | Y | LauncherCommonFunc.UD | 授权唯一UUID |
|
||||
| configFile | N | 不可外部调用 | 系统配置文件 |
|
||||
| cipherFile | Y | LauncherCommonFunc.cipherFile | 机械码文件 |
|
||||
| licenseFile | Y | LauncherCommonFunc.licenseFile | 系统授权文件 |
|
||||
| cipherContent | N | 不可外部调用 | 机械码信息(加密字符串) |
|
||||
| SYSTEM_CUSTOMER_AUTHOR_CODE | N | 不可外部调用 | 系统授权前缀信息 |
|
||||
|
||||
|
||||
|
||||
2. 静态函数
|
||||
|
||||
依次对函数进行释义
|
||||
|
||||
1. 机械码初始化函数
|
||||
|
||||
- 函数名:init
|
||||
|
||||
- 调用:不可外部调用
|
||||
|
||||
- 调用方式:LauncherCommonFunc.init();
|
||||
|
||||
- 基础逻辑:初始化缓存项目所在机械对应主板序列号、CPU序列号及硬盘S/N编码。
|
||||
|
||||
- 入参:无
|
||||
|
||||
- 出参:无
|
||||
|
||||
|
||||
|
||||
2. 获取本机机械码秘钥
|
||||
|
||||
- 函数名:generateKey
|
||||
|
||||
- 调用:不可外部调用
|
||||
|
||||
- 调用方式:LauncherCommonFunc.generateKey();
|
||||
|
||||
- 基础逻辑:获取系统授权文件秘钥信息。
|
||||
|
||||
- 入参:无
|
||||
|
||||
- 出参:无
|
||||
|
||||
|
||||
|
||||
3. 字符串处理编码(BOM)异常
|
||||
|
||||
- 函数名:deleteUTF8Bom
|
||||
|
||||
- 调用:不可外部调用
|
||||
|
||||
- 调用方式:LauncherCommonFunc.deleteUTF8Bom(fileStr);
|
||||
|
||||
- 基础逻辑:将传入字符串去除编码过程中出现的BOM异常。
|
||||
|
||||
- 入参:
|
||||
|
||||
| 字段 | 类型 | 释义 |
|
||||
| ------- | ------ | ---------- |
|
||||
| fileStr | String | 文件字符串 |
|
||||
|
||||
|
||||
|
||||
- 出参:去除异常后的字符串
|
||||
|
||||
|
||||
|
||||
4. 获取缓存授权码内容
|
||||
|
||||
- 函数名:getCode
|
||||
|
||||
- 调用:可外部调用
|
||||
|
||||
- 调用方式:LauncherCommonFunc.getCode();
|
||||
|
||||
- 基础逻辑:获取缓存授权码内容。
|
||||
|
||||
- 入参:无
|
||||
|
||||
- 出参:无
|
||||
|
||||
|
||||
|
||||
5. 设置机械码缓存授权码信息
|
||||
|
||||
- 函数名:setCode
|
||||
|
||||
- 调用:不可外部调用
|
||||
|
||||
- 调用方式:LauncherCommonFunc.setCode(content);
|
||||
|
||||
- 基础逻辑:设置机械码缓存授权码信息。
|
||||
|
||||
- 入参:
|
||||
|
||||
| 字段 | 类型 | 释义 |
|
||||
| ------- | ------ | ------------------------ |
|
||||
| content | String | 系统机械码加密字符串信息 |
|
||||
|
||||
|
||||
|
||||
- 出参:无
|
||||
|
||||
|
||||
|
||||
6. 获取授权随机加密地址
|
||||
|
||||
- 函数名:getPathKey
|
||||
|
||||
- 调用:不可外部调用
|
||||
|
||||
- 调用方式:LauncherCommonFunc.getPathKey(text);
|
||||
|
||||
- 基础逻辑:根据传入随机码(生成机械码时会自动创建),获取注册表定义地址信息。
|
||||
|
||||
- 入参:
|
||||
|
||||
| 字段 | 类型 | 释义 |
|
||||
| ---- | ------ | ---------------- |
|
||||
| text | String | 系统机械码随机码 |
|
||||
|
||||
|
||||
|
||||
- 出参:返回加密结果字符串
|
||||
|
||||
|
||||
|
||||
7. 生成系统机械码文件
|
||||
|
||||
- 函数名:generateCipher
|
||||
|
||||
- 调用:可外部调用
|
||||
|
||||
- 调用方式:LauncherCommonFunc.generateCipher();
|
||||
|
||||
- 基础逻辑:初始化生成机械码文件(存储对应服务器的硬件加密信息)。
|
||||
|
||||
- 入参:无
|
||||
|
||||
- 出参:无
|
||||
|
||||
|
||||
|
||||
8. 获取本机硬件加密信息
|
||||
|
||||
- 函数名:generateCipherContent
|
||||
|
||||
- 调用:私有函数,不可外部调用
|
||||
|
||||
- 调用方式:无
|
||||
|
||||
- 基础逻辑:生成系统机械码必要信息对象,并转换为字符串信息。
|
||||
|
||||
- 入参:无
|
||||
|
||||
- 出参:返回存储信息JSON字符串
|
||||
|
||||
|
||||
|
||||
|
||||
87
documents/LocalLauncherValid工具函数释义-202509928.md
Normal file
87
documents/LocalLauncherValid工具函数释义-202509928.md
Normal file
@ -0,0 +1,87 @@
|
||||
# LocalLauncherValid工具函数释义
|
||||
|
||||
本文档用于解释新增LocalLauncherValid工具函数的使用释义,开发使用。
|
||||
本文档书写事件:2025-09-28 对应 xinlauncher_20250928.zip 。
|
||||
|
||||
## 简介
|
||||
|
||||
该类统一了内部鉴权相关操作函数。
|
||||
|
||||
## 调用函数
|
||||
|
||||
基于外部调用,针对每一个函数进行调用释义。
|
||||
注意:该内容需要跟随版本进行修改,查看文档时请注意是否为对应版本包及文档。
|
||||
|
||||
1. 静态资源
|
||||
|
||||
无。
|
||||
|
||||
|
||||
|
||||
2. 静态函数
|
||||
|
||||
依次对函数进行释义:
|
||||
|
||||
1. 读取授权码文件内容
|
||||
|
||||
- 函数名:loadCipher
|
||||
|
||||
- 调用:可外部调用
|
||||
|
||||
- 调用方式:LocalLauncherValid.loadCipher();
|
||||
|
||||
- 基础逻辑:读取授权文件对应字符串。
|
||||
|
||||
- 入参:无
|
||||
|
||||
- 出参:返回授权文件字符串信息。
|
||||
|
||||
|
||||
|
||||
2. 验证授权文件
|
||||
|
||||
- 函数名:valid
|
||||
|
||||
- 调用:私有函数,不可外部调用
|
||||
|
||||
- 调用方式:无;
|
||||
|
||||
- 基础逻辑:校验系统授权文件,为空或鉴权失败时,清除已有文件并重新生成机械码信息。
|
||||
|
||||
- 入参:无
|
||||
|
||||
- 出参:无
|
||||
|
||||
|
||||
|
||||
3. 验证系统信息
|
||||
|
||||
- 函数名:validCipher
|
||||
|
||||
- 调用:私有函数,不可外部调用
|
||||
|
||||
- 调用方式:无
|
||||
|
||||
- 基础逻辑:获取存储在机械码文件中的加密字符串信息,比对机械实际硬件信息,对照失败时,重新生成并删除已有授权文件。
|
||||
|
||||
- 入参:无
|
||||
|
||||
- 出参:无
|
||||
|
||||
|
||||
|
||||
4. 解码校验系统信息
|
||||
|
||||
- 函数名:validCipher
|
||||
|
||||
- 调用:私有函数,不可外部调用
|
||||
|
||||
- 调用方式:无
|
||||
|
||||
- 基础逻辑:解密传入的机械码加密字符串,比对机械实际硬件信息,对照失败时,重新生成并删除已有授权文件。
|
||||
|
||||
- 入参:无
|
||||
|
||||
- 出参:无
|
||||
|
||||
|
||||
65
documents/XinadminLauncherValid工具函数释义-202509928.md
Normal file
65
documents/XinadminLauncherValid工具函数释义-202509928.md
Normal file
@ -0,0 +1,65 @@
|
||||
# XinAdminLauncherValid工具函数释义
|
||||
|
||||
本文档用于解释新增XinAdminLauncherValid工具函数的使用释义,开发使用。
|
||||
本文档书写事件:2025-09-28 对应 xinlauncher_20250928.zip 。
|
||||
|
||||
## 简介
|
||||
|
||||
该类统一了外部鉴权相关操作函数。
|
||||
|
||||
## 调用函数
|
||||
|
||||
基于外部调用,针对每一个函数进行调用释义。
|
||||
注意:该内容需要跟随版本进行修改,查看文档时请注意是否为对应版本包及文档。
|
||||
|
||||
1. 静态资源
|
||||
|
||||
无。
|
||||
|
||||
|
||||
|
||||
2. 静态函数
|
||||
|
||||
依次对函数进行释义:
|
||||
|
||||
1. 读取授权码文件内容
|
||||
|
||||
- 函数名:validCipher
|
||||
|
||||
- 调用:
|
||||
|
||||
- 调用方式:XinAdminLauncherValid.validCipher(licenseContent,uploadFile);
|
||||
|
||||
- 基础逻辑:解码授权文件信息,校验系统硬件信息。
|
||||
|
||||
- 入参:
|
||||
|
||||
| 字段 | 类型 | 释义 |
|
||||
| -------------- | ------- | -------------- |
|
||||
| licenseContent | String | 授权文件字符串 |
|
||||
| uploadFile | boolean | 是否为上传文件 |
|
||||
|
||||
- 出参:返回校验结果。
|
||||
|
||||
|
||||
|
||||
2. 验证授权文件
|
||||
|
||||
- 函数名:validMachineInfo
|
||||
|
||||
- 调用:可外部调用
|
||||
|
||||
- 调用方式:XinAdminLauncherValid.validMachineInfo(licenseContent);
|
||||
|
||||
- 基础逻辑:解码授权文件信息,比对机械码存储信息。
|
||||
|
||||
- 入参:
|
||||
|
||||
| 字段 | 类型 | 释义 |
|
||||
| -------------- | ------ | -------------- |
|
||||
| licenseContent | String | 授权文件字符串 |
|
||||
|
||||
- 出参:无
|
||||
|
||||
|
||||
|
||||
BIN
xin-launcher.zip
BIN
xin-launcher.zip
Binary file not shown.
Binary file not shown.
@ -1,4 +1,4 @@
|
||||
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
|
||||
<%@ page contentType="text/html;charset=UTF-8" %>
|
||||
<head>
|
||||
<title>X·in管理端 - 修改密码</title>
|
||||
<script type="text/javascript" src="themes/js/vue.min.js"></script>
|
||||
@ -8,18 +8,19 @@
|
||||
<script type="text/javascript" src="themes/js/moment.js"></script>
|
||||
<link rel="stylesheet" href="themes/css/index.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<style>
|
||||
.header{
|
||||
.header {
|
||||
height: 60px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.header .logo{
|
||||
.header .logo {
|
||||
height: 60px;
|
||||
width: 260px;
|
||||
}
|
||||
|
||||
.header .logo-image{
|
||||
.header .logo-image {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
background-repeat: no-repeat;
|
||||
@ -27,30 +28,10 @@
|
||||
background-size: 90%;
|
||||
background-image: url('themes/img/xin.png');
|
||||
}
|
||||
.el-form{
|
||||
width: 480px;
|
||||
margin: auto;
|
||||
margin-top: 40px;
|
||||
}
|
||||
.admin {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border: 1px solid #DCDFE6;
|
||||
background-color: #fff;
|
||||
border-radius: 4px;
|
||||
height: 40px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.iconinfo {
|
||||
display: block;
|
||||
width: 40px;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #999;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
.el-form {
|
||||
width: 480px;
|
||||
margin: 40px auto auto;
|
||||
}
|
||||
|
||||
#app {
|
||||
@ -72,7 +53,8 @@
|
||||
width: 80%;
|
||||
margin: 40px auto;
|
||||
}
|
||||
.title{
|
||||
|
||||
.title {
|
||||
height: 60px;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
@ -81,12 +63,13 @@
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.system {
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
|
||||
<body>
|
||||
<div id="app">
|
||||
<div class="header">
|
||||
@ -100,13 +83,16 @@
|
||||
</div>
|
||||
<el-form :model="from" id="passLogin" :rules="rules" ref="user" label-width="80px" @keyup.enter.native="login">
|
||||
<el-form-item label="原密码" class="demo-dynamic" prop="pass">
|
||||
<el-input v-model="from.pass" size="small" placeholder="请输入原密码" type="password" show-password ></el-input>
|
||||
<el-input v-model="from.pass" size="small" placeholder="请输入原密码" type="password"
|
||||
show-password></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="新密码" class="demo-dynamic" prop="editpass">
|
||||
<el-input size="small" v-model="from.editpass" placeholder="请输入要修改的密码" type="password" show-password></el-input>
|
||||
<el-form-item label="新密码" class="demo-dynamic" prop="editPass">
|
||||
<el-input size="small" v-model="from.editPass" placeholder="请输入要修改的密码" type="password"
|
||||
show-password></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="确认密码" class="demo-dynamic" prop="checkpass">
|
||||
<el-input size="small" v-model="from.checkpass" placeholder="请确认改改的密码" type="password" show-password></el-input>
|
||||
<el-form-item label="确认密码" class="demo-dynamic" prop="checkPass">
|
||||
<el-input size="small" v-model="from.checkPass" placeholder="请确认改改的密码" type="password"
|
||||
show-password></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<div style="text-align: center;">
|
||||
@ -117,58 +103,85 @@
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: '#app',
|
||||
data() {
|
||||
return {
|
||||
from: {
|
||||
pass: '',
|
||||
editpass:'',
|
||||
checkpass:''
|
||||
},
|
||||
rules: {
|
||||
pass: [
|
||||
{required: true, message: '请输入原密码', trigger: 'blur'},
|
||||
],
|
||||
editpass: [
|
||||
{required: true, message: '请输入要修改的密码', trigger: 'blur'},
|
||||
],
|
||||
checkpass: [
|
||||
{required: true, message: '请确认改改的密码', trigger: 'blur'},
|
||||
],
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
edit(user) {
|
||||
this.$refs[user].validate((valid) => {
|
||||
if(valid){
|
||||
if(this.from.editpass == this.from.checkpass){
|
||||
const that = this;
|
||||
axios.post('/xinadmin/edit', this.from,{
|
||||
headers: {
|
||||
'token': sessionStorage.getItem("token")
|
||||
}
|
||||
}).then(function (res) {
|
||||
console.log(res)
|
||||
if (res.data.state == "success") {
|
||||
that.$message.success('修改成功');
|
||||
setTimeout(()=>{ //设置延迟执行
|
||||
location.href = "login.jsp";
|
||||
},2000);
|
||||
}else{
|
||||
that.$message.error("密码错误");
|
||||
}
|
||||
}).catch(function (error) {
|
||||
console.log(error)
|
||||
})
|
||||
}else{
|
||||
this.$message.error("两次密码不一致")
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
new Vue({
|
||||
el: '#app',
|
||||
data() {
|
||||
const validatePass = (rule, value, callback) => {
|
||||
if (value === '') {
|
||||
callback(new Error('请输入密码'));
|
||||
} else {
|
||||
if (this.from.checkPass !== '') {
|
||||
this.$refs.user.validateField('checkPass');
|
||||
}
|
||||
callback();
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
const validatePass2 = (rule, value, callback) => {
|
||||
if (value === '') {
|
||||
callback(new Error('请再次输入密码'));
|
||||
} else if (value !== this.from.editPass) {
|
||||
callback(new Error('两次输入密码不一致!'));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
from: {
|
||||
pass: '',
|
||||
editPass: '',
|
||||
checkPass: ''
|
||||
},
|
||||
rules: {
|
||||
pass: [
|
||||
{required: true, message: '请输入原密码', trigger: 'blur'},
|
||||
],
|
||||
editPass: [
|
||||
{required: true, message: '请输入要修改的密码', trigger: 'blur'},
|
||||
{
|
||||
pattern: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,16}$/g,
|
||||
message: '密码必须包含大小写字母及数字,允许特殊字符,长度6-16'
|
||||
},
|
||||
{validator: validatePass, trigger: 'blur'}
|
||||
],
|
||||
checkPass: [
|
||||
{required: true, message: '请再次输入修改的密码', trigger: 'blur'},
|
||||
{validator: validatePass2, trigger: 'blur'}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
edit(user) {
|
||||
this.$refs[user].validate((valid) => {
|
||||
if (valid) {
|
||||
if (this.from.editPass === this.from.checkPass) {
|
||||
const that = this;
|
||||
axios.post('/xinadmin/edit', this.from, {
|
||||
headers: {
|
||||
'token': sessionStorage.getItem("token")
|
||||
}
|
||||
}).then(function (res) {
|
||||
if (res.data.state === "success") {
|
||||
that.$message.success('修改成功');
|
||||
setTimeout(() => { //设置延迟执行
|
||||
location.href = "login.jsp";
|
||||
}, 2000);
|
||||
} else {
|
||||
that.$message.error(res.data.mes??"密码错误");
|
||||
}
|
||||
}).catch(function (error) {
|
||||
console.log(error)
|
||||
})
|
||||
} else {
|
||||
this.$message.error("两次密码不一致")
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
|
||||
<%@ page contentType="text/html;charset=UTF-8" %>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns:th="http://www.thymeleaf.org">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>授权中心</title>
|
||||
@ -8,47 +8,72 @@
|
||||
<script type="text/javascript" src="themes/js/index.js"></script>
|
||||
<script type="text/javascript" src="themes/js/axios.min.js"></script>
|
||||
<script type="text/javascript" src="themes/js/jquery.js"></script>
|
||||
<script type="text/javascript" src="themes/js/jquery.qrcode.min.js"></script>
|
||||
<script type="text/javascript" src="themes/js/moment.js"></script>
|
||||
<link rel="stylesheet" href="themes/css/index.css" type="text/css">
|
||||
<link rel="stylesheet" href="themes/css/main.css" type="text/css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="app">
|
||||
<div class="header">
|
||||
<div class="logo">
|
||||
<div class="logo" style="float: left">
|
||||
<div class="logo-image"></div>
|
||||
</div>
|
||||
|
||||
<div style="float: right;margin-right: 20px;margin-top: 15px;">
|
||||
<el-button type="primary" @click="openShow">修改密码</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-main">
|
||||
<div class="main">
|
||||
<div class="top">
|
||||
<div class="labe">授权企业详情</div>
|
||||
</div>
|
||||
|
||||
<div class="company">
|
||||
<div class="company-det">
|
||||
|
||||
<div class="company-lint">
|
||||
<div class="company-name">
|
||||
<div class="company-logo">
|
||||
<img src="http://www.crtech.cn/images/logo.png">
|
||||
<img src="themes/img/logo.png" alt="超然X-in智慧管理平台">
|
||||
</div>
|
||||
<div style="margin-left: 20px;">{{single.company.name}}</div>
|
||||
<div style="margin-left: 20px;">{{companyName}}</div>
|
||||
</div>
|
||||
|
||||
<div style="margin: 10px;">
|
||||
<div class="address">地址:{{single.company.address}}</div>
|
||||
<div class="des">简介:{{single.company.introduce}}</div>
|
||||
<div class="des">授权码:<span style="color: green">已生成</span> <span><el-link
|
||||
type="primary" :underline="false"
|
||||
style=" font-size: 12px;margin-left: 8px;" @click="dialogCodeVisible = true">查看</el-link></span></div>
|
||||
<div class="des">授权文件:<span style="color: green">正常</span>
|
||||
<div class="address">地址:{{companyAddress}}</div>
|
||||
<div class="des">简介:{{companyIntroduce}}</div>
|
||||
<div class="des">授权码:
|
||||
<span style="color: green">已生成</span>
|
||||
<span>
|
||||
<el-link type="primary" :underline="false" style=" font-size: 12px;margin-left: 8px;" @click="dialogTableVisible = true">更换授权文件</el-link></span></div>
|
||||
<el-link type="primary" :underline="false"
|
||||
style=" font-size: 12px;margin-left: 8px;"
|
||||
@click="toSeeCode">查看</el-link>
|
||||
</span>
|
||||
</div>
|
||||
<div class="des">授权文件:
|
||||
<span style="color: green">正常</span>
|
||||
<span>
|
||||
<el-link type="primary" :underline="false" style="font-size: 12px;margin-left: 8px;"
|
||||
@click="openUploadLicense">
|
||||
更换授权文件
|
||||
</el-link>
|
||||
</span>
|
||||
</div>
|
||||
<div class="des">配置文件
|
||||
<el-link type="primary" :underline="false"
|
||||
style="font-size: 12px;margin-left: 8px;" @click="openConfigSet">设置
|
||||
</el-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-main">
|
||||
<div class="main">
|
||||
<div class="top">
|
||||
@ -56,36 +81,79 @@
|
||||
</div>
|
||||
<div class="pubg">
|
||||
<div class="applist">
|
||||
<div class="app" v-for="(item,i) in single.applist">
|
||||
<div class="app" v-for="(item,i) in single.appList" @click="showDetail(item)">
|
||||
<div class="app-det">
|
||||
<img :src="item.logo ? item.logo : 'themes/img/mk.png'">
|
||||
<img :src="item.logo ? item.logo : 'themes/img/mk.png'" :alt="item.name">
|
||||
</div>
|
||||
<div class="app-name">{{item.name}}</div>
|
||||
<div class="app-des">版本:{{item.version}}</div>
|
||||
<div class="app-license">{{item.grade == 'custom' ? '定制授权' : item.gradeName}}</div>
|
||||
<div class="app-time" style="color: green" v-if="new Date().getTime() < new Date(item.expiryTime).getTime()"> {{item.expiryTime | dateFilter('YYYY-MM-DD')}}到期</div>
|
||||
<div class="app-time" style="color: green"
|
||||
v-if="new Date().getTime() < new Date(item.expiryTime).getTime()">
|
||||
{{item.expiryTime | dateFilter('YYYY-MM-DD')}}到期
|
||||
</div>
|
||||
<div v-else style="color: red">已过期</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<el-dialog title="授权码" :visible.sync="dialogCodeVisible">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>本机授权码</span>
|
||||
<el-button style="float: right; padding: 3px 0;" icon="el-icon-document-copy" @click="copy()" type="text">复制授权码</el-button>
|
||||
</div>
|
||||
|
||||
<el-dialog title="修改密码" :visible.sync="showPassChange" width="500px" @close="closeShow"
|
||||
:close-on-click-modal="false">
|
||||
<el-form :model="from" id="passLogin" :rules="rules" ref="user"
|
||||
label-width="80px" @keyup.enter.native="login">
|
||||
<el-form-item label="原密码" class="demo-dynamic" prop="pass">
|
||||
<el-input v-model="from.pass" size="small" placeholder="请输入原密码" type="password"
|
||||
show-password clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="新密码" class="demo-dynamic" prop="editPass">
|
||||
<el-input size="small" v-model="from.editPass" placeholder="请输入要修改的密码" type="password"
|
||||
show-password clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="确认密码" class="demo-dynamic" prop="checkPass">
|
||||
<el-input size="small" v-model="from.checkPass" placeholder="请确认改改的密码" type="password"
|
||||
show-password clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<div style="text-align: center;">
|
||||
<el-button @click="closeShow">取 消</el-button>
|
||||
|
||||
<el-button type="primary" @click="edit('user')">确认修改</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog title="授权码" :visible.sync="dialogCodeVisible" :close-on-click-modal="false">
|
||||
<div class="demo-input-suffix">
|
||||
<el-input type="textarea" ref="copy" autosize="true" v-model="single.code" resize="none" readonly="true"></el-input>
|
||||
<div style="display: flex;margin-top: 10px;">
|
||||
<div style="display: flex;width: 200px;">
|
||||
<div id="qrcode" style="width:200px;height: 200px;"></div>
|
||||
</div>
|
||||
|
||||
<el-input type="textarea" ref="copy" autosize="true" v-model="single.code" resize="none"
|
||||
readonly="true" :autosize="{ minRows: 9, maxRows: 10}"
|
||||
style="flex:1;margin-left: 10px"></el-input>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="padding:10px;display: block">
|
||||
<el-button style="float: right; " icon="el-icon-document-copy" @click="copy()"
|
||||
type="text">
|
||||
复制授权码
|
||||
</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
<el-dialog title="授权文件修改" :visible.sync="dialogTableVisible">
|
||||
|
||||
<el-dialog title="授权文件修改" :visible.sync="dialogTableVisible" :close-on-click-modal="false">
|
||||
<div slot="header">
|
||||
<span>上传授权文件</span>
|
||||
</div>
|
||||
<span class="tip"></span>
|
||||
<div align="center">
|
||||
<el-upload class="upload-demo" accept enctype="multipart/form-data" drag action="/xinadmin/upload" multiple="false" show-file-list="false"
|
||||
<el-upload class="upload-demo" accept enctype="multipart/form-data" drag action="/xinadmin/upload"
|
||||
multiple="false" show-file-list="false"
|
||||
drag="true" auto-upload="true" limit="1" :on-success="Success">
|
||||
<i class="el-icon-upload" style="height: 10px;"></i>
|
||||
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
|
||||
@ -93,18 +161,136 @@
|
||||
</el-upload>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog :title="rightDialogTitle" :modal-append-to-body="true" :visible.sync="rightDialogVisible"
|
||||
:close-on-click-modal="false" :close-on-press-escape="false" @close="closeDetail">
|
||||
<div style="max-height: 500px;overflow-y: auto">
|
||||
<el-table :data="tableData" size="mini" row-key="code" ref="tableData" border>
|
||||
<el-table-column prop="description" label="权限"></el-table-column>
|
||||
<el-table-column prop="value" label="参数"></el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog title="系统配置文件设置" :visible.sync="configSetVis" :close-on-click-modal="false">
|
||||
<el-row style="margin-top: -20px;margin-bottom: 10px;" :gutter="10">
|
||||
<el-col :span="8">
|
||||
<el-input v-model="configSetPath" placeholder="手动输入文件路径,例如:C:\test.txt"></el-input>
|
||||
</el-col>
|
||||
<el-col :span="16">
|
||||
<el-button @click="readFileInfo" :loading="readBtnLoad">读取配置</el-button>
|
||||
<el-button @click="keepFileInfo" :disabled="!apiReadFile" :loading="keepBtnLoad">保存配置</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-input type="textarea" :disabled="!apiReadFile" :autosize="{ minRows: 20, maxRows: 20}"
|
||||
v-model="configSetValue" v-loading="readBtnLoad"></el-input>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function generateQRCode(rendermethod, picwidth, picheight, url) {
|
||||
$("#qrcode").qrcode({
|
||||
render: rendermethod, // 渲染方式有table方式(IE兼容)和canvas方式
|
||||
width: picwidth, //宽度
|
||||
height: picheight, //高度
|
||||
text: utf16to8(url), //内容
|
||||
typeNumber: -1,//计算模式
|
||||
correctLevel: 2,//二维码纠错级别
|
||||
background: "#ffffff",//背景颜色
|
||||
foreground: "#000000" //二维码颜色
|
||||
});
|
||||
}
|
||||
|
||||
//中文编码格式转换
|
||||
function utf16to8(str) {
|
||||
var out, i, len, c;
|
||||
out = "";
|
||||
len = str.length;
|
||||
for (i = 0; i < len; i++) {
|
||||
c = str.charCodeAt(i);
|
||||
if ((c >= 0x0001) && (c <= 0x007F)) {
|
||||
out += str.charAt(i);
|
||||
} else if (c > 0x07FF) {
|
||||
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
|
||||
} else {
|
||||
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
Vue.filter("dateFilter", function (date, formatPattern) {
|
||||
return moment(date).format(formatPattern || "YYYY-MM-DD HH:mm:ss");
|
||||
});
|
||||
new Vue({
|
||||
|
||||
const home = new Vue({
|
||||
el: '#app',
|
||||
data() {
|
||||
const validatePass = (rule, value, callback) => {
|
||||
if (value === '') {
|
||||
callback(new Error('请输入密码'));
|
||||
} else {
|
||||
if (this.from.checkPass !== '') {
|
||||
this.$refs.user.validateField('checkPass');
|
||||
}
|
||||
callback();
|
||||
}
|
||||
};
|
||||
|
||||
const validatePass2 = (rule, value, callback) => {
|
||||
if (value === '') {
|
||||
callback(new Error('请再次输入密码'));
|
||||
} else if (value !== this.from.editPass) {
|
||||
callback(new Error('两次输入密码不一致!'));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
single: {},
|
||||
single: [],
|
||||
dialogCodeVisible: false,
|
||||
dialogTableVisible: false
|
||||
dialogTableVisible: false,
|
||||
rightDialogVisible: false,
|
||||
rightDialogTitle: '',
|
||||
tableData: [],
|
||||
companyName: '',
|
||||
companyAddress: '',
|
||||
companyIntroduce: '',
|
||||
showPassChange: false,
|
||||
from: {
|
||||
pass: '',
|
||||
editPass: '',
|
||||
checkPass: ''
|
||||
},
|
||||
rules: {
|
||||
pass: [
|
||||
{required: true, message: '请输入原密码', trigger: 'blur'},
|
||||
],
|
||||
editPass: [
|
||||
{required: true, message: '请输入要修改的密码', trigger: 'blur'},
|
||||
{
|
||||
pattern: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,16}$/g,
|
||||
message: '密码必须包含大小写字母及数字,允许特殊字符,长度6-16'
|
||||
},
|
||||
{validator: validatePass, trigger: 'blur'}
|
||||
],
|
||||
checkPass: [
|
||||
{required: true, message: '请再次输入修改的密码', trigger: 'blur'},
|
||||
{validator: validatePass2, trigger: 'blur'}
|
||||
]
|
||||
},
|
||||
generalQrCode: false,
|
||||
configSetVis: false,
|
||||
configSetPath: 'C:\\Users\\tiany\\Desktop\\tets\\datasource.xml',
|
||||
apiReadFile: false,
|
||||
configSetValue: '',
|
||||
readBtnLoad: false,
|
||||
keepBtnLoad: false,
|
||||
}
|
||||
},
|
||||
created: function () {
|
||||
@ -113,18 +299,16 @@
|
||||
},
|
||||
//绑定方法
|
||||
methods: {
|
||||
copy() {
|
||||
this.$refs.copy.select()
|
||||
document.execCommand('Copy')
|
||||
this.$message.success('已复制到剪贴板')
|
||||
},
|
||||
singlecode() {
|
||||
const that = this;
|
||||
axios.get('/xinadmin/single', {}).then(function (res) {
|
||||
if (res.data) {
|
||||
if(res.data.license){
|
||||
if (res.data.license) {
|
||||
that.single = res.data;
|
||||
}else{
|
||||
that.companyName = res.data.company.name;
|
||||
that.companyAddress = res.data.company.address;
|
||||
that.companyIntroduce = res.data.company.introduce;
|
||||
} else {
|
||||
location.href = "index.jsp"
|
||||
}
|
||||
}
|
||||
@ -132,26 +316,31 @@
|
||||
console.log(error)
|
||||
})
|
||||
},
|
||||
uploadfile() {
|
||||
this.$refs.upload.submit()
|
||||
},
|
||||
checkLogin(){
|
||||
checkLogin() {
|
||||
const token = sessionStorage.getItem("token");
|
||||
if(token == null){
|
||||
if (token == null) {
|
||||
location.href = "login.jsp"
|
||||
}else{
|
||||
} else {
|
||||
const str = new Date().getTime()
|
||||
if((+token + (2*60*60*1000) < str)){
|
||||
if ((+token + (2 * 60 * 60 * 1000) < str)) {
|
||||
location.href = "login.jsp"
|
||||
}
|
||||
}
|
||||
},
|
||||
Success(response, file, fileList) {
|
||||
if(response.state == "success"){
|
||||
copy() {
|
||||
this.$refs.copy.select()
|
||||
document.execCommand('Copy')
|
||||
this.$message.success('已复制到剪贴板')
|
||||
},
|
||||
uploadfile() {
|
||||
this.$refs.upload.submit()
|
||||
},
|
||||
Success(response) {
|
||||
if (response.state === "success") {
|
||||
this.dialogTableVisible = false;
|
||||
this.$notify({
|
||||
title: '成功',
|
||||
duration:2000,
|
||||
duration: 2000,
|
||||
message: '校验通过',
|
||||
type: 'success'
|
||||
});
|
||||
@ -161,10 +350,10 @@
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
axios.get('/xinadmin/adminstarter', {}).then(function (res) {
|
||||
axios.get('/xinadmin/adminstarter', {}).then(function () {
|
||||
that.$notify({
|
||||
title: '重启中',
|
||||
duration:2000,
|
||||
duration: 2000,
|
||||
message: '正在重启相关应用,请稍侯....',
|
||||
type: 'info'
|
||||
});
|
||||
@ -177,18 +366,149 @@
|
||||
}).catch(() => {
|
||||
that.$notify({
|
||||
title: '警告',
|
||||
duration:2000,
|
||||
duration: 2000,
|
||||
message: '应用尚未重启,授权尚未生效,请稍后手动重启',
|
||||
type: 'warning'
|
||||
});
|
||||
});
|
||||
}else{
|
||||
} else {
|
||||
this.$notify.error({
|
||||
title: '上传失败',
|
||||
message: response.error
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
showDetail(item) {
|
||||
this.rightDialogVisible = true;
|
||||
this.rightDialogTitle = item.name + "授权参数详情";
|
||||
let ary = [];
|
||||
let data = item.params;
|
||||
if (data != null) {
|
||||
for (let i in data) {
|
||||
let desc = data[i].name;
|
||||
let value = data[i].value;
|
||||
let valueType = data[i].valueType;
|
||||
|
||||
if (valueType === "number") {
|
||||
if (value === -1)
|
||||
value = "未限制数量";
|
||||
else
|
||||
value = "当前允许最大数量为: " + value + " , 请勿超出限制";
|
||||
} else if (valueType === "boolean") {
|
||||
if (value === data[i].falseDefault)
|
||||
value = "未拥有此功能(或权限)";
|
||||
else if (value === data[i].trueDefault)
|
||||
value = "已拥有此功能(或权限)";
|
||||
}
|
||||
|
||||
let param = {
|
||||
code: i,
|
||||
description: desc,
|
||||
value: value,
|
||||
};
|
||||
ary.push(param);
|
||||
}
|
||||
}
|
||||
this.tableData = ary;
|
||||
},
|
||||
closeDetail() {
|
||||
this.rightDialogVisible = false;
|
||||
this.rightDialogTitle = '';
|
||||
this.tableData = [];
|
||||
},
|
||||
openShow() {
|
||||
this.showPassChange = true;
|
||||
},
|
||||
closeShow() {
|
||||
this.form = {
|
||||
pass: '',
|
||||
editPass: '',
|
||||
checkPass: ''
|
||||
}
|
||||
this.showPassChange = false
|
||||
},
|
||||
edit(user) {
|
||||
this.$refs[user].validate((valid) => {
|
||||
if (valid) {
|
||||
if (this.from.editPass === this.from.checkPass) {
|
||||
const that = this;
|
||||
axios.post('/xinadmin/edit', this.from, {
|
||||
headers: {
|
||||
'token': sessionStorage.getItem("token")
|
||||
}
|
||||
}).then(function (res) {
|
||||
if (res.data.state === "success") {
|
||||
that.$message.success('修改成功');
|
||||
setTimeout(() => { //设置延迟执行
|
||||
location.href = "login.jsp";
|
||||
}, 2000);
|
||||
} else {
|
||||
that.$message.error(res.data.mes ?? "密码错误");
|
||||
}
|
||||
}).catch(function (error) {
|
||||
console.log(error)
|
||||
})
|
||||
} else {
|
||||
this.$message.error("两次密码不一致")
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
toSeeCode() {
|
||||
this.dialogCodeVisible = true
|
||||
if (!this.generalQrCode) {
|
||||
setTimeout(() => {
|
||||
generateQRCode("table", 200, 200, this.single.code);
|
||||
this.generalQrCode = true;
|
||||
}, 100)
|
||||
}
|
||||
},
|
||||
openUploadLicense() {
|
||||
this.dialogTableVisible = true;
|
||||
},
|
||||
openConfigSet() {
|
||||
const that = this;
|
||||
that.configSetVis = true;
|
||||
},
|
||||
closeConfigSet() {
|
||||
const that = this;
|
||||
that.configSetVis = false;
|
||||
},
|
||||
readFileInfo() {
|
||||
const that = this;
|
||||
that.configSetValue = '';
|
||||
that.apiReadFile = false;
|
||||
const params = {filePath: that.configSetPath}
|
||||
that.readBtnLoad = true;
|
||||
axios.post('/xinadmin/readConfigFile', params).then(function (res) {
|
||||
if (res.status === 200) {
|
||||
that.configSetValue = res.data.data;
|
||||
that.apiReadFile = true;
|
||||
} else {
|
||||
that.$message.error(res.data.mes);
|
||||
}
|
||||
}).finally(() => {
|
||||
that.readBtnLoad = false;
|
||||
})
|
||||
},
|
||||
keepFileInfo() {
|
||||
const that = this;
|
||||
const params = {
|
||||
filePath: that.configSetPath,
|
||||
fileContent: that.configSetValue
|
||||
}
|
||||
that.keepBtnLoad = true;
|
||||
axios.post('/xinadmin/keepConfigSetFile', params).then(function (res) {
|
||||
if (res.status === 200) {
|
||||
that.$message.success('保存成功!');
|
||||
that.closeConfigSet();
|
||||
} else {
|
||||
that.$message.error(res.data.mes);
|
||||
}
|
||||
}).finally(() => {
|
||||
that.keepBtnLoad = false;
|
||||
})
|
||||
},
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
@ -1,65 +1,108 @@
|
||||
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
|
||||
<%@ page contentType="text/html;charset=UTF-8" %>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>授权中心</title>
|
||||
<script type="text/javascript" src="themes/js/vue.min.js"></script>
|
||||
<script type="text/javascript" src="themes/js/index.js"></script>
|
||||
<script type="text/javascript" src="themes/js/axios.min.js"></script>
|
||||
<script type="text/javascript" src="themes/js/jquery.js"></script>
|
||||
<script type="text/javascript" src="themes/js/moment.js"></script>
|
||||
<link rel="stylesheet" href="themes/css/index.css" type="text/css">
|
||||
<link rel="stylesheet" href="themes/css/main.css" type="text/css">
|
||||
<meta charset="UTF-8">
|
||||
<title>授权中心</title>
|
||||
<script type="text/javascript" src="themes/js/vue.min.js"></script>
|
||||
<script type="text/javascript" src="themes/js/index.js"></script>
|
||||
<script type="text/javascript" src="themes/js/axios.min.js"></script>
|
||||
<script type="text/javascript" src="themes/js/jquery.js"></script>
|
||||
<script type="text/javascript" src="themes/js/jquery.qrcode.min.js"></script>
|
||||
<script type="text/javascript" src="themes/js/moment.js"></script>
|
||||
<link rel="stylesheet" href="themes/css/index.css" type="text/css">
|
||||
<link rel="stylesheet" href="themes/css/main.css" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app">
|
||||
<div class="header">
|
||||
<div class="logo">
|
||||
<div class="logo-image"></div>
|
||||
<div class="header">
|
||||
<div class="logo">
|
||||
<div class="logo-image"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="no-license">
|
||||
<el-card class="box-card" shadow="never" style="width:640px;margin: 10px auto 0 auto;">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>本机授权码</span>
|
||||
<el-button style="float: right; padding: 3px 0;" icon="el-icon-document-copy" @click="copy()"
|
||||
type="text">复制授权码
|
||||
</el-button>
|
||||
</div>
|
||||
<span class="tip">请联系您的商务经理或客服经理,使用手机扫码并复制扫码结果或直接将下方框体内的本机授权码发送给Ta,以获取授权文件</span>
|
||||
<div class="demo-input-suffix" style="display: flex;">
|
||||
<div id="qrcode" style="width:200px;height: 200px;margin: 10px"></div>
|
||||
|
||||
<el-input type="textarea" ref="copy" autosize="true" v-model="code" resize="none"
|
||||
readonly="true" :autosize="{ minRows: 9, maxRows: 10}"
|
||||
style="margin: 10px"></el-input>
|
||||
</div>
|
||||
</el-card>
|
||||
<el-card class="box-card" shadow="never" style="width:640px;margin: 10px auto 0 auto;">
|
||||
<div slot="header">
|
||||
<span>上传授权文件</span>
|
||||
</div>
|
||||
<span class="tip"></span>
|
||||
<div align="center">
|
||||
<el-upload class="upload-demo" accept enctype="multipart/form-data" drag action="/xinadmin/upload"
|
||||
multiple="false" show-file-list="false"
|
||||
drag="true" auto-upload="true" limit="1" :on-success="Success">
|
||||
<i class="el-icon-upload" style="height: 10px;"></i>
|
||||
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
|
||||
<div class="el-upload__tip" slot="tip">请将您获得的授权文件(LICENSE)传入系统进行校验</div>
|
||||
</el-upload>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</div>
|
||||
<div class="no-license">
|
||||
<el-card class="box-card" shadow="never" style="width:640px;margin: 10px auto 0px auto;">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>本机授权码</span>
|
||||
<el-button style="float: right; padding: 3px 0;" icon="el-icon-document-copy" @click="copy()" type="text">复制授权码</el-button>
|
||||
</div>
|
||||
<span class="tip">请联系您的商务经理或客服经理,并将下方框体内的本机授权码发送给Ta,以获取授权文件</span>
|
||||
<div class="demo-input-suffix">
|
||||
<el-input type="textarea" ref="copy" autosize="true" v-model="code" resize="none" readonly="true"></el-input>
|
||||
</div>
|
||||
</el-card>
|
||||
<el-card class="box-card" shadow="never" style="width:640px;margin: 10px auto 0px auto;">
|
||||
<div slot="header">
|
||||
<span>上传授权文件</span>
|
||||
</div>
|
||||
<span class="tip"></span>
|
||||
<div align="center">
|
||||
<el-upload class="upload-demo" accept enctype="multipart/form-data" drag action="/xinadmin/upload" multiple="false" show-file-list="false"
|
||||
drag="true" auto-upload="true" limit="1" :on-success="Success">
|
||||
<i class="el-icon-upload" style="height: 10px;"></i>
|
||||
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
|
||||
<div class="el-upload__tip" slot="tip">请将您获得的授权文件(LICENSE)传入系统进行校验</div>
|
||||
</el-upload>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function generateQRCode(rendermethod, picwidth, picheight, url) {
|
||||
$("#qrcode").qrcode({
|
||||
render: rendermethod, // 渲染方式有table方式(IE兼容)和canvas方式
|
||||
width: picwidth, //宽度
|
||||
height:picheight, //高度
|
||||
text: utf16to8(url), //内容
|
||||
typeNumber:-1,//计算模式
|
||||
correctLevel:2,//二维码纠错级别
|
||||
background:"#ffffff",//背景颜色
|
||||
foreground:"#000000" //二维码颜色
|
||||
});
|
||||
}
|
||||
|
||||
//中文编码格式转换
|
||||
function utf16to8(str) {
|
||||
var out, i, len, c;
|
||||
out = "";
|
||||
len = str.length;
|
||||
for (i = 0; i < len; i++) {
|
||||
c = str.charCodeAt(i);
|
||||
if ((c >= 0x0001) && (c <= 0x007F)) {
|
||||
out += str.charAt(i);
|
||||
} else if (c > 0x07FF) {
|
||||
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
|
||||
} else {
|
||||
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
Vue.filter("dateFilter", function (date, formatPattern) {
|
||||
return moment(date).format(formatPattern || "YYYY-MM-DD HH:mm:ss");
|
||||
});
|
||||
new Vue({
|
||||
el: '#app',
|
||||
beforeCreate:function(){
|
||||
beforeCreate: function () {
|
||||
const that = this;
|
||||
axios.get('/xinadmin/code', {}).then(function (res) {
|
||||
if (res.data) {
|
||||
if(res.data.license){
|
||||
if (res.data.license) {
|
||||
location.href = "login.jsp"
|
||||
}else{
|
||||
that.code = res.data.code
|
||||
} else {
|
||||
that.code = res.data.code;
|
||||
generateQRCode("table",200, 200, that.code);
|
||||
}
|
||||
|
||||
}
|
||||
}).catch(function (error) {
|
||||
console.log(error)
|
||||
@ -77,23 +120,23 @@
|
||||
document.execCommand('Copy')
|
||||
this.$message.success('已复制到剪贴板')
|
||||
},
|
||||
uploadfile(){
|
||||
uploadFile() {
|
||||
this.$refs.upload.submit()
|
||||
},
|
||||
Success(response, file, fileList) {
|
||||
if(response.state == "success"){
|
||||
Success(response) {
|
||||
if (response.state === "success") {
|
||||
this.dialogTableVisible = false;
|
||||
this.$notify({
|
||||
title: '成功',
|
||||
duration:2000,
|
||||
duration: 2000,
|
||||
message: '上传成功',
|
||||
type: 'success'
|
||||
});
|
||||
const that = this;
|
||||
axios.get('/xinadmin/adminstarter', {}).then(function (res) {
|
||||
axios.get('/xinadmin/adminstarter', {}).then(function () {
|
||||
that.$notify({
|
||||
title: '重启中',
|
||||
duration:2000,
|
||||
duration: 2000,
|
||||
message: '正在重启相关应用,请稍侯....',
|
||||
type: 'info'
|
||||
});
|
||||
@ -104,14 +147,13 @@
|
||||
}).catch(function (error) {
|
||||
console.log(error)
|
||||
})
|
||||
}else{
|
||||
} else {
|
||||
this.$notify.error({
|
||||
title: '上传失败',
|
||||
message: response.error
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
|
||||
<%@ page contentType="text/html;charset=UTF-8" %>
|
||||
<head>
|
||||
<title>X·in管理端</title>
|
||||
<script type="text/javascript" src="themes/js/vue.min.js"></script>
|
||||
@ -9,17 +9,17 @@
|
||||
<link rel="stylesheet" href="themes/css/index.css" type="text/css">
|
||||
</head>
|
||||
<style>
|
||||
.header{
|
||||
.header {
|
||||
height: 60px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.header .logo{
|
||||
.header .logo {
|
||||
height: 60px;
|
||||
width: 260px;
|
||||
}
|
||||
|
||||
.header .logo-image{
|
||||
.header .logo-image {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
background-repeat: no-repeat;
|
||||
@ -27,15 +27,17 @@
|
||||
background-size: 90%;
|
||||
background-image: url('themes/img/xin.png');
|
||||
}
|
||||
.el-form{
|
||||
|
||||
.el-form {
|
||||
width: 480px;
|
||||
margin: auto;
|
||||
margin-top: 40px;
|
||||
margin: 40px auto auto;
|
||||
}
|
||||
|
||||
.el-input__inner {
|
||||
border: 0 !important;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.admin {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@ -46,7 +48,7 @@
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.iconinfo {
|
||||
.iconInfo {
|
||||
display: block;
|
||||
width: 40px;
|
||||
text-align: center;
|
||||
@ -76,7 +78,8 @@
|
||||
width: 80%;
|
||||
margin: 40px auto;
|
||||
}
|
||||
.title{
|
||||
|
||||
.title {
|
||||
height: 60px;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
@ -85,12 +88,13 @@
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.system {
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
|
||||
<body>
|
||||
<div id="app">
|
||||
<div class="header">
|
||||
@ -104,81 +108,80 @@
|
||||
</div>
|
||||
<el-form id="passLogin" ref="user" label-width="80px" @keyup.enter.native="login">
|
||||
<div class="admin">
|
||||
<i class="el-icon-user-solid iconinfo"></i>
|
||||
<i class="el-icon-user-solid iconInfo"></i>
|
||||
<el-input v-model="user.name" ref="name" placeholder="请输入用户名" clearable></el-input>
|
||||
</div>
|
||||
<div class="admin">
|
||||
<i class="el-icon-key iconinfo"></i>
|
||||
<i class="el-icon-key iconInfo"></i>
|
||||
<el-input placeholder="请输入密码" ref="pass" v-model="user.pass" type="password" show-password></el-input>
|
||||
</div>
|
||||
<div class="remenber">
|
||||
<el-checkbox-group>
|
||||
<el-checkbox label="记住密码" name="type"></el-checkbox>
|
||||
</el-checkbox-group>
|
||||
<div>
|
||||
<div>
|
||||
<el-checkbox label="记住密码" name="type" style="float: left"></el-checkbox>
|
||||
<div style="float: left;margin-left: 400px;margin-top: -30px;">
|
||||
<el-button type="text">忘记密码?</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div style="text-align: center;">
|
||||
<div style="margin-top: 10px">
|
||||
<el-button type="primary" style="width: 100%;" @click="login">登陆</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
new Vue({
|
||||
el: '#app',
|
||||
data() {
|
||||
return {
|
||||
user: {
|
||||
name: '',
|
||||
pass:''
|
||||
},
|
||||
}
|
||||
new Vue({
|
||||
el: '#app',
|
||||
data() {
|
||||
return {
|
||||
user: {
|
||||
name: '',
|
||||
pass: ''
|
||||
},
|
||||
created: function () {
|
||||
this.checkLogin();
|
||||
},
|
||||
methods: {
|
||||
login() {
|
||||
if(!this.user.name){
|
||||
this.$message.error("用户名不能为空");
|
||||
this.$refs.name.select()
|
||||
return false;
|
||||
}else if(this.user.pass == ""){
|
||||
this.$refs.pass.select()
|
||||
this.$message.error("密码不能为空");
|
||||
return false;
|
||||
}
|
||||
const that = this;
|
||||
const data = {
|
||||
name:this.user.name,
|
||||
pass:this.user.pass
|
||||
}
|
||||
axios.post('/xinadmin/login', data).then(function (res) {
|
||||
console.log(res.data)
|
||||
if (res.data.state == "success") {
|
||||
sessionStorage.setItem("token",res.data.token);
|
||||
if(res.data.edit == 0){
|
||||
location.href = "editpass.jsp";
|
||||
}else{
|
||||
location.href = "home.jsp";
|
||||
}
|
||||
}else{
|
||||
that.$message.error(res.data.mes);
|
||||
}
|
||||
})
|
||||
},
|
||||
checkLogin(){
|
||||
const token = sessionStorage.getItem("token");
|
||||
const str = new Date().getTime()
|
||||
if(token){
|
||||
if((+token + (2*60*60*1000) > str)){
|
||||
location.href = "home.jsp"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
created: function () {
|
||||
// this.checkLogin();
|
||||
},
|
||||
methods: {
|
||||
login() {
|
||||
if (!this.user.name) {
|
||||
this.$message.error("用户名不能为空");
|
||||
this.$refs.name.select()
|
||||
return false;
|
||||
} else if (this.user.pass === "") {
|
||||
this.$refs.pass.select()
|
||||
this.$message.error("密码不能为空");
|
||||
return false;
|
||||
}
|
||||
})
|
||||
const that = this;
|
||||
const data = {
|
||||
name: this.user.name,
|
||||
pass: this.user.pass
|
||||
}
|
||||
axios.post('/xinadmin/login', data).then(function (res) {
|
||||
console.log(res.data)
|
||||
if (res.data.state === "success") {
|
||||
sessionStorage.setItem("token", res.data.token);
|
||||
if (res.data.edit === 0) {
|
||||
location.href = "editpass.jsp";
|
||||
} else {
|
||||
location.href = "home.jsp";
|
||||
}
|
||||
} else {
|
||||
that.$message.error(res.data.mes??res.data.mes);
|
||||
}
|
||||
})
|
||||
},
|
||||
checkLogin() {
|
||||
const token = sessionStorage.getItem("token");
|
||||
const str = new Date().getTime()
|
||||
if (token) {
|
||||
if ((+token + (2 * 60 * 60 * 1000) > str)) {
|
||||
location.href = "home.jsp"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
@ -86,7 +86,7 @@ body {
|
||||
|
||||
.company-det {
|
||||
padding: 10px;
|
||||
margin: 10px 20px 0px 20px;
|
||||
margin: 10px 20px 0 20px;
|
||||
}
|
||||
|
||||
.company-logo {
|
||||
@ -141,6 +141,7 @@ body {
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 20px 40px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.app-det {
|
||||
@ -181,7 +182,7 @@ body {
|
||||
height: 20px;
|
||||
line-height: 20px;
|
||||
color: #666;
|
||||
text-align: right;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@ -260,3 +261,11 @@ body {
|
||||
.hide{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.keySpan{
|
||||
color: #F56C6C;
|
||||
}
|
||||
|
||||
.notKeySpan{
|
||||
color: #409EFF;
|
||||
}
|
||||
|
||||
28
xin-launcher/apps/xinadmin/themes/js/jquery.qrcode.min.js
vendored
Normal file
28
xin-launcher/apps/xinadmin/themes/js/jquery.qrcode.min.js
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
(function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;d<a.length&&0==a[d];)d++;this.num=Array(a.length-d+c);for(var b=0;b<a.length-d;b++)this.num[b]=a[b+d]}function p(a,c){this.totalCount=a;this.dataCount=c}function t(){this.buffer=[];this.length=0}u.prototype={getLength:function(){return this.data.length},
|
||||
write:function(a){for(var c=0;c<this.data.length;c++)a.put(this.data.charCodeAt(c),8)}};o.prototype={addData:function(a){this.dataList.push(new u(a));this.dataCache=null},isDark:function(a,c){if(0>a||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e<c.length;e++)b+=c[e].dataCount;
|
||||
for(e=0;e<this.dataList.length;e++)c=this.dataList[e],d.put(c.mode,4),d.put(c.getLength(),j.getLengthInBits(c.mode,a)),c.write(d);if(d.getLengthInBits()<=8*b)break}this.typeNumber=a}this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17;this.modules=Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=Array(this.moduleCount);for(var b=0;b<this.moduleCount;b++)this.modules[d][b]=null}this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-
|
||||
7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(a,c);7<=this.typeNumber&&this.setupTypeNumber(a);null==this.dataCache&&(this.dataCache=o.createData(this.typeNumber,this.errorCorrectLevel,this.dataList));this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,c){for(var d=-1;7>=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]=
|
||||
0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c<this.modules.length;c++)for(var d=1*c,b=0;b<this.modules[c].length;b++){var e=1*b;this.modules[c][b]&&(a.beginFill(0,100),a.moveTo(e,d),a.lineTo(e+1,d),a.lineTo(e+1,d+1),a.lineTo(e,d+1),a.endFill())}return a},
|
||||
setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(a=8;a<this.moduleCount-8;a++)null==this.modules[6][a]&&(this.modules[6][a]=0==a%2)},setupPositionAdjustPattern:function(){for(var a=j.getPatternPosition(this.typeNumber),c=0;c<a.length;c++)for(var d=0;d<a.length;d++){var b=a[c],e=a[d];if(null==this.modules[b][e])for(var f=-2;2>=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c=
|
||||
j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount-
|
||||
b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0<i;i-=2)for(6==i&&i--;;){for(var g=0;2>g;g++)if(null==this.modules[b][i-g]){var n=!1;f<a.length&&(n=1==(a[f]>>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a,
|
||||
c),b=new t,e=0;e<d.length;e++){var f=d[e];b.put(f.mode,4);b.put(f.getLength(),j.getLengthInBits(f.mode,a));f.write(b)}for(e=a=0;e<c.length;e++)a+=c[e].dataCount;if(b.getLengthInBits()>8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d=
|
||||
0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g<c.length;g++){var n=c[g].dataCount,h=c[g].totalCount-n,b=Math.max(b,n),e=Math.max(e,h);f[g]=Array(n);for(var k=0;k<f[g].length;k++)f[g][k]=255&a.buffer[k+d];d+=n;k=j.getErrorCorrectPolynomial(h);n=(new q(f[g],k.getLength()-1)).mod(k);i[g]=Array(k.getLength()-1);for(k=0;k<i[g].length;k++)h=k+n.getLength()-i[g].length,i[g][k]=0<=h?n.get(h):0}for(k=g=0;k<c.length;k++)g+=c[k].totalCount;d=Array(g);for(k=n=0;k<b;k++)for(g=0;g<c.length;g++)k<f[g].length&&
|
||||
(d[n++]=f[g][k]);for(k=0;k<e;k++)for(g=0;g<c.length;g++)k<i[g].length&&(d[n++]=i[g][k]);return d};s=4;for(var j={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,
|
||||
78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var c=a<<10;0<=j.getBCHDigit(c)-j.getBCHDigit(j.G15);)c^=j.G15<<j.getBCHDigit(c)-j.getBCHDigit(j.G15);return(a<<10|c)^j.G15_MASK},getBCHTypeNumber:function(a){for(var c=a<<12;0<=j.getBCHDigit(c)-
|
||||
j.getBCHDigit(j.G18);)c^=j.G18<<j.getBCHDigit(c)-j.getBCHDigit(j.G18);return a<<12|c},getBCHDigit:function(a){for(var c=0;0!=a;)c++,a>>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+
|
||||
a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;d<a;d++)c=c.multiply(new q([1,l.gexp(d)],0));return c},getLengthInBits:function(a,c){if(1<=c&&10>c)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+
|
||||
a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b<c;b++)for(var e=0;e<c;e++){for(var f=0,i=a.isDark(b,e),g=-1;1>=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5<f&&(d+=3+f-5)}for(b=0;b<c-1;b++)for(e=0;e<c-1;e++)if(f=0,a.isDark(b,e)&&f++,a.isDark(b+1,e)&&f++,a.isDark(b,e+1)&&f++,a.isDark(b+1,e+1)&&f++,0==f||4==f)d+=3;for(b=0;b<c;b++)for(e=0;e<c-6;e++)a.isDark(b,e)&&!a.isDark(b,e+1)&&a.isDark(b,e+
|
||||
2)&&a.isDark(b,e+3)&&a.isDark(b,e+4)&&!a.isDark(b,e+5)&&a.isDark(b,e+6)&&(d+=40);for(e=0;e<c;e++)for(b=0;b<c-6;b++)a.isDark(b,e)&&!a.isDark(b+1,e)&&a.isDark(b+2,e)&&a.isDark(b+3,e)&&a.isDark(b+4,e)&&!a.isDark(b+5,e)&&a.isDark(b+6,e)&&(d+=40);for(e=f=0;e<c;e++)for(b=0;b<c;b++)a.isDark(b,e)&&f++;a=Math.abs(100*f/c/c-50)/5;return d+10*a}},l={glog:function(a){if(1>a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256),
|
||||
LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<<m;for(m=8;256>m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var b=0;b<a.getLength();b++)c[d+b]^=l.gexp(l.glog(this.get(d))+l.glog(a.get(b)));return new q(c,0)},mod:function(a){if(0>
|
||||
this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b<this.getLength();b++)d[b]=this.get(b);for(b=0;b<a.getLength();b++)d[b]^=l.gexp(l.glog(a.get(b))+c);return(new q(d,0)).mod(a)}};p.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],
|
||||
[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,
|
||||
116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,
|
||||
43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,
|
||||
3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,
|
||||
55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,
|
||||
45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];p.getRSBlocks=function(a,c){var d=p.getRsBlockTable(a,c);if(void 0==d)throw Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+c);for(var b=d.length/3,e=[],f=0;f<b;f++)for(var h=d[3*f+0],g=d[3*f+1],j=d[3*f+2],l=0;l<h;l++)e.push(new p(g,j));return e};p.getRsBlockTable=function(a,c){switch(c){case 1:return p.RS_BLOCK_TABLE[4*(a-1)+0];case 0:return p.RS_BLOCK_TABLE[4*(a-1)+1];case 3:return p.RS_BLOCK_TABLE[4*
|
||||
(a-1)+2];case 2:return p.RS_BLOCK_TABLE[4*(a-1)+3]}};t.prototype={get:function(a){return 1==(this.buffer[Math.floor(a/8)]>>>7-a%8&1)},put:function(a,c){for(var d=0;d<c;d++)this.putBit(1==(a>>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,
|
||||
correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f<a.getModuleCount();f++)for(var i=0;i<a.getModuleCount();i++){d.fillStyle=a.isDark(f,i)?h.foreground:h.background;var g=Math.ceil((i+1)*b)-Math.floor(i*b),
|
||||
j=Math.ceil((f+1)*b)-Math.floor(f*b);d.fillRect(Math.round(i*b),Math.round(f*e),g,j)}}else{a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();c=r("<table></table>").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e<a.getModuleCount();e++){f=r("<tr></tr>").css("height",b+"px").appendTo(c);for(i=0;i<a.getModuleCount();i++)r("<td></td>").css("width",
|
||||
d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery);
|
||||
4
xin-launcher/conf/Dev-Hosts.xml
Normal file
4
xin-launcher/conf/Dev-Hosts.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<Dev-Hosts>
|
||||
<Context path="/" docBase=""/>
|
||||
</Dev-Hosts>
|
||||
@ -1 +0,0 @@
|
||||
cNSGlMwZy8GxLDTo3QxuAYdVS847cZkzMhg/elJWYfigvUT6qRoxruOwstcfHkMHh18o7e6t/8KVUTycWJ5YJbpmYIAQBDOnCLD3//z+RFFPKj56UGZl9gyii4poNjj6phEnQWQ0wSf0DAAiL59m4y26ZzadKfSIqxMQlVPlj4T9tuhaLtqFKPIVPPllhJd8/okdKBcFK0m9GyKu9RyjWFuaBbpnyYE4/h/PuBY8hv6+e9bZPbz0i7SdX9EFBqDE
|
||||
@ -1,11 +1,16 @@
|
||||
#save success
|
||||
#Thu Dec 17 16:49:58 CST 2020
|
||||
login.user=admin
|
||||
path_key=
|
||||
maxthreads=200
|
||||
port=8080
|
||||
charset=UTF-8
|
||||
connectiontimeout=60000
|
||||
login.edit=0
|
||||
login.pass=96e79218965eb72c92a549dd5a330112
|
||||
is_check=1
|
||||
login.edit=1
|
||||
login.pass=aeb6a04dfe285d98298f5666f02d2503
|
||||
is_dev=1
|
||||
maxconnections=10000
|
||||
product_version=2026.2.6
|
||||
product_group_code=
|
||||
# 该配置为 1 时 标识不加载对应鉴权数据模块 为空或其他值时进行校验
|
||||
is_client=
|
||||
|
||||
Binary file not shown.
Binary file not shown.
BIN
xin-launcher/lib/ecj-4.20.jar
Normal file
BIN
xin-launcher/lib/ecj-4.20.jar
Normal file
Binary file not shown.
Binary file not shown.
BIN
xin-launcher/lib/fastjson-2.0.4.jar
Normal file
BIN
xin-launcher/lib/fastjson-2.0.4.jar
Normal file
Binary file not shown.
BIN
xin-launcher/lib/fastjson2-2.0.4.jar
Normal file
BIN
xin-launcher/lib/fastjson2-2.0.4.jar
Normal file
Binary file not shown.
BIN
xin-launcher/lib/fastjson2-extension-2.0.4.jar
Normal file
BIN
xin-launcher/lib/fastjson2-extension-2.0.4.jar
Normal file
Binary file not shown.
Binary file not shown.
BIN
xin-launcher/lib/jna-5.9.0.jar
Normal file
BIN
xin-launcher/lib/jna-5.9.0.jar
Normal file
Binary file not shown.
Binary file not shown.
BIN
xin-launcher/lib/jna-platform-5.9.0.jar
Normal file
BIN
xin-launcher/lib/jna-platform-5.9.0.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,6 +0,0 @@
|
||||
@echo off
|
||||
title Xin-launcher启动器(请勿关闭)
|
||||
set CURRENT_DIR="%cd%"
|
||||
set JAVA_HOME="%CURRENT_DIR%\..\..\..\DevelopTools\jdk1.8.0_51"
|
||||
CHCP 65001
|
||||
%JAVA_HOME%\bin\java -Xms1024m -Xmx1024m -Dfile.encoding=utf-8 -jar lib\xin-launcher.jar
|
||||
Reference in New Issue
Block a user