Compare commits

...

16 Commits

22 changed files with 818 additions and 290 deletions

View File

@ -6,7 +6,9 @@
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="xin-launcher" 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" /> <orderEntry type="library" name="xin-launcher" level="project" />
<orderEntry type="library" name="xin-admin" level="project" /> <orderEntry type="library" name="xin-admin" level="project" />
<orderEntry type="library" name="xin-launcher" level="project" />
</component> </component>
</module> </module>

View File

@ -51,4 +51,33 @@
调整授权时对应注册表处理逻辑 调整授权时对应注册表处理逻辑
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. 新增相关工具函数,实现配置文件读取、加密及解密对象获取

View 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字符串

View 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
- 调用:私有函数,不可外部调用
- 调用方式:无
- 基础逻辑:解密传入的机械码加密字符串,比对机械实际硬件信息,对照失败时,重新生成并删除已有授权文件。
- 入参:无
- 出参:无

View 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 | 授权文件字符串 |
- 出参:无

Binary file not shown.

View File

@ -8,6 +8,7 @@
<script type="text/javascript" src="themes/js/index.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/axios.min.js"></script>
<script type="text/javascript" src="themes/js/jquery.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> <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/index.css" type="text/css">
<link rel="stylesheet" href="themes/css/main.css" type="text/css"> <link rel="stylesheet" href="themes/css/main.css" type="text/css">
@ -33,7 +34,6 @@
<div class="company"> <div class="company">
<div class="company-det"> <div class="company-det">
<div class="company-lint"> <div class="company-lint">
<div class="company-name"> <div class="company-name">
<div class="company-logo"> <div class="company-logo">
@ -45,16 +45,27 @@
<div style="margin: 10px;"> <div style="margin: 10px;">
<div class="address">地址:{{companyAddress}}</div> <div class="address">地址:{{companyAddress}}</div>
<div class="des">简介:{{companyIntroduce}}</div> <div class="des">简介:{{companyIntroduce}}</div>
<div class="des">授权码:<span style="color: green">已生成</span> <span><el-link <div class="des">授权码:
type="primary" :underline="false" <span style="color: green">已生成</span>
style=" font-size: 12px;margin-left: 8px;"
@click="dialogCodeVisible = true">查看</el-link></span></div>
<div class="des">授权文件:<span style="color: green">正常</span>
<span> <span>
<el-link type="primary" :underline="false" <el-link type="primary" :underline="false"
style=" font-size: 12px;margin-left: 8px;" style=" font-size: 12px;margin-left: 8px;"
@click="dialogTableVisible = true">更换授权文件</el-link> @click="toSeeCode">查看</el-link>
</span> </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>
@ -78,8 +89,8 @@
<div class="app-des">版本:{{item.version}}</div> <div class="app-des">版本:{{item.version}}</div>
<div class="app-license">{{item.grade == 'custom' ? '定制授权' : item.gradeName}}</div> <div class="app-license">{{item.grade == 'custom' ? '定制授权' : item.gradeName}}</div>
<div class="app-time" style="color: green" <div class="app-time" style="color: green"
v-if="new Date().getTime() < new Date(item.expiryTime).getTime()"> {{item.expiryTime | v-if="new Date().getTime() < new Date(item.expiryTime).getTime()">
dateFilter('YYYY-MM-DD')}}到期 {{item.expiryTime | dateFilter('YYYY-MM-DD')}}到期
</div> </div>
<div v-else style="color: red">已过期</div> <div v-else style="color: red">已过期</div>
</div> </div>
@ -116,12 +127,22 @@
<el-dialog title="授权码" :visible.sync="dialogCodeVisible" :close-on-click-modal="false"> <el-dialog title="授权码" :visible.sync="dialogCodeVisible" :close-on-click-modal="false">
<div class="demo-input-suffix"> <div class="demo-input-suffix">
<el-button style="float: right; margin-top: -25px" icon="el-icon-document-copy" @click="copy()" type="text"> <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> </el-button>
<el-input type="textarea" ref="copy" autosize="true" v-model="single.code" resize="none"
readonly="true">
</el-input>
</div> </div>
</el-dialog> </el-dialog>
@ -150,237 +171,346 @@
</el-table> </el-table>
</div> </div>
</el-dialog> </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> </div>
<script> <script>
Vue.filter("dateFilter", function (date, formatPattern) { function generateQRCode(rendermethod, picwidth, picheight, url) {
return moment(date).format(formatPattern || "YYYY-MM-DD HH:mm:ss"); $("#qrcode").qrcode({
}); render: rendermethod, // 渲染方式有table方式IE兼容和canvas方式
const home = new Vue({ width: picwidth, //宽度
el: '#app', height: picheight, //高度
data() { text: utf16to8(url), //内容
const validatePass = (rule, value, callback) => { typeNumber: -1,//计算模式
if (value === '') { correctLevel: 2,//二维码纠错级别
callback(new Error('请输入密码')); background: "#ffffff",//背景颜色
} else { foreground: "#000000" //二维码颜色
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: [],
dialogCodeVisible: 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'}
]
}
}
},
created: function () {
this.checkLogin();
this.singlecode();
},
//绑定方法
methods: {
singlecode() {
const that = this;
axios.get('/xinadmin/single', {}).then(function (res) {
if (res.data) {
if (res.data.license) {
that.single = res.data;
that.companyName = res.data.company.name;
that.companyAddress = res.data.company.address;
that.companyIntroduce = res.data.company.introduce;
} else {
location.href = "index.jsp"
}
}
}).catch(function (error) {
console.log(error)
})
},
checkLogin() {
const token = sessionStorage.getItem("token");
if (token == null) {
location.href = "login.jsp"
} else {
const str = new Date().getTime()
if ((+token + (2 * 60 * 60 * 1000) < str)) {
location.href = "login.jsp"
}
}
},
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,
message: '校验通过',
type: 'success'
});
const that = this;
this.$confirm('授权文件已更新,是否立即重启相关应用?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.get('/xinadmin/adminstarter', {}).then(function () {
that.$notify({
title: '重启中',
duration: 2000,
message: '正在重启相关应用,请稍侯....',
type: 'info'
});
setTimeout(() => {
location.reload();
}, 2000);
}).catch(function (error) {
console.log(error)
})
}).catch(() => {
that.$notify({
title: '警告',
duration: 2000,
message: '应用尚未重启,授权尚未生效,请稍后手动重启',
type: 'warning'
});
});
} 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("两次密码不一致")
}
}
}); });
}
} }
})
//中文编码格式转换
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");
});
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: [],
dialogCodeVisible: 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 () {
this.checkLogin();
this.singlecode();
},
//绑定方法
methods: {
singlecode() {
const that = this;
axios.get('/xinadmin/single', {}).then(function (res) {
if (res.data) {
if (res.data.license) {
that.single = res.data;
that.companyName = res.data.company.name;
that.companyAddress = res.data.company.address;
that.companyIntroduce = res.data.company.introduce;
} else {
location.href = "index.jsp"
}
}
}).catch(function (error) {
console.log(error)
})
},
checkLogin() {
const token = sessionStorage.getItem("token");
if (token == null) {
location.href = "login.jsp"
} else {
const str = new Date().getTime()
if ((+token + (2 * 60 * 60 * 1000) < str)) {
location.href = "login.jsp"
}
}
},
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,
message: '校验通过',
type: 'success'
});
const that = this;
this.$confirm('授权文件已更新,是否立即重启相关应用?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.get('/xinadmin/adminstarter', {}).then(function () {
that.$notify({
title: '重启中',
duration: 2000,
message: '正在重启相关应用,请稍侯....',
type: 'info'
});
setTimeout(() => {
location.reload();
}, 2000);
}).catch(function (error) {
console.log(error)
})
}).catch(() => {
that.$notify({
title: '警告',
duration: 2000,
message: '应用尚未重启,授权尚未生效,请稍后手动重启',
type: 'warning'
});
});
} 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> </script>
</body> </body>
</html> </html>

