lisy 2 viikkoa sitten
vanhempi
säilyke
0d5eaaa8ab

+ 24 - 18
src/components/ut-confirm-dialog/ut-confirm-dialog.vue

@@ -1,25 +1,31 @@
 // 如果up-popup弹框的遮罩层被覆盖或者是变为白色,需要查看unocss配置,unocss把u-popup__content—transition转化为两个变量了,需要过滤
 <template>
     <up-popup :show="internalShow" mode="center" :round="16" :closeable="false" @close="handleClose" bgColor="transparent">
-        <view class="confirm-dialog" :style="{width}">
+        <view class="confirm-dialog" :style="{ width }">
             <!-- 标题区域 -->
-            <view class="dialog-header pd-32">
-                <text class="dialog-title f-s-32 f-w-6 c-#333">{{ title }}</text>
-                <up-icon v-if="closeable" name="close" size="20" color="#999" class="close-icon" @click="handleClose" />
-            </view>
+            <slot name="title">
+                <view class="dialog-header pd-32">
+                    <text class="dialog-title f-s-32 f-w-6 c-#333">{{ title }}</text>
+                    <up-icon v-if="closeable" name="close" size="20" color="#999" class="close-icon" @click="handleClose" />
+                </view>
+            </slot>
             <!-- 内容区域(slot插槽) -->
-            <view class="dialog-content pd-32 pt-0">
-                <slot></slot>
-            </view>
+            <slot name="content">
+                <view class="dialog-content pd-32 pt-0">
+                    <slot></slot>
+                </view>
+            </slot>
             <!-- 按钮区域 -->
-            <view class="dialog-footer pd-32 pt-0">
-                <up-button v-if="showCancel" class="cancel-btn" :style="{ backgroundColor: cancelBgColor, color: cancelColor }" :customStyle="{ height: '80rpx', fontSize: '32rpx', borderRadius: '8rpx', flex: 1 }" @click="handleCancel">
-                    {{ cancelText }}
-                </up-button>
-                <up-button class="confirm-btn" :style="{ backgroundColor: confirmBgColor, color: confirmColor }" :customStyle="{ height: '80rpx', fontSize: '32rpx', borderRadius: '8rpx', flex: 1, marginLeft: showCancel ? '24rpx' : '0' }" @click="handleConfirm">
-                    {{ confirmText }}
-                </up-button>
-            </view>
+            <slot name="footer">
+                <view class="dialog-footer pd-32 pt-0">
+                    <up-button v-if="showCancel" class="cancel-btn" :style="{ backgroundColor: cancelBgColor, color: cancelColor }" :customStyle="{ height: '80rpx', fontSize: '32rpx', borderRadius: '8rpx', flex: 1 }" @click="handleCancel">
+                        {{ cancelText }}
+                    </up-button>
+                    <up-button class="confirm-btn" :style="{ backgroundColor: confirmBgColor, color: confirmColor }" :customStyle="{ height: '80rpx', fontSize: '32rpx', borderRadius: '8rpx', flex: 1, marginLeft: showCancel ? '24rpx' : '0' }" @click="handleConfirm">
+                        {{ confirmText }}
+                    </up-button>
+                </view>
+            </slot>
         </view>
     </up-popup>
 </template>
