258 lines
7.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { useEffect, useState } from 'react';
import { Form, Input, DatePicker, Select, Button, message, FormInstance } from 'antd';
import { GetMachineAuthorizationTypeOptions } from '@/services/enum/machineAuthorizationEnum';
import CryptoJS from 'crypto-js'; // 添加这一行导入
import * as LZString from 'lz-string';
import { AddMachineIdAuthorizationFunc } from '@/services/services/other';
interface AddMachineIdAuthorizationProps {
setFormRef: (form: FormInstance) => void;
}
const AddMachineIdAuthorization: React.FC<AddMachineIdAuthorizationProps> = ({ setFormRef }) => {
const [form] = Form.useForm();
const [loading, setLoading] = useState(false);
const [messageApi, messageHolder] = message.useMessage();
useEffect(() => {
setFormRef(form);
form.setFieldsValue({
type: 0,
useType: 0,
expiryTime: 365,
authorizationCode: ""
})
}, [form, setFormRef]);
const handleSubmit = async () => {
try {
setLoading(true);
// TODO: Implement API call to save the authorization
let values = form.getFieldsValue();
await AddMachineIdAuthorizationFunc(values);
messageApi.success('Machine ID authorization added successfully');
} catch (error: any) {
messageApi.error(error.message);
} finally {
setLoading(false);
}
};
/**
* 生成唯一授权码
* @returns 返回一个唯一的授权码字符串长度与UUID相似
*/
function generateUniqueAuthCode(): string {
// 基于时间戳的组件
const timestamp = Date.now().toString(16);
// 使用加密安全的随机值生成函数
const getRandomHex = (length: number): string => {
const bytes = new Uint8Array(length);
// 使用浏览器的加密API生成随机数
window.crypto.getRandomValues(bytes);
// 转换为十六进制字符串
return Array.from(bytes)
.map(b => b.toString(16).padStart(2, '0'))
.join('');
};
// 生成四个随机组件
const randomA = getRandomHex(4);
const randomB = getRandomHex(2);
const randomC = getRandomHex(2);
const randomD = getRandomHex(6);
// 组合成类似UUID格式的字符串但算法完全不同
return `${timestamp}${randomA}${randomB}${randomC}${randomD}`.toUpperCase();
}
function GenerateAuthorizationCode() {
let code = generateUniqueAuthCode();
form.setFieldsValue({ authorizationCode: code });
// return;
// const values = form.getFieldsValue();
// const { machineId, type, authorizedDate, expiryDate } = values;
// if (!machineId || type === undefined || !authorizedDate || !expiryDate) {
// messageApi.error('请先填写必要信息(机器码、类型和日期)');
// return;
// }
// try {
// // Format dates to strings
// const authDate = moment(authorizedDate).format('YYYY-MM-DD HH:mm:ss');
// const expDate = moment(expiryDate).format('YYYY-MM-DD HH:mm:ss');
// let obj = {
// machineId: machineId,
// type: type,
// authorizedDate: authDate,
// expiryDate: expDate
// }
// // Create the string to encrypt
// const dataToEncrypt = JSON.stringify(obj);
// // Assuming CryptoJS is imported
// const secretKey = machineId;
// // Generate a secure encryption key from machineId
// const key = CryptoJS.enc.Utf8.parse(CryptoJS.SHA256(secretKey).toString());
// // Generate a random initialization vector
// const iv = CryptoJS.lib.WordArray.random(16);
// // Encrypt the data using AES encryption
// const encrypted = CryptoJS.AES.encrypt(dataToEncrypt, key, {
// iv: iv,
// mode: CryptoJS.mode.CBC,
// padding: CryptoJS.pad.Pkcs7
// });
// // Convert IV to base64 for storage
// const ivBase64 = CryptoJS.enc.Base64.stringify(iv);
// // Get the encrypted data in base64 format
// const encryptedBase64 = encrypted.toString();
// // Combine IV and encrypted data with a delimiter for future decryption
// const authCode = ivBase64 + ':' + encryptedBase64;
// // 使用LZString压缩
// const compressedCode = LZString.compressToEncodedURIComponent(authCode);
// // Set the encrypted value in the form
// form.setFieldsValue({ authorizationCode: compressedCode });
// messageApi.success('授权码已生成');
// } catch (error) {
// console.error('生成授权码时出错:', error);
// messageApi.error('生成授权码失败');
// }
}
return (
<Form
form={form}
layout="vertical"
onFinish={handleSubmit}
autoComplete="off"
>
<Form.Item
name="type"
label="授权软件类型"
rules={[{ required: true, message: '请输入授权软件类型' }]}
>
<Select placeholder="选择授权软件类型" options={GetMachineAuthorizationTypeOptions()}></Select>
</Form.Item>
<Form.Item
name="useType"
label="授权使用类型"
rules={[{ required: true, message: '请输入授权软件类型' }]}
>
<Select placeholder="选择授权软件类型" options={[
{ label: '基础', value: 0 },
{ label: '专业', value: 1 },
]}></Select>
</Form.Item>
<Form.Item
name="authorizedDate"
label="授权时间"
>
<DatePicker
disabled
showTime
style={{ width: '100%' }}
placeholder="选择授权日期和时间"
format="YYYY-MM-DD HH:mm:ss"
/>
</Form.Item>
<Form.Item
name="expiryDate"
label="到期时间"
>
<DatePicker
disabled
showTime
style={{ width: '100%' }}
placeholder="选择到期日期和时间"
format="YYYY-MM-DD HH:mm:ss"
/>
</Form.Item>
<Form.Item
name="expiryTime"
label="授权到期时间"
rules={[{ required: true, message: '请选择授权到期时间' }]}
>
<Select
placeholder="请选择授权时间"
showSearch
allowClear
optionFilterProp="children"
options={[
{ label: '0天', value: 0 },
{ label: '30天', value: 30 },
{ label: '90天', value: 90 },
{ label: '180天', value: 180 },
{ label: '365天', value: 365 },
]}
/>
</Form.Item>
<Form.Item name="authorizationCode" label="授权码"
rules={[{ required: true, message: '请先生成授权码' }]}
>
<Input
placeholder="授权码将显示在这里"
/>
</Form.Item>
<Form.Item style={{ textAlign: 'right' }}>
{/* <Button
style={{ marginRight: 8 }}
type="primary"
onClick={() => {
const values = form.getFieldsValue();
const { machineId, authorizationCode } = values;
if (!machineId || !authorizationCode) {
messageApi.error('请先填写机器码和授权码');
return;
}
const result = DecryptAuthorizationCode(authorizationCode, machineId);
if (result.success) {
messageApi.success('授权码解密成功');
console.log('解密结果:', result.data);
} else {
messageApi.error(`解密失败: ${result.error}`);
}
}}
>
解密授权码
</Button> */}
<Button
type="primary"
onClick={GenerateAuthorizationCode}
style={{ marginRight: 8 }}
>
</Button>
<Button type="primary" htmlType="submit" loading={loading}>
</Button>
</Form.Item>
{messageHolder}
</Form >
);
};
export default AddMachineIdAuthorization;