View File

@ -6,6 +6,7 @@
<script type="text/javascript" src="themes/js/index.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/axios.min.js"></script>
<script type="text/javascript" src="themes/js/jquery.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> <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/index.css" type="text/css">
<link rel="stylesheet" href="themes/css/main.css" type="text/css"> <link rel="stylesheet" href="themes/css/main.css" type="text/css">
@ -25,10 +26,13 @@
type="text">复制授权码 type="text">复制授权码
</el-button> </el-button>
</div> </div>
<span class="tip">请联系您的商务经理或客服经理,将下方框体内的本机授权码发送给Ta以获取授权文件</span> <span class="tip">请联系您的商务经理或客服经理,使用手机扫码并复制扫码结果或直接将下方框体内的本机授权码发送给Ta以获取授权文件</span>
<div class="demo-input-suffix"> <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" <el-input type="textarea" ref="copy" autosize="true" v-model="code" resize="none"
readonly="true"></el-input> readonly="true" :autosize="{ minRows: 9, maxRows: 10}"
style="margin: 10px"></el-input>
</div> </div>
</el-card> </el-card>
<el-card class="box-card" shadow="never" style="width:640px;margin: 10px auto 0 auto;"> <el-card class="box-card" shadow="never" style="width:640px;margin: 10px auto 0 auto;">
@ -50,6 +54,40 @@
</div> </div>
<script> <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) { Vue.filter("dateFilter", function (date, formatPattern) {
return moment(date).format(formatPattern || "YYYY-MM-DD HH:mm:ss"); return moment(date).format(formatPattern || "YYYY-MM-DD HH:mm:ss");
}); });
@ -62,9 +100,9 @@
if (res.data.license) { if (res.data.license) {
location.href = "login.jsp" location.href = "login.jsp"
} else { } else {
that.code = res.data.code that.code = res.data.code;
generateQRCode("table",200, 200, that.code);
} }
} }
}).catch(function (error) { }).catch(function (error) {
console.log(error) console.log(error)
@ -115,8 +153,7 @@
message: response.error message: response.error
}); });
} }
} },
} }
}) })
</script> </script>