@@ -62,7 +68,7 @@ const props = withDefaults(defineProps<Props>(), {
     confirmBgColor: '#37A954',
     confirmColor: '#fff',
     showCancel: true,
-    width: 'auto'
+    width: 'auto',
 });
 
 const emit = defineEmits<{
@@ -115,7 +121,7 @@ const handleConfirm = () => {
     flex-direction: column;
     background-color: #fff;
     border-radius: 16rpx;
-    overflow: hidden;
+    // overflow: hidden;
 
     .dialog-header {
         display: flex;

+ 46 - 46
src/manifest.json

@@ -1,34 +1,34 @@
 {
-   "h5": {
-    "router": {
-      "mode": "history",
-      "base": "/"  // 可设置基础路径
-    }
-  },
-    "name" : "",
-    "appid" : "",
-    "description" : "",
-    "versionName" : "1.0.0",
-    "versionCode" : "100",
-    "transformPx" : false,
+    "h5": {
+        "router": {
+            "mode": "history",
+            "base": "/" // 可设置基础路径
+        }
+    },
+    "name": "",
+    "appid": "",
+    "description": "",
+    "versionName": "1.0.0",
+    "versionCode": "100",
+    "transformPx": false,
     /* 5+App特有相关 */
-    "app-plus" : {
-        "usingComponents" : true,
-        "nvueStyleCompiler" : "uni-app",
-        "compilerVersion" : 3,
-        "splashscreen" : {
-            "alwaysShowBeforeRender" : true,
-            "waiting" : true,
-            "autoclose" : true,
-            "delay" : 0
+    "app-plus": {
+        "usingComponents": true,
+        "nvueStyleCompiler": "uni-app",
+        "compilerVersion": 3,
+        "splashscreen": {
+            "alwaysShowBeforeRender": true,
+            "waiting": true,
+            "autoclose": true,
+            "delay": 0
         },
         /* 模块配置 */
-        "modules" : {},
+        "modules": {},
         /* 应用发布信息 */
-        "distribute" : {
+        "distribute": {
             /* android打包配置 */
-            "android" : {
-                "permissions" : [
+            "android": {
+                "permissions": [
                     "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                     "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
                     "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
@@ -47,40 +47,40 @@
                 ]
             },
             /* ios打包配置 */
-            "ios" : {},
+            "ios": {},
             /* SDK配置 */
-            "sdkConfigs" : {}
+            "sdkConfigs": {}
         }
     },
     /* 快应用特有相关 */
-    "quickapp" : {},
+    "quickapp": {},
     /* 小程序特有相关 */
-    "mp-weixin" : {
-        "appid" : "wx77a892f4c82cb7a3",
-        "setting" : {
-            "urlCheck" : false
+    "mp-weixin": {
+        "appid": "wxf11517e71e36169f",
+        "setting": {
+            "urlCheck": false
         },
-        "usingComponents" : true,
-        "mergeVirtualHostAttributes" : true,
+        "usingComponents": true,
+        "mergeVirtualHostAttributes": true,
         "styleIsolation": "shared",
-         "permission" : {
-            "scope.userLocation" : {
-                "desc" : "您的位置信息将用于基地位置选择"
+        "permission": {
+            "scope.userLocation": {
+                "desc": "您的位置信息将用于基地位置选择"
             }
         },
-        "requiredPrivateInfos" : [ "chooseAddress", "chooseLocation", "getLocation" ]
+        "requiredPrivateInfos": ["chooseAddress", "chooseLocation", "getLocation"]
     },
-    "mp-alipay" : {
-        "usingComponents" : true
+    "mp-alipay": {
+        "usingComponents": true
     },
-    "mp-baidu" : {
-        "usingComponents" : true
+    "mp-baidu": {
+        "usingComponents": true
     },
-    "mp-toutiao" : {
-        "usingComponents" : true
+    "mp-toutiao": {
+        "usingComponents": true
     },
-    "uniStatistics": {  
+    "uniStatistics": {
         "enable": false
     },
-    "vueVersion" : "3"
+    "vueVersion": "3"
 }

+ 12 - 0
src/pages.json

@@ -113,6 +113,18 @@
                 }
             ]
         },
+        // 种养殖
+        {
+            "root": "plant/port",
+            "pages": [
+                {
+                    "path": "port-create/index",
+                    "style": {
+                        "navigationBarTitleText": "创建种养殖任务"
+                    }
+                }
+            ]
+        },
         {
             "root": "tools",
             "pages": [

+ 2 - 3
src/pages/plant/base/index.vue

@@ -292,13 +292,13 @@ const handlechose = (item: string) => {
     basetype.value = item;
 };
 
-// 处理删除取消
+// 处理取消
 const handleDeleteCancel = () => {
     showDeleteDialog.value = false;
     basetype.value = null;
 };
 const handlechoseConfirm = () => {
-    uni.$u.route({ type: 'navigateTo', url: '/plant/base/base-edit/index', params: { basetype: basetype.value } });
+    uni.$u.route({ type: 'navigateTo', url: '/plant/base/base-edit/index', params: { baseType: basetype.value } });
 };
 
 onMounted(() => {
@@ -307,7 +307,6 @@ onMounted(() => {
         .select('#topup-navbar')
         .boundingClientRect((data: any) => {
             console.log(data);
-
             stickyTop.value = data.top + data.height;
         })
         .exec();

+ 46 - 0
src/pages/plant/port/index.vue

@@ -199,14 +199,46 @@
             <ut-tabar activeTab="planting"></ut-tabar>
         </template>
     </z-paging>
+    <ut-suspension v-if="sus?.left" :imageWidth="60" :imageHeight="60" :x="sus?.left" :y="sus?.bottom" :inertia="false" :snap-threshold="40">
+        <image src="/static/images/plant/addBase.png" mode="widthFix" class="w-120 h-120" @click="showDeleteDialog = true"></image>
+    </ut-suspension>
+    <ut-confirm-dialog v-model:show="showDeleteDialog" width="80vw" title="请选择要创建的任务类型" :confirmText="'确认选择'" :cancelText="'取消'" @confirm="handlechoseConfirm" @cancel="handleDeleteCancel">
+        <view class="" v-for="item in pt_task_type" :key="item?.value">
+            <view style="border: 1rpx solid" :style="{ backgroundColor: item?.value == basetype ? '#EBF6EE' : '#f7f7f7', borderColor: item?.value == basetype ? '#37A954' : 'transparent' }" class="pr-30 d-flex a-c mb-20 radius-100" @click="handlechose(item.value)">
+                <view class="radius-50% mg-8">
+                    <up-avatar size="90rpx" :src="item?.avatar || 'https://ta.zycpzs.cn/oss-file/smart-trace/szyy/images/common/avatar.png'" class="mr-20"></up-avatar>
+                </view>
+                <view class="c-#333 f-s-34">
+                    {{ item?.label }}
+                </view>
+                <view class="flex1"></view>
+                <view class="d-flex">
+                    <img v-if="basetype === item.value" class="w-30 h-30" src="/static/images/plant/chooseSuccessfully.png" mode="widthFix" alt="" />
+                </view>
+            </view>
+        </view>
+    </ut-confirm-dialog>
 </template>
 <script setup lang="ts">
 import { useClientRequest } from '@/utils/request';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { pt_task_type } = toRefs<any>(proxy?.useDict('pt_task_type'));
+setTimeout(() => {
+    console.log(pt_task_type.value, 'pt_task_type');
+}, 2000);
+
 const list = ref<unknown[]>();
 const form = ref({ queryType: '', keyword: '' });
 const paging = ref();
 const windowInfo = uni.getWindowInfo();
 const safeAreaBottom = windowInfo.safeAreaInsets.bottom;
+const systemInfo = uni.getSystemInfoSync();
+const sus = ref({
+    left: 0,
+    bottom: 0,
+});
+sus.value.left = systemInfo.windowWidth - 10;
+sus.value.bottom = systemInfo.windowHeight - 200;
 //分段器的配置
 const subList = ref(['进行中', '已结束']);
 const subCurrent = ref(0);
@@ -254,6 +286,20 @@ const customStyle3 = reactive({
 const onRefresh = () => {
     paging.value.reload();
 };
+//选择创建类型
+const showDeleteDialog = ref(false);
+const basetype = ref();
+const handlechose = (item: string) => {
+    basetype.value = item;
+};
+// 处理取消
+const handleDeleteCancel = () => {
+    showDeleteDialog.value = false;
+    basetype.value = null;
+};
+const handlechoseConfirm = () => {
+    uni.$u.route({ type: 'navigateTo', url: '/plant/port/port-create/index', params: { baseType: basetype.value } });
+};
 </script>
 <style lang="scss" scoped>
 // @import '@/assets/styles/theme.scss';

+ 79 - 30
src/plant/base/base-edit/index.vue

@@ -16,15 +16,10 @@
                 <up-alert type="primary" fontSize="24rpx" description="注意:基地不强制与品种挂钩!基地地址以行政村为界,可成片集中或相对集中,跨村则视为另一基地(连片跨村除外)。"></up-alert>
                 <view class="pd-10"></view>
                 <view class="h-1" id="baseTypepppp"></view>
-                <ut-action-sheet v-model="form.baseInfo.baseType" :tabs="pt_base_type" title="选择基地类型">
-                    <up-form-item borderBottom label="基地类型" required prop="baseType">
-                        <view v-if="form.baseInfo.baseType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_base_type, form.baseInfo.baseType) }}</view>
-                        <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择基地类型</view>
-                        <template #right>
-                            <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
-                        </template>
-                    </up-form-item>
-                </ut-action-sheet>
+                <up-form-item borderBottom label="基地类型" required prop="baseType">
+                    <view v-if="form.baseInfo.baseType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_base_type, form.baseInfo.baseType) }}</view>
+                    <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择基地类型</view>
+                </up-form-item>
                 <!-- 基地名称 -->
                 <view class="h-1" id="baseNamepppp"></view>
                 <up-form-item borderBottom label="基地名称" required prop="baseName">
@@ -126,7 +121,7 @@
                     <view class="startline-title">地块信息</view>
                 </view>
                 <view class="pd-24 bg-#fff">
-                    <up-button type="primary" text="确定" plain>
+                    <up-button @click="addPlot({ landType: form.baseInfo.baseType, areaUnit: form.baseInfo.gapInfo.areaUnit }, '添加地块')" type="primary" text="确定" plain>
                         <up-icon class="mr-10" name="plus" color="#37A954"></up-icon>
                         <span>添加地块信息</span>
                     </up-button>
@@ -137,7 +132,7 @@
                     <view class="startline-title">圈舍信息</view>
                 </view>
                 <view class="pd-24 bg-#fff">
-                    <up-button type="primary" text="确定" plain>
+                    <up-button @click="addPlot({ landType: form.baseInfo.baseType, areaUnit: form.baseInfo.gapInfo.areaUnit }, '添加圈舍')" type="primary" text="确定" plain>
                         <up-icon class="mr-10" name="plus" color="#37A954"></up-icon>
                         <span>添加圈舍信息</span>
                     </up-button>
@@ -148,7 +143,7 @@
                     <view class="startline-title">组培架信息</view>
                 </view>
                 <view class="pd-24 bg-#fff">
-                    <up-button type="primary" text="确定" plain>
+                    <up-button @click="addPlot({ landType: form.baseInfo.baseType, areaUnit: form.baseInfo.gapInfo.areaUnit, capacityUnit: '瓶' }, '添加组培架')" type="primary" text="确定" plain>
                         <up-icon class="mr-10" name="plus" color="#37A954"></up-icon>
                         <span>添加组培架信息</span>
                     </up-button>
@@ -175,21 +170,41 @@
                 </view>
                 <view class="pd-24 bg-#fff mb-10">
                     <view class="f-s-32 c-#333 f-w-600">环境信息</view>
-                    <up-form-item label="土壤类型" prop="environmentInfo.soilType" borderBottom>
-                        <up-input v-model="form.environmentInfo.soilType" placeholder="请输入土壤类型" border="none" clearable></up-input>
-                    </up-form-item>
-                    <up-form-item label="土壤质地" prop="environmentInfo.soilTexture" borderBottom>
-                        <up-input v-model="form.environmentInfo.soilTexture" placeholder="请输入土壤质地" border="none" clearable></up-input>
-                    </up-form-item>
+                    <!-- 土壤类型选择 -->
+                    <ut-action-sheet v-model="form.environmentInfo.soilType" :tabs="pt_soil_type" title="选择土壤类型">
+                        <up-form-item borderBottom label="土壤类型" prop="soilType">
+                            <view v-if="form.environmentInfo.soilType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_soil_type, form.environmentInfo.soilType) }}</view>
+                            <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择土壤类型</view>
+                            <template #right>
+                                <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
+                            </template>
+                        </up-form-item>
+                    </ut-action-sheet>
+                    <!-- 字典 -->
+                    <ut-action-sheet v-model="form.environmentInfo.soilTexture" :tabs="pt_soil_texture" title="选择土壤质地">
+                        <up-form-item borderBottom label="土壤质地" prop="soilTexture">
+                            <view v-if="form.environmentInfo.soilTexture" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_soil_texture, form.environmentInfo.soilTexture) }}</view>
+                            <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择土壤质地</view>
+                            <template #right>
+                                <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
+                            </template>
+                        </up-form-item>
+                    </ut-action-sheet>
                     <up-form-item label="有机质含量" prop="environmentInfo.organic" borderBottom>
                         <up-input v-model="form.environmentInfo.organic" placeholder="请输入有机质含量" border="none" clearable></up-input>
                     </up-form-item>
                     <up-form-item label="土壤PH值" prop="environmentInfo.soilPh" borderBottom>
                         <up-input v-model="form.environmentInfo.soilPh" placeholder="请输入土壤PH值" border="none" clearable></up-input>
                     </up-form-item>
-                    <up-form-item label="水源类型" prop="environmentInfo.waterType" borderBottom>
-                        <up-input v-model="form.environmentInfo.waterType" placeholder="请输入水源类型" border="none" clearable></up-input>
-                    </up-form-item>
+                    <ut-action-sheet v-model="form.environmentInfo.waterType" :tabs="pt_water_type" title="选择水源类型">
+                        <up-form-item borderBottom label="水源类型" prop="waterType">
+                            <view v-if="form.environmentInfo.waterType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_water_type, form.environmentInfo.waterType) }}</view>
+                            <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择水源类型</view>
+                            <template #right>
+                                <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
+                            </template>
+                        </up-form-item>
+                    </ut-action-sheet>
                     <up-form-item label="无霜期" prop="environmentInfo.notFrost" borderBottom>
                         <up-input v-model="form.environmentInfo.notFrost" placeholder="请输入无霜期" border="none" clearable></up-input>
                         <template #right>
@@ -263,9 +278,16 @@
                 </view>
                 <view class="pd-24 bg-#fff mb-10">
                     <view class="f-s-32 c-#333 f-w-600">环境信息</view>
-                    <up-form-item label="水源类型" prop="environmentInfo.waterType" borderBottom>
-                        <up-input v-model="form.environmentInfo.waterType" placeholder="请输入水源类型" border="none" clearable></up-input>
-                    </up-form-item>
+                    <ut-action-sheet v-model="form.environmentInfo.waterType" :tabs="pt_water_type" title="选择水源类型">
+                        <up-form-item borderBottom label="水源类型" prop="waterType">
+                            <view v-if="form.environmentInfo.waterType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_water_type, form.environmentInfo.waterType) }}</view>
+                            <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择水源类型</view>
+                            <template #right>
+                                <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
+                            </template>
+                        </up-form-item>
+                    </ut-action-sheet>
+
                     <up-form-item label="无霜期" prop="environmentInfo.notFrost" borderBottom>
                         <up-input v-model="form.environmentInfo.notFrost" placeholder="请输入无霜期" border="none" clearable></up-input>
                         <template #right>
@@ -365,12 +387,15 @@
         </template>
     </z-paging>
     <ut-picker-area v-model:show="showArea" v-model="form.baseInfo.gapInfo.adcode" @confirm="confirmArea"></ut-picker-area>
+    <FormPlot v-if="showPlot" v-model:show="showPlot" v-model="rowForm" :title="plotTitle" :dict="{ pt_light_type, pt_capacity_unit }"></FormPlot>
 </template>
 <script setup lang="ts">
 import { useUserStore } from '@/store';
 import { useClientRequest } from '@/utils/request';
 import { isOpenSetting } from '@/utils/common';
 import { generateUniqueId } from '@/utils/public';
+import FormPlot from './models/form-plot.vue';
+
 const tabs = reactive([
     { label: '基本信息', value: 'base' },
     { label: '地块信息', value: 'plot' },
@@ -378,10 +403,13 @@ const tabs = reactive([
 ]);
 const activeTab = ref('base');
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { yes_no, pt_org_type, pt_base_type } = toRefs<any>(proxy?.useDict('yes_no', 'pt_org_type', 'pt_base_type'));
+const { yes_no, pt_org_type, pt_base_type, pt_water_type, pt_soil_type, pt_soil_texture, pt_light_type, pt_capacity_unit } = toRefs<any>(proxy?.useDict('yes_no', 'pt_org_type', 'pt_base_type', 'pt_water_type', 'pt_soil_type', 'pt_soil_texture', 'pt_light_type', 'pt_capacity_unit'));
 const paging = ref<any>(null);
 const upFormRef = ref<any>(null);
 const showArea = ref(false);
+const showPlot = ref(false);
+const plotTitle = ref('添加地块信息');
+const rowForm = ref<any>(null);
 const form = ref<any>({
     baseInfo: {
         baseType: '',
@@ -473,15 +501,17 @@ const submitForm = async () => {
 
 const mapDrawArea = async () => {
     uni.$on('mapAreaData', (data: any) => {
+        console.log(data);
+
         // 这里可以将 data 赋值给 form 中的相应字段
         form.value.baseInfo.gapInfo.basePic = data.gapInfo.basePic;
         form.value.baseInfo.gapInfo.area = String(data.gapInfo.area);
         form.value.baseInfo.gapInfo.areaUnit = data.gapInfo.areaUnit;
         form.value.baseInfo.coordinates = data.coordinates;
-        form.value.baseInfo.gapInfo.lng = data.gapInfo.lng;
-        form.value.baseInfo.gapInfo.lat = data.gapInfo.lat;
-        form.value.baseInfo.lnglat = `${data.gapInfo.lng},${data.gapInfo.lat}`;
-        form.value.baseInfo.zoom = data.zoom;
+        form.value.baseInfo.gapInfo.lng = data.mapInfo.lng;
+        form.value.baseInfo.gapInfo.lat = data.mapInfo.lat;
+        form.value.baseInfo.lnglat = `${data.mapInfo.lng},${data.mapInfo.lat}`;
+        form.value.baseInfo.zoom = data.mapInfo.zoom;
         uni.$off('mapAreaData');
     });
     if (form.value.baseInfo.gapInfo?.basePic) {
@@ -556,7 +586,26 @@ const getLocationByAddress = async () => {
         lat: location.latitude,
     };
 };
-
+const addPlot = (rowItem: any, title = '添加地块') => {
+    console.log(rowItem, '+dadas');
+    
+    rowForm.value = {
+        ...rowItem,
+    };
+    plotTitle.value = title;
+    showPlot.value = true;
+};
+const mapUnitByBaseType: any = {
+    '1': '亩',
+    '2': '平方米',
+    '3': '平方米',
+};
+onLoad((options: any) => {
+    form.value.baseInfo.baseType = options.baseType || '1';
+    form.value.baseInfo.gapInfo.areaUnit = mapUnitByBaseType[options.baseType || '1'];
+    console.log(options, mapUnitByBaseType[options.baseType || '1']);
+    
+});
 </script>
 <style lang="scss" scoped>
 .z-paging-wrap {

+ 303 - 0
src/plant/base/base-edit/models/form-plot.ts

@@ -0,0 +1,303 @@
+/**
+ * BaseAllAddDTO,种植端基地添加对象 pt_base
+ */
+export interface Request {
+    baseInfo?: BaseAddDTO;
+    environmentInfo?: BaseEnvironmentAddDTO;
+    /**
+     * 地块信息
+     */
+    landInfoList?: BaseLandInfoAddDTO[];
+    /**
+     * 是否暂存
+     */
+    tempFlag?: string;
+    [property: string]: any;
+}
+
+/**
+ * BaseAddDTO,种植端基地添加对象 pt_base
+ */
+export interface BaseAddDTO {
+    /**
+     * 基地编码
+     */
+    baseCode?: string;
+    /**
+     * 基地名称
+     */
+    baseName: string;
+    /**
+     * 基地类型
+     */
+    baseType: string;
+    /**
+     * 建设时间
+     */
+    buildDate: string;
+    /**
+     * 基地负责人
+     */
+    contactId?: number;
+    /**
+     * 基地联系电话
+     */
+    contactTel?: string;
+    /**
+     * 坐标系
+     */
+    coordinates?: Array<PointDTO[]>;
+    /**
+     * 是否GAP基地 0否 1是
+     */
+    gapFlag: string;
+    /**
+     * 基地ID
+     */
+    gapId?: number;
+    gapInfo?: GapRefBaseInfoDTO;
+    id?: number;
+    /**
+     * 基地组织方式
+     */
+    orgType: string;
+    /**
+     * 随机编码
+     */
+    randomCode?: string;
+    /**
+     * 是否暂存
+     */
+    tempFlag?: string;
+    [property: string]: any;
+}
+
+/**
+ * PointDTO
+ */
+export interface PointDTO {
+    lat?: number;
+    lng?: number;
+    [property: string]: any;
+}
+
+/**
+ * GapRefBaseInfoDTO,GAP认证信息关联基地视图对象
+ */
+export interface GapRefBaseInfoDTO {
+    /**
+     * 行政区划代码
+     */
+    adcode?: string;
+    /**
+     * 详细地址
+     */
+    address?: string;
+    /**
+     * 认证面积
+     */
+    area?: number;
+    /**
+     * 认证面积单位
+     */
+    areaUnit?: string;
+    /**
+     * 基地图片
+     */
+    basePic?: string;
+    /**
+     * 基地名称
+     */
+    gapBaseName?: string;
+    /**
+     * 主键
+     */
+    id?: number;
+    /**
+     * 纬度
+     */
+    lat?: number;
+    /**
+     * 经度
+     */
+    lng?: number;
+    /**
+     * 药材ID
+     */
+    medicineId?: number;
+    /**
+     * 药材名称
+     */
+    medicineName?: string;
+    /**
+     * 获评时间
+     */
+    ratedDate?: Date;
+    [property: string]: any;
+}
+
+/**
+ * BaseEnvironmentAddDTO,基地环境信息添加对象 pt_base_environment
+ */
+export interface BaseEnvironmentAddDTO {
+    /**
+     * 选址依据
+     */
+    accordFile?: AccesseryDTO[];
+    /**
+     * 选址适应性材料
+     */
+    adaptFile?: AccesseryDTO[];
+    /**
+     * 海拔
+     */
+    altitude?: string;
+    /**
+     * 年平均气温
+     */
+    avgTem?: string;
+    /**
+     * 基地ID
+     */
+    baseId?: number;
+    /**
+     * 基地图片
+     */
+    basePic?: string;
+    /**
+     * 基地视频
+     */
+    baseVoice?: AccesseryDTO[];
+    /**
+     * 是否道地场区
+     */
+    daoStatus?: string;
+    /**
+     * 年绝对最高气温
+     */
+    maxTem?: string;
+    /**
+     * 年绝对最低气温
+     */
+    minTem?: string;
+    /**
+     * 无霜期
+     */
+    notFrost?: string;
+    /**
+     * 有机质含量
+     */
+    organic?: string;
+    /**
+     * 年降水量
+     */
+    precipitation?: string;
+    /**
+     * 水、土壤、大气等环评报告
+     */
+    report?: AccesseryDTO[];
+    /**
+     * 土壤PH值
+     */
+    soilPh?: string;
+    /**
+     * 土壤质地
+     */
+    soilTexture?: string;
+    /**
+     * 土壤类型
+     */
+    soilType?: string;
+    /**
+     * 年日照时数
+     */
+    sunshineHours?: string;
+    /**
+     * 是否暂存
+     */
+    tempFlag?: string;
+    /**
+     * 水源类型
+     */
+    waterType?: string;
+    [property: string]: any;
+}
+
+/**
+ * AccesseryDTO,2025-03-10 10:14:28
+ * 附件DTO
+ */
+export interface AccesseryDTO {
+    /**
+     * 文件名称
+     */
+    fileName?: string;
+    /**
+     * 文件大小
+     */
+    fileSize?: number;
+    /**
+     * 文件URL
+     */
+    url?: string;
+    [property: string]: any;
+}
+
+/**
+ * BaseLandInfoAddDTO,基地地块添加对象 pt_base_land_info
+ */
+export interface BaseLandInfoAddDTO {
+    /**
+     * 面积
+     */
+    area?: number;
+    /**
+     * 面积单位
+     */
+    areaUnit?: string;
+    /**
+     * 基地ID
+     */
+    baseId: number;
+    /**
+     * 每层容量
+     */
+    capacityAmount?: number;
+    /**
+     * 容量单位
+     */
+    capacityUnit?: string;
+    /**
+     * 负责人ID
+     */
+    contact?: number;
+    /**
+     * 负责人名称
+     */
+    contactName?: string;
+    /**
+     * 地块名称/编号
+     */
+    landName: string;
+    /**
+     * 地块类型
+     */
+    landType?: string;
+    /**
+     * 层数
+     */
+    layers?: number;
+    /**
+     * 光照类型
+     */
+    lightType?: string;
+    /**
+     * 是否有独立温控
+     */
+    tempeStatus?: string;
+    /**
+     * 是否暂存
+     */
+    tempFlag?: string;
+    [property: string]: any;
+}

+ 190 - 0
src/plant/base/base-edit/models/form-plot.vue

@@ -0,0 +1,190 @@
+<template>
+    <ut-confirm-dialog v-model:show="visable" :title="title" width="680rpx">
+        <template #content>
+            <scroll-view scroll-y class="scroll-view-content" style="max-height: 60vh">
+                <view class="p-rtv pd4-0-24-24-24">
+                    <up-form ref="formRef" :model="form" :rules="rules" labelWidth="auto" class="p-rtv" labelPosition="top">
+                        <up-form-item label="名称/编号" prop="landName" required borderBottom>
+                            <up-input v-model="form.landName" placeholder="请输入名称/编号" border="none" clearable />
+                        </up-form-item>
+                        <template v-if="['1', '2'].includes(form.landType as string)">
+                            <up-form-item label="面积" prop="area" required borderBottom>
+                                <up-input v-model="form.area" placeholder="请输入面积" border="none" clearable />
+                                <template #right>
+                                    <span>{{ form.areaUnit || '亩' }}</span>
+                                </template>
+                            </up-form-item>
+                        </template>
+                        <template v-if="['3'].includes(form.landType as string)">
+                            <up-form-item label="层数" prop="layers" required borderBottom>
+                                <up-input v-model="form.layers" placeholder="请输入层数" border="none" clearable />
+                            </up-form-item>
+                            <up-form-item label="每层容量" prop="capacityAmount" required borderBottom>
+                                <up-input v-model="form.capacityAmount" placeholder="请输入每层容量" border="none" clearable />
+                                <template #right>
+                                    <span>{{ form.capacityUnit || '瓶' }}</span>
+                                </template>
+                            </up-form-item>
+                            <!-- 光照类型 -->
+                            <up-form-item label="光照类型" prop="lightType" borderBottom>
+                                <up-radio-group v-model="form.lightType" direction="row">
+                                    <up-radio :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in pt_light_type" :key="index" :label="item.label" :name="item.value"></up-radio>
+                                </up-radio-group>
+                            </up-form-item>
+                        </template>
+                        <up-form-item @click="selectCpyMember" borderBottom label="负责人" prop="contact">
+                            <view v-if="form.contact" class="f-s-30 c-333 f-w-5 flex1">{{ form.contactName }}</view>
+                            <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择负责人</view>
+                            <template #right>
+                                <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
+                            </template>
+                        </up-form-item>
+                    </up-form>
+                </view>
+            </scroll-view>
+        </template>
+        <template #footer>
+            <view class="pd-24 d-flex a-c">
+                <up-button class="mr-16">取消</up-button>
+                <up-button type="primary">添加</up-button>
+            </view>
+        </template>
+    </ut-confirm-dialog>
+</template>
+
+<script setup lang="ts" name="FormPlot">
+import { BaseLandInfoAddDTO } from './form-plot';
+const props = withDefaults(
+    defineProps<{
+        show: boolean;
+        title?: string;
+        modelValue?: BaseLandInfoAddDTO;
+        dict: any;
+    }>(),
+    {
+        show: false,
+        title: '新增地块',
+        dict: () => ({}),
+        modelValue: () => ({
+            landName: '',
+            area: undefined,
+            areaUnit: '亩',
+            baseId: 0,
+            capacityAmount: undefined,
+            capacityUnit: '株',
+            contact: undefined,
+            contactName: '',
+            landType: '',
+            layers: undefined,
+            lightType: '',
+            tempeStatus: '',
+            tempFlag: '',
+        }),
+    }
+);
+const { pt_base_type, pt_light_type } = toRefs(props.dict);
+const visable = ref(props.show);
+const emit = defineEmits<{
+    'update:show': [value: boolean];
+    close: [];
+    submit: [data: BaseLandInfoAddDTO];
+}>();
+
+const formRef = ref();
+const submitting = ref(false);
+const form = reactive<BaseLandInfoAddDTO>({
+    landName: '',
+    area: undefined,
+    areaUnit: '亩',
+    baseId: 0,
+    capacityAmount: undefined,
+    capacityUnit: '株',
+    contact: undefined,
+    contactName: '',
+    landType: '',
+    layers: undefined,
+    lightType: '',
+    tempeStatus: '',
+    tempFlag: '',
+});
+const selectCpyMember = () => {
+    uni.showToast({
+        title: '选择负责人功能待实现',
+        icon: 'none',
+    });
+};
+const rules = reactive({
+    landName: [{ required: true, message: '请输入名称/编号' }],
+    area: [
+        {
+            required: ['1', '2'].includes(form.landType as string),
+            message: '请输入面积',
+        },
+    ],
+    layers: [
+        {
+            required: form.landType === '3',
+            message: '请输入层数',
+        },
+    ],
+    capacityAmount: [
+        {
+            required: form.landType === '3',
+            message: '请输入每层容量',
+        },
+    ],
+});
+
+const onClose = () => {
+    emit('update:show', false);
+    emit('close');
+};
+watch(
+    () => props.show,
+    (newVal) => {
+        visable.value = newVal;
+    }
+);
+const onConfirm = async () => {
+    if (submitting.value) return;
+    try {
+        submitting.value = true;
+        // uview-plus 的 up-form 暴露 validate 方法
+        await formRef.value?.validate();
+        emit('submit', form);
+        emit('update:show', false);
+    } catch (e) {
+        // 校验不通过
+    }
+};
+watch(
+    () => props.modelValue,
+    (newVal) => {
+        console.log(newVal, '++++++++++++++++');
+
+        Object.assign(form, newVal);
+    },
+    { immediate: true }
+);
+</script>
+
+<style scoped lang="scss">
+.popup-card {
+    width: 86vw;
+    max-width: 680rpx;
+    background: #fff;
+    border-radius: 16rpx;
+    padding: 24rpx;
+}
+.header {
+    margin-bottom: 12rpx;
+}
+.title {
+    font-size: 32rpx;
+    font-weight: 600;
+}
+.footer {
+    margin-top: 20rpx;
+    gap: 24rpx;
+}
+</style>

+ 122 - 0
src/plant/port/port-create/index.vue

@@ -0,0 +1,122 @@
+<template>
+    <z-paging ref="paging" v-model="list" bgColor="#f7f7f7" @query="query" safe-area-inset-bottom>
+        <template #top>
+            <ut-navbar title="创建种养殖任务" :fixed="false"></ut-navbar>
+        </template>
+        <view class="pt-26">
+            <up-form class="p-rtv" labelPosition="top" :model="form" :rules="rules" labelWidth="auto" ref="upFormRef">
+                <view class="startline-title pl-24 ml-26 mb-16">基地信息</view>
+                <view class="bg-#fff pd-26">
+                    <view class="b-radius bg-#EBF6EE c-primary f-s-24 pd-26"> 注意:关联时请确保已添加到地块;关联时必须选到地块/圈 舍/组培架。</view>
+                </view>
+                <view class="bg-#fff pd-26 mb-20">
+                    <up-form-item :borderBottom="false" label="种养殖所在基地" required prop="plantBase">
+                        <view class="w-100% d-flex a-c j-c pd-26 b-radius bg-#FBFDFB border-#AFDDBB" @click="openDrawer">
+                            <view class=""></view>
+                            <view class="f-s-34 c-primary">请选择种养殖所在的基地</view>
+                        </view>
+                    </up-form-item>
+                </view>
+                <view class="startline-title pl-24 ml-26 mb-16">种养殖信息</view>
+                <view class="bg-#fff pd-26 mb-20">
+                    <ut-action-sheet v-model="form.queryType" :tabs="pt_task_type" title="选择任务类型">
+                        <up-form-item borderBottom label="任务类型" required prop="baseType">
+                            <view v-if="form.queryType1" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_org_type, form.queryType1) }}</view>
+                            <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择任务类型</view>
+                            <template #right>
+                                <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
+                            </template>
+                        </up-form-item>
+                    </ut-action-sheet>
+                    <ut-action-sheet v-model="form.queryType1" :tabs="pt_org_type" title="选择溯源级别">
+                        <up-form-item borderBottom label="溯源级别" required prop="orgType">
+                            <view v-if="form.queryType1" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_org_type, form.queryType1) }}</view>
+                            <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择溯源级别</view>
+                            <template #right>
+                                <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
+                            </template>
+                        </up-form-item>
+                    </ut-action-sheet>
+                    <up-form-item borderBottom label="符合要求" required prop="gapFlag">
+                        <view v-if="form.queryType2" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_org_type, form.queryType1) }}</view>
+                        <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择符合要求</view>
+                        <template #right>
+                            <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
+                        </template>
+                    </up-form-item>
+                    <up-form-item borderBottom label="动物名称" required prop="plantBase">
+                        <view class="w-100% d-flex a-c j-c pd-26 b-radius bg-#FBFDFB border-#AFDDBB">
+                            <view class=""></view>
+                            <view class="f-s-34 c-primary">请选择养植的动物名称</view>
+                        </view>
+                    </up-form-item>
+                    <up-form-item borderBottom label="养殖批号" required prop="plantBase">
+                        <view class="d-flex a-c j-sb w-100%">
+                            <up-input v-model="form.queryType3" placeholder="请输入养殖批号" border="none"></up-input>
+                            <up-button class="c-#fff" type="primary" style="height: 50rpx; width: 130rpx">随机生成</up-button>
+                        </view>
+                    </up-form-item>
+                    <up-form-item label="请选择养殖技术规程文件" prop="environmentInfo.report" borderBottom>
+                        <ut-upload v-model="form.queryType4" :max-count="9" valueType="array" accept="file"></ut-upload>
+                    </up-form-item>
+                    <ut-action-sheet v-model="form.queryType5" :tabs="pt_task_type" title="选择任务类型">
+                        <up-form-item borderBottom label="任务类型" required prop="baseType">
+                            <view v-if="form.queryType1" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_org_type, form.queryType1) }}</view>
+                            <view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择养殖方式</view>
+                            <template #right>
+                                <up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
+                            </template>
+                        </up-form-item>
+                    </ut-action-sheet>
+                </view>
+            </up-form>
+        </view>
+    </z-paging>
+
+    <!-- 添加drawer组件 -->
+    <Drawer v-if="drawerVisible" v-model="drawerVisible" @open="onDrawerOpen" @close="onDrawerClose" />
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue';
+import Drawer from './models/drawer.vue';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { pt_task_type, pt_org_type, yes_no } = toRefs<any>(proxy?.useDict('pt_task_type', 'pt_org_type', 'yes_no'));
+const form = ref({
+    queryType: '',
+    queryType1: '',
+    queryType2: '',
+    queryType3: '',
+    queryType4: '',
+    queryType5: '',
+});
+const paging = ref<unknown>('paging');
+const list = ref<unknown>([]);
+
+// 控制抽屉显示状态
+const drawerVisible = ref(false);
+
+// 打开抽屉
+function openDrawer() {
+    drawerVisible.value = true;
+}
+
+// 关闭抽屉
+function closeDrawer() {
+    drawerVisible.value = false;
+}
+
+// 处理抽屉打开事件
+function onDrawerOpen() {
+    console.log('抽屉打开了');
+}
+
+// 处理抽屉关闭事件
+function onDrawerClose() {
+    console.log('抽屉关闭了');
+}
+
+onLoad((options) => {
+    console.log(options);
+});
+</script>

+ 193 - 0
src/plant/port/port-create/models/drawer.vue

@@ -0,0 +1,193 @@
+<template>
+    <up-popup :show="modelValue" mode="right" @close="handleClose" @open="handleOpen">
+        <ut-navbar :fixed="false" bgColor="transparent">
+            <template #left>
+                <view class="c-#333 f-s-34 f-w-5">请选择种养殖所在基地</view>
+            </template>
+        </ut-navbar>
+        <view class="h-86 pd-20 pt-0">
+            <ut-search ref="searchRef" v-model="form.keyword" @search="changeSeach" margin="0" :border="false" placeholder="搜基地名称、编号、地址、负责人" bgColor="#f7f7f7" height="86rpx" borderRadius="16rpx"></ut-search>
+        </view>
+        <view class="d-flex pl-20 mb-20">
+            <view class="f-s-26 w-90 h-54 radius-100 bg-#f7f7f7 d-flex a-c j-c mr-20 c-#333" @click="changeSelect(0)" :style="{ backgroundColor: activeSelect == 0 ? '#37A954' : '', color: activeSelect == 0 ? '#FFF' : '' }">全部</view>
+            <view class="f-s-26 w-150 h-54 radius-100 bg-#f7f7f7 d-flex a-c j-c mr-20 c-#333" @click="changeSelect(1)" :style="{ backgroundColor: activeSelect == 1 ? '#37A954' : '', color: activeSelect == 1 ? '#FFF' : '' }">GAP基地</view>
+            <view class="f-s-26 w-200 h-54 radius-100 bg-#f7f7f7 d-flex a-c j-c mr-20 c-#333" @click="changeSelect(2)" :style="{ backgroundColor: activeSelect == 2 ? '#37A954' : '', color: activeSelect == 2 ? '#FFF' : '' }">三无一全基地</view>
+        </view>
+        <view class="w-700 d-flex" id="scroll">
+            <scroll-view class="w-50% bg-#f7f7f7 c-#fff" :style="`height: calc(100vh - ${top}px)`" scroll-y="true">
+                <view v-for="(item, index) in 10" :key="index" class="border-#E6E6E6 pd-20 title" :class="{ activeTitle: activeBase == index }" @click="changeBase(index)">
+                    <view class="">
+                        <text class="base">香格里拉市虎跳峡镇宝山村基地 </text>
+                        <text class="area">12000平方米</text>
+                    </view>
+                    <view class="pt-10">
+                        <view class="label">GAP</view>
+                    </view>
+                </view>
+            </scroll-view>
+            <scroll-view class="w-50% pd-16" :style="`height: calc(100vh - ${top}px)`" scroll-y="true">
+                <up-checkbox label="全选" labelColor="#333" name="agree" usedAlone :checked="aloneChecked" @change="handleAllCheckboxChange"></up-checkbox>
+                <!-- 复选框组包含全选框 -->
+                <up-checkbox-group activeColor="#37a954" :modelValue="checkBox" @change="handleCheckboxGroupChange" iconPlacement="right" placement="column">
+                    <up-checkbox v-for="(item, index) in mixData" :key="index" :name="item?.name" :label="item?.label"></up-checkbox>
+                </up-checkbox-group>
+            </scroll-view>
+        </view>
+    </up-popup>
+</template>
+<script setup lang="ts">
+import { ref, reactive, watch, computed } from 'vue';
+const instance = getCurrentInstance();
+defineProps<{
+    modelValue: boolean;
+}>();
+const form = ref({
+    keyword: '',
+});
+// 定义emit事件:通知父组件状态变化
+const emit = defineEmits<{
+    (e: 'update:modelValue', value: boolean): void;
+    (e: 'open'): void;
+    (e: 'close'): void;
+}>();
+
+// 处理关闭事件
+function handleClose() {
+    emit('update:modelValue', false);
+    emit('close');
+}
+
+// 处理打开事件
+function handleOpen() {
+    emit('open');
+}
+// 处理切换搜索
+const activeSelect = ref(0);
+const changeSelect = (index: number) => {
+    activeSelect.value = index;
+};
+
+// 处理搜索
+const changeSeach = () => {
+    console.log('搜索关键词:', form.value.keyword);
+    // 这里可以添加实际的搜索逻辑
+};
+// 切换基地>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+const activeBase = ref(0);
+const changeBase = (index: number) => {
+    activeBase.value = index;
+};
+// 选择checkbox>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+// 所有复选框的name值
+//模拟数据
+const mixData = ref([
+    {
+        name: 'red',
+        label: '红色',
+    },
+    {
+        name: 'green',
+        label: '绿色',
+    },
+    {
+        name: 'blue',
+        label: '蓝色',
+    },
+]);
+let allCheckboxNames: string[] = [];
+setTimeout(() => {
+    mixData.value.forEach((item) => {
+        allCheckboxNames.push(item.name);
+    });
+}, 2000);
+
+let checkBox = ref<string[]>([]);
+const aloneChecked = ref(false);
+
+// 全选框change事件处理
+const handleAllCheckboxChange = (value: boolean) => {
+    aloneChecked.value = value;
+    if (value) {
+        // 全选:将checkBox设置为所有name
+        checkBox.value = [...allCheckboxNames];
+    } else {
+        // 取消全选:清空checkBox
+        checkBox.value = [];
+    }
+};
+
+// 复选框组change事件处理
+const handleCheckboxGroupChange = (value: string[]) => {
+    checkBox.value = value;
+    // 检查是否所有复选框都被选中
+    const allSelected = allCheckboxNames.every((name) => value.includes(name));
+    aloneChecked.value = allSelected;
+};
+const top = ref(0);
+onMounted(() => {
+    const querys = uni.createSelectorQuery().in(instance?.proxy);
+    querys
+        .select('#scroll')
+        .boundingClientRect((data: any) => {
+            top.value = data.top;
+        })
+        .exec();
+});
+</script>
+<style scoped lang="scss">
+:deep(.u-border-bottom) {
+    border-color: transparent !important;
+}
+.title {
+    .base {
+        font-size: 28rpx;
+        color: #333;
+        font-weight: 500;
+    }
+    .area {
+        font-size: 24rpx;
+        color: #999;
+    }
+    .label {
+        font-size: 24rpx;
+        color: #37a954;
+        border-radius: 100rpx;
+        background-color: #e3efe6;
+        width: max-content;
+        padding-left: 14rpx;
+        padding-right: 14rpx;
+        padding-top: 6rpx;
+        padding-bottom: 6rpx;
+    }
+}
+.activeTitle {
+    background-color: #37a954;
+    .base {
+        font-size: 28rpx;
+        color: #fff;
+        font-weight: 500;
+    }
+    .area {
+        font-size: 24rpx;
+        color: #ebf6ee;
+    }
+    .label {
+        font-size: 24rpx;
+        color: #fff;
+        border-radius: 100rpx;
+        background-color: #5fba76;
+        width: max-content;
+        padding-left: 14rpx;
+        padding-right: 14rpx;
+        padding-top: 6rpx;
+        padding-bottom: 6rpx;
+    }
+}
+:deep(.u-checkbox-label--left) {
+    flex-direction: row-reverse !important;
+}
+:deep(.u-checkbox__icon-wrap) {
+    margin-right: 0 !important;
+    margin-left: 10px;
+}
+</style>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
stats.html


+ 10 - 0
unocss.config.js

@@ -157,6 +157,16 @@ export default defineConfig({
                 transform: 'rotate(360deg)',
             }),
         ],
+        //边框
+        [
+            /^border-([\w#-]+)$/,
+            ([_, color]) => ({
+                'border-color': color,
+                'border-style': 'solid',
+                'border-width': '1rpx',
+                transform: 'rotate(360deg)',
+            }),
+        ],
         // 旋转度数
         [
             /^rotate-([\-\.\d]+)$/,

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä