Sfoglia il codice sorgente

Merge branch 'localhost'

codeMan 1 anno fa
parent
commit
feefab9d61

+ 4 - 4
cloud/businessCard/index.vue

@@ -29,10 +29,10 @@
                         <text class="phone">{{ userInfo.phonebumber||'暂无' }}</text>
                         <view class="redline"></view>
                     </view>
-                    <view class="right">
+                    <navigator class="right">
                         <image :src="userInfo.headpic || 'https://yossys06593.obs.cn-east-3.myhuaweicloud.com:443/202404231713854678447B26b4363.svg'" mode="aspectFill">
                         </image>
-                    </view>
+                    </navigator>
                 </view>
                 <view class="bottom">
                     <view class="left">
@@ -49,10 +49,10 @@
                             <view class="text u-line-2">{{ userInfo.address ||'暂无' }}</view>
                         </view>
                     </view>
-                    <view class="right">
+                    <navigator class="right" :url="'/cloud/businessCard/share?id='+userid">
                         <image class="code" src="/static/workbench/二维码.svg" />
                         <text>名片码</text>
-                    </view>
+                    </navigator>
                 </view>
             </view>
         </view>

+ 3 - 0
cloud/contacts/index.vue

@@ -87,6 +87,9 @@ export default {
             console.log(this.groupList,'分组列表');
         },
         onLoad () {
+            uni.setNavigationBarTitle({
+                title:'通讯录',
+            })
             this.getGroup()
         }
     },

+ 2 - 1
cloud/mySubscription/list.vue

@@ -8,7 +8,7 @@
                     <text class="title">{{ item.name }}</text>
                     <view class="address">
                         <i class="iconfont icon-dizhi-hui1"></i>
-                        <text>{{ item.province+item.city+item.county+item.address }}</text>
+                        <text class="u-line-2">{{ item.province+item.city+item.county+item.address }}</text>
                     </view>
                 </view>
             </view>
