|
|
@@ -3,28 +3,11 @@
|
|
|
<!-- 搜索栏 -->
|
|
|
<view class="search-bar" @click="goToSearch">
|
|
|
<text class="search-icon">🔍</text>
|
|
|
- <text class="search-placeholder">搜索有声书...</text>
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 分类标签栏 -->
|
|
|
- <view class="category-bar">
|
|
|
- <scroll-view class="category-scroll" scroll-x="true" :show-scrollbar="false">
|
|
|
- <view class="category-list">
|
|
|
- <view
|
|
|
- v-for="cat in categories"
|
|
|
- :key="cat.id"
|
|
|
- class="category-item"
|
|
|
- :class="{ active: selectedCategory === cat.id }"
|
|
|
- @click="selectCategory(cat.id)"
|
|
|
- >
|
|
|
- <text class="category-name">{{ cat.name }}</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </scroll-view>
|
|
|
+ <text class="search-placeholder">搜索专辑...</text>
|
|
|
</view>
|
|
|
|
|
|
<!-- 骨架屏加载状态 -->
|
|
|
- <scroll-view scroll-y class="audio-list" @scrolltolower="loadMore" v-if="loading && audioList.length === 0">
|
|
|
+ <scroll-view scroll-y class="album-list" @scrolltolower="loadMore" v-if="loading && albumList.length === 0">
|
|
|
<view class="skeleton-grid">
|
|
|
<view v-for="i in 6" :key="i" class="skeleton-card">
|
|
|
<view class="skeleton-cover"></view>
|
|
|
@@ -36,31 +19,29 @@
|
|
|
</view>
|
|
|
</scroll-view>
|
|
|
|
|
|
- <!-- 音频列表 -->
|
|
|
- <scroll-view scroll-y class="audio-list" @scrolltolower="loadMore" v-else>
|
|
|
- <view v-if="audioList.length === 0 && !loading" class="empty">
|
|
|
- <text class="empty-icon">🎵</text>
|
|
|
- <text class="empty-text">暂无音频</text>
|
|
|
- <text class="empty-hint">点击下方按钮生成第一个音频</text>
|
|
|
+ <!-- 专辑列表 -->
|
|
|
+ <scroll-view scroll-y class="album-list" @scrolltolower="loadMore" v-else>
|
|
|
+ <view v-if="albumList.length === 0 && !loading" class="empty">
|
|
|
+ <text class="empty-icon">📚</text>
|
|
|
+ <text class="empty-text">暂无专辑</text>
|
|
|
+ <text class="empty-hint">点击下方按钮创建第一个专辑</text>
|
|
|
</view>
|
|
|
|
|
|
- <view v-else class="audio-grid">
|
|
|
+ <view v-else class="album-grid">
|
|
|
<view
|
|
|
- v-for="item in audioList"
|
|
|
- :key="item._id"
|
|
|
- class="audio-card"
|
|
|
- @click="playAudio(item)"
|
|
|
+ v-for="item in albumList"
|
|
|
+ :key="item.id"
|
|
|
+ class="album-card"
|
|
|
+ @click="goToAlbumDetail(item)"
|
|
|
>
|
|
|
- <view class="audio-cover" :style="{ background: getCoverGradient(item.voiceId) }">
|
|
|
+ <view class="album-cover" :style="{ background: getCoverGradient(item) }">
|
|
|
<text class="cover-icon">🎵</text>
|
|
|
- <view class="play-overlay">
|
|
|
- <text class="play-icon">▶</text>
|
|
|
- </view>
|
|
|
- <text class="audio-duration-badge">{{ formatDuration(item.audioDuration) }}</text>
|
|
|
+ <view class="album-count">{{ item.audioCount || 0 }}个音频</view>
|
|
|
</view>
|
|
|
- <view class="audio-info">
|
|
|
- <text class="audio-title">{{ item.title }}</text>
|
|
|
- <text class="audio-meta">{{ item.wordCount }}字 · {{ formatDate(item.createdAt) }}</text>
|
|
|
+ <view class="album-info">
|
|
|
+ <text class="album-title">{{ item.name }}</text>
|
|
|
+ <text class="album-desc">{{ item.description || '暂无描述' }}</text>
|
|
|
+ <text class="album-meta">{{ item.subscriberCount || 0 }}人订阅</text>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
@@ -69,13 +50,17 @@
|
|
|
<text>加载中...</text>
|
|
|
</view>
|
|
|
|
|
|
- <view v-if="!hasMore && audioList.length > 0" class="no-more">
|
|
|
+ <view v-if="!hasMore && albumList.length > 0" class="no-more">
|
|
|
<text>没有更多了</text>
|
|
|
</view>
|
|
|
</scroll-view>
|
|
|
|
|
|
- <!-- 底部生成按钮 -->
|
|
|
+ <!-- 底部操作按钮 -->
|
|
|
<view class="bottom-bar">
|
|
|
+ <button class="action-btn" @click="goToAlbums">
|
|
|
+ <text class="btn-icon">📚</text>
|
|
|
+ <text class="btn-text">管理专辑</text>
|
|
|
+ </button>
|
|
|
<button class="generate-btn" @click="handleGenerate">
|
|
|
<text class="btn-icon">+</text>
|
|
|
<text class="btn-text">新建生成</text>
|
|
|
@@ -87,66 +72,45 @@
|
|
|
<script setup lang="ts">
|
|
|
import { ref, onMounted } from 'vue';
|
|
|
import { onShow } from '@dcloudio/uni-app';
|
|
|
-import { useUserStore } from '../../store/user';
|
|
|
-import { useAudioStore } from '../../store/audio';
|
|
|
import { get } from '../../utils/request';
|
|
|
-import type { AudioItem } from '../../types';
|
|
|
-
|
|
|
-const userStore = useUserStore();
|
|
|
-const audioStore = useAudioStore();
|
|
|
-
|
|
|
-// 音色封面颜色映射
|
|
|
-const voiceColors: Record<string, string[]> = {
|
|
|
- cherry: ['#667eea', '#764ba2'],
|
|
|
- ethan: ['#f093fb', '#f5576c'],
|
|
|
- serena: ['#4facfe', '#00f2fe'],
|
|
|
- chelsie: ['#43e97b', '#38f9d7'],
|
|
|
- momo: ['#fa709a', '#fee140'],
|
|
|
- vivian: ['#a8edea', '#fed6e3'],
|
|
|
- moon: ['#5ee7df', '#b490ca'],
|
|
|
- maia: ['#d299c2', '#fef9d7'],
|
|
|
- kai: ['#89f7fe', '#66a6ff'],
|
|
|
- nofish: ['#cd9cf2', '#f6f3ff'],
|
|
|
-};
|
|
|
-
|
|
|
-// 音频列表状态
|
|
|
-const audioList = ref<AudioItem[]>([]);
|
|
|
+
|
|
|
+interface Album {
|
|
|
+ id: number;
|
|
|
+ name: string;
|
|
|
+ description?: string;
|
|
|
+ coverUrl?: string;
|
|
|
+ subscriberCount: number;
|
|
|
+ audioCount: number;
|
|
|
+ isDefault: boolean;
|
|
|
+}
|
|
|
+
|
|
|
+const albumList = ref<Album[]>([]);
|
|
|
const page = ref(1);
|
|
|
const pageSize = 20;
|
|
|
const total = ref(0);
|
|
|
const loading = ref(false);
|
|
|
const hasMore = ref(true);
|
|
|
|
|
|
-// 分类状态
|
|
|
-interface Category {
|
|
|
- id: number;
|
|
|
- name: string;
|
|
|
-}
|
|
|
-const categories = ref<Category[]>([
|
|
|
- { id: 1, name: '推荐' },
|
|
|
- { id: 2, name: '故事' },
|
|
|
- { id: 3, name: '小说' },
|
|
|
- { id: 4, name: '儿童' },
|
|
|
- { id: 5, name: '知识' },
|
|
|
- { id: 6, name: '娱乐' },
|
|
|
-]);
|
|
|
-const selectedCategory = ref(1);
|
|
|
+// 封面颜色映射
|
|
|
+const coverColors = [
|
|
|
+ ['#4f46e5', '#818cf8'],
|
|
|
+ ['#ef4444', '#f87171'],
|
|
|
+ ['#f97316', '#fb923c'],
|
|
|
+ ['#22c55e', '#4ade80'],
|
|
|
+ ['#3b82f6', '#60a5fa'],
|
|
|
+ ['#a855f7', '#c084fc'],
|
|
|
+ ['#ec4899', '#f472b6'],
|
|
|
+ ['#14b8a6', '#2dd4bf'],
|
|
|
+];
|
|
|
|
|
|
// 获取封面渐变色
|
|
|
-function getCoverGradient(voiceId: string): string {
|
|
|
- const colors = voiceColors[voiceId] || ['#667eea', '#764ba2'];
|
|
|
+function getCoverGradient(item: Album): string {
|
|
|
+ const colors = coverColors[item.id % coverColors.length] || coverColors[0];
|
|
|
return `linear-gradient(135deg, ${colors[0]} 0%, ${colors[1]} 100%)`;
|
|
|
}
|
|
|
|
|
|
-// 选择分类
|
|
|
-async function selectCategory(categoryId: number) {
|
|
|
- selectedCategory.value = categoryId;
|
|
|
- page.value = 1;
|
|
|
- await fetchAudioList();
|
|
|
-}
|
|
|
-
|
|
|
-// 获取音频列表
|
|
|
-async function fetchAudioList(isLoadMore = false) {
|
|
|
+// 获取专辑列表
|
|
|
+async function fetchAlbumList(isLoadMore = false) {
|
|
|
if (loading.value) return;
|
|
|
if (!isLoadMore) {
|
|
|
page.value = 1;
|
|
|
@@ -154,21 +118,20 @@ async function fetchAudioList(isLoadMore = false) {
|
|
|
|
|
|
loading.value = true;
|
|
|
try {
|
|
|
- // 使用分类API
|
|
|
- const result = await get<{ list: AudioItem[]; total: number; totalPages: number }>(`/categories/${selectedCategory.value}`, {
|
|
|
+ const result = await get<{ list: Album[]; total: number; totalPages: number }>('/albums', {
|
|
|
page: page.value,
|
|
|
pageSize,
|
|
|
});
|
|
|
|
|
|
if (isLoadMore) {
|
|
|
- audioList.value.push(...result.list);
|
|
|
+ albumList.value.push(...result.list);
|
|
|
} else {
|
|
|
- audioList.value = result.list;
|
|
|
+ albumList.value = result.list;
|
|
|
}
|
|
|
total.value = result.total;
|
|
|
hasMore.value = page.value < result.totalPages;
|
|
|
} catch (error) {
|
|
|
- console.error('获取音频列表失败:', error);
|
|
|
+ console.error('获取专辑列表失败:', error);
|
|
|
} finally {
|
|
|
loading.value = false;
|
|
|
}
|
|
|
@@ -178,40 +141,18 @@ async function fetchAudioList(isLoadMore = false) {
|
|
|
function loadMore() {
|
|
|
if (hasMore.value && !loading.value) {
|
|
|
page.value++;
|
|
|
- fetchAudioList(true);
|
|
|
+ fetchAlbumList(true);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// 播放音频
|
|
|
-function playAudio(item: AudioItem) {
|
|
|
- audioStore.play(item);
|
|
|
- uni.navigateTo({ url: `/pages/player/index?id=${item._id}` });
|
|
|
+// 跳转专辑详情
|
|
|
+function goToAlbumDetail(item: Album) {
|
|
|
+ uni.navigateTo({ url: `/pages/album/index?id=${item.id}` });
|
|
|
}
|
|
|
|
|
|
-// 格式化时长
|
|
|
-function formatDuration(seconds: number): string {
|
|
|
- const mins = Math.floor(seconds / 60);
|
|
|
- const secs = Math.floor(seconds % 60);
|
|
|
- return `${mins}:${secs.toString().padStart(2, '0')}`;
|
|
|
-}
|
|
|
-
|
|
|
-// 格式化日期
|
|
|
-function formatDate(dateStr: string): string {
|
|
|
- const date = new Date(dateStr);
|
|
|
- const now = new Date();
|
|
|
- const diff = now.getTime() - date.getTime();
|
|
|
- const days = Math.floor(diff / (1000 * 60 * 60 * 24));
|
|
|
-
|
|
|
- if (days === 0) return '今天';
|
|
|
- if (days === 1) return '昨天';
|
|
|
- if (days < 7) return `${days}天前`;
|
|
|
-
|
|
|
- return `${date.getMonth() + 1}/${date.getDate()}`;
|
|
|
-}
|
|
|
-
|
|
|
-// 点击用户头像
|
|
|
-function handleUserClick() {
|
|
|
- uni.navigateTo({ url: '/pages/mine/index' });
|
|
|
+// 跳转专辑管理页
|
|
|
+function goToAlbums() {
|
|
|
+ uni.navigateTo({ url: '/pages/albums/index' });
|
|
|
}
|
|
|
|
|
|
// 跳转搜索页
|
|
|
@@ -226,12 +167,12 @@ function handleGenerate() {
|
|
|
|
|
|
// 初始化
|
|
|
onMounted(async () => {
|
|
|
- await fetchAudioList();
|
|
|
+ await fetchAlbumList();
|
|
|
});
|
|
|
|
|
|
// 页面显示时刷新
|
|
|
onShow(() => {
|
|
|
- fetchAudioList();
|
|
|
+ fetchAlbumList();
|
|
|
});
|
|
|
</script>
|
|
|
|
|
|
@@ -257,79 +198,19 @@ onShow(() => {
|
|
|
z-index: 100;
|
|
|
}
|
|
|
|
|
|
-.search-bar-inner {
|
|
|
- flex: 1;
|
|
|
- height: 64rpx;
|
|
|
- background: rgba(255, 255, 255, 0.2);
|
|
|
- border-radius: 32rpx;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- padding: 0 24rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.search-bar .search-icon {
|
|
|
+.search-icon {
|
|
|
font-size: 28rpx;
|
|
|
margin-right: 12rpx;
|
|
|
}
|
|
|
|
|
|
-.search-bar .search-placeholder {
|
|
|
+.search-placeholder {
|
|
|
font-size: 26rpx;
|
|
|
color: rgba(255, 255, 255, 0.8);
|
|
|
}
|
|
|
|
|
|
-.category-bar {
|
|
|
- position: fixed;
|
|
|
- top: 100rpx;
|
|
|
- left: 0;
|
|
|
- right: 0;
|
|
|
- background: #ffffff;
|
|
|
- z-index: 99;
|
|
|
- box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
|
|
-}
|
|
|
-
|
|
|
-.category-scroll {
|
|
|
- width: 100%;
|
|
|
- white-space: nowrap;
|
|
|
-}
|
|
|
-
|
|
|
-.category-list {
|
|
|
- display: inline-flex;
|
|
|
- gap: 16rpx;
|
|
|
- padding: 16rpx 24rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.category-item {
|
|
|
- padding: 12rpx 32rpx;
|
|
|
- font-size: 28rpx;
|
|
|
- color: #666;
|
|
|
- flex-shrink: 0;
|
|
|
- position: relative;
|
|
|
-}
|
|
|
-
|
|
|
-.category-item.active {
|
|
|
- color: #4f46e5;
|
|
|
- font-weight: 600;
|
|
|
-}
|
|
|
-
|
|
|
-.category-item.active::after {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- bottom: 0;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- width: 40rpx;
|
|
|
- height: 6rpx;
|
|
|
- background: #4f46e5;
|
|
|
- border-radius: 3rpx;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-.audio-list {
|
|
|
- padding-top: 160rpx;
|
|
|
- height: calc(100vh - 160rpx);
|
|
|
+.album-list {
|
|
|
+ padding-top: 120rpx;
|
|
|
+ height: calc(100vh - 120rpx);
|
|
|
}
|
|
|
|
|
|
.empty {
|
|
|
@@ -340,20 +221,6 @@ onShow(() => {
|
|
|
padding: 200rpx 0;
|
|
|
}
|
|
|
|
|
|
-.empty .login-btn {
|
|
|
- margin-top: 32rpx;
|
|
|
- padding: 16rpx 48rpx;
|
|
|
- background: linear-gradient(135deg, #4f46e5 0%, #818cf8 100%);
|
|
|
- border-radius: 44rpx;
|
|
|
- border: none;
|
|
|
- font-size: 28rpx;
|
|
|
- color: #ffffff;
|
|
|
-}
|
|
|
-
|
|
|
-.empty .login-btn::after {
|
|
|
- border: none;
|
|
|
-}
|
|
|
-
|
|
|
.empty-icon {
|
|
|
font-size: 120rpx;
|
|
|
margin-bottom: 24rpx;
|
|
|
@@ -370,14 +237,14 @@ onShow(() => {
|
|
|
color: #9ca3af;
|
|
|
}
|
|
|
|
|
|
-.audio-grid {
|
|
|
+.album-grid {
|
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
|
padding: 24rpx;
|
|
|
gap: 20rpx;
|
|
|
}
|
|
|
|
|
|
-.audio-card {
|
|
|
+.album-card {
|
|
|
width: calc(50% - 10rpx);
|
|
|
background: #ffffff;
|
|
|
border-radius: 16rpx;
|
|
|
@@ -385,10 +252,10 @@ onShow(() => {
|
|
|
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
|
|
|
}
|
|
|
|
|
|
-.audio-cover {
|
|
|
+.album-cover {
|
|
|
position: relative;
|
|
|
width: 100%;
|
|
|
- height: 240rpx;
|
|
|
+ height: 200rpx;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
@@ -399,38 +266,7 @@ onShow(() => {
|
|
|
opacity: 0.6;
|
|
|
}
|
|
|
|
|
|
-.play-overlay {
|
|
|
- position: absolute;
|
|
|
- top: 0;
|
|
|
- left: 0;
|
|
|
- right: 0;
|
|
|
- bottom: 0;
|
|
|
- background: rgba(0, 0, 0, 0.2);
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- opacity: 0;
|
|
|
- transition: opacity 0.3s;
|
|
|
-}
|
|
|
-
|
|
|
-.audio-card:active .play-overlay {
|
|
|
- opacity: 1;
|
|
|
-}
|
|
|
-
|
|
|
-.play-icon {
|
|
|
- width: 80rpx;
|
|
|
- height: 80rpx;
|
|
|
- background: rgba(255, 255, 255, 0.9);
|
|
|
- border-radius: 50%;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- font-size: 32rpx;
|
|
|
- color: #4f46e5;
|
|
|
- padding-left: 8rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.audio-duration-badge {
|
|
|
+.album-count {
|
|
|
position: absolute;
|
|
|
bottom: 12rpx;
|
|
|
right: 12rpx;
|
|
|
@@ -441,11 +277,11 @@ onShow(() => {
|
|
|
border-radius: 8rpx;
|
|
|
}
|
|
|
|
|
|
-.audio-info {
|
|
|
+.album-info {
|
|
|
padding: 20rpx;
|
|
|
}
|
|
|
|
|
|
-.audio-title {
|
|
|
+.album-title {
|
|
|
font-size: 28rpx;
|
|
|
font-weight: 500;
|
|
|
color: #1f2937;
|
|
|
@@ -456,7 +292,17 @@ onShow(() => {
|
|
|
margin-bottom: 8rpx;
|
|
|
}
|
|
|
|
|
|
-.audio-meta {
|
|
|
+.album-desc {
|
|
|
+ font-size: 22rpx;
|
|
|
+ color: #9ca3af;
|
|
|
+ display: block;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+ margin-bottom: 8rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.album-meta {
|
|
|
font-size: 22rpx;
|
|
|
color: #9ca3af;
|
|
|
}
|
|
|
@@ -473,43 +319,6 @@ onShow(() => {
|
|
|
color: #9ca3af;
|
|
|
}
|
|
|
|
|
|
-.bottom-bar {
|
|
|
- position: fixed;
|
|
|
- bottom: 0;
|
|
|
- left: 0;
|
|
|
- right: 0;
|
|
|
- padding: 20rpx 32rpx;
|
|
|
- padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
|
|
|
- background: #ffffff;
|
|
|
- box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.04);
|
|
|
-}
|
|
|
-
|
|
|
-.generate-btn {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- height: 88rpx;
|
|
|
- background: linear-gradient(135deg, #4f46e5 0%, #818cf8 100%);
|
|
|
- border-radius: 44rpx;
|
|
|
- border: none;
|
|
|
-}
|
|
|
-
|
|
|
-.generate-btn::after {
|
|
|
- border: none;
|
|
|
-}
|
|
|
-
|
|
|
-.btn-icon {
|
|
|
- font-size: 36rpx;
|
|
|
- color: #ffffff;
|
|
|
- margin-right: 8rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.btn-text {
|
|
|
- font-size: 32rpx;
|
|
|
- font-weight: 600;
|
|
|
- color: #ffffff;
|
|
|
-}
|
|
|
-
|
|
|
/* 骨架屏样式 */
|
|
|
.skeleton-grid {
|
|
|
display: flex;
|
|
|
@@ -527,7 +336,7 @@ onShow(() => {
|
|
|
|
|
|
.skeleton-cover {
|
|
|
width: 100%;
|
|
|
- height: 240rpx;
|
|
|
+ height: 200rpx;
|
|
|
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
|
|
|
background-size: 200% 100%;
|
|
|
animation: shimmer 1.5s infinite;
|
|
|
@@ -560,4 +369,64 @@ onShow(() => {
|
|
|
0% { background-position: 200% 0; }
|
|
|
100% { background-position: -200% 0; }
|
|
|
}
|
|
|
+
|
|
|
+/* 底部操作栏 */
|
|
|
+.bottom-bar {
|
|
|
+ position: fixed;
|
|
|
+ bottom: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ display: flex;
|
|
|
+ gap: 20rpx;
|
|
|
+ padding: 20rpx 32rpx;
|
|
|
+ padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
|
|
|
+ background: #ffffff;
|
|
|
+ box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.04);
|
|
|
+}
|
|
|
+
|
|
|
+.action-btn {
|
|
|
+ flex: 1;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ height: 88rpx;
|
|
|
+ background: #f5f5f5;
|
|
|
+ border-radius: 44rpx;
|
|
|
+ border: none;
|
|
|
+}
|
|
|
+
|
|
|
+.action-btn::after {
|
|
|
+ border: none;
|
|
|
+}
|
|
|
+
|
|
|
+.generate-btn {
|
|
|
+ flex: 2;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ height: 88rpx;
|
|
|
+ background: linear-gradient(135deg, #4f46e5 0%, #818cf8 100%);
|
|
|
+ border-radius: 44rpx;
|
|
|
+ border: none;
|
|
|
+}
|
|
|
+
|
|
|
+.generate-btn::after {
|
|
|
+ border: none;
|
|
|
+}
|
|
|
+
|
|
|
+.btn-icon {
|
|
|
+ font-size: 32rpx;
|
|
|
+ color: #ffffff;
|
|
|
+ margin-right: 8rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.btn-text {
|
|
|
+ font-size: 28rpx;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #ffffff;
|
|
|
+}
|
|
|
+
|
|
|
+.action-btn .btn-text {
|
|
|
+ color: #333;
|
|
|
+}
|
|
|
</style>
|