View File

@ -155,7 +155,7 @@ body {
} }
.app-name { .app-name {
font-family: "微软雅黑", serif; font-family: "微软雅黑";
font-size: 12pt; font-size: 12pt;
color: #666666; color: #666666;
text-decoration: none; text-decoration: none;
@ -164,14 +164,14 @@ body {
} }
.app-des { .app-des {
font-family: "微软雅黑", serif; font-family: "微软雅黑";
font-size: 14px; font-size: 14px;
line-height: 22px; line-height: 22px;
color: #999999; color: #999999;
} }
.app-license { .app-license {
font-family: "微软雅黑", serif; font-family: "微软雅黑";
font-size: 14px; font-size: 14px;
line-height: 28px; line-height: 28px;
color: #084aaf; color: #084aaf;
@ -216,7 +216,7 @@ body {
} }
.main { .main {
margin: 10px 0 auto; margin: 10px 0px auto;
padding: 10px; padding: 10px;
} }

View 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);

View File

@ -1,16 +1,16 @@
#save success #save success
#Thu Dec 17 16:49:58 CST 2020 #Thu Dec 17 16:49:58 CST 2020
login.user=admin login.user=admin
path_key=
maxthreads=200 maxthreads=200
port=8080 port=8080
charset=UTF-8 charset=UTF-8
connectiontimeout=60000 connectiontimeout=60000
login.edit=0 login.edit=1
login.pass=aeb6a04dfe285d98298f5666f02d2503 login.pass=aeb6a04dfe285d98298f5666f02d2503
is_dev=1 is_dev=1
maxconnections=10000 maxconnections=10000
product_version=2.0 product_version=2026.2.6
# 产品分组标识 为空时不进行校验 存在值时将进行产品分组数据信息校验 不一致时鉴权不通过
product_group_code= product_group_code=
# 该配置为 1 时 标识不加载对应鉴权数据模块 为空或其他值时进行校验 # 该配置为 1 时 标识不加载对应鉴权数据模块 为空或其他值时进行校验
is_client= is_client=

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,6 +0,0 @@
@echo off
setlocal EnableDelayedExpansion
@rem set "LinkName=C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\XinLauncher.lnk"
mshta VBScript:Execute("Set Shell=CreateObject(""WScript.Shell""):Set Link=Shell.CreateShortcut(Shell.SpecialFolders(""Startup"") & ""\XinLauncher.lnk""):Link.TargetPath=""%~dp0\run.bat"":Link.WorkingDirectory=""%~dp0\"":Link.Save:close")
pause
exit

View File

@ -1,27 +0,0 @@
@echo off
title Xin-launcher启动器请勿关闭
SETLOCAL
set "CURRENT_DIR=%cd%"
set "CATALINA_HOME=%CURRENT_DIR%"
set MAINPATH=%cd%\lib\xin-launcher.jar
set JAVA_HOME="C:\project\test_environment\jdk1.8.0_191"
echo CURRENT_DIR=%CURRENT_DIR%
echo JAVA_HOME=%JAVA_HOME%
echo MAINPATH=%MAINPATH%
@rem 设置Java虚拟机参数
set JAVA_VM=-hotspot
@rem 设置Java虚拟机所使用的内存
set MEM_ARGS=-Xms128m -Xmx128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -XX:MaxDirectMemorySize=128m -Xss1024K
@rem start /b
taskkill /f /t /im javaw.exe
CHCP 65001
@rem 如果此行命令运行失败 使用下方命令
start /b %JAVA_HOME%\bin\javaw %MEM_ARGS% -Dfile.encoding=UTF-8 -jar %MAINPATH%
@rem start /b %JAVA_HOME%\bin\javaw %MEM_ARGS% %MAINPATH%
:end
ENDLOCAL