新增短视频列表和短视频tabs

master
于肖磊 2026-02-27 16:25:13 +08:00
parent 48662fb4e7
commit c29da34d19
6 changed files with 107 additions and 51 deletions

View File

@ -12,47 +12,47 @@
"format": "prettier --write src/"
},
"dependencies": {
"@types/dompurify": "^3.0.5",
"@types/qrcode": "^1.5.5",
"@vueuse/core": "^10.2.1",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.4.0",
"dompurify": "^3.1.6",
"@types/dompurify": "3.0.5",
"@types/qrcode": "1.5.5",
"@vueuse/core": "10.2.1",
"@wangeditor/editor": "5.1.23",
"@wangeditor/editor-for-vue": "5.1.12",
"axios": "1.4.0",
"dompurify": "3.1.6",
"element-plus": "2.8.1",
"pinia": "^2.1.3",
"qrcode": "^1.5.4",
"swiper": "^11.1.5",
"terser": "^5.31.5",
"tsparticles": "^2.11.0",
"unocss": "^0.53.5",
"vue": "^3.3.4",
"vue-draggable-plus": "^0.5.0",
"vue-router": "^4.0.13",
"vue3-draggable-resizable": "^1.6.5"
"pinia": "2.1.3",
"qrcode": "1.5.4",
"swiper": "11.1.5",
"terser": "5.31.5",
"tsparticles": "2.11.0",
"unocss": "0.53.5",
"vue": "3.3.4",
"vue-draggable-plus": "0.5.0",
"vue-router": "4.0.13",
"vue3-draggable-resizable": "1.6.5"
},
"devDependencies": {
"@iconify-json/ep": "^1.1.11",
"@rushstack/eslint-patch": "^1.2.0",
"@tsconfig/node18": "^2.0.1",
"@types/sortablejs": "^1.15.8",
"@vitejs/plugin-vue": "^4.2.3",
"@vue/eslint-config-prettier": "^7.1.0",
"@vue/eslint-config-typescript": "^11.0.3",
"@vue/tsconfig": "^0.4.0",
"eslint": "^8.39.0",
"eslint-plugin-vue": "^9.11.0",
"@iconify-json/ep": "1.1.11",
"@rushstack/eslint-patch": "1.2.0",
"@tsconfig/node18": "2.0.1",
"@types/sortablejs": "1.15.8",
"@vitejs/plugin-vue": "4.2.3",
"@vue/eslint-config-prettier": "7.1.0",
"@vue/eslint-config-typescript": "11.0.3",
"@vue/tsconfig": "0.4.0",
"eslint": "8.39.0",
"eslint-plugin-vue": "9.11.0",
"fast-glob": "3.2.11",
"npm-run-all": "^4.1.5",
"prettier": "^3.0.0",
"npm-run-all": "4.1.5",
"prettier": "3.0.0",
"sass": "1.63.6",
"typescript": "~5.0.4",
"unplugin-auto-import": "^0.16.6",
"unplugin-icons": "^0.16.3",
"unplugin-vue-components": "^0.25.1",
"vite": "^4.3.9",
"unplugin-auto-import": "0.16.6",
"unplugin-icons": "0.16.3",
"unplugin-vue-components": "0.25.1",
"vite": "4.3.9",
"vite-plugin-svg-icons": "2.0.1",
"vue-tsc": "^1.6.5",
"vue3-particles": "^2.10.1"
"vue-tsc": "1.6.5",
"vue3-particles": "2.10.1"
}
}

View File

