feat:首页完成

This commit is contained in:
李伊帆
2026-09-11 08:02:01 +08:00
parent 5b31eac508
commit 173cd6b975
68 changed files with 3181 additions and 112 deletions

View File

@@ -0,0 +1,335 @@
<script setup lang="ts">
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import { getBusinessDetail } from '@/constants/business-detail'
import type { BusinessDetailContent } from '@/types/business-detail'
import { navigateBackWithFallback } from '@/utils/navigate-back'
import heroBg from '@/static/icons/background.png'
const detail = ref<BusinessDetailContent | null>(null)
onLoad((options) => {
const id = (options?.id as string) || 'software'
detail.value = getBusinessDetail(id) || null
if (!detail.value) {
uni.showToast({ title: '业务详情不存在', icon: 'none' })
setTimeout(() => uni.navigateBack(), 1500)
}
})
function handleBack() {
navigateBackWithFallback('/pages/home-index/index')
}
function handleSubmit() {
if (!detail.value)
return
uni.navigateTo({
url: `/pages/home-index/requirement-submit/index?businessType=${encodeURIComponent(detail.value.title)}&detailId=${detail.value.id}`,
})
}
</script>
<template>
<view
v-if="detail"
class="business-detail"
>
<view class="business-detail__navbar">
<view
class="business-detail__back"
@tap="handleBack"
>
<image
class="business-detail__back-icon"
src="/static/icons/icon-back.svg"
mode="aspectFit"
/>
</view>
<text class="business-detail__navbar-title">
业务详情
</text>
<view class="business-detail__navbar-placeholder" />
</view>
<scroll-view
class="business-detail__scroll"
scroll-y
:show-scrollbar="false"
>
<view class="business-detail__hero">
<image
class="business-detail__hero-bg"
:src="heroBg"
mode="scaleToFill"
/>
<view class="business-detail__hero-inner">
<image
class="business-detail__hero-icon"
:src="detail.icon"
mode="aspectFit"
/>
<text class="business-detail__hero-title">
{{ detail.title }}
</text>
<text class="business-detail__hero-subtitle">
{{ detail.subtitle }}
</text>
</view>
</view>
<view class="business-detail__section">
<text class="business-detail__section-title">
服务类型
</text>
<view class="business-detail__type-row">
<view
v-for="type in detail.serviceTypes"
:key="type.id"
class="business-detail__type-item"
>
<image
class="business-detail__type-icon"
:src="type.icon"
mode="aspectFit"
/>
<text class="business-detail__type-label">
{{ type.label }}
</text>
</view>
</view>
</view>
<view class="business-detail__section">
<text class="business-detail__section-title">
{{ detail.contentTitle }}
</text>
<view class="business-detail__video">
<view class="business-detail__video-play">
<text class="business-detail__video-play-icon">
▶
</text>
</view>
</view>
<view class="business-detail__content">
<text
v-for="(paragraph, index) in detail.contentSections"
:key="index"
class="business-detail__paragraph"
:class="{ 'business-detail__paragraph--title': paragraph.startsWith('一、') || paragraph.startsWith('二、') }"
>
{{ paragraph }}
</text>
</view>
</view>
</scroll-view>
<view class="business-detail__footer">
<view
class="business-detail__submit-btn"
@tap="handleSubmit"
>
立即提报
</view>
</view>
</view>
</template>
<style scoped lang="scss">
@import '@/styles/variables.scss';
.business-detail {
display: flex;
flex-direction: column;
min-height: 100vh;
background: $color-bg-section;
}
.business-detail__navbar {
display: flex;
align-items: center;
justify-content: space-between;
flex-shrink: 0;
padding: calc(var(--status-bar-height, 44px) + 12rpx) 24rpx 12rpx;
background: $color-bg-page;
}
.business-detail__back {
display: flex;
align-items: center;
justify-content: center;
width: 64rpx;
height: 64rpx;
}
.business-detail__back-icon {
width: 40rpx;
height: 40rpx;
}
.business-detail__navbar-title {
font-size: 34rpx;
font-weight: 600;
color: $color-text-primary;
}
.business-detail__navbar-placeholder {
width: 64rpx;
height: 64rpx;
}
.business-detail__scroll {
flex: 1;
height: 0;
}
.business-detail__hero {
position: relative;
margin: 20rpx 24rpx 0;
overflow: hidden;
border-radius: 20rpx;
}
.business-detail__hero-bg {
position: absolute;
top: 0;
left: 0;
z-index: 0;
width: 100%;
height: 100%;
}
.business-detail__hero-inner {
position: relative;
z-index: 1;
padding: 24rpx 24rpx 28rpx;
}
.business-detail__hero-icon {
width: 96rpx;
height: 96rpx;
}
.business-detail__hero-title {
display: block;
margin-top: 16rpx;
font-size: 32rpx;
font-weight: 600;
color: $color-text-primary;
}
.business-detail__hero-subtitle {
display: block;
margin-top: 8rpx;
font-size: 24rpx;
line-height: 1.5;
color: #333333;
}
.business-detail__section {
margin: 20rpx 24rpx 0;
padding: 28rpx 24rpx 32rpx;
background: $color-bg-page;
border-radius: 20rpx;
}
.business-detail__section-title {
display: block;
margin-bottom: 28rpx;
font-size: 32rpx;
font-weight: 600;
color: $color-text-primary;
}
.business-detail__type-row {
display: flex;
justify-content: space-between;
}
.business-detail__type-item {
display: flex;
flex: 1;
flex-direction: column;
align-items: center;
}
.business-detail__type-icon {
width: 91rpx;
height: 91rpx;
}
.business-detail__type-label {
margin-top: 12rpx;
font-size: 22rpx;
color: $color-text-primary;
text-align: center;
}
.business-detail__video {
position: relative;
display: flex;
align-items: center;
justify-content: center;
height: 360rpx;
overflow: hidden;
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
border-radius: 16rpx;
}
.business-detail__video-play {
display: flex;
align-items: center;
justify-content: center;
width: 80rpx;
height: 80rpx;
background: rgba(255, 255, 255, 0.25);
border-radius: 50%;
}
.business-detail__video-play-icon {
margin-left: 6rpx;
font-size: 32rpx;
color: #ffffff;
}
.business-detail__content {
margin-top: 28rpx;
}
.business-detail__paragraph {
display: block;
margin-bottom: 16rpx;
font-size: 28rpx;
line-height: 1.8;
color: $color-text-primary;
&--title {
margin-top: 8rpx;
margin-bottom: 12rpx;
font-weight: 600;
}
}
.business-detail__footer {
flex-shrink: 0;
padding: 16rpx 32rpx calc(16rpx + env(safe-area-inset-bottom));
background: $color-bg-page;
border-top: 1rpx solid #f0f0f0;
}
.business-detail__submit-btn {
display: flex;
align-items: center;
justify-content: center;
height: 88rpx;
font-size: 32rpx;
font-weight: 600;
color: #ffffff;
background: $color-primary;
border-radius: 44rpx;
}
</style>