短链接转换

main
ybc 3 months ago
parent db0cf324ba
commit 0c43d84631

@ -12,9 +12,9 @@
"dependencies": {
"@ant-design/icons": "^6.0.0",
"@dckj/react-better-modal": "^0.1.2",
"@haina/utils-commons": "https://research.hainatravel.com/npm/utils-commons-0.1.1.tgz",
"@haina/utils-pagespy": "https://research.hainatravel.com/npm/utils-pagespy-0.1.1.tgz",
"@haina/utils-request": "https://research.hainatravel.com/npm/utils-request-0.1.1.tgz",
"@haina/utils-commons": "https://research.hainatravel.com/npm/utils-commons-0.1.2.tgz",
"@haina/utils-pagespy": "https://research.hainatravel.com/npm/utils-pagespy-0.1.2.tgz",
"@haina/utils-request": "https://research.hainatravel.com/npm/utils-request-0.1.2.tgz",
"@lexical/code": "^0.34.0",
"@lexical/hashtag": "^0.34.0",
"@lexical/html": "^0.34.0",

@ -0,0 +1,78 @@
import { message } from 'antd';
const Shorturlchange = async (longUrl) => {
const apiPrefix = {
"japanhighlights.com": "https://www.japanhighlights.com/index.php",
"chinahighlights.com": "https://www.chinahighlights.com/guide-use.php",
"highlightstravel.com": "https://www.highlightstravel.com/index.php",
"asiahighlights.com": "https://www.asiahighlights.com/index.php",
"globalhighlights.com": "https://www.globalhighlights.com/index.php",
};
const fetchNowConversationsitems = async (base64Url, apiUrl) => {
try {
const formData = new FormData();
formData.append('url', base64Url);
formData.append('type', 'info');
const response = await fetch(`${apiUrl}/apps/short_link/index/create`, {
method: 'POST',
body: formData,
});
const data = await response.json();
if (data[0].name == 'ok') {
return data[0].value;
}
return null;
} catch (error) {
console.error('获取短链接转换内容失败:', error);
return null;
}
};
const urlConversion = async (longUrl) => {
if (!longUrl.trim()) {
message.error('不是有效的长链接');
return null;
}
const { base64Url, extracted1, extracted2 } = urlBase64(longUrl);
if (base64Url && extracted1 && extracted2) {
const apiUrl = apiPrefix[extracted2];
const data = await fetchNowConversationsitems(base64Url, apiUrl);
if (data) {
const resultShortUrl = extracted1 + data.isl_link;
message.success('转换成功!');
return resultShortUrl;
} else {
message.error('转换失败请检查输入的URL是否正确');
return null;
}
} else {
message.error('URL格式不正确请输入完整的URL');
return null;
}
};
const urlBase64 = (longUrl) => {
try {
const extracted1 = longUrl.match(/^.*?com/)?.[0] || '';
const extracted2 = longUrl.match(/https:\/\/www\.([^\/]+)/)?.[1] || '';
const encoder = new TextEncoder();
const utf8Bytes = encoder.encode(longUrl);
const base64Url = btoa(String.fromCharCode(...utf8Bytes));
return { base64Url, extracted1, extracted2 };
} catch (error) {
message.error('转换失败请检查输入的URL是否正确');
console.error('URL转换错误:', error);
return { base64Url: '', extracted1: '', extracted2: '' };
}
}
return await urlConversion(longUrl);
}
export default Shorturlchange;

@ -0,0 +1,21 @@
import { create } from 'zustand'
import { devtools } from 'zustand/middleware'
const useUrlStore = create(devtools((set, get) => ({
drawerOpen: false,
openDrawer: () => {
set(() => ({
drawerOpen: true
}))
},
closeDrawer: () => {
set(() => ({
drawerOpen: false
}))
},
}), { name: 'urlStore' }))
export default useUrlStore

@ -25,6 +25,7 @@ import FetchEmailWorker from './../workers/fetchEmailWorker?worker&url'
import { useGlobalNotify } from '@/hooks/useGlobalNotify'
import GeneratePaymentDrawer from './Conversations/Online/Components/GeneratePaymentDrawer'
import GenerateAutoDocDrawer from './Conversations/Online/Components/GenerateAutoDocDrawer'
import GenerateShorturlDrawer from './Conversations/Online/Components/GenerateShorturlDrawer'
import LogUploader from '@/components/LogUploader'
import { BUILD_VERSION } from '@/config'
@ -162,6 +163,7 @@ function AuthApp() {
</dialog>
<GeneratePaymentDrawer />
<GenerateAutoDocDrawer />
<GenerateShorturlDrawer />
</ErrorBoundary>
</AntApp>
</ConfigProvider>

@ -0,0 +1,14 @@
import { createContext, useEffect, useState } from 'react'
import { Drawer } from 'antd'
import useUrlStore from '@/stores/UrlStore'
import ShorturlConversion from '@/views/accounts/ShorturlConversion'
const GenerateShorturlDrawer = ({ ...props }) => {
const [openShorturlDrawer, closeShorturlDrawer, shorturlDrawerOpen] = useUrlStore((state) => [state.openDrawer, state.closeDrawer, state.drawerOpen])
return (
<Drawer title='短链接转换' placement={'top'} size={'large'} onClose={() => closeShorturlDrawer()} open={shorturlDrawerOpen}>
<ShorturlConversion/>
</Drawer>
)
}
export default GenerateShorturlDrawer

@ -1,6 +1,7 @@
import useAuthStore from '@/stores/AuthStore'
import useSnippetStore from '@/stores/SnippetStore'
import { useOrderStore } from '@/stores/OrderStore'
import useUrlStore from '@/stores/UrlStore'
import useConversationStore from '@/stores/ConversationStore'
import { useThemeContext } from '@/stores/ThemeContext'
import { DownOutlined } from '@ant-design/icons'
@ -59,12 +60,23 @@ function DesktopApp() {
state.closeDrawer,
state.drawerOpen,
])
const [
openShorturlDrawer,
closeShorturlDrawer,
shorturlDrawerOpen,
] = useUrlStore((state) => [
state.openDrawer,
state.closeDrawer,
state.drawerOpen,
])
const onClick = ({ key }) => {
if (key === 'snippet-list') {
openSnippetDrawer()
} else if (key == 'generate-payment') {
openPaymentDrawer()
} else if (key === 'shorturl-conversion') {
openShorturlDrawer()
}
}
@ -183,10 +195,15 @@ function DesktopApp() {
label: <Link to='/account/profile'>个人资料</Link>,
key: 'profile',
},
{ type: 'divider' },
{
label: '支付链接',
key: 'generate-payment',
},
{
label: '短链接转换',
key: 'shorturl-conversion',
},
{
label: '图文集',
key: 'snippet-list',

@ -0,0 +1,85 @@
import { Input, Button, Space, message, Typography } from 'antd'
import { CopyOutlined, LinkOutlined } from '@ant-design/icons'
import Shorturlchange from '@/components/Shorturlchange'
import { useState } from 'react'
const { Title, Text } = Typography
function ShorturlConversion() {
const [longUrl, setLongUrl] = useState('')
const [shortUrl, setShortUrl] = useState('')
function copyToClipboard(text) {
const textarea = document.createElement('textarea');
textarea.value = text;
//
textarea.style.position = 'fixed';
textarea.style.opacity = 0;
document.body.appendChild(textarea);
//
textarea.select();
try {
const successful = document.execCommand('copy');
if (successful) {
message.success('已复制');
} else {
throw new Error('复制失败');
}
} catch (err) {
message.error('复制失败,请手动复制');
} finally {
//
document.body.removeChild(textarea);
}
}
const handleConvert = async () => {
const result = await Shorturlchange(longUrl);
if (result) {
setShortUrl(result);
}
};
return (
<Space direction='vertical' size='large' className='w-full'>
<div>
<Text strong>长链接</Text>
<Input
placeholder="输入长链接"
value={longUrl}
onChange={(e) => setLongUrl(e.target.value)}
prefix={<LinkOutlined />}
size="large"
/>
</div>
<Button
type='primary'
size='large'
onClick={handleConvert}
icon={<LinkOutlined />}
>
转换
</Button>
<div>
<Text strong>短链接</Text>
<Input
placeholder="转换后的短链接"
value={shortUrl}
readOnly
suffix={
shortUrl && (
<Button
type="text"
icon={<CopyOutlined />}
onClick={() => copyToClipboard(shortUrl)}
/>
)
}
size="large"
/>
</div>
</Space>
);
}
export default ShorturlConversion
Loading…
Cancel
Save