|
@@ -0,0 +1,751 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <view class="sales-publish-container">
|
|
|
|
|
+ <!-- 表单内容 -->
|
|
|
|
|
+ <view class="form-container">
|
|
|
|
|
+ <!-- 产品名称 -->
|
|
|
|
|
+ <view class="form-item">
|
|
|
|
|
+ <view class="item-label">
|
|
|
|
|
+ <text class="label-text">产品名称</text>
|
|
|
|
|
+ <text class="required">*</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="item-content">
|
|
|
|
|
+ <input
|
|
|
|
|
+ class="form-input"
|
|
|
|
|
+ v-model="formData.productName"
|
|
|
|
|
+ placeholder="请输入产品名称"
|
|
|
|
|
+ placeholder-style="color: #999;"
|
|
|
|
|
+ maxlength="20"
|
|
|
|
|
+ @input="onNameInput"
|
|
|
|
|
+ />
|
|
|
|
|
+ <view class="char-count">{{ nameLength }}/20</view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 产品分类 -->
|
|
|
|
|
+ <view class="form-item">
|
|
|
|
|
+ <view class="item-label">
|
|
|
|
|
+ <text class="label-text">产品分类</text>
|
|
|
|
|
+ <text class="required">*</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="item-content">
|
|
|
|
|
+ <view class="category-selector" @click="showCategoryPicker = true">
|
|
|
|
|
+ <text class="selector-text" :class="{ placeholder: !formData.category }">
|
|
|
|
|
+ {{ formData.category || '请选择产品分类' }}
|
|
|
|
|
+ </text>
|
|
|
|
|
+ <text class="arrow-icon">></text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 销售价格 -->
|
|
|
|
|
+ <view class="form-item">
|
|
|
|
|
+ <view class="item-label">
|
|
|
|
|
+ <text class="label-text">销售价格</text>
|
|
|
|
|
+ <text class="required">*</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="item-content">
|
|
|
|
|
+ <view class="input-with-unit">
|
|
|
|
|
+ <text class="currency-symbol">¥</text>
|
|
|
|
|
+ <input
|
|
|
|
|
+ class="form-input"
|
|
|
|
|
+ v-model="formData.price"
|
|
|
|
|
+ placeholder="请输入销售价格"
|
|
|
|
|
+ placeholder-style="color: #999;"
|
|
|
|
|
+ type="digit"
|
|
|
|
|
+ />
|
|
|
|
|
+ <text class="unit-text">元/斤</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 产品简介 -->
|
|
|
|
|
+ <view class="form-item">
|
|
|
|
|
+ <view class="item-label">
|
|
|
|
|
+ <text class="label-text">产品简介</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="item-content">
|
|
|
|
|
+ <textarea
|
|
|
|
|
+ class="form-textarea"
|
|
|
|
|
+ v-model="formData.description"
|
|
|
|
|
+ placeholder="请简单介绍您的农产品特色、种植方式等"
|
|
|
|
|
+ placeholder-style="color: #999;"
|
|
|
|
|
+ maxlength="80"
|
|
|
|
|
+ auto-height
|
|
|
|
|
+ @input="onDescInput"
|
|
|
|
|
+ />
|
|
|
|
|
+ <view class="char-count">{{ descLength }}/80</view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 产品图片 -->
|
|
|
|
|
+ <view class="form-item">
|
|
|
|
|
+ <view class="item-label">
|
|
|
|
|
+ <text class="label-text">产品图片</text>
|
|
|
|
|
+ <text class="required">*</text>
|
|
|
|
|
+ <text class="optional">(最多3张)</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="item-content">
|
|
|
|
|
+ <view class="image-upload-area">
|
|
|
|
|
+ <view
|
|
|
|
|
+ class="image-item"
|
|
|
|
|
+ v-for="(image, index) in formData.images"
|
|
|
|
|
+ :key="index"
|
|
|
|
|
+ >
|
|
|
|
|
+ <image class="uploaded-image" :src="image" mode="aspectFill"></image>
|
|
|
|
|
+ <view class="image-delete" @click="removeImage(index)">×</view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view
|
|
|
|
|
+ class="image-upload-btn"
|
|
|
|
|
+ v-if="formData.images.length < 3"
|
|
|
|
|
+ @click="chooseImage"
|
|
|
|
|
+ >
|
|
|
|
|
+ <text class="upload-icon">+</text>
|
|
|
|
|
+ <text class="upload-text">上传图片</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 产地信息 -->
|
|
|
|
|
+ <view class="form-item">
|
|
|
|
|
+ <view class="item-label">
|
|
|
|
|
+ <text class="label-text">产地信息</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="contact-info">
|
|
|
|
|
+ <view class="contact-row">
|
|
|
|
|
+ <text class="contact-label">产地:</text>
|
|
|
|
|
+ <text class="contact-value">{{ locationInfo.address }}</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="contact-row">
|
|
|
|
|
+ <text class="contact-label">地块:</text>
|
|
|
|
|
+ <text class="contact-value">{{ locationInfo.field }}</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 联系人信息 -->
|
|
|
|
|
+ <view class="form-item">
|
|
|
|
|
+ <view class="item-label">
|
|
|
|
|
+ <text class="label-text">联系人信息</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="item-content">
|
|
|
|
|
+ <view class="contact-input-row">
|
|
|
|
|
+ <text class="contact-label">联系人:</text>
|
|
|
|
|
+ <input
|
|
|
|
|
+ class="contact-input"
|
|
|
|
|
+ v-model="formData.contactName"
|
|
|
|
|
+ placeholder="请输入联系人姓名"
|
|
|
|
|
+ placeholder-style="color: #999;"
|
|
|
|
|
+ maxlength="10"
|
|
|
|
|
+ />
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="contact-input-row">
|
|
|
|
|
+ <text class="contact-label">电话:</text>
|
|
|
|
|
+ <input
|
|
|
|
|
+ class="contact-input"
|
|
|
|
|
+ v-model="formData.contactPhone"
|
|
|
|
|
+ placeholder="请输入联系电话"
|
|
|
|
|
+ placeholder-style="color: #999;"
|
|
|
|
|
+ type="number"
|
|
|
|
|
+ maxlength="11"
|
|
|
|
|
+ />
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 底部提交按钮 -->
|
|
|
|
|
+ <view class="bottom-action-bar">
|
|
|
|
|
+ <view class="submit-btn" @click="submitForm">
|
|
|
|
|
+ <text class="btn-text">{{ isEditMode ? '保存修改' : '提交审核' }}</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 分类选择弹窗 -->
|
|
|
|
|
+ <view class="picker-modal" v-if="showCategoryPicker" @click="showCategoryPicker = false">
|
|
|
|
|
+ <view class="picker-content" @click.stop>
|
|
|
|
|
+ <view class="picker-header">
|
|
|
|
|
+ <text class="picker-title">选择产品分类</text>
|
|
|
|
|
+ <text class="picker-close" @click="showCategoryPicker = false">×</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="picker-options">
|
|
|
|
|
+ <view
|
|
|
|
|
+ class="picker-option"
|
|
|
|
|
+ v-for="category in categoryOptions"
|
|
|
|
|
+ :key="category"
|
|
|
|
|
+ @click="selectCategory(category)"
|
|
|
|
|
+ >
|
|
|
|
|
+ <text class="option-text">{{ category }}</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script>
|
|
|
|
|
+export default {
|
|
|
|
|
+ data() {
|
|
|
|
|
+ return {
|
|
|
|
|
+ isEditMode: false, // 是否为编辑模式
|
|
|
|
|
+ editProductId: '', // 编辑的产品ID
|
|
|
|
|
+ productType: 'sale', // 产品类型:sale(销售)或 purchase(收购)
|
|
|
|
|
+ formData: {
|
|
|
|
|
+ productName: '',
|
|
|
|
|
+ category: '',
|
|
|
|
|
+ price: '',
|
|
|
|
|
+ description: '',
|
|
|
|
|
+ images: [],
|
|
|
|
|
+ contactName: '',
|
|
|
|
|
+ contactPhone: ''
|
|
|
|
|
+ },
|
|
|
|
|
+ locationInfo: {
|
|
|
|
|
+ address: '张家村',
|
|
|
|
|
+ field: '水稻田A区'
|
|
|
|
|
+ },
|
|
|
|
|
+ categoryOptions: ['蔬菜', '水果', '粮食', '畜产品', '水产品', '中药材'],
|
|
|
|
|
+ showCategoryPicker: false,
|
|
|
|
|
+ nameLength: 0,
|
|
|
|
|
+ descLength: 0
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ onLoad(options) {
|
|
|
|
|
+ // 检查是否为编辑模式
|
|
|
|
|
+ if (options.action === 'edit' && options.id) {
|
|
|
|
|
+ this.isEditMode = true;
|
|
|
|
|
+ this.editProductId = options.id;
|
|
|
|
|
+ this.productType = options.type || 'sale';
|
|
|
|
|
+
|
|
|
|
|
+ // 设置页面标题
|
|
|
|
|
+ uni.setNavigationBarTitle({
|
|
|
|
|
+ title: this.productType === 'sale' ? '编辑销售信息' : '编辑收购信息'
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 加载产品数据
|
|
|
|
|
+ this.loadProductData();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 新建模式
|
|
|
|
|
+ this.isEditMode = false;
|
|
|
|
|
+ uni.setNavigationBarTitle({
|
|
|
|
|
+ title: '发布农产品'
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ methods: {
|
|
|
|
|
+ // 加载产品数据(编辑模式)
|
|
|
|
|
+ loadProductData() {
|
|
|
|
|
+ // 模拟从API加载数据,实际应用中需要根据ID和类型调用相应的API
|
|
|
|
|
+ uni.showLoading({ title: '加载中...' });
|
|
|
|
|
+
|
|
|
|
|
+ setTimeout(() => {
|
|
|
|
|
+ let mockData;
|
|
|
|
|
+
|
|
|
|
|
+ if (this.productType === 'sale') {
|
|
|
|
|
+ // 销售信息的模拟数据
|
|
|
|
|
+ mockData = {
|
|
|
|
|
+ productName: '2024年红富士苹果',
|
|
|
|
|
+ category: '水果',
|
|
|
|
|
+ price: '8.5',
|
|
|
|
|
+ description: '自家果园种植的红富士苹果,个大味甜,果形端正,色泽鲜艳。采用有机种植方式,无农药残留,口感清脆香甜。',
|
|
|
|
|
+ images: [
|
|
|
|
|
+ '/static/images/products/corn-seeds-new.jpg',
|
|
|
|
|
+ '/static/images/products/rice-seeds.jpg'
|
|
|
|
|
+ ],
|
|
|
|
|
+ contactName: '张先生',
|
|
|
|
|
+ contactPhone: '18812341234'
|
|
|
|
|
+ };
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 收购信息的模拟数据
|
|
|
|
|
+ mockData = {
|
|
|
|
|
+ productName: '高价收购优质土豆',
|
|
|
|
|
+ category: '蔬菜',
|
|
|
|
|
+ price: '3.5',
|
|
|
|
|
+ description: '大量收购优质土豆,要求新鲜无病害,无青皮,规格统一。支持长期合作,价格优惠,现金结算。',
|
|
|
|
|
+ images: [
|
|
|
|
|
+ '/static/images/products/agriculture-tools.jpg'
|
|
|
|
|
+ ],
|
|
|
|
|
+ contactName: '李先生',
|
|
|
|
|
+ contactPhone: '13856785678'
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 填充表单数据
|
|
|
|
|
+ this.formData = { ...mockData };
|
|
|
|
|
+
|
|
|
|
|
+ // 更新字符计数
|
|
|
|
|
+ this.nameLength = this.formData.productName.length;
|
|
|
|
|
+ this.descLength = this.formData.description.length;
|
|
|
|
|
+
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+ }, 1000);
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // 产品名称输入处理
|
|
|
|
|
+ onNameInput(e) {
|
|
|
|
|
+ this.nameLength = e.detail.value.length;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // 描述输入处理
|
|
|
|
|
+ onDescInput(e) {
|
|
|
|
|
+ this.descLength = e.detail.value.length;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // 选择分类
|
|
|
|
|
+ selectCategory(category) {
|
|
|
|
|
+ this.formData.category = category;
|
|
|
|
|
+ this.showCategoryPicker = false;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // 选择图片
|
|
|
|
|
+ chooseImage() {
|
|
|
|
|
+ const remainingCount = 3 - this.formData.images.length;
|
|
|
|
|
+ uni.chooseImage({
|
|
|
|
|
+ count: remainingCount,
|
|
|
|
|
+ sizeType: ['compressed'],
|
|
|
|
|
+ sourceType: ['album', 'camera'],
|
|
|
|
|
+ success: (res) => {
|
|
|
|
|
+ this.formData.images = this.formData.images.concat(res.tempFilePaths);
|
|
|
|
|
+ },
|
|
|
|
|
+ fail: (err) => {
|
|
|
|
|
+ console.error('选择图片失败:', err);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // 删除图片
|
|
|
|
|
+ removeImage(index) {
|
|
|
|
|
+ this.formData.images.splice(index, 1);
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // 表单验证
|
|
|
|
|
+ validateForm() {
|
|
|
|
|
+ if (!this.formData.productName.trim()) {
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ title: '请输入产品名称',
|
|
|
|
|
+ icon: 'none'
|
|
|
|
|
+ });
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!this.formData.category) {
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ title: '请选择产品分类',
|
|
|
|
|
+ icon: 'none'
|
|
|
|
|
+ });
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!this.formData.price || this.formData.price <= 0) {
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ title: '请输入有效的销售价格',
|
|
|
|
|
+ icon: 'none'
|
|
|
|
|
+ });
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (this.formData.images.length === 0) {
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ title: '请至少上传一张产品图片',
|
|
|
|
|
+ icon: 'none'
|
|
|
|
|
+ });
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!this.formData.contactName.trim()) {
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ title: '请输入联系人姓名',
|
|
|
|
|
+ icon: 'none'
|
|
|
|
|
+ });
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!this.formData.contactPhone.trim()) {
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ title: '请输入联系电话',
|
|
|
|
|
+ icon: 'none'
|
|
|
|
|
+ });
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 简单的手机号格式验证
|
|
|
|
|
+ const phoneRegex = /^1[3-9]\d{9}$/;
|
|
|
|
|
+ if (!phoneRegex.test(this.formData.contactPhone)) {
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ title: '请输入正确的手机号码',
|
|
|
|
|
+ icon: 'none'
|
|
|
|
|
+ });
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // 提交表单
|
|
|
|
|
+ submitForm() {
|
|
|
|
|
+ if (!this.validateForm()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 显示加载提示
|
|
|
|
|
+ const loadingTitle = this.isEditMode ? '保存中...' : '提交中...';
|
|
|
|
|
+ uni.showLoading({
|
|
|
|
|
+ title: loadingTitle
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 模拟提交
|
|
|
|
|
+ setTimeout(() => {
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+
|
|
|
|
|
+ if (this.isEditMode) {
|
|
|
|
|
+ // 编辑模式 - 保存修改
|
|
|
|
|
+ uni.showModal({
|
|
|
|
|
+ title: '保存成功',
|
|
|
|
|
+ content: '您的修改已保存成功!',
|
|
|
|
|
+ showCancel: false,
|
|
|
|
|
+ success: () => {
|
|
|
|
|
+ uni.navigateBack();
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 新建模式 - 提交审核
|
|
|
|
|
+ uni.showModal({
|
|
|
|
|
+ title: '提交成功',
|
|
|
|
|
+ content: '您的农产品信息已提交审核,审核通过后将在销售页面展示。',
|
|
|
|
|
+ showCancel: false,
|
|
|
|
|
+ success: () => {
|
|
|
|
|
+ uni.navigateBack();
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ }, 2000);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+<style lang="scss">
|
|
|
|
|
+.sales-publish-container {
|
|
|
|
|
+ min-height: 100vh;
|
|
|
|
|
+ background-color: #f5f5f5;
|
|
|
|
|
+ padding-bottom: calc(128rpx + env(safe-area-inset-bottom));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-container {
|
|
|
|
|
+ padding: 20rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-item {
|
|
|
|
|
+ background-color: #fff;
|
|
|
|
|
+ border-radius: 12rpx;
|
|
|
|
|
+ padding: 24rpx;
|
|
|
|
|
+ margin-bottom: 16rpx;
|
|
|
|
|
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.item-label {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ margin-bottom: 16rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.label-text {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.required {
|
|
|
|
|
+ color: #ff4d4f;
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ margin-left: 4rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.optional {
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+ font-size: 24rpx;
|
|
|
|
|
+ margin-left: 8rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.item-content {
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-input {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 44rpx;
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+ line-height: 44rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-textarea {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ min-height: 120rpx;
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+ line-height: 1.5;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.char-count {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ right: 0;
|
|
|
|
|
+ bottom: -4rpx;
|
|
|
|
|
+ font-size: 24rpx;
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 分类选择器
|
|
|
|
|
+.category-selector {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ padding: 12rpx 0;
|
|
|
|
|
+ border-bottom: 1rpx solid #f0f0f0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.selector-text {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+
|
|
|
|
|
+ &.placeholder {
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.arrow-icon {
|
|
|
|
|
+ font-size: 24rpx;
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 带单位的输入框
|
|
|
|
|
+.input-with-unit {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ border-bottom: 1rpx solid #f0f0f0;
|
|
|
|
|
+ padding: 12rpx 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.currency-symbol {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+ margin-right: 8rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.unit-text {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #666;
|
|
|
|
|
+ margin-left: 8rpx;
|
|
|
|
|
+ white-space: nowrap;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 图片上传
|
|
|
|
|
+.image-upload-area {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
|
+ gap: 16rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.image-item {
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ width: 160rpx;
|
|
|
|
|
+ height: 160rpx;
|
|
|
|
|
+ border-radius: 8rpx;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.uploaded-image {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.image-delete {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ top: -8rpx;
|
|
|
|
|
+ right: -8rpx;
|
|
|
|
|
+ width: 32rpx;
|
|
|
|
|
+ height: 32rpx;
|
|
|
|
|
+ background-color: #ff4d4f;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ border-radius: 50%;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ font-size: 20rpx;
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.image-upload-btn {
|
|
|
|
|
+ width: 160rpx;
|
|
|
|
|
+ height: 160rpx;
|
|
|
|
|
+ border: 2rpx dashed #ddd;
|
|
|
|
|
+ border-radius: 8rpx;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ background-color: #fafafa;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.upload-icon {
|
|
|
|
|
+ font-size: 48rpx;
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+ margin-bottom: 8rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.upload-text {
|
|
|
|
|
+ font-size: 24rpx;
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 产地信息
|
|
|
|
|
+.contact-info {
|
|
|
|
|
+ background-color: #f8f9fa;
|
|
|
|
|
+ border-radius: 8rpx;
|
|
|
|
|
+ padding: 20rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.contact-row {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ margin-bottom: 12rpx;
|
|
|
|
|
+
|
|
|
|
|
+ &:last-child {
|
|
|
|
|
+ margin-bottom: 0;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.contact-value {
|
|
|
|
|
+ font-size: 26rpx;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 联系人信息输入
|
|
|
|
|
+.contact-input-row {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ margin-bottom: 20rpx;
|
|
|
|
|
+
|
|
|
|
|
+ &:last-child {
|
|
|
|
|
+ margin-bottom: 0;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.contact-label {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+ width: 120rpx;
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.contact-input {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ height: 44rpx;
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+ line-height: 44rpx;
|
|
|
|
|
+ border-bottom: 1rpx solid #f0f0f0;
|
|
|
|
|
+ padding: 12rpx 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 底部提交按钮
|
|
|
|
|
+.bottom-action-bar {
|
|
|
|
|
+ position: fixed;
|
|
|
|
|
+ bottom: 0;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ right: 0;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ background-color: #fff;
|
|
|
|
|
+ border-top: 1rpx solid #f0f0f0;
|
|
|
|
|
+ padding: 20rpx 30rpx;
|
|
|
|
|
+ padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
|
|
|
|
|
+ z-index: 1000;
|
|
|
|
|
+ box-shadow: 0 -2rpx 8rpx rgba(0, 0, 0, 0.05);
|
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.submit-btn {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 88rpx;
|
|
|
|
|
+ background-color: #4CAF50;
|
|
|
|
|
+ border-radius: 12rpx;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ transition: background-color 0.2s ease;
|
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
|
+
|
|
|
|
|
+ &:active {
|
|
|
|
|
+ background-color: #45a049;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .btn-text {
|
|
|
|
|
+ font-size: 32rpx;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 分类选择弹窗
|
|
|
|
|
+.picker-modal {
|
|
|
|
|
+ position: fixed;
|
|
|
|
|
+ top: 0;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ background-color: rgba(0, 0, 0, 0.5);
|
|
|
|
|
+ z-index: 2000;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: flex-end;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.picker-content {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ background-color: #fff;
|
|
|
|
|
+ border-radius: 24rpx 24rpx 0 0;
|
|
|
|
|
+ padding: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.picker-header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 30rpx;
|
|
|
|
|
+ border-bottom: 1rpx solid #f0f0f0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.picker-title {
|
|
|
|
|
+ font-size: 32rpx;
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.picker-close {
|
|
|
|
|
+ font-size: 36rpx;
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.picker-options {
|
|
|
|
|
+ padding: 20rpx 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.picker-option {
|
|
|
|
|
+ padding: 24rpx 30rpx;
|
|
|
|
|
+ border-bottom: 1rpx solid #f8f8f8;
|
|
|
|
|
+ transition: background-color 0.2s ease;
|
|
|
|
|
+
|
|
|
|
|
+ &:last-child {
|
|
|
|
|
+ border-bottom: none;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ &:active {
|
|
|
|
|
+ background-color: #f5f5f5;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.option-text {
|
|
|
|
|
+ font-size: 30rpx;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|