@ -40,12 +40,15 @@
</el-form-item>
</template>
<!-- 文章 博客-->
<template v-else-if="['blog', 'article'].includes(type)">
<el-form-item :label="`${ type === 'article' ? '文章' : '博客' }分类`">
<el-select v-model="form.category_ids" multiple collapse-tags filterable :placeholder="`请选择${ type === 'article' ? '文章' : '博客' }分类`">
<template v-else-if="['blog', 'article', 'plugins_video'].includes(type)">
<el-form-item :label="`${ type === 'article' ? '文章' : type === 'plugins_video' ? '视频' : '博客' }分类`">
<el-select v-model="form.category_ids" multiple collapse-tags filterable :placeholder="`请选择${ type === 'article' ? '文章' : type === 'plugins_video' ? '视频' : '博客' }分类`">
<template v-if="type === 'article'">
<el-option v-for="item in common_store.common.article_category" :key="item.id" :label="item.name" :value="item.id" />
</template>
<template v-else-if="type === 'plugins_video'">
<el-option v-for="item in get_data_list(common_store.common.plugins, 'video.category_list')" :key="item.id" :label="item.name" :value="item.id" />
</template>
<template v-else>
<el-option v-for="item in get_data_list(common_store.common.plugins, 'blog.category_list')" :key="item.id" :label="item.name" :value="item.id" />
</template>
@ -59,20 +62,39 @@
<template v-if="type === 'article'">
<el-radio v-for="item in common_store.common.article_order_by_type_list" :key="item.index" :value="item.index">{{ item.name }}</el-radio>
</template>
<template v-else-if="type === 'plugins_video'">
<el-radio v-for="item in get_data_list(common_store.common.plugins, 'video.search_order_by_list')" :key="item.index" :value="item.index">{{ item.name }}</el-radio>
</template>
<template v-else>
<el-radio v-for="item in get_data_list(common_store.common.plugins, 'blog.order_by_type_list')" :key="item.index" :value="item.index">{{ item.name }}</el-radio>
</template>
</el-radio-group>
</el-form-item>
<el-form-item label="排序规则">
<el-radio-group v-model="form.order_by_rule">
<el-radio v-for="item in common_store.common.data_order_by_rule_list" :key="item.index" :value="item.index">{{ item.name }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="封面图片">
<el-switch v-model="form.is_cover" active-value="1" inactive-value="0" />
</el-form-item>
<template v-if="['blog', 'blog-tabs'].includes(type)">
<template v-if="['blog', 'blog-tabs', 'article'].includes(type)">
<el-form-item label="排序规则">
<el-radio-group v-model="form.order_by_rule">
<el-radio v-for="item in common_store.common.data_order_by_rule_list" :key="item.index" :value="item.index">{{ item.name }}</el-radio>
</el-radio-group>
</el-form-item>
</template>
<template v-else>
<el-form-item label="发布时间">
<el-radio-group v-model="form.order_by_release_time_rule">
<el-radio v-for="item in get_data_list(common_store.common.plugins, 'video.search_release_time_list')" :key="item.index" :value="item.index">{{ item.name }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="视频时长">
<el-radio-group v-model="form.order_by_duration_rule">
<el-radio v-for="item in get_data_list(common_store.common.plugins, 'video.search_duration_list')" :key="item.index" :value="item.index">{{ item.name }}</el-radio>
</el-radio-group>
</el-form-item>
</template>
<template v-if="['blog', 'blog-tabs', 'article'].includes(type)">
<el-form-item label="封面图片">
<el-switch v-model="form.is_cover" active-value="1" inactive-value="0" />
</el-form-item>
</template>
<template v-if="['blog', 'blog-tabs', 'plugins_video'].includes(type)">
<el-form-item label="是否推荐">
<el-switch v-model="form.is_recommended" active-value="1" inactive-value="0" />
</el-form-item>
@ -278,7 +300,7 @@
default: () => {},
},
type: {
type: String as PropType<'goods' | 'blog' | 'article' | 'binding' | 'realstore' | 'merchant' | 'ask' | 'activity' | 'coupon'>,
type: String as PropType<'goods' | 'blog' | 'article' | 'binding' | 'realstore' | 'merchant' | 'ask' | 'activity' | 'coupon' | 'plugins_video'>,
default: 'goods',
}
});
@ -344,6 +366,11 @@
imgParam: 'logo',
titleParam: 'title',
},
plugins_video: {
optionListKey: 'brand_data_type_list',
imgParam: '',
titleParam: 'title',
},
};
type config_type = {
optionListKey: string,
@ -362,8 +389,14 @@
keywords.value = props.value.keywords;
form.value = props.value;
//
form.value.order_by_type = Number(props.value?.order_by_type || 0);
form.value.order_by_rule = Number(props.value?.order_by_rule || 0);
if (props.type !== 'plugins_video') {
form.value.order_by_type = Number(props.value?.order_by_type || 0);
form.value.order_by_rule = Number(props.value?.order_by_rule || 0);
} else {
form.value.order_by_type = props.value?.order_by_type || 'default';
form.value.order_by_release_time_rule = props.value?.order_by_release_time_rule || 'default';
form.value.order_by_duration_rule = props.value?.order_by_duration_rule || 'default';
}
drag_list.value = props.list;
});
const keyword_blur = () => {

View File

@ -150,6 +150,14 @@
<template v-else-if="item.key == 'activity'">
<model-activity :key="item.com_data" :value="item.com_data"></model-activity>
</template>
<!-- 视频列表 -->
<template v-else-if="item.key == 'plugins-video'">
<model-plugins-video-list :key="item.com_data" :value="item.com_data"></model-plugins-video-list>
</template>
<!-- 视频选项卡 -->
<template v-else-if="item.key == 'plugins-video-tabs'">
<model-plugins-video-tabs :key="item.com_data" :value="item.com_data"></model-plugins-video-tabs>
</template>
<!-- 工具组件 -->
<!-- 辅助线 -->
<template v-else-if="item.key == 'row-line'">

View File

@ -1,6 +1,6 @@
.siderbar {
width: 34rem;
padding: 0.5rem 3rem;
padding: 0.5rem 1rem;
background-color: #fff;
overflow: auto;
.el-collapse {

View File

@ -35,6 +35,9 @@ import defaultAskTabs from '@/config/const/ask-tabs';
import defaultActivity from '@/config/const/activity';
import defaultGoodsMagic from '@/config/const/goods-magic';
import defaultTabsMagic from '@/config/const/tabs-magic';
import defaultPluginsVideo from '@/config/const/plugins-video-list';
import defaultPluginsVideoTabs from '@/config/const/plugins-video-tabs';
// 系统设置
interface DefaultSettings {
@ -46,6 +49,8 @@ interface DefaultSettings {
article_tabs: object;
blog: object;
blog_tabs: object;
plugins_video: object;
plugins_video_tabs: object;
row_line: object;
auxiliary_blank: object;
rich_text: object;
@ -86,6 +91,8 @@ const defaultSettings: DefaultSettings = {
article_tabs: defaultArticleTabs,
blog: defaultBlogList,
blog_tabs: defaultBlogTabs,
plugins_video: defaultPluginsVideo,
plugins_video_tabs: defaultPluginsVideoTabs,
row_line: defaultRowLine,
auxiliary_blank: defaultAuxiliaryBlank,
rich_text: defaultRichText,

View File

@ -134,6 +134,14 @@
<template v-else-if="value.key == 'ask-tabs'">
<model-ask-tabs-setting :type="radio" :value="value.com_data"></model-ask-tabs-setting>
</template>
<!-- 短视频 -->
<template v-else-if="value.key == 'plugins-video'">
<model-plugins-video-list-setting :type="radio" :value="value.com_data"></model-plugins-video-list-setting>
</template>
<!-- 短视频选项卡 -->
<template v-else-if="value.key == 'plugins-video-tabs'">
<model-plugins-video-tabs-setting :type="radio" :value="value.com_data"></model-plugins-video-tabs-setting>
</template>
<!-- 活动配置 -->
<template v-else-if="value.key == 'activity'">
<model-activity-setting :type="radio" :value="value.com_data"></model-activity-setting>