@@ -52,6 +52,7 @@ export default {
       display: flex;
       flex-direction: column;
       border-radius: 8px 8px 8px 8px;
+      margin-bottom: 10px;
       .item-top {
           display: flex;
           flex-direction: column;

+ 208 - 2
store/budget/changePrice.vue

@@ -1,13 +1,219 @@
 <template>
     <view>
-        装修预算改价
+        <view class="price-content">
+            <AForm ref="form" :form="form" @isUncomplete="isUncomplete"></AForm>
+            <view style="height: 70px;" />
+            
+        </view>
+        <view class="footer">
+            <view class="add" :class="uncomplete ? 'forbidden' : ''" hover-class="navigator-hover"
+                @click="uncomplete || loading ? '' : submit()">
+                <u-loading-icon v-if="loading" />
+                <block v-else>
+                    {{  '保存' }}
+                </block>
+            </view>
+        </view>
     </view>
+    
 </template>
 
 <script>
+import AForm from './my_form.vue'
 export default {
+    components:{AForm},
+    data () {
+        return{
+            uncomplete:true,
+            loading:false,
+            form: [],
+            sa_storeid:uni.getStorageSync('shop').sa_storeid
+        }
+    },
+    methods: {
+        async init () {
+            let from = [{
+                key: "cufang_min",
+                type: "text",
+                inputmode:'digit',
+                label: "厨房最小单价",
+                isMust: true,//是否必填
+                value: "",
+                title:'1个厨房(6平方)',
+                descript:'官方指导价199元',
+            },{
+                key: "cufang_max",
+                type: "text",
+                inputmode:'digit',
+                label: "厨房最大单价",
+                isMust: true,//是否必填
+                value: "",
+                marginBottom:10,
+                paddingBottom:15,
+                borderRadius:true
+            },{
+                key: "weiyu_min",
+                type: "text",
+                inputmode:'digit',
+                label: "卫浴最小单价",
+                isMust: true,//是否必填
+                value: "",
+                title:'1个卫浴(4平方)',
+                descript:'官方指导价799元'
+            },{
+                key: "weiyu_max",
+                type: "text",
+                inputmode:'digit',
+                label: "卫浴最大单价",
+                isMust: true,//是否必填
+                value: "",
+                marginBottom:10,
+                paddingBottom:15,
+                borderRadius:true
+            },{
+                key: "bg_min",
+                type: "text",
+                inputmode:'digit',
+                label: "背景墙最小单价",
+                isMust: true,//是否必填
+                value: "",
+                paddingBottom:false,
+                title:'1个背景墙(4平方)',
+                descript:'官方指导价199元'
+            },{
+                key: "bg_max",
+                type: "text",
+                inputmode:'digit',
+                label: "背景墙最大单价",
+                isMust: true,//是否必填
+                value: "",
+                paddingBottom:15,
+                borderRadius:true
+            }]
+            await this.$Http.basic({
+                "id": 20240515131702,
+                "content": {
+                    "sa_storeid": this.sa_storeid
+                }
+            }).then(res => {
+                for (let i = 0; i < res.data.length; i++) {
+                    for (let j = 0; j < from.length; j++) {
+                        if (from[j].label.indexOf(res.data[i].type) != -1) {
+                            if (from[j].key.indexOf('min') != -1) {
+                                from[j].value = res.data[i].min_price
+                            } else {
+                                from[j].value = res.data[i].max_price
+                            }
+                        }
+                    }
+                }
+                console.log(res.data,'门店价');
+            })
 
+
+            await this.$Http.basic({
+                "id": 20240515133602,
+                "content": {
+                }
+            }).then(res => {
+                for (let i = 0; i < res.data.length; i++) {
+                    for (let j = 0; j < from.length; j++) {
+                        if (from[j].label.indexOf(res.data[i].type) != -1) {
+                            if (from[j].key.indexOf('min') != -1) {
+                                from[j].descript = '官方指导价' + res.data[i].min_price + '元'
+                            } else {
+                                from[j].descript = '官方指导价元' + res.data[i].max_price + '元'
+                            }
+                        }
+                    }
+                }
+                this.form = from
+                console.log(res.data,'官方价');
+                console.log(this.form,'value');
+            })
+
+
+        },
+        isUncomplete(uncomplete,actions) {
+            console.log(uncomplete,'验证');
+            this.uncomplete = uncomplete;
+        },
+        submit() {
+            this.loading = true;
+            let that = this;
+            this.$refs.form.submit().then(data => {
+                this.$Http.basic({
+                    "id": 20240515134102,
+                    "content": {
+                        sa_storeid:that.sa_storeid,
+                        "items": [
+                            {
+                                "type": "厨房",
+                                "min_price": data.cufang_min,
+                                "max_price": data.cufang_max
+                            },
+                            {
+                                "type": "卫浴",
+                                "min_price": data.weiyu_min,
+                                "max_price": data.weiyu_max
+                            },
+                            {
+                                "type": "背景墙",
+                                "min_price": data.bg_min,
+                                "max_price": data.bg_max
+                            }
+                        ]
+                    }
+                }).then(async res => {
+                    this.loading = false;
+                    console.log("修改信息", res)
+                    if (this.cutoff(res.msg)) return;
+                    uni.showToast({
+                        title:'修改成功'
+                    })
+                })
+            })
+        },
+    },
+    onLoad () {
+        this.init()
+        uni.setNavigationBarTitle({
+            title:'装修预算改价',
+        })
+    }
 }
 </script>
 
-<style></style>
+<style lang="scss">
+.price-content {
+    padding: 10px 10px 0 10px;
+    box-sizing: border-box;
+}
+.footer {
+    position: fixed;
+    bottom: 0;
+    width: 100vw;
+    height: 65px;
+    background: #FFFFFF;
+    box-shadow: 0px -2px 6px 1px rgba(0, 0, 0, 0.16);
+    box-sizing: border-box;
+    padding: 5px 10px;
+    z-index: 2;
+    .add {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        width: 100%;
+        height: 45px;
+        background: #C30D23;
+        border-radius: 5px;
+        font-family: PingFang SC, PingFang SC;
+        font-size: 14px;
+        color: #FFFFFF;
+    }
+
+    .forbidden {
+        opacity: .6;
+    }
+}
+</style>

+ 824 - 0
store/budget/my_form.vue

@@ -0,0 +1,824 @@
+<template>
+    <view>
+        <view class="requiredFieldOnly-head" v-if="requiredFieldOnly">
+            <view class="label">
+                基本信息
+            </view>
+            <view class="content">
+                仅显示必填信息<text style="padding: 0 2.5px;" /> <u-switch activeColor="#C40C24" v-model="unShowAll" />
+            </view>
+        </view>
+        <slot name="head" />
+        <view v-for="(item, index) in  list " :key="item.key">
+            <block v-if="item.isMust || !unShowAll">
+                <!-- 文本输入 -->
+                <view class="input-box" v-if="item.type == 'text'"
+                    :style="{ marginTop: tovw(item.marginTop || 0), opacity: item.disabled ? 0.7 : 1 }"
+                    @click="focusLabel = item.label">
+                    <view class="box" :style="[{'padding-bottom':item.paddingBottom ? `${tovw(item.paddingBottom)}`:''},{'margin-bottom':item.marginBottom?`${tovw(item.marginBottom)}`:''}]" :class="item.unBorBot ? '' : 'borBot'">
+                        <view class="title" v-if="item.title">{{ item.title }}</view>
+                        <view class="label">
+                            <view class="left">
+                                <text class="must" v-if="item.isMust">*</text>
+                                {{ item.label }}:
+                            </view>
+                            <view class="right">{{ item.descript }}</view>
+                        </view>
+                        <view class="content-box">
+                            <view class="content">
+                                <input v-if="item.inputmode == 'number'" type="number" :disabled="item.disabled"
+                                    placeholder-style="color: #BBBBBB;font-family: Source Han Sans SC, Source Han Sans SC;"
+                                    :focus="focusLabel == item.label" :placeholder="item.placeholder || '请填写' + item.label"
+                                    :value="item.value"
+                                    @input="onInput($event, index)" :maxlength="item.maxlength || '499'"
+                                    confirm-type="done" />
+                                <input v-else-if="item.inputmode == 'digit'" type="digit" :disabled="item.disabled"
+                                    placeholder-style="color: #BBBBBB;font-family: Source Han Sans SC, Source Han Sans SC;"
+                                    :focus="focusLabel == item.label" :placeholder="item.placeholder || '请填写' + item.label"
+                                    :value="item.value"
+                                    @input="onInput($event, index)" :maxlength="item.maxlength || '499'"
+                                    confirm-type="done" />
+                                <textarea v-else :disabled="item.disabled"
+                                    placeholder-style="color: #BBBBBB;font-family: Source Han Sans SC, Source Han Sans SC;"
+                                    auto-height type="text" :focus="focusLabel == item.label"
+                                    :placeholder="item.placeholder || '请填写' + item.label" :value="item.value"
+                                    @input="onInput($event, index)"
+                                    :maxlength="item.maxlength || '499'" confirm-type="done" />
+                                <icon v-if="item.value && !item.disabled" class="icon" type="clear" size="3.733vw"
+                                    @click="onClearInput(index)" />
+                            </view>
+                            <view v-if="item.errText" class="err-text">
+                                <icon class="icon" color="#E3041F" type="clear" size="2.733vw" />
+                                {{ item.errText }}
+                            </view>
+                        </view>
+                    </view>
+                </view>
+                <!-- 文本域 -->
+                <view class="textarea-box" v-else-if="item.type == 'textarea'">
+                    <textarea class="textarea" :class="item.unBorBot ? '' : 'borBot'" :disabled="item.disabled"
+                        placeholder-style="color: #BBBBBB;font-family: Source Han Sans SC, Source Han Sans SC;" type="text"
+                        :placeholder="item.placeholder || '请填写' + item.label" :value="item.value"
+                        @input="onInput($event, index)" :maxlength="item.maxlength || '499'" confirm-type="done" />
+                </view>
+                <!-- 自定义选项分类 -->
+                <view class="custom-class-box" v-else-if="item.type == 'customClass'"
+                    :style="{ marginTop: tovw(item.marginTop || 0) }">
+                    <view class="head">
+                        <view class="label">
+                            <text class="must" style="color: #E3041F;" v-if="item.isMust">*</text>
+                            {{ item.label }}
+                        </view>
+                        <view class="state">
+                            {{ item.isMultipleChoice ? '可多选' : '仅单选' }}
+                        </view>
+                    </view>
+                    <view class="options">
+                        <view class="option"
+                            :class="item.isMultipleChoice ? (item.value.includes(option.value) ? 'active' : '') : (item.value == option.value ? 'active' : '')"
+                            v-for=" option  in  item.list " :key="option.value" hover-class="navigator-hover"
+                            @click="changOptions(option.value, index)">
+                            {{ option.remarks }}
+                        </view>
+                    </view>
+                </view>
+                <!-- 选择所在地区 -->
+                <picker class="region" @change="selectRegion($event, index)" mode='region' :disabled="item.disabled"
+                    :value="item.value" v-else-if="item.type == 'region'"
+                    :style="{ marginTop: tovw(item.marginTop || 0), opacity: item.disabled ? 0.7 : 1 }">
+                    <view class="box" :class="item.unBorBot ? '' : 'borBot'">
+                        <view class="label">
+                            <text class="must" v-if="item.isMust">*</text>
+                            {{ item.label }}:
+                        </view>
+                        <view class="content-box">
+                            <view class="value" v-if="item.value.length">
+                                {{ item.value.join(",") }}
+                            </view>
+                            <view v-else class="placeholder" hover-class="none">
+                                {{ item.placeholder || '请选择' + item.label }}
+                            </view>
+                            <view v-if="!item.disabled" class="iconfont icon-a-wodetiaozhuan" />
+                        </view>
+                    </view>
+                </picker>
+                <!-- 日期 -->
+                <picker class="region" @change="selectRegion($event, index)" mode='date' :disabled="item.disabled"
+                    :value="item.value" v-else-if="item.type == 'date'"
+                    :style="{ marginTop: tovw(item.marginTop || 0), opacity: item.disabled ? 0.7 : 1 }">
+                    <view class="box" :class="item.unBorBot ? '' : 'borBot'">
+                        <view class="label">
+                            <text class="must" v-if="item.isMust">*</text>
+                            {{ item.label }}:
+                        </view>
+                        <view class="content-box">
+                            <view class="value" v-if="item.value">
+                                {{ item.value }}
+                            </view>
+                            <view v-else class="placeholder" hover-class="none">
+                                {{ item.placeholder || '请选择' + item.label }}
+                            </view>
+                            <view v-if="!item.disabled" class="iconfont icon-a-wodetiaozhuan" />
+                        </view>
+                    </view>
+                </picker>
+                <!-- 上传附件 -->
+                <view class="custom-class-box" v-else-if="item.type == 'upload'"
+                    :style="{ marginTop: tovw(item.marginTop || 0) }">
+                    <view class="head">
+                        <view class="label">
+                            <text class="must" v-if="item.isMust">*</text>
+                            {{ item.label }}
+                        </view>
+                        <view class="state">
+                            {{ item.placeholder }}
+                        </view>
+                    </view>
+                    <view class="content">
+                        <view class="file-box" v-for="file in item.value" :key="file.attachmentid">
+                            <image class="image" v-if="file.fileType == 'image'" :src="file.url" mode="aspectFill"
+                                lazy-load="true" @click="previewImg(file)" />
+                            <video v-else-if="file.fileType == 'video'" class="video" :poster="file.subfiles[0].url"
+                                :src="file.url" />
+                            <image class="delete" @click.stop="deleteFile(file, index)"
+                                src="https://yossys06593.obs.cn-east-3.myhuaweicloud.com:443/202404241713944430197B47af9b2f.png"
+                                mode="widthFix" />
+                        </view>
+                        <My_upload v-if="item.allowUpload" :showLoading="false" :accept="item.accept"
+                            @uploadCallback="uploadCallback($event, index)" @onLoading="onUploadLoading($event, index)">
+                            <view class="upload-box" hover-class="navigator-hover">
+                                <u-loading-icon v-if="item.loading" />
+                                <text v-else class="iconfont icon-xiazai" />
+                                <text style="margin-left: 5px;">上传</text>
+                            </view>
+                        </My_upload>
+                    </view>
+                </view>
+                <!-- 开关 -->
+                <view class="region" v-else-if="item.type == 'switch'">
+                    <view class="box" :class="item.unBorBot ? '' : 'borBot'">
+                        <view class="label">
+                            <text class="must" v-if="item.isMust">*</text>
+                            {{ item.label }}:
+                        </view>
+                        <view class="content-box">
+                            <view />
+                            <u-switch activeColor="#70D95D" v-model="item.value" :disabled="item.disabled"
+                                @change="switchChange($event, index)" />
+                        </view>
+                    </view>
+                </view>
+                <!-- 性别 -->
+                <view class="region" v-else-if="item.type == 'sex'">
+                    <view class="box" :class="item.unBorBot ? '' : 'borBot'">
+                        <view class="label">
+                            <text class="must" v-if="item.isMust">*</text>
+                            {{ item.label }}:
+                        </view>
+                        <u-radio-group v-model="item.value" placement="row" @change="groupChange($event, index)">
+                            <u-radio :customStyle="{ marginRight: tovw(60) }" label="男" name="男" />
+                            <u-radio label="女" name="女" />
+                        </u-radio-group>
+                    </view>
+                </view>
+                <!-- 单选 -->
+                <view class="region" v-else-if="item.type == 'radio'">
+                    <view class="box" :class="item.unBorBot ? '' : 'borBot'">
+                        <view class="label">
+                            <text class="must" v-if="item.isMust">*</text>
+                            {{ item.label }}:
+                        </view>
+                        <u-radio-group v-model="item.value" :placement="item.placement || 'row'"
+                            @change="groupChange($event, index)">
+                            <u-radio v-for="option in item.options"
+                                :customStyle="{ marginRight: tovw(option.marginRight || item.marginRight || 0), marginTop: tovw(option.marginTop || item.marginTop || 0) }"
+                                :key="option.label" :label="option.label" :name="option.name" />
+                        </u-radio-group>
+                    </view>
+                </view>
+                <!-- 路由选择器 -->
+                <view class="region" v-else-if="item.type == 'route'"
+                    :style="{ marginTop: tovw(item.marginTop || 0), opacity: item.disabled ? 0.7 : 1 }"
+                    @click="item.disabled ? '' : toRoute(item, index)">
+                    <view class="box" :class="item.unBorBot ? '' : 'borBot'">
+                        <view class="label">
+                            <text class="must" v-if="item.isMust">*</text>
+                            {{ item.label }}:
+                        </view>
+                        <view class="content-box">
+                            <view class="value" v-if="item.value.length">
+                                {{ item.showValue.join(",") }}
+                            </view>
+                            <view v-else class="placeholder" hover-class="none">
+                                {{ item.placeholder || '请选择' + item.label }}
+                            </view>
+                            <view v-if="!item.disabled" class="iconfont icon-a-wodetiaozhuan" />
+                        </view>
+                    </view>
+                </view>
+            </block>
+        </view>
+    </view>
+</template>
+
+<script>
+import { formattedFiles, viewImage } from "../../utils/settleFiles.js"
+
+export default {
+    name: "my_form",
+    props: {
+        form: {
+            type: Array,
+            default: []
+        },
+        isUncomplete: {
+            type: Function
+        },
+        onUploading: {
+            type: Function
+        },
+        requiredFieldOnly: {
+            type: Boolean
+        },
+        isShowAll: {
+            type: Function
+        },
+        interrupt: {
+            type: Function
+        }
+    },
+    data() {
+        return {
+            list: [],
+            focusLabel: "",
+            unShowAll: false,
+        }
+    },
+    watch: {
+        form: {
+            handler: function (newVal) {
+                if (newVal) {
+                    this.list = JSON.parse(JSON.stringify(newVal));
+                    setTimeout(() => {
+                        this.verify()
+                    }, 200);
+                }
+            },
+            immediate: true,
+        },
+        unShowAll: function (newVal) {
+            this.$emit("isShowAll", newVal)
+        }
+    },
+    async created() {
+        /*     let list = [{
+                key: "name",
+                type: "text",
+                label: "标题",
+                isMust: true,//是否必填
+                value: "",
+                inputmode:"", //https://uniapp.dcloud.net.cn/component/input.html#type
+                marginTop: 10,
+                verify:[],
+            }, {
+                key: "Class",
+                type: "customClass",
+                label: "标题",
+                isMust: false,//是否必填
+                isMultipleChoice: true,//是否多选
+                value: [],// 多选[] 单选 ""
+                isMust: true,//是否必填
+                list: await this.getCustomClass('picturespace'),
+                marginTop: 10
+            },{
+                key: "attachmentids",
+                type: "upload",
+                label: "图片/视频",
+                accept:"all",
+                placeholder: "可上传多个视频或图片",
+                ownertable: "temporary",
+                ownerid: 999,
+                usetype: 'default',
+                allowUpload: true,
+                allowDelete: true,
+                value:[],
+                marginTop: 10
+            }, {
+                key: "region",
+                type: "region",
+                label: "所在地区",
+                isMust: true,//是否必填
+                value: [],
+            }, {
+                key: "address",
+                type: "textarea",
+                label: "详细地址",
+                isMust: true,//是否必填
+                value: '',
+            }, {
+                key: "isdefault",
+                type: "switch",
+                label: "设为默认地址",
+                isMust: false,//是否必填
+                value: false,
+                isNum: true,
+                unBorBot: true
+            }] */
+    },
+    methods: {
+        toRoute(item, index) {
+            uni.navigateTo({
+                url: item.path
+            });
+            this.$Http.routeSelected = function (selected) {
+                this.$emit('interrupt', item, selected, index)
+                delete this.$Http.routeSelected;
+            }.bind(this)
+        },
+        onInput(e, index) {
+            let item = this.list[index];
+            item.errText = "";
+            this.$set(this.list[index], 'value', e.detail.value)
+            if (item.verify && item.verify.length && item.value != '') {
+                let err = item.verify.find(r => !new RegExp(r.reg).test(item.value));
+                if (err) this.$set(this.list[index], 'errText', err.errText)
+            }
+            this.verify()
+        },
+        setItem(index, item, back = false) {
+            this.$set(this.list, index, item)
+            this.verify()
+            if (back) uni.navigateBack();
+        },
+        setValue(index, value, back = false) {
+            this.$set(this.list[index], 'value', value)
+            this.verify()
+            if (back) uni.navigateBack();
+        },
+        onClearInput(index) {
+            let item = this.list[index];
+            item.errText = ''
+            this.$set(this.list[index], 'value', '')
+            this.verify()
+        },
+        switchChange(e, index) {
+            this.$set(this.list[index], 'value', e)
+            this.verify()
+        },
+        changOptions(value, index) {
+            let item = this.list[index];
+            if (item.isMultipleChoice) {
+                let i = -1;
+                try {
+                    i = item.value.findIndex(v => v == value)
+                } catch (error) {
+                }
+                if (i == -1) {
+                    item.value.push(value)
+                } else {
+                    item.value.splice(i, 1)
+                }
+                this.$set(this.list[index], 'value', item.value)
+            } else {
+                this.$set(this.list[index], 'value', value)
+            }
+            this.verify()
+        },
+        verify() {
+            let list = this.list.filter(v => v.isMust);
+            let Uncomplete = false;
+            if (list.length) Uncomplete = list.some(v => {
+                let res = false;
+                if (v.type == 'customClass') {
+                    if (v.isMultipleChoice) {
+                        res = v.value.length == 0;
+                    } else {
+                        res = v.value == "";
+                    }
+                } else if (v.type == 'upload') {
+                    res = v.value.length == 0;
+                } else if (v.type == 'text') {
+                    res = v.value == "";
+                    if (v.errText) res = true;
+                } else {
+                    res = v.value == "";
+                }
+                return res
+            })
+            if (!Uncomplete) Uncomplete = this.list.filter(v => !v.isMust).some(v => v.errText);
+            this.$emit("isUncomplete", Uncomplete)
+        },
+        previewImg(item) {
+            viewImage(item.url)
+        },
+        uploadCallback(attachmentids, index) {
+            let item = this.list[index];
+            this.$Http.basic({
+                "classname": "system.attachment.Attachment",
+                "method": "createFileLink",
+                "content": {
+                    ownertable: item.ownertable,
+                    ownerid: item.ownerid,
+                    usetype: item.usetype,
+                    attachmentids
+                }
+            }).then(res => {
+                console.log('绑定附件', res)
+                if (this.cutoff(res.msg)) return;
+                res.data = formattedFiles(res.data)
+                item.value.push(res.data[0]);
+
+                //临时文件
+                if (res.data[0].ownertable == "temporary") try {
+                    item.temporarys.push(attachmentids[0])
+                } catch (error) {
+                    item.temporarys = [attachmentids[0]]
+                }
+
+                this.$set(this.list[index], 'value', item.value)
+                this.verify()
+            })
+        },
+        deleteFiles() {
+            this.list.forEach(v => {
+                if (v.type == 'upload') {
+                    let linksids = v.value.filter(v => v.ownertable == "temporary").map(v => v.linksid)
+                    if (linksids.length) this.$Http.basic({
+                        "classname": "system.attachment.Attachment",
+                        "method": "deleteFileLink",
+                        "content": {
+                            linksids
+                        }
+                    }).then(res => {
+                        console.log("处理删除附件", res)
+                        if (this.cutoff(res.msg)) return;
+                    });
+                }
+            });
+        },
+        onUploadLoading(e, index) {
+            this.$set(this.list[index], 'loading', e)
+            this.$emit("onUploading", e)
+        },
+        groupChange(e, index) {
+            this.$set(this.list[index], 'loading', e)
+            this.verify()
+        },
+        selectRegion({ detail }, index) {
+            this.$set(this.list[index], 'value', detail.value)
+            this.verify()
+        },
+        deleteFile(flie, index) {
+            let item = this.list[index];
+            item.value = item.value.filter(v => v.attachmentid != flie.attachmentid)
+            //临时文件
+            if (flie.ownertable == "temporary") {
+                item.temporarys = item.temporarys.filter(v => v != flie.attachmentid)
+                this.$Http.basic({
+                    "classname": "system.attachment.Attachment",
+                    "method": "deleteFileLink",
+                    "content": {
+                        linksids: [flie.linksid]
+                    }
+                }).then(res => {
+                    console.log("处理删除附件", res)
+                    if (this.cutoff(res.msg)) return;
+                });
+            } else {
+                try {
+                    item.linksids.push(flie.linksid)
+                } catch (error) {
+                    item.linksids = [flie.linksid]
+                }
+            }
+            this.$set(this.list[index], 'value', item.value)
+            this.verify()
+        },
+        submit() {
+            return new Promise((resolve, reject) => {
+                let res = {};
+                this.list.forEach(v => {
+                    if (v.type == 'upload') {
+                        res.files = {
+                            temporarys: [],
+                            linksids: [],
+                        }
+                        try {
+                            res.files.temporarys = v.temporarys || []
+                        } catch (error) {
+
+                        }
+                        try {
+                            res.files.linksids = v.linksids || []
+                        } catch (error) {
+
+                        }
+                    } else if (v.type == 'region') {
+                        if (v.value.length) {
+                            res.province = v.value[0];
+                            res.city = v.value[1];
+                            res.county = v.value[2];
+                        } else {
+                            res.province = ''
+                            res.city = ''
+                            res.county = ''
+                        }
+                    } else if (v.type == 'switch') {
+                        if (v.isNum) {
+                            res[v.key] = v.value ? 1 : 0;
+                        } else {
+                            res[v.key] = v.value;
+                        }
+                    } else {
+                        try {
+                            res[v.key] = v.value.trim();
+                        } catch (error) {
+                            res[v.key] = v.value;
+                        }
+                    }
+                })
+                resolve(res)
+            })
+        }
+    },
+}
+</script>
+
+
+<style lang="scss">
+.requiredFieldOnly-head {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 100vw;
+    height: 45px;
+    background: #F7F7F7;
+    padding: 0 10px;
+    box-sizing: border-box;
+
+    .label {
+        font-family: PingFang SC, PingFang SC;
+        font-weight: bold;
+        font-size: 15px;
+        color: #333333;
+        line-height: 22px;
+    }
+
+    .content {
+        display: flex;
+        align-items: center;
+        font-family: PingFang SC, PingFang SC;
+        font-size: 14px;
+        color: #999999;
+    }
+}
+
+.borBot {
+    // border-bottom: 1px #DDDDDD solid;
+}
+
+.custom-class-box {
+    width: 100%;
+    background: #fff;
+    padding: 15px 0 15px 10px;
+    box-sizing: border-box;
+
+    .head {
+        width: 355px;
+        height: 20px;
+        display: flex;
+        justify-content: space-between;
+        align-items: flex-end;
+
+        .label {
+            font-size: 14px;
+            color: #333333;
+            line-height: 20px;
+        }
+
+        .state {
+            font-family: Source Han Sans SC, Source Han Sans SC;
+            font-size: 12px;
+            color: #999999;
+        }
+    }
+
+    .options {
+        display: flex;
+        flex-wrap: wrap;
+
+        .option {
+            padding: 6px 10px;
+            text-align: center;
+            min-width: 81px;
+            font-family: PingFang SC, PingFang SC;
+            font-size: 14px;
+            color: #333333;
+            border-radius: 5px;
+            background: #F2F2F2;
+            margin-top: 10px;
+            margin-right: 10px;
+            box-sizing: border-box;
+        }
+
+        .active {
+            background: #C30D23;
+            color: #fff;
+        }
+    }
+
+    .content {
+        .file-box {
+            position: relative;
+            width: 355px;
+            height: 240px;
+            margin-top: 10px;
+
+            .video,
+            .image {
+                width: 355px;
+                height: 240px;
+                border-radius: 5px;
+            }
+
+            .delete {
+                position: absolute;
+                width: 30px;
+                top: 0;
+                right: 0;
+                z-index: 1;
+            }
+        }
+
+        .upload-box {
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            width: 355px;
+            height: 45px;
+            background: #FFFFFF;
+            border-radius: 5px;
+            border: 1px dashed #C30D23;
+            font-family: Source Han Sans SC, Source Han Sans SC;
+            font-size: 14px;
+            color: #C30D23;
+            margin-top: 10px;
+        }
+    }
+}
+
+.textarea-box {
+    width: 100%;
+
+    .textarea {
+        width: 355px;
+        height: 160px;
+        padding: 15px 10px;
+        box-sizing: border-box;
+        margin: 0 auto;
+    }
+}
+
+.input-box {
+    width: 100%;
+    background: #fff;
+    box-sizing: border-box;
+    padding: 0 10px;
+    border-radius: 5px;
+    .box {
+        display: flex;
+        flex-direction: column;
+        width: 100%;
+        min-height: 54.4px;
+        box-sizing: border-box;
+        border-radius: 8px;
+        .title {
+            font-weight: bold;
+            font-size: 14px;
+            color: #333333;
+            margin-top: 16px;
+            position: relative;
+            padding-left: 10px;
+            &::before {
+                content:'';
+                width:4px;
+                height: 16px;
+                background: #C30D23;
+                position: absolute;
+                top: 1px;
+                left: 0;
+            }
+        }
+    }
+
+    .label {
+        width: 100%;
+        margin: 14px 0 11px 0;
+        line-height: 20px;
+        font-family: Source Han Sans SC, Source Han Sans SC;
+        font-size: 14px;
+        color: #666666;
+        flex-shrink: 0;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        align-content: baseline;
+        .right {
+            font-family: PingFang SC, PingFang SC;
+            font-weight: 400;
+            font-size: 12px;
+            color: #E3041F;
+        }
+        .must {
+            color: #E3041F;
+            margin-right: 5px;
+        }
+    }
+
+    .content-box {
+        .content {
+            flex: 1;
+            display: flex;
+            align-items: center;
+            box-sizing: border-box;
+            position: relative;
+            input {
+                width: 100%;
+                height: 50px;
+                background: #F7F7F7;
+                border-radius: 8px 8px 8px 8px;
+                border: 1px solid #DDDDDD;
+                padding-left: 10px;
+            }
+
+            .icon {
+                padding: 5px;
+                position: absolute;
+                right: 0;
+                top: 50%;
+                transform: translateY(-50%);
+                z-index: 3;
+            }
+        }
+
+        .err-text {
+            font-size: 12px;
+            color: #E3041F;
+            margin-bottom: -12px;
+
+            .icon {
+                margin-right: 2px;
+            }
+        }
+
+    }
+}
+
+.region {
+    width: 100vw;
+    background: #fff;
+    box-sizing: border-box;
+    padding: 15px 0 0 10px;
+
+    .box {
+        display: flex;
+        padding-bottom: 15px;
+        padding-right: 10px;
+        box-sizing: border-box;
+
+        .label {
+            width: 100px;
+            margin-right: 10px;
+            line-height: 20px;
+            font-family: Source Han Sans SC, Source Han Sans SC;
+            font-size: 14px;
+            color: #666666;
+            flex-shrink: 0;
+
+            .must {
+                color: #E3041F;
+                margin-right: 5px;
+            }
+        }
+
+        .content-box {
+            flex: 1;
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            height: 20px;
+            line-height: 20px;
+
+            .placeholder {
+                font-family: Source Han Sans SC, Source Han Sans SC;
+                font-size: 14px;
+                color: #BBBBBB;
+            }
+
+
+        }
+    }
+
+
+}
+</style>