Merge remote-tracking branch 'origin/feature/v1.2灵机空间-内容上传审核_rxd' into test

# Conflicts:
#	pnpm-lock.yaml
#	src/components/text-over-tips/index.vue
#	src/layouts/Basic.vue
#	src/main.ts
#	src/router/constants.ts
#	src/router/typeings.d.ts
#	src/utils/tools.ts
#	vite.config.ts
This commit is contained in:
rd
2025-08-14 15:27:10 +08:00
13 changed files with 76 additions and 71 deletions

18
pnpm-lock.yaml generated
View File

@ -1758,8 +1758,8 @@ packages:
copy-to@2.0.1: copy-to@2.0.1:
resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==}
core-js@3.44.0: core-js@3.45.0:
resolution: {integrity: sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==} resolution: {integrity: sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==}
core-util-is@1.0.3: core-util-is@1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
@ -3608,11 +3608,6 @@ packages:
resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
marked@16.1.1:
resolution: {integrity: sha512-ij/2lXfCRT71L6u0M29tJPhP0bM5shLL3u5BePhFwPELj2blMJ6GDtD7PfJhRLhJ/c2UwrK17ySVcDzy2YHjHQ==}
engines: {node: '>= 20'}
hasBin: true
match-file@0.2.2: match-file@0.2.2:
resolution: {integrity: sha512-BDEZIcrBSnooL0zC72Yt3z1HhJiCq+2pMnHKVDeYN/cilCrz3KrpqKPm4ZOfWCoDolRl4QyKQpfRlQWF6PqnjQ==} resolution: {integrity: sha512-BDEZIcrBSnooL0zC72Yt3z1HhJiCq+2pMnHKVDeYN/cilCrz3KrpqKPm4ZOfWCoDolRl4QyKQpfRlQWF6PqnjQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -7427,7 +7422,7 @@ snapshots:
dependencies: dependencies:
'@babel/runtime': 7.28.2 '@babel/runtime': 7.28.2
'@types/raf': 3.4.3 '@types/raf': 3.4.3
core-js: 3.44.0 core-js: 3.45.0
raf: 3.4.1 raf: 3.4.1
regenerator-runtime: 0.13.11 regenerator-runtime: 0.13.11
rgbcolor: 1.0.1 rgbcolor: 1.0.1
@ -7649,7 +7644,7 @@ snapshots:
copy-to@2.0.1: {} copy-to@2.0.1: {}
core-js@3.44.0: core-js@3.45.0:
optional: true optional: true
core-util-is@1.0.3: {} core-util-is@1.0.3: {}
@ -7881,6 +7876,7 @@ snapshots:
dompurify@3.2.6: dompurify@3.2.6:
optionalDependencies: optionalDependencies:
'@types/trusted-types': 2.0.7 '@types/trusted-types': 2.0.7
optional: true
domutils@1.7.0: domutils@1.7.0:
dependencies: dependencies:
@ -9482,7 +9478,7 @@ snapshots:
fflate: 0.8.2 fflate: 0.8.2
optionalDependencies: optionalDependencies:
canvg: 3.0.11 canvg: 3.0.11
core-js: 3.44.0 core-js: 3.45.0
dompurify: 3.2.6 dompurify: 3.2.6
html2canvas: 1.4.1 html2canvas: 1.4.1
@ -9864,8 +9860,6 @@ snapshots:
dependencies: dependencies:
object-visit: 1.0.1 object-visit: 1.0.1
marked@16.1.1: {}
match-file@0.2.2: match-file@0.2.2:
dependencies: dependencies:
is-glob: 3.1.0 is-glob: 3.1.0

View File

@ -51,7 +51,6 @@ const props = defineProps({
default: false, default: false,
}, },
}); });
const data = reactive({}); const data = reactive({});
const isShow = ref(false); const isShow = ref(false);
const contentStyle = computed(() => { const contentStyle = computed(() => {

View File

@ -110,10 +110,6 @@ provide('toggleDrawerMenu', () => {
<style scoped lang="scss"> <style scoped lang="scss">
$layout-max-width: 1100px; $layout-max-width: 1100px;
.layout {
// width: 100%;
// height: 100%;
}
.layout-navbar { .layout-navbar {
position: fixed; position: fixed;
top: 0; top: 0;

View File

@ -26,4 +26,11 @@ app.component('NoData', NoData);
app.component('SvgIcon', SvgIcon); app.component('SvgIcon', SvgIcon);
(Object.keys(directives) as Array<keyof typeof directives>).forEach((k) => app.use(directives[k])); // 注册指令 (Object.keys(directives) as Array<keyof typeof directives>).forEach((k) => app.use(directives[k])); // 注册指令
app.use(store).use(router).mount('#app'); app.use(store);
app.use(router);
Object.values(directives).forEach((directive) => {
app.use(directive);
}); // 注册指令
app.mount('#app');

View File

@ -23,10 +23,10 @@ export const DEFAULT_ROUTE = {
export const MENU_GROUP_IDS = { export const MENU_GROUP_IDS = {
DATA_ENGINE_ID: 1, // 全域数据分析 DATA_ENGINE_ID: 1, // 全域数据分析
AGENT: 2, // 智能体 AGENT: 2,
MANAGEMENT_ID: 3, // 管理中心 MANAGEMENT_ID: 3, // 管理中心
PROPERTY_ID: 4, // 资产营销平台 PROPERTY_ID: 4, // 资产营销平台
WORK_BENCH_ID: 5, // 工作台 WORK_BENCH_ID: 5, // 工作台
WRITER_CREATIVE_GENERATION_WORKSHOP_ID: 6, // 内容稿件-写手侧 WRITER_CREATIVE_GENERATION_WORKSHOP_ID: 6, // 内容稿件-写手侧
CREATIVE_GENERATION_WORKSHOP_ID: 7, // 创意生成工坊 CREATIVE_GENERATION_WORKSHOP_ID: 7 // 创意生成工坊
}; };

View File

@ -14,8 +14,8 @@ declare module 'vue-router' {
noAffix?: boolean; // if set true, the tag will not affix in the tab-bar noAffix?: boolean; // if set true, the tag will not affix in the tab-bar
ignoreCache?: boolean; // if set true, the page will not be cached ignoreCache?: boolean; // if set true, the page will not be cached
hideSidebar?: boolean; hideSidebar?: boolean;
isAgentRoute?:boolean;
hideFooter?: boolean; hideFooter?: boolean;
isAgentRoute?:boolean;
requireLogin?: boolean; // 是否需要登陆才能访问 requireLogin?: boolean; // 是否需要登陆才能访问
} }
} }

View File

@ -397,7 +397,7 @@ export function getImageMainColor(imageUrl: string): Promise<string> {
const avgColor = { const avgColor = {
r: Math.round(maxGroup.sumR / maxGroup.count), r: Math.round(maxGroup.sumR / maxGroup.count),
g: Math.round(maxGroup.sumG / maxGroup.count), g: Math.round(maxGroup.sumG / maxGroup.count),
b: Math.round(maxGroup.sumB / maxGroup.count), b: Math.round(maxGroup.sumB / maxGroup.count)
}; };
resolve(`rgb(${avgColor.r},${avgColor.g},${avgColor.b})`); resolve(`rgb(${avgColor.r},${avgColor.g},${avgColor.b})`);
@ -427,38 +427,28 @@ function medianCut(data: Uint8ClampedArray, levels: number): any[] {
if (a < 128) continue; if (a < 128) continue;
colors.push({ colors.push({
r, r, g, b,
g,
b,
count: 1, count: 1,
sumR: r, sumR: r, sumG: g, sumB: b
sumG: g,
sumB: b,
}); });
} }
// 如果没有颜色数据,返回默认白色 // 如果没有颜色数据,返回默认白色
if (colors.length === 0) { if (colors.length === 0) {
return [ return [{
{ count: 1,
count: 1, sumR: 255, sumG: 255, sumB: 255
sumR: 255, }];
sumG: 255,
sumB: 255,
},
];
} }
// 开始中位数切分 // 开始中位数切分
let colorGroups = [ let colorGroups = [{
{ colors,
colors, count: colors.length,
count: colors.length, sumR: colors.reduce((sum, c) => sum + c.r, 0),
sumR: colors.reduce((sum, c) => sum + c.r, 0), sumG: colors.reduce((sum, c) => sum + c.g, 0),
sumG: colors.reduce((sum, c) => sum + c.g, 0), sumB: colors.reduce((sum, c) => sum + c.b, 0)
sumB: colors.reduce((sum, c) => sum + c.b, 0), }];
},
];
for (let i = 0; i < levels; i++) { for (let i = 0; i < levels; i++) {
const newGroups = []; const newGroups = [];
@ -470,12 +460,12 @@ function medianCut(data: Uint8ClampedArray, levels: number): any[] {
} }
// 找出颜色范围最大的通道 // 找出颜色范围最大的通道
const rMin = Math.min(...group.colors.map((c) => c.r)); const rMin = Math.min(...group.colors.map(c => c.r));
const rMax = Math.max(...group.colors.map((c) => c.r)); const rMax = Math.max(...group.colors.map(c => c.r));
const gMin = Math.min(...group.colors.map((c) => c.g)); const gMin = Math.min(...group.colors.map(c => c.g));
const gMax = Math.max(...group.colors.map((c) => c.g)); const gMax = Math.max(...group.colors.map(c => c.g));
const bMin = Math.min(...group.colors.map((c) => c.b)); const bMin = Math.min(...group.colors.map(c => c.b));
const bMax = Math.max(...group.colors.map((c) => c.b)); const bMax = Math.max(...group.colors.map(c => c.b));
const rRange = rMax - rMin; const rRange = rMax - rMin;
const gRange = gMax - gMin; const gRange = gMax - gMin;
@ -489,9 +479,15 @@ function medianCut(data: Uint8ClampedArray, levels: number): any[] {
} }
// 按最大范围通道排序 // 按最大范围通道排序
type ColorChannel = 'r' | 'g' | 'b'; group.colors.sort((a, b) => {
const safeSortChannel = sortChannel as ColorChannel; if (sortChannel === 'r') {
group.colors.sort((a, b) => a[safeSortChannel] - b[safeSortChannel]); return a.r - b.r;
} else if (sortChannel === 'g') {
return a.g - b.g;
} else {
return a.b - b.b;
}
});
// 切分中位数 // 切分中位数
const mid = Math.floor(group.colors.length / 2); const mid = Math.floor(group.colors.length / 2);
@ -504,7 +500,7 @@ function medianCut(data: Uint8ClampedArray, levels: number): any[] {
count: group1.length, count: group1.length,
sumR: group1.reduce((sum, c) => sum + c.r, 0), sumR: group1.reduce((sum, c) => sum + c.r, 0),
sumG: group1.reduce((sum, c) => sum + c.g, 0), sumG: group1.reduce((sum, c) => sum + c.g, 0),
sumB: group1.reduce((sum, c) => sum + c.b, 0), sumB: group1.reduce((sum, c) => sum + c.b, 0)
}); });
newGroups.push({ newGroups.push({
@ -512,7 +508,7 @@ function medianCut(data: Uint8ClampedArray, levels: number): any[] {
count: group2.length, count: group2.length,
sumR: group2.reduce((sum, c) => sum + c.r, 0), sumR: group2.reduce((sum, c) => sum + c.r, 0),
sumG: group2.reduce((sum, c) => sum + c.g, 0), sumG: group2.reduce((sum, c) => sum + c.g, 0),
sumB: group2.reduce((sum, c) => sum + c.b, 0), sumB: group2.reduce((sum, c) => sum + c.b, 0)
}); });
} }

View File

@ -136,7 +136,7 @@ export default {
}); });
if (code === 200) { if (code === 200) {
taskStatus.value = TASK_STATUS.SUCCESS; taskStatus.value = TASK_STATUS.SUCCESS;
works.value = data ? [data] : []; data && works.value.push(data);
} }
}; };
@ -189,8 +189,9 @@ export default {
<Upload <Upload
action="/" action="/"
draggable draggable
multiple
customRequest={handleUpload} customRequest={handleUpload}
accept=".xlsx,.xls,.docx,.doc,.mp4,.mov,.avi,.flv,.wmv" accept=".xlsx,.xls,.docx,.doc,.mp4,.mov,.avi,.flv,.wmv,.m4v"
show-file-list={false} show-file-list={false}
> >
{{ {{

View File

@ -277,7 +277,7 @@ export default {
onClick={(e) => onDelete(e, item, index)} onClick={(e) => onDelete(e, item, index)}
/> />
<TextOverTips <TextOverTips
context={item.content} context={item.title}
line={1} line={1}
class={`cts !color-#211F24 mb-8px ${selectCardInfo.value.id === item.id ? 'bold' : ''}`} class={`cts !color-#211F24 mb-8px ${selectCardInfo.value.id === item.id ? 'bold' : ''}`}
/> />

View File

@ -158,7 +158,7 @@ export default {
}); });
if (code === 200) { if (code === 200) {
taskStatus.value = TASK_STATUS.SUCCESS; taskStatus.value = TASK_STATUS.SUCCESS;
works.value = data ? [data] : []; data && works.value.push(data);
} }
}; };
@ -220,8 +220,9 @@ export default {
<Upload <Upload
action="/" action="/"
draggable draggable
multiple
customRequest={handleUpload} customRequest={handleUpload}
accept=".xlsx,.xls,.docx,.doc,.mp4,.mov,.avi,.flv,.wmv" accept=".xlsx,.xls,.docx,.doc,.mp4,.mov,.avi,.flv,.wmv,.m4v"
show-file-list={false} show-file-list={false}
> >
{{ {{

View File

@ -278,7 +278,7 @@ export default {
onClick={(e) => onDelete(e, item, index)} onClick={(e) => onDelete(e, item, index)}
/> />
<TextOverTips <TextOverTips
context={item.content} context={item.title}
line={1} line={1}
class={`cts !color-#211F24 mb-8px ${selectCardInfo.value.id === item.id ? 'bold' : ''}`} class={`cts !color-#211F24 mb-8px ${selectCardInfo.value.id === item.id ? 'bold' : ''}`}
/> />

View File

@ -19,7 +19,7 @@
class="ignore-export" class="ignore-export"
@onReset="handleReset" @onReset="handleReset"
v-model:query="query" v-model:query="query"
@onSearch="onSearch" @onSearch="handleSearch"
:disabled="loading" :disabled="loading"
></listSearchForm> ></listSearchForm>
@ -29,6 +29,7 @@
@onSearch="onSearch" @onSearch="onSearch"
@updateQuery="handleUpdateQuery" @updateQuery="handleUpdateQuery"
/> />
<a-spin v-if="loading" tip="AI分析中" />
<div v-if="listData.total > 0" class="pagination-box flex justify-end ignore-export"> <div v-if="listData.total > 0" class="pagination-box flex justify-end ignore-export">
<a-pagination <a-pagination
@ -44,10 +45,13 @@
/> />
</div> </div>
</div> </div>
<!-- 投放建议--> <!-- 投放建议-->
<MonthData v-if="tabData == 'placement_guide'" :overview="aiResult.overview"></MonthData> <MonthData v-if="tabData == 'placement_guide'" :overview="aiResult.overview"></MonthData>
<PlacementSuggestions
<PlacementSuggestions v-if="tabData == 'placement_guide'" :optimization="aiResult.optimization"></PlacementSuggestions> v-if="tabData == 'placement_guide'"
:optimization="aiResult.optimization"
></PlacementSuggestions>
<div v-if="tabData == 'placement_guide'" class="ignore-export"> <div v-if="tabData == 'placement_guide'" class="ignore-export">
<a-space class="down-btn"> <a-space class="down-btn">
@ -132,12 +136,9 @@ const onSearch = async () => {
let result; let result;
if (tabData.value === 'placement_guide') { if (tabData.value === 'placement_guide') {
result = await getPlacementGuide(query); result = await getPlacementGuide(query);
console.log(1);
placementGuideList.value = result?.data?.data || []; placementGuideList.value = result?.data?.data || [];
if (placementGuideList.value.length > 0 && isGetAi.value) {
loading.value = true;
syncGetAiResult();
startTask();
}
} else { } else {
result = await getPlacementGuideHistory(query); result = await getPlacementGuideHistory(query);
guideHistoryList.value = result?.data?.data || []; guideHistoryList.value = result?.data?.data || [];
@ -145,6 +146,16 @@ const onSearch = async () => {
listData.total = result.data.total; listData.total = result.data.total;
isGetAi.value = true; isGetAi.value = true;
}; };
const handleSearch = async () => {
await onSearch();
if (placementGuideList.value.length > 0 && isGetAi.value) {
loading.value = true;
syncGetAiResult();
startTask();
}
};
const aiResult = reactive({ const aiResult = reactive({
optimization: [], // 投放建议优化 optimization: [], // 投放建议优化
action_guide: [], // 新投放建议生成 action_guide: [], // 新投放建议生成