Files
cunkebao_v3/Cunkebao_Uniapp/pages/content/detail.vue
2025-03-29 16:50:39 +08:00

504 lines
13 KiB
Vue
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.

<template>
<view class="detail-container">
<!-- 顶部导航栏 -->
<view class="header">
<view class="back-icon" @click="goBack">
<u-icon name="arrow-left" size="42" color="black"></u-icon>
</view>
<view class="title">内容库详情</view>
<view class="header-right">
<view class="save-btn" @click="saveContent">
<u-icon name="checkbox-mark" size="28" color="#fff"></u-icon>
<text class="save-text">保存</text>
</view>
</view>
</view>
<!-- 表单内容 -->
<view class="form-container">
<!-- 内容库名称 -->
<view class="form-item">
<view class="form-label">内容库名称</view>
<view class="form-input-box">
<input type="text" v-model="form.title" placeholder="示例内容库" class="form-input" />
</view>
</view>
<!-- 数据来源配置 -->
<view class="form-item">
<view class="form-label">数据来源配置</view>
<view class="source-buttons">
<view class="source-btn" :class="{ active: form.dataSource === 'friend' }" @click="setDataSource('friend')">
<text>选择微信好友</text>
</view>
<view class="source-btn" :class="{ active: form.dataSource === 'group' }" @click="setDataSource('group')">
<text>选择聊天群</text>
</view>
</view>
<!-- 当选择微信好友时显示 -->
<view class="friend-list-box" v-if="form.dataSource === 'friend'">
<view class="friend-select-btn" @click="showFriendSelector">
<text>选择微信好友</text>
</view>
<view class="selected-friends" v-if="form.selectedFriends.length > 0">
<view class="friend-tag" v-for="(friend, index) in form.selectedFriends" :key="index">
<text>{{friend.name || friend}}</text>
</view>
</view>
</view>
<!-- 当选择聊天群时显示 -->
<view class="group-list-box" v-if="form.dataSource === 'group'">
<view class="group-select-btn" @click="showGroupSelector">
<text>选择聊天群</text>
</view>
<view class="selected-groups" v-if="form.selectedGroups.length > 0">
<view class="group-tag" v-for="(group, index) in form.selectedGroups" :key="index">
<text>{{group.name || group}}</text>
</view>
</view>
</view>
</view>
<!-- 关键字设置 -->
<view class="form-item">
<view class="form-label">
<text>关键字设置</text>
<u-icon name="arrow-down" size="28" color="#666" @click="toggleKeywordSection"></u-icon>
</view>
</view>
<!-- 是否启用AI -->
<view class="form-item">
<view class="form-label-with-desc">
<view class="label-row">
<text>是否启用AI</text>
<u-switch v-model="form.enableAI" activeColor="#4080ff"></u-switch>
</view>
<view class="label-desc">
<text>当启用AI之后该内容库下的所有内容都会通过AI重新生成内容</text>
</view>
</view>
</view>
<!-- AI提示词 -->
<view class="form-item" v-if="form.enableAI">
<view class="form-label">AI 提示词</view>
<view class="form-textarea-box">
<textarea v-model="form.aiPrompt" placeholder="AI提示词示例" class="form-textarea" />
</view>
</view>
<!-- 时间限制 -->
<view class="form-item">
<view class="form-label">时间限制</view>
<view class="form-date-box" @click="showDatePicker">
<u-icon name="calendar" size="28" color="#666"></u-icon>
<text class="date-text">{{form.dateRange || '选择日期范围'}}</text>
</view>
</view>
<!-- 是否启用 -->
<view class="form-item">
<view class="form-label-with-switch">
<text>是否启用</text>
<u-switch v-model="form.isEnabled" activeColor="#4080ff"></u-switch>
</view>
</view>
</view>
<!-- 底部导航栏 -->
<CustomTabBar active="work"></CustomTabBar>
<!-- 微信好友选择器 -->
<FriendSelector
:show="showFriendSelectorFlag"
:selected="selectedFriendIds"
:multiple="true"
@update:show="showFriendSelectorFlag = $event"
@confirm="handleFriendConfirm"
@cancel="showFriendSelectorFlag = false"
/>
<!-- 聊天群选择器 -->
<GroupSelector
:show="showGroupSelectorFlag"
:selected="selectedGroupIds"
:multiple="true"
@update:show="showGroupSelectorFlag = $event"
@confirm="handleGroupConfirm"
@cancel="showGroupSelectorFlag = false"
/>
</view>
</template>
<script>
import CustomTabBar from '@/components/CustomTabBar.vue'
import FriendSelector from './components/FriendSelector.vue'
import GroupSelector from './components/GroupSelector.vue'
export default {
components: {
CustomTabBar,
FriendSelector,
GroupSelector
},
data() {
return {
id: '', // 编辑时的内容库ID
form: {
title: '', // 内容库名称
dataSource: 'friend', // 数据来源: friend-微信好友, group-聊天群
selectedFriends: [], // 已选择的好友
selectedGroups: [], // 已选择的群组
enableAI: true, // 是否启用AI
aiPrompt: 'AI提示词示例', // AI提示词
isKeywordExpanded: false, // 关键字设置是否展开
dateRange: '', // 时间限制
isEnabled: true // 是否启用
},
isEdit: false, // 是否为编辑模式
showFriendSelectorFlag: false, // 是否显示好友选择器
showGroupSelectorFlag: false, // 是否显示群组选择器
}
},
computed: {
// 获取已选择的好友ID列表
selectedFriendIds() {
return this.form.selectedFriends.map(friend => {
return typeof friend === 'object' ? friend.id : friend;
});
},
// 获取已选择的群组ID列表
selectedGroupIds() {
return this.form.selectedGroups.map(group => {
return typeof group === 'object' ? group.id : group;
});
}
},
onLoad(options) {
if (options.id) {
this.id = options.id;
this.isEdit = true;
this.loadContentDetail();
}
},
methods: {
// 返回上一页
goBack() {
uni.navigateBack();
},
// 设置数据来源
setDataSource(source) {
this.form.dataSource = source;
},
// 显示好友选择器
showFriendSelector() {
this.showFriendSelectorFlag = true;
},
// 显示群组选择器
showGroupSelector() {
this.showGroupSelectorFlag = true;
},
// 处理好友选择确认
handleFriendConfirm(selectedFriends) {
this.form.selectedFriends = selectedFriends;
},
// 处理群组选择确认
handleGroupConfirm(selectedGroups) {
this.form.selectedGroups = selectedGroups;
},
// 切换关键字设置区域
toggleKeywordSection() {
this.form.isKeywordExpanded = !this.form.isKeywordExpanded;
},
// 显示日期选择器
showDatePicker() {
// 这里应该调用日期选择器组件
uni.showToast({
title: '日期选择功能开发中',
icon: 'none'
});
},
// 保存内容库
saveContent() {
// 表单验证
if (!this.form.title) {
uni.showToast({
title: '请输入内容库名称',
icon: 'none'
});
return;
}
// 验证是否选择了数据来源
if (this.form.dataSource === 'friend' && this.form.selectedFriends.length === 0) {
uni.showToast({
title: '请选择微信好友',
icon: 'none'
});
return;
}
if (this.form.dataSource === 'group' && this.form.selectedGroups.length === 0) {
uni.showToast({
title: '请选择聊天群',
icon: 'none'
});
return;
}
// 在实际应用中,这里应该提交表单数据到服务器
uni.showLoading({
title: '保存中...'
});
// 模拟API请求
setTimeout(() => {
uni.hideLoading();
uni.showToast({
title: '保存成功',
icon: 'success'
});
// 返回上一页
setTimeout(() => {
uni.navigateBack();
}, 1500);
}, 1000);
},
// 加载内容库详情数据
loadContentDetail() {
// 在实际应用中,这里应该从服务器获取内容库详情
console.log('加载内容库详情:', this.id);
// 模拟数据加载
if (this.isEdit) {
// 模拟已有数据
this.form = {
title: '示例内容库',
dataSource: 'friend',
selectedFriends: ['张三', '李四'],
selectedGroups: [],
enableAI: true,
aiPrompt: 'AI提示词示例',
isKeywordExpanded: false,
dateRange: '',
isEnabled: true
};
}
}
}
}
</script>
<style lang="scss" scoped>
.detail-container {
min-height: 100vh;
background-color: #f9fafb;
padding-bottom: 150rpx; /* 为底部导航栏预留空间 */
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 25rpx 30rpx;
background-color: #fff;
border-bottom: 1px solid #f0f0f0;
.back-icon {
width: 60rpx;
color: #000;
padding: 10rpx;
border-radius: 50%;
&:active {
background-color: rgba(0, 0, 0, 0.05);
}
}
.title {
font-size: 38rpx;
font-weight: 600;
margin-left: -60rpx; /* 使标题居中 */
flex: 1;
text-align: center;
}
.header-right {
.save-btn {
display: flex;
align-items: center;
justify-content: center;
background-color: #4080ff;
border-radius: 30rpx;
padding: 12rpx 24rpx;
color: #fff;
.save-text {
font-size: 28rpx;
}
}
}
}
.form-container {
padding: 20rpx 30rpx;
.form-item {
background-color: #fff;
border-radius: 16rpx;
padding: 24rpx;
margin-bottom: 20rpx;
.form-label {
font-size: 30rpx;
font-weight: 500;
color: #333;
margin-bottom: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
.form-label-with-desc {
.label-row {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 30rpx;
font-weight: 500;
color: #333;
margin-bottom: 10rpx;
}
.label-desc {
font-size: 24rpx;
color: #999;
line-height: 1.4;
}
}
.form-label-with-switch {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 30rpx;
font-weight: 500;
color: #333;
}
.form-input-box {
.form-input {
width: 100%;
height: 80rpx;
background-color: #f5f5f5;
border-radius: 8rpx;
padding: 0 20rpx;
font-size: 28rpx;
}
}
.form-textarea-box {
.form-textarea {
width: 100%;
height: 200rpx;
background-color: #f5f5f5;
border-radius: 8rpx;
padding: 20rpx;
font-size: 28rpx;
}
}
.source-buttons {
display: flex;
margin-bottom: 20rpx;
.source-btn {
flex: 1;
height: 80rpx;
display: flex;
align-items: center;
justify-content: center;
background-color: #f5f5f5;
font-size: 28rpx;
color: #666;
&:first-child {
border-top-left-radius: 8rpx;
border-bottom-left-radius: 8rpx;
border-right: 1px solid #e0e0e0;
}
&:last-child {
border-top-right-radius: 8rpx;
border-bottom-right-radius: 8rpx;
}
&.active {
background-color: #e6f7ff;
color: #4080ff;
font-weight: 500;
}
}
}
.friend-list-box, .group-list-box {
.friend-select-btn, .group-select-btn {
width: 100%;
height: 80rpx;
display: flex;
align-items: center;
justify-content: center;
background-color: #f5f5f5;
border-radius: 8rpx;
font-size: 28rpx;
color: #666;
margin-bottom: 20rpx;
}
.selected-friends, .selected-groups {
display: flex;
flex-wrap: wrap;
.friend-tag, .group-tag {
background-color: #f5f5f5;
border-radius: 30rpx;
padding: 10rpx 20rpx;
margin-right: 15rpx;
margin-bottom: 15rpx;
font-size: 26rpx;
color: #666;
}
}
}
.form-date-box {
width: 100%;
height: 80rpx;
display: flex;
align-items: center;
background-color: #f5f5f5;
border-radius: 8rpx;
padding: 0 20rpx;
.date-text {
margin-left: 10rpx;
font-size: 28rpx;
color: #999;
}
}
}
}
</style>