Browse Source

智能体:优化联网查询URL组件

master^2
han2015 6 days ago
parent
commit
e61d80b4d2
  1. 71
      src/views/doc/spacesimpletable.vue

71
src/views/doc/spacesimpletable.vue

@ -13,13 +13,78 @@ const props = withDefaults(defineProps<{
}>(),{}) }>(),{})
const weburls=ref<string[]>([]) const weburls=ref<string[]>([])
const tags = ref<string[]>([])
const extractLtag = (url: string) => {
if(!url) return ''
try {
const u = new URL(url)
return u.searchParams.get('ltag') || ''
} catch (e) {
// fallback for non-absolute urls
const qIdx = url.indexOf('?')
if (qIdx === -1) return ''
const qs = url.slice(qIdx + 1)
const params = new URLSearchParams(qs)
return params.get('ltag') || ''
}
}
const updateUrlWithTag = (url: string, tag: string) => {
try {
const u = new URL(url || 'http://example.com') // base for relative fallback
if (tag) u.searchParams.set('ltag', tag)
else u.searchParams.delete('ltag')
// if original url had no origin and we used example.com, strip it
if (!/^[a-zA-Z]+:\/\//.test(url || '')) {
const path = u.pathname + (u.search ? u.search : '') + (u.hash ? u.hash : '')
return path === '/' ? (u.search ? u.search.slice(1) : '') : path
}
return u.toString()
} catch (e) {
const hasQ = url.includes('?')
const parts = url.split('?')
const base = parts[0]
const qs = parts[1] || ''
const params = new URLSearchParams(qs)
if (tag) params.set('ltag', tag)
else params.delete('ltag')
const qsStr = params.toString()
return qsStr ? `${base}?${qsStr}` : base
}
}
// /
const sanitizeTag = (val: string) => {
if (!val) return ''
try {
// 使 Unicode property escapes
return val.replace(/[^\p{L}\p{N}]+/gu, '')
} catch (e) {
// fallback ASCII /
return val.replace(/[^0-9a-zA-Z\u4e00-\u9fff]+/g, '')
}
}
const addUrl = () => { const addUrl = () => {
weburls.value.push('') weburls.value.push('')
tags.value.push('')
} }
const removeUrl = (index: number) => { const removeUrl = (index: number) => {
weburls.value.splice(index, 1) weburls.value.splice(index, 1)
tags.value.splice(index, 1)
}
const onTagChange = (index: number, val: string) => {
const clean = sanitizeTag(val)
tags.value[index] = clean
weburls.value[index] = updateUrlWithTag(weburls.value[index] || '', clean)
}
const onUrlChange = (index: number, val: string) => {
weburls.value[index] = val
tags.value[index] = extractLtag(val)
} }
const onSaveChange = () => { const onSaveChange = () => {
@ -29,17 +94,19 @@ const onSaveChange = () => {
onMounted(() => { onMounted(() => {
weburls.value = props.urlstr ? props.urlstr.split(",") : [] weburls.value = props.urlstr ? props.urlstr.split(",") : []
tags.value = weburls.value.map(extractLtag)
}) })
</script> </script>
<template> <template>
<el-dialog :model-value="true" :style="{'max-height': '880px','--el-dialog-width': '33%'}" @close="props.closeFunc"> <el-dialog :model-value="true" :style="{'max-height': '880px','--el-dialog-width': '63%'}" @close="props.closeFunc">
<template #header> <template #header>
<span style="font-weight: bold;">{{props.title}}</span> <span style="font-weight: bold;">{{props.title}}</span>
</template> </template>
<div class="tablelist"> <div class="tablelist">
<div v-for="(url, index) in weburls" :key="index" style="display:flex;align-items:center;margin:8px 0;"> <div v-for="(url, index) in weburls" :key="index" style="display:flex;align-items:center;margin:8px 0;">
<el-input v-model="weburls[index]" placeholder="输入网址" style="flex:1;margin-right:8px;"></el-input> <el-input v-model="tags[index]" :maxlength="20" @input="onTagChange(index, $event)" placeholder="输入网址标签" style="margin-right:8px;width: 30%;"></el-input>
<el-input v-model="weburls[index]" @input="onUrlChange(index, $event)" placeholder="输入网址" style="flex:1;margin-right:8px;"></el-input>
<el-button circle size="small" type="danger" :icon="Delete" @click="removeUrl(index)"></el-button> <el-button circle size="small" type="danger" :icon="Delete" @click="removeUrl(index)"></el-button>
</div> </div>

Loading…
Cancel
Save