Преглед на файлове

修改供应商相关信息

yangzm123 преди 10 месеца
родител
ревизия
9828423628

+ 4 - 0
.hbuilderx/launch.json

@@ -10,9 +10,13 @@
             "default" : {
                 "launchtype" : "local"
             },
+            "h5" : {
+                "launchtype" : "local"
+            },
             "mp-weixin" : {
                 "launchtype" : "local"
             },
+            "provider" : "aliyun",
             "type" : "uniCloud"
         },
         {

+ 3 - 3
src/App.vue

@@ -2,7 +2,7 @@
  * @Author: PoJun
  * @Date: 2023-05-14 16:13:54
  * @LastEditors: PoJun
- * @LastEditTime: 2024-01-09 15:22:54
+ * @LastEditTime: 2024-04-28 12:41:41
  * @Message: Nothing
 -->
 <script>
@@ -10,8 +10,8 @@ export default {
     onLaunch: function () {
         console.log("App Launch");
         // uni.onPushMessage(res => {
-            // console.log("收到推送消息:", res); //监听推送消息
-            // uni.$uv.toast("收到推送消息");
+        // console.log("收到推送消息:", res); //监听推送消息
+        // uni.$uv.toast("收到推送消息");
         // });
     },
     onShow: function () {

+ 2 - 2
src/androidPrivacy.json

@@ -2,14 +2,14 @@
     "version" : "1",
     "prompt" : "template",
     "title" : "服务协议和隐私政策",
-    "message" : "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"static\\htmls\\service.html\">《服务协议》</a>和<a href=\"static\\htmls\\privacy.html\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
+    "message" : "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"https://themetech-dt.com/service.html\">《服务协议》</a>和<a href=\"https://themetech-dt.com/privacy.html\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
     "buttonAccept" : "同意并接受",
     "buttonRefuse" : "暂不同意",
     "hrefLoader" : "system|default",
     "backToExit" : "false",
     "second" : {
         "title" : "确认提示",
-        "message" : "  进入应用前,你需先同意<a href=\"static\\htmls\\service.html\">《服务协议》</a>和<a href=\"static\\htmls\\privacy.html\">《隐私政策》</a>,否则将退出应用。",
+        "message" : "  进入应用前,你需先同意<a href=\"https://themetech-dt.com/service.html\">《服务协议》</a>和<a href=\"https://themetech-dt.com/privacy.html\">《隐私政策》</a>,否则将退出应用。",
         "buttonAccept" : "同意并继续",
         "buttonRefuse" : "退出应用"
     }

+ 4 - 1
src/config/apis/products.js

@@ -2,7 +2,7 @@
  * @Author: PoJun
  * @Date: 2023-09-13 17:12:51
  * @LastEditors: PoJun
- * @LastEditTime: 2024-01-18 14:24:43
+ * @LastEditTime: 2024-04-27 22:47:03
  * @Message: 产品相关
  */
 const { http } = uni.$uv;
@@ -11,3 +11,6 @@ export const getProductsTreeNoAuth = () => http.get(`/product_dirs/tree_noauth`)
 
 /** 产品目录对应的供应商数量 */
 export const getHomeChartData = () => http.get(`/product_dirs/supplierCountGroupByProduct`);
+
+/** 获取当前供应商优质产品目录树 */
+export const getMyProductsTree = () => http.get(`/srmSuppliers/self/product/info`);

+ 3 - 0
src/config/apis/supplier.js

@@ -16,3 +16,6 @@ export const getSuppliersList = (params, config = {}) => http.get(`/srmSuppliers
 export const appealMark = params => http.post(`/srmSuppliers/appeal`, params);
 /** 分页查询我的合作记录 */
 export const getSelfRecords = params => http.get(`/srmCooperates/self/page`, params);
+
+// 修改我的供应商信息
+export const editSelfInfo = params => http.post(`/srmSuppliers/self/info`, params);

+ 111 - 1
src/kirin-ui/kirin-form/kirin-form.vue

@@ -2,7 +2,7 @@
  * @Author: PoJun
  * @Date: 2023-10-09 15:51:12
  * @LastEditors: PoJun
- * @LastEditTime: 2024-01-05 15:30:22
+ * @LastEditTime: 2024-04-28 14:17:11
  * @Message: 表单
 -->
 <template>
@@ -202,6 +202,7 @@
                     :uploadText="item.uploadText"
                     :width="item.width"
                     :height="item.height"
+                    :disabled="!item.canEdit"
                 ></uv-upload>
             </uv-form-item>
             <!-- 带标题的图片上传 -->
@@ -229,6 +230,31 @@
                     ></uv-upload>
                 </view>
             </uv-form-item>
+
+            <!-- 产品选择器,暂时主要用于选产品 -->
+            <uv-form-item
+                v-else-if="item.type == 'products' && item.canShow"
+                :label="item.label"
+                :required="item.required"
+                borderBottom
+                :leftIcon="item.showIcon ? FormIcon : ''"
+                :leftIconStyle="leftIconStyle"
+                :customStyle="item.customStyle"
+                :labelWidth="item.labelWidth ? item.labelWidth : 150"
+                @click="item.canEdit && openProductsPicker(item)"
+            >
+                <uv-input
+                    inputAlign="right"
+                    fontSize="14px"
+                    border="none"
+                    :value="getShowNames(item.rv)"
+                    :placeholder="item.canEdit ? (item.placeholder ? item.placeholder : '请选择') : '暂无'"
+                    readonly
+                    :suffixIcon="item.canEdit ? 'arrow-down' : ''"
+                    :suffixIconStyle="suffixIconStyle"
+                ></uv-input>
+            </uv-form-item>
+
             <!-- 附加字段,在某些场景下需要,如安全措施说明 -->
             <slot :name="item.type + '_' + item.code"></slot>
         </block>
@@ -251,10 +277,22 @@
             :defaultValue="multipleObj.defaultValue"
             @confirm="multiplePickerConfirm"
         ></kirin-multiple>
+
+        <next-tree
+            themeColor="#4076f4"
+            :selectParent="true"
+            :checkStrictly="true"
+            funcMode="checkbox"
+            ref="nextTreeAsyncRef"
+            @confirm="productsConfirm"
+            :treeData="productsList"
+            labelKey="name"
+        />
     </uv-form>
 </template>
 
 <script>
+import { getProductsTreeNoAuth } from "@/config/http.js";
 export default {
     props: {
         // { type: "类型", label: "标题", code: "控制唯一名", sv: "展示值", rv: "存储值" },
@@ -306,6 +344,13 @@ export default {
                 code: "",
                 defaultValue: [],
             },
+            // 产品目录
+            productsList: [],
+            // 当前选择的产品对象
+            productObject: {
+                code: "",
+                value: [],
+            },
         };
     },
     methods: {
@@ -554,6 +599,48 @@ export default {
                 return { url: process.env.VUE_APP_BASE_API + `/files/${id}/show_image` };
             });
         },
+        openProductsPicker(item) {
+            this.productObject.code = item.code;
+            this.productObject.value = item.rv;
+            this.$refs.nextTreeAsyncRef.showTree = true;
+            this.checkedTreeData(this.productsList, item.rv);
+        },
+        checkedTreeData(treeData, selectIds = []) {
+            (treeData || []).map(item => {
+                if (!selectIds || selectIds.length == 0) {
+                    return;
+                }
+                if (selectIds.indexOf(item.id) !== -1) {
+                    item.checked = true;
+                } else {
+                    item.checked = false;
+                }
+                if (item.children && item.children.length) {
+                    this.checkedTreeData(item.children, selectIds);
+                }
+            });
+        },
+        productsConfirm(array) {
+            const item = this.getItemFromList(this.productObject.code);
+            const ids = array.map(item => item.id);
+            this.$set(item, "rv", ids);
+        },
+        async getProductsList() {
+            try {
+                if (this.vuex_products && this.vuex_products.length) {
+                    this.productsList = JSON.parse(JSON.stringify(this.vuex_products));
+                    return;
+                } else {
+                    if (this.vuex_userInfo) {
+                        const data = await getProductsTreeNoAuth();
+                        this.$uv.vuex("vuex_products", data ? data : []);
+                        this.productsList = JSON.parse(JSON.stringify(data));
+                    }
+                }
+            } catch (error) {
+                console.log(error);
+            }
+        },
     },
     watch: {
         list: {
@@ -566,6 +653,29 @@ export default {
             },
         },
     },
+    created() {
+        this.getProductsList();
+    },
+    computed: {
+        getShowNames() {
+            return (rv = []) => {
+                if (!rv || !rv.length) return "";
+                let names = [];
+                this.vuex_products.map(item => {
+                    let itemNs = [];
+                    if (item.children && item.children.length) {
+                        item.children.map(v => {
+                            if (rv.includes(v.id)) {
+                                itemNs.push(v.name);
+                            }
+                        });
+                    }
+                    names = names.concat(itemNs);
+                });
+                return names.join(",");
+            };
+        },
+    },
 };
 </script>
 

+ 4 - 0
src/pages.json

@@ -97,6 +97,10 @@
                     "path": "representations",
                     "style": { "bounce": false, "navigationBarTitleText": "评分申述" }
                 },
+                {
+                    "path": "editInfo",
+                    "style": { "bounce": false, "navigationBarTitleText": "修改信息" }
+                },
                 {
                     "path": "supplier",
                     "style": { "bounce": false, "navigationBarTitleText": "供应商", "enablePullDownRefresh": true }

+ 24 - 37
src/pages/index/components/products-list.vue

@@ -2,22 +2,22 @@
  * @Author: PoJun
  * @Date: 2023-12-19 14:57:48
  * @LastEditors: PoJun
- * @LastEditTime: 2024-01-18 10:53:10
+ * @LastEditTime: 2024-04-28 22:15:26
  * @Message: 产品列表, 只展示5个
 -->
 <template>
     <uv-cell-group :border="false" :customStyle="{ padding: '5px 0' }">
-        <uv-cell :border="false" :arrow="false" value="查看更多" :isLink="true" url="/subpkg/home/products">
-            <uv-text slot="title" text="产品目录" :customStyle="{ 'font-weight': 'bold' }"></uv-text>
+        <uv-cell :border="false" :arrow="false" value="全部产品" :isLink="true" url="/subpkg/home/products">
+            <uv-text slot="title" text="我的优势产品" :customStyle="{ 'font-weight': 'bold' }"></uv-text>
         </uv-cell>
 
-        <template v-if="productsList.length">
+        <template v-if="productsList">
             <uv-cell
-                v-for="(item, index) in productsList"
+                v-for="(key, value, index) in productsList"
                 :key="index"
                 :border="false"
-                :label="item.code"
-                :value="item.name"
+                :label="key"
+                :value="value"
             ></uv-cell>
         </template>
 
@@ -28,50 +28,37 @@
 </template>
 
 <script>
-import { getProductsTreeNoAuth } from "@/config/http.js";
+import { getMyProductsTree } from "@/config/http.js";
 export default {
+    props: {
+        times: {
+            type: Number,
+            default: 0,
+        },
+    },
     data() {
         return {
-            productsList: [],
+            productsList: null,
         };
     },
     methods: {
         // 获取产品目录, 缓存下后续直接用
         async getList() {
             try {
-                const data = await getProductsTreeNoAuth();
-                this.$uv.vuex("vuex_products", data ? data : []);
-                this.resetData(data);
-            } catch (error) {
-                console.log(error);
-            }
-        },
-        // 展开下数组处理数据,选个大概5条?
-        resetData(data = []) {
-            try {
-                this.productsList = this.treeToArray(JSON.parse(JSON.stringify(data))).slice(0, 5);
+                const data = await getMyProductsTree();
+                this.productsList = data;
             } catch (error) {
                 console.log(error);
             }
         },
-        treeToArray(list, newArr = []) {
-            list.forEach(item => {
-                const { children } = item;
-                if (children) {
-                    delete item.children;
-
-                    if (children.length) {
-                        newArr.push(item);
-                        return this.treeToArray(children, newArr);
-                    }
-                }
-                newArr.push(item);
-            });
-            return newArr;
-        },
     },
-    created() {
-        this.getList();
+    watch: {
+        times: {
+            immediate: true,
+            handler: function () {
+                this.getList();
+            },
+        },
     },
 };
 </script>

+ 2 - 2
src/pages/index/index.vue

@@ -2,7 +2,7 @@
  * @Author: PoJun
  * @Date: 2023-05-15 19:59:55
  * @LastEditors: PoJun
- * @LastEditTime: 2024-01-18 14:25:57
+ * @LastEditTime: 2024-04-28 22:14:52
  * @Message: Nothing
 -->
 <template>
@@ -34,7 +34,7 @@
                 </view>
                 <!-- 产品目录 -->
                 <view class="content-container">
-                    <products-list></products-list>
+                    <products-list :times="times"></products-list>
                 </view>
             </view>
         </view>

+ 1 - 1
src/store/index.js

@@ -2,7 +2,7 @@
  * @Author: PoJun
  * @Date: 2023-05-14 17:52:10
  * @LastEditors: PoJun
- * @LastEditTime: 2024-01-18 10:37:37
+ * @LastEditTime: 2024-04-25 15:43:53
  * @Message: Nothing
  */
 import Vue from "vue";

+ 2 - 2
src/subpkg/agreement/index.vue

@@ -7,8 +7,8 @@
 -->
 <template>
     <view class="webview-box">
-        <web-view v-if="type == 'service'" src="/static/htmls/service.html"></web-view>
-        <web-view v-else src="/static/htmls/privacy.html"></web-view>
+        <web-view v-if="type == 'service'" src="https://themetech-dt.com/service.html"></web-view>
+        <web-view v-else src="https://themetech-dt.com/privacy.html"></web-view>
     </view>
 </template>
 

+ 99 - 64
src/subpkg/flow/detail.vue

@@ -2,7 +2,7 @@
  * @Author: PoJun
  * @Date: 2024-01-03 16:13:54
  * @LastEditors: PoJun
- * @LastEditTime: 2024-01-18 15:08:08
+ * @LastEditTime: 2024-04-27 20:28:52
  * @Message: Nothing
 -->
 <template>
@@ -36,85 +36,120 @@
 <script>
 import { getAffairSelfInfo, refuseAffairs, agreeAffairs } from "@/config/http.js";
 import formBasicMixin from "@/utils/form-basic-mixin.js";
+import { authenticationFormList } from "../setting/constant";
 export default {
     mixins: [formBasicMixin],
     data() {
         return {
-            list: [
-                {
-                    type: "textarea",
-                    label: "标题",
-                    code: "title",
-                    sv: null,
-                    rv: null,
-                    canShow: true,
-                    labelWidth: 80,
-                },
-                {
-                    type: "input",
-                    label: "审核类型",
-                    code: "type",
-                    sv: null,
-                    rv: null,
-                    canShow: true,
-                    labelWidth: 80,
-                },
-                {
-                    type: "input",
-                    label: "名称",
-                    code: "name",
-                    sv: null,
-                    rv: null,
-                    canShow: true,
-                    labelWidth: 80,
-                },
-                {
-                    type: "input",
-                    label: "联系方式",
-                    code: "phone",
-                    sv: null,
-                    rv: null,
-                    canShow: true,
-                    labelWidth: 80,
-                },
-                {
-                    type: "input",
-                    label: "审核结果",
-                    code: "result",
-                    sv: null,
-                    rv: null,
-                    canShow: true,
-                    labelWidth: 80,
-                },
-            ],
+            list: [],
             tabType: "todo",
             id: "",
             skeletonLoading: true,
             detailItem: null,
+            authenticationFormList,
         };
     },
     methods: {
         async initPage(id) {
             const data = await getAffairSelfInfo(id);
             this.detailItem = data;
-            this.list.forEach(item => {
-                if (item.code == "title" || item.code == "type") {
-                    item.sv = item.rv = data[item.code];
-                }
-                if (item.code == "phone" || item.code == "name") {
+            const type = data.type;
+            if (type == "UserJoinOrg") {
+                this.list = [
+                    {
+                        type: "textarea",
+                        label: "标题",
+                        code: "title",
+                        sv: data.title,
+                        rv: data.title,
+                        canShow: true,
+                        labelWidth: 80,
+                    },
+                    {
+                        type: "input",
+                        label: "审核类型",
+                        code: "type",
+                        sv: "人员加入组织",
+                        rv: "人员加入组织",
+                        canShow: true,
+                        labelWidth: 80,
+                    },
+                    {
+                        type: "input",
+                        label: "名称",
+                        code: "name",
+                        sv: data?.data.name,
+                        rv: data?.data.name,
+                        canShow: true,
+                        labelWidth: 80,
+                    },
+                    {
+                        type: "input",
+                        label: "联系方式",
+                        code: "phone",
+                        sv: data?.data.phone,
+                        rv: data?.data.phone,
+                        canShow: true,
+                        labelWidth: 80,
+                    },
+                ];
+            } else {
+                this.list = authenticationFormList.map(item => {
                     item.sv = item.rv = data?.data[item.code];
-                }
-                if (item.code == "result") {
-                    if (data[item.code] != undefined && data[item.code] != null) {
-                        item.sv = item.rv = data[item.code] == 1 ? "已通过" : "已拒绝";
-                    }
-                    if (this.tabType == "done") {
-                        item.canShow = true;
-                    } else {
-                        item.canShow = false;
+                    item.canEdit = false;
+                    return item;
+                });
+                this.list.unshift(
+                    {
+                        type: "textarea",
+                        label: "标题",
+                        code: "title",
+                        sv: data.title,
+                        rv: data.title,
+                        canShow: true,
+                        labelWidth: 80,
+                    },
+                    {
+                        type: "input",
+                        label: "审核类型",
+                        code: "type",
+                        sv: "申请加入供应商",
+                        rv: "申请加入供应商",
+                        canShow: true,
+                        labelWidth: 80,
                     }
-                }
-            });
+                );
+            }
+
+            if (data.result != undefined && data.result != null) {
+                this.list.push({
+                    type: "input",
+                    label: "审核结果",
+                    code: "result",
+                    sv: data.result == 1 ? "已通过" : "已拒绝",
+                    rv: data.result == 1 ? "已通过" : "已拒绝",
+                    canShow: true,
+                    labelWidth: 80,
+                });
+            }
+            // this.list.forEach(item => {
+            //     if (item.code == "title" || item.code == "type") {
+            //         item.sv = item.rv = data[item.code];
+            //     }
+            //     if (item.code == "phone" || item.code == "name") {
+            //         item.sv = item.rv = data?.data[item.code];
+            //     }
+            //     if (item.code == "result") {
+            //         if (data[item.code] != undefined && data[item.code] != null) {
+            //             item.sv = item.rv = data[item.code] == 1 ? "已通过" : "已拒绝";
+            //         }
+            //         if (this.tabType == "done") {
+            //             item.canShow = true;
+            //         } else {
+            //             item.canShow = false;
+            //         }
+            //     }
+            // });
             uni.$uv.sleep(200).then(() => {
                 this.skeletonLoading = false;
             });

+ 149 - 0
src/subpkg/home/editInfo.vue

@@ -0,0 +1,149 @@
+<!--
+ * @Author: PoJun
+ * @Date: 2023-09-28 10:38:11
+ * @LastEditors: PoJun
+ * @LastEditTime: 2024-04-28 14:03:59
+ * @Message: 修改供应商信息界面
+-->
+<template>
+    <view class="authentication">
+        <view class="authentication-cont">
+            <kirin-form ref="dataFrom" :list="list"></kirin-form>
+            <view class="uv-m-t-30">
+                <uv-button type="primary" text="确定" @click="save"></uv-button>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+import { editSelfInfo, getMySupplierInfo } from "@/config/http.js";
+
+export default {
+    data() {
+        return {
+            list: [],
+        };
+    },
+    async onLoad() {
+        this.initPage();
+    },
+    methods: {
+        async initPage() {
+            const res = await getMySupplierInfo();
+            this.list = [
+                {
+                    type: "input",
+                    label: "名称",
+                    code: "name",
+                    sv: res.name,
+                    rv: res.name,
+                    canShow: true,
+                    canEdit: true,
+                },
+                {
+                    type: "input",
+                    label: "联系电话",
+                    code: "phone",
+                    sv: res.phone,
+                    rv: res.phone,
+                    canShow: true,
+                    canEdit: true,
+                },
+                {
+                    type: "input",
+                    label: "地址",
+                    code: "address",
+                    sv: res.address,
+                    rv: res.address,
+                    canShow: true,
+                    canEdit: true,
+                },
+                {
+                    type: "input",
+                    label: "企业简介",
+                    code: "intro",
+                    sv: res.intro,
+                    rv: res.intro,
+                    canShow: true,
+                    canEdit: true,
+                },
+                {
+                    type: "products",
+                    label: "优势产品",
+                    code: "product",
+                    sv: null,
+                    rv: res.product ? res.product : [],
+                    canShow: true,
+                    canEdit: true,
+                    required: false,
+                },
+                {
+                    type: "images",
+                    label: "形象图片",
+                    code: "imageStr",
+                    sv: res.image ? res.image.join(",") : "",
+                    rv: res.image ? res.image.join(",") : "",
+                    canShow: true,
+                    canEdit: true,
+                    required: false,
+                    maxCount: 5,
+                    width: "80px",
+                    height: "80px",
+                    required: false,
+                    uploadText: "上传图片",
+                },
+
+                {
+                    type: "images",
+                    label: "营业执照",
+                    code: "businessLicense",
+                    sv: res.businessLicense,
+                    rv: res.businessLicense,
+                    canShow: true,
+                    canEdit: true,
+                    maxCount: 1,
+                    width: "80px",
+                    height: "80px",
+                    uploadText: "上传图片",
+                },
+                {
+                    type: "images",
+                    label: "权威证书",
+                    code: "certificatesStr",
+                    sv: res.certificates ? res.certificates.join(",") : "",
+                    rv: res.certificates ? res.certificates.join(",") : "",
+                    canShow: true,
+                    canEdit: true,
+                    maxCount: 5,
+                    width: "80px",
+                    height: "80px",
+                    uploadText: "上传图片",
+                },
+            ];
+        },
+        async save() {
+            const formData = this.$refs.dataFrom.getFormData();
+            if (!formData) {
+                return;
+            }
+            uni.showLoading({ mask: true });
+            await editSelfInfo(formData);
+            try {
+                uni.$uv.route({ type: "back" });
+                uni.$emit("refreshSupplierDetail");
+            } finally {
+                uni.hideLoading();
+            }
+        },
+    },
+};
+</script>
+
+<style lang="scss">
+.authentication {
+    &-cont {
+        padding: 25rpx;
+    }
+}
+</style>

+ 12 - 2
src/subpkg/home/products.vue

@@ -2,7 +2,7 @@
  * @Author: PoJun
  * @Date: 2023-09-28 10:38:11
  * @LastEditors: PoJun
- * @LastEditTime: 2024-01-18 11:10:00
+ * @LastEditTime: 2024-04-27 22:49:22
  * @Message: 产品列表
 -->
 <template>
@@ -34,6 +34,7 @@
 </template>
 
 <script>
+import { getProductsTreeNoAuth } from "@/config/http.js";
 export default {
     data() {
         return {
@@ -46,9 +47,18 @@ export default {
         },
     },
     onLoad() {
-        console.log(this.vuex_products);
+        this.getList();
     },
     methods: {
+        // 获取产品目录, 缓存下后续直接用
+        async getList() {
+            try {
+                const data = await getProductsTreeNoAuth();
+                this.$uv.vuex("vuex_products", data ? data : []);
+            } catch (error) {
+                console.log(error);
+            }
+        },
         change(index) {
             console.log("选项改变:", index);
         },

+ 49 - 8
src/subpkg/home/supplier-detail.vue

@@ -2,13 +2,13 @@
  * @Author: PoJun
  * @Date: 2023-09-28 10:38:11
  * @LastEditors: PoJun
- * @LastEditTime: 2024-01-04 14:55:05
+ * @LastEditTime: 2024-04-27 22:10:30
  * @Message: 供应商详情页面
 -->
 <template>
     <view class="supplier-detail">
         <uv-navbar :border="false" :autoBack="true" bgColor="transparent" :placeholder="false"></uv-navbar>
-        <uv-swiper :list="getImages" height="400" indicator circular></uv-swiper>
+        <uv-swiper :list="getImages(item.image)" height="400" indicator circular></uv-swiper>
         <view class="supplier-detail-cont">
             <uv-cell-group :border="false">
                 <uv-cell title="名称" :value="item.name" :border="false" :cellStyle="{ padding: '15px' }"></uv-cell>
@@ -37,6 +37,22 @@
                     :border="false"
                     :cellStyle="{ padding: '15px' }"
                 ></uv-cell>
+                <uv-cell
+                    title="公司简介"
+                    :value="item.intro"
+                    :border="false"
+                    :cellStyle="{ padding: '15px' }"
+                ></uv-cell>
+                <uv-cell title="营业执照" :border="false" :cellStyle="{ padding: '15px' }">
+                    <uv-album
+                        v-if="item.businessLicense"
+                        slot="value"
+                        :urls="getImages(item.businessLicense)"
+                    ></uv-album>
+                </uv-cell>
+                <uv-cell title="权威证书" :border="false" :cellStyle="{ padding: '15px' }">
+                    <uv-album v-if="item.certificates" slot="value" :urls="getImages(item.certificates)"></uv-album>
+                </uv-cell>
                 <uv-cell
                     v-if="showBtn"
                     title="评分申述"
@@ -46,6 +62,16 @@
                     :border="false"
                     :cellStyle="{ padding: '15px' }"
                 ></uv-cell>
+
+                <uv-cell
+                    v-if="showBtn"
+                    title="修改供应商信息"
+                    :isLink="true"
+                    arrow-direction="right"
+                    url="/subpkg/home/editInfo"
+                    :border="false"
+                    :cellStyle="{ padding: '15px' }"
+                ></uv-cell>
             </uv-cell-group>
         </view>
     </view>
@@ -73,18 +99,33 @@ export default {
     },
     computed: {
         getImages() {
-            if (this.item.image && this.item.image.length) {
-                const urls = this.item.image.map(v => this.getImageUrl(v));
-                return urls;
-            } else {
-                return [];
-            }
+            return ids => {
+                if (!ids) {
+                    return [];
+                }
+                if (typeof ids === "string") {
+                    ids = [ids];
+                }
+                if (ids.length == 0) {
+                    return [];
+                }
+                console.log(ids.map(v => this.getImageUrl(v)));
+                return ids.map(v => this.getImageUrl(v));
+            };
         },
     },
     onLoad(e) {
         this.showBtn = e.id ? false : true;
         this.initPage(e.id);
     },
+    onReady() {
+        uni.$on("refreshSupplierDetail", () => {
+            this.initPage();
+        });
+    },
+    beforeDestroy() {
+        uni.$off("refreshSupplierDetail");
+    },
 };
 </script>
 

+ 3 - 1
src/subpkg/setting/authentication.vue

@@ -2,7 +2,7 @@
  * @Author: PoJun
  * @Date: 2023-09-28 10:38:11
  * @LastEditors: PoJun
- * @LastEditTime: 2024-01-03 17:17:37
+ * @LastEditTime: 2024-04-28 19:37:22
  * @Message: 角色认证界面
 -->
 <template>
@@ -48,6 +48,8 @@ export default {
                 return;
             }
             uni.showLoading({ mask: true });
+
+            console.log(formData);
             this.current == 0 ? await userJoinOrgAffair(formData) : await supplierAffair(formData);
             try {
                 await this.$store.dispatch("UPDATELOGININFO");

+ 69 - 11
src/subpkg/setting/constant.js

@@ -2,7 +2,7 @@
  * @Author: PoJun
  * @Date: 2023-12-14 21:10:35
  * @LastEditors: PoJun
- * @LastEditTime: 2024-01-18 10:31:36
+ * @LastEditTime: 2024-04-28 12:45:19
  * @Message: Nothing
  */
 // 个人信息表单信息
@@ -71,7 +71,7 @@ export const myInfoFormList = [
 export const authenticationFormList = [
     {
         type: "input",
-        label: "供应商名称",
+        label: "名称",
         code: "name",
         sv: null,
         rv: null,
@@ -90,20 +90,78 @@ export const authenticationFormList = [
         required: true,
     },
     {
-        type: "radio",
-        label: "供应商类型",
-        code: "type",
+        type: "input",
+        label: "地址",
+        code: "address",
+        sv: null,
+        rv: null,
+        canShow: true,
+        canEdit: true,
+        required: false,
+    },
+    {
+        type: "input",
+        label: "企业简介",
+        code: "intro",
+        sv: null,
+        rv: null,
+        canShow: true,
+        canEdit: true,
+        required: false,
+    },
+    {
+        type: "products",
+        label: "优势产品",
+        code: "product",
+        sv: null,
+        rv: null,
+        canShow: true,
+        canEdit: true,
+        required: false,
+    },
+    {
+        type: "images",
+        label: "形象图片",
+        code: "image",
+        sv: null,
+        rv: null,
+        canShow: true,
+        canEdit: true,
+        required: false,
+        maxCount: 5,
+        width: "80px",
+        height: "80px",
+        required: false,
+        uploadText: "上传图片",
+    },
+
+    {
+        type: "images",
+        label: "营业执照",
+        code: "businessLicense",
         sv: null,
         rv: null,
         canShow: true,
         canEdit: true,
+        maxCount: 1,
+        width: "80px",
+        height: "80px",
         required: true,
-        options: [
-            { name: "战略供应商", key: "战略供应商" },
-            { name: "瓶颈供应商", key: "瓶颈供应商" },
-            { name: "杠杆供应商", key: "杠杆供应商" },
-            { name: "一般供应商", key: "一般供应商" },
-        ],
+        uploadText: "上传图片",
+    },
+    {
+        type: "images",
+        label: "权威证书",
+        code: "certificates",
+        sv: null,
+        rv: null,
+        canShow: true,
+        canEdit: true,
+        maxCount: 5,
+        width: "80px",
+        height: "80px",
+        required: false,
+        uploadText: "上传图片",
     },
 ];
 // 修改密码

+ 5 - 5
src/uni.scss

@@ -4,10 +4,10 @@
  * uvUI自定义的css类名和scss变量,均以"uv-"开头,不会造成冲突,请放心使用 
  * @import '@/uni_modules/uv-ui-tools/theme.scss';
  */
-@import '@/uni_modules/uv-ui-tools/theme.scss';
+@import "@/uni_modules/uv-ui-tools/theme.scss";
 $uvui-nvue-style: false;
 $uv-main-color: #151823;
-$uv-primary: #4076F4;
-$uv-success:#6ECD8E;
-$uv-error:#FF1010;
-$uv-content-color: #676767;
+$uv-primary: #4076f4;
+$uv-success: #6ecd8e;
+$uv-error: #ff1010;
+$uv-content-color: #676767;

+ 20 - 0
src/uni_modules/next-search-more/changelog.md

@@ -0,0 +1,20 @@
+## 1.0.9(2023-07-06)
+增加clear时,同事发送input事件
+## 1.0.8(2023-06-16)
+更新修复input事件
+## 1.0.7(2023-06-15)
+增加输入事件
+## 1.0.6(2023-06-09)
+增加demo
+## 1.0.5(2023-06-09)
+更新more插槽的使用说明
+## 1.0.4(2023-06-09)
+修复mode=more模式下input事件
+## 1.0.3(2023-06-08)
+更改模式
+## 1.0.2(2023-06-08)
+更改说明文件模式
+## 1.0.1(2023-06-08)
+更新说明
+## 1.0.0(2023-06-08)
+初始化next-search-more

+ 239 - 0
src/uni_modules/next-search-more/components/next-search-more/next-search-more.vue

@@ -0,0 +1,239 @@
+<template>
+	<view class="next-search-more">
+		<view class="search" :style="{ backgroundColor: backgroundColor }">
+			<view class="content" :style="{ 'border-radius': radius + 'px', border: border }">
+				<view class="content-box" :class="{ center: mode === 'center' }">
+					<text class="icon icon-search">&#xe66f;</text>
+					<input class="input" :class="{ center: !active && mode === 'center' }" :focus="isFocus" :placeholder="placeholder" v-model="inputVal" @input="input" @focus="focus" @blur="blur" />
+					<text v-if="isDelShow" class="icon icon-del" @click="clear">&#xe61c;</text>
+				</view>
+				<view v-show="(active && isFixedSearchBtn && button === 'inside') || (isDelShow && button === 'inside')" class="searchBtn" @click="search">搜索</view>
+			</view>
+			<template v-if="mode === 'common' || mode ==='center'">
+				<view v-if="button === 'outside'" class="button" :class="{ active: isFixedSearchBtn || active }" @click="search">
+					<view class="button-item">{{ !isFixedSearchBtn ? searchName : '搜索' }}</view>
+				</view>
+			</template>
+			<template v-else-if="mode === 'more'">
+				<view class="button active" @click="selectMore">
+					<view class="button-item"><text class="icon icon-more">&#xe61a;</text></view>
+				</view>
+			</template>
+		</view>
+		<view class="more-container-parent">
+			<view v-if="mode === 'more' && showMore" class="more-container">
+				<slot name="more"></slot>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		mode: {
+			type: String,
+			default: 'common'
+		},
+		button: {
+			type: String,
+			default: 'outside'
+		},
+		isFixedSearchBtn: {
+			type: Boolean,
+			default: true
+		},
+		radius: {
+			type: String,
+			default: '60'
+		},
+		placeholder: {
+			type: String,
+			default: '请输入搜索内容'
+		},
+		backgroundColor: {
+			type: String,
+			default: '#fff'
+		},
+		showMore: {
+			type: Boolean,
+			default: false
+		},
+		border: { type: String, default: '1px #f5f5f5 solid' }
+		
+	},
+	data() {
+		return {
+			active: false,
+			inputVal: '',
+			searchName: '取消',
+			isDelShow: false,
+			isFocus: false,
+			timer: 0
+		};
+	},
+	methods: {
+		focus() {
+			this.active = true;
+		},
+		blur() {
+			this.isFocus = false;
+			if (!this.inputVal) {
+				this.active = false;
+			}
+		},
+		input() {
+			clearInterval(this.timer)
+			this.timer = setTimeout(() => {
+				this.$emit('input', this.inputVal);
+			}, 500)
+		},
+		clear() {
+			this.inputVal = '';
+			this.active = false;
+			this.$emit('input', this.inputVal);
+			this.$emit('search', '');
+		},
+		getFocus() {
+			this.isFocus = true;
+		},
+		search() {
+			if (!this.inputVal) return;
+			this.$emit('search', this.inputVal);
+		},
+		selectMore() {
+			this.$emit('moreClick')
+		}
+	},
+	created() {
+		this.$watch(() => this.inputVal, (newVal) => {
+			if (newVal) {
+				this.searchName = '搜索';
+				this.isDelShow = true;
+			} else {
+				this.searchName = '取消';
+				this.isDelShow = false;
+			}
+		})
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.next-search-more {
+	.search {
+		display: flex;
+		width: 100%;
+		border-bottom: 1px #f5f5f5 solid;
+		box-sizing: border-box;
+		padding: 15upx;
+		font-size: $uni-font-size-base;
+		background: #fff;
+		.content {
+			display: flex;
+			align-items: center;
+			width: 100%;
+			height: 60upx;
+			border: 1px #ccc solid;
+			background: #fff;
+			overflow: hidden;
+			transition: all 0.2s linear;
+			border-radius: 30px;
+	
+			.content-box {
+				width: 100%;
+				display: flex;
+				align-items: center;
+				&.center {
+					justify-content: center;
+				}
+				.icon {
+					padding: 0 15upx;
+					&.icon-del {
+						font-size: 38upx;
+					}
+				}
+				.input {
+					width: 100%;
+					max-width: 100%;
+					line-height: 60upx;
+					height: 60upx;
+					transition: all 0.2s linear;
+					&.center {
+						width: 200upx;
+					}
+					&.sub {
+						// position: absolute;
+						width: auto;
+						color: grey;
+					}
+				}
+			}
+			.searchBtn {
+				height: 100%;
+				flex-shrink: 0;
+				padding: 0 30upx;
+				background: $uni-color-success;
+				line-height: 60upx;
+				color: #fff;
+				border-left: 1px #ccc solid;
+				transition: all 0.3s;
+			}
+		}
+	
+		.button {
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			position: relative;
+			flex-shrink: 0;
+			width: 0;
+			transition: all 0.2s linear;
+			white-space: nowrap;
+			overflow: hidden;
+			&.active {
+				padding-left: 15upx;
+				width: 100upx;
+			}
+			.icon-more {
+				font-size: 48upx;
+			}
+		}
+	}
+	.more-container-parent {
+		flex-shrink: 0;
+		width: 100%;
+		// position: fixed;
+		// position: sticky;
+		z-index: 997;
+		flex-wrap: nowrap;
+		display: flex;
+		flex-direction: row;
+		position: relative;
+		flex-direction: column;
+		.more-container {
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: auto;
+			background-color: #ffffff;
+			padding: 20rpx;
+			border-radius: 0 0 30rpx 30rpx;
+			box-sizing: border-box;
+			overflow: hidden;
+		}
+	}
+}
+
+@font-face {
+	font-family: 'iconfont';
+	src: url('https://at.alicdn.com/t/c/font_4110624_nikfg21uyk8.ttf?t=1686190660183') format('truetype');
+}
+.icon {
+	font-family: iconfont;
+	font-size: 32upx;
+	font-style: normal;
+	color: #999;
+}
+</style>

+ 79 - 0
src/uni_modules/next-search-more/package.json

@@ -0,0 +1,79 @@
+{
+  "id": "next-search-more",
+  "displayName": "next-search-more(vue2 vue3多端通用)搜索框组合、搜索下拉框组件全端可用",
+  "version": "1.0.9",
+  "description": "搜索下拉框,支持多种展示形式,可以结合第三方组件一起使用,可自定义",
+  "keywords": [
+    "远程搜索",
+    "组合搜索",
+    "配置搜索",
+    "自定义搜索",
+    "搜索下拉框"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.1"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "插件不采集任何数据",
+      "permissions": "无"
+    },
+    "npmurl": "",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "n",
+          "app-nvue": "n"
+        },
+        "H5-mobile": {
+          "Safari": "n",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "n",
+          "Edge": "n",
+          "Firefox": "n",
+          "Safari": "n"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "u",
+          "百度": "u",
+          "字节跳动": "u",
+          "QQ": "u"
+        },
+        "快应用": {
+          "华为": "n",
+          "联盟": "n"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 215 - 0
src/uni_modules/next-search-more/readme.md

@@ -0,0 +1,215 @@
+
+## next-search-more --搜索更多,搜索下拉,search-more
+
+> 遇到问题或有建议可以加入QQ群(<font color=#f00>455948571</font>)反馈  
+> 如果觉得组件不错,<font color=#f00>给五星鼓励鼓励</font>咯!
+
+
+## 使用
+
+>[从uniapp插件市场导入](https://ext.dcloud.net.cn/plugin?name=next-search-more)
+
+```html
+<template>
+	<view class="index">
+		<view style="padding: 10px 0;background-color:#000000;color: #fff;font-size: 13px;"><text>1. mode=more模式</text></view>
+		<next-search-more mode="more" :showMore="showMore" @moreClick="moreClick">
+			<!--以下demo你可以借助第三方的插件实现你想要的任何复杂功能-->
+			<template #more>
+				<u--form labelWidth="80" labelAlign="right">
+					<u-form-item label="radio:">
+						<u-radio-group v-model="searchForm.radio" placement="row">
+							<u-radio v-for="(item, index) in optionslist" :key="index" :label="item.name" :name="item.name" />
+						</u-radio-group>
+					</u-form-item>
+					<u-form-item label="checkbox:">
+						<u-checkbox-group v-model="searchForm.checkbox" placement="row">
+							<u-checkbox v-for="(item, index) in optionslist" :key="index" :label="item.name" :name="item.name" />
+						</u-checkbox-group>
+					</u-form-item>
+					<u-form-item label="rate:">
+						<u-rate :count="5" v-model="searchForm.rate" />
+					</u-form-item>
+					<u-form-item label="switch:">
+						<u-switch v-model="searchForm.switch"></u-switch>
+					</u-form-item>
+					<u-form-item label="other:">
+						<next-search-select
+							:multiple="false"
+							:list="options"
+							label-key="projectName"
+							value-key="id"
+							placeholder=" 请选择报备项目"
+							title="选择报备项目"
+							v-model:value="searchForm.projectId"
+							@search="searchFunc"
+							@change="changeCallback"
+							clearable
+						></next-search-select>
+					</u-form-item>
+					<view class="flex-row">
+						<u-button @click="cancel" :customStyle="{margin: '10rpx'}" text="取消"></u-button>
+						<u-button @click="comfirm" :customStyle="{margin: '10rpx'}" type="primary" text="确定"></u-button>
+					</view>
+				</u--form>
+			</template>
+		</next-search-more>
+		<view style="padding: 10px 0;background-color:#000000;color: #fff;font-size: 13px;"><text>2. mode=common;button=outside模式</text></view>
+		<next-search-more mode="common" button="outside" />
+		<view style="padding: 10px 0;background-color:#000000;color: #fff;font-size: 13px;"><text>3. mode=common;button=inside模式</text></view>
+		<next-search-more mode="common" button="inside" />
+		<view style="padding: 10px 0;background-color:#000000;color: #fff;font-size: 13px;"><text>4. mode=center;button=outside模式</text></view>
+		<next-search-more mode="center" button="outside" />
+		<view style="padding: 10px 0;background-color:#000000;color: #fff;font-size: 13px;"><text>5. mode=center;button=inside模式</text></view>
+		<next-search-more mode="center" button="inside" />
+		<view style="padding: 10px 0;background-color:#000000;color: #fff;font-size: 13px;"><text>6. mode=center;button=inside;isFixedSearchBtn=false模式</text></view>
+		<next-search-more mode="center" button="inside" :isFixedSearchBtn="false" />
+		<view class="content-block"><text>全站ICON图标海量下载iconfont图标大全,为你优选-包图网,全站ICON图标海量下载iconfont图标大全,为你优选-包图网</text></view>
+	</view>
+</template>
+```
+
+### vue3 + ts 使用
+
+```js
+<script lang="ts">
+import { ref, nextTick, toRefs, toRaw, unref, reactive } from 'vue'
+
+export default {
+	setup() {
+		const showMore = ref(false)
+		const searchForm = reactive({
+			radio: '',
+			checkbox: '',
+			rate: 3,
+			switch: false,
+			projectId: ''
+		})
+		let dataLength = 0
+		const options = ref<any>([])
+		const optionslist = ref([{
+            name: '苹果',
+            disabled: false
+          },
+					{
+						name: '香蕉',
+					},
+					{
+						name: '橙子',
+					}
+				])
+		function cancel () {
+			showMore.value = false
+		}
+		function comfirm () {
+			showMore.value = false
+		}
+		function moreClick () {
+			showMore.value = !unref(showMore)
+		}
+		function searchFunc(val?) {
+			console.log("搜索的关键字:", val)
+			uni.showLoading({
+				title: '请稍后...',
+				icon: 'none'
+			})
+			// 模拟ajax请求
+			setTimeout(() => {
+				options.value = []
+				dataLength = 0
+				if (dataLength < 40) {
+					for (let i = 0; i < 40; i++) {
+						options.value.push({
+							id: `id-${val ? val + '-' : ''}${dataLength + i}`,
+							projectName: `项目item-${val ? val + '-' : ''}${dataLength + i}`,
+							ohterKey: `test-${i}`
+						})
+					}
+					dataLength = unref(options).length
+				}
+				uni.hideLoading()
+			}, 1000)
+		}
+		function changeCallback(item) {
+			console.log("选中的item:", item)
+		}
+		searchFunc()
+		return {
+			showMore,
+			moreClick,
+			optionslist,
+			searchForm,
+			searchFunc,
+			options,
+			changeCallback,
+			comfirm,
+			cancel
+		}
+	}
+}
+</script>
+<style lang="scss">
+
+	.flex-row {
+		display: flex;
+		justify-content: space-around;
+	}
+	.content-block {
+		border-radius: 20rpx;
+		border: 1rpx solid #ccc;
+		margin: 20rpx;
+		padding: 20rpx;
+	}
+</style>
+<style lang="scss">
+page {
+  background: #ccc;
+}
+</style>
+
+
+```
+### vue2 同样支持,在这里不再写demo
+
+### 组件按需加载
+如果不需要组件全局加载,而已把组件拷贝到项目的components目录下,单独引入进来使用即可达到按需加载的效果
+### 预览
+
+***
+
+|                 						功能预览               				   			 					|   |                 						项目中应用演示               				   			 			 |
+| :--------------------------------------------------------------------------:|		| :-----------------------------------------------------------------------------:|
+| ![](https://lixueshiaa.github.io/webtest/www/static/next-search-more.gif) 	|		| ![](https://lixueshiaa.github.io/webtest/www/static/next-search-more-demo.gif) |
+
+
+## 参数
+
+
+### next-search-more Props
+
+可选参数属性列表
+
+|参数名				|说明																																																						|类型														|是否必填	|默认值								|可选值			|
+|----				|----																																																							|----														|----			|----									|----				|
+|mode				|模式mode,支持common模式 center模式 more模式																																			|String													|否				|common								|center,more|
+|button			|搜索按钮的模式,支持outside模式 inside模式				 																																	|String													|否				|outside							|inside			|
+|isFixedSearchBtn			|是否固定搜索按钮																																												|Boolean												|否				|true									|false			|
+|radius	|搜索控件的radius																																																			|String, Number									|否				|60										|-					|
+|placeholder			|	placeholder																																																|String													|否				|请输入搜索内容				|-					|
+|backgroundColor			|搜索控件的背景颜色																																											|String													|否				|#fff					 				|-					|
+|showMore			|		mode=more模式下,用于控制打开下拉弹层																																					|Boolean												|否				|false				 				|true				|
+|border|	border																																																							|String													|否				|1px #f5f5f5 solid		|-					|
+
+
+# Event 事件
+|事件名	|说明																	|类型	|回调参数	|
+|----		|----																	|----	|----			|
+|input |搜索框输入事件													|emit	|-				|
+|search|搜索触发的事件													|emit	|-				|
+|moreClick|更多按钮点击触发事件								|emit	|-				|
+
+## Slot 插槽
+
+|名称	|说明									|参数	|
+|----	|----									|----	|
+|more	|more插槽,在mode=more模式下用于存放下拉框内容	|无		|

+ 167 - 0
src/uni_modules/next-tree/changelog.md

@@ -0,0 +1,167 @@
+## 1.8.6(2024-04-07)
+功能更新
+## 1.8.5(2024-04-07)
+修复bug
+## 1.8.3(2024-04-06)
+update
+## 1.8.2(2024-04-06)
+update
+## 1.8.1(2024-04-06)
+fix bug
+## 1.8.0(2024-04-03)
+优化
+## 1.7.9(2024-04-03)
+优化编辑tree功能
+## 1.7.8(2024-04-02)
+超集功能上线
+## 1.7.7(2024-03-26)
+增加expandedMode=singe
+## 1.7.6(2024-02-27)
+修复特殊字符的处理方法
+## 1.7.5(2024-02-26)
+增加无子节点的父节点配置
+## 1.7.4(2024-02-05)
+修复vue2,语法使用问题
+## 1.7.3(2024-02-05)
+修复vue2,插槽不显示bug
+## 1.7.2(2024-02-05)
+优化大数据的性能
+## 1.7.1(2024-01-25)
+优化功能说明
+## 1.7.0(2024-01-24)
+增加expandedKeys默认展开项目,配置
+## 1.6.9(2024-01-23)
+增加change事件
+## 1.6.8(2024-01-22)
+搜索模式下,不再响应展开收起逻辑
+## 1.6.7(2024-01-04)
+修复异步加载节点搜索展示bug
+## 1.6.6(2023-12-29)
+修复next-tree异步加载节点关闭bug
+## 1.6.5(2023-12-21)
+fix bug
+## 1.6.4(2023-12-21)
+fix bug
+## 1.6.3(2023-12-21)
+更新vue2版本说明文档
+## 1.6.2(2023-12-21)
+修复说明文档
+## 1.6.1(2023-12-18)
+增加empty插槽
+## 1.6.0(2023-12-18)
+增加empty插槽
+## 1.5.9(2023-12-15)
+修改说明文件
+## 1.5.8(2023-12-15)
+修复changeVerify函数单选时,返回参数bug
+## 1.5.7(2023-12-14)
+修复checkStrictlyModel === 'strong'的bug
+## 1.5.6(2023-12-13)
+代码优化
+## 1.5.5(2023-12-13)
+优化changeVerify的使用
+## 1.5.4(2023-12-12)
+修复提示层级问题
+## 1.5.3(2023-12-12)
+优化uiMode=page模式下的使用
+## 1.5.2(2023-12-11)
+增加uiMode配置,实现页面模式展示
+## 1.5.1(2023-12-06)
+更新说明
+## 1.5.0(2023-12-06)
+更新插件使用注意事项
+## 1.4.9(2023-12-01)
+增加topBar插槽
+## 1.4.8(2023-11-30)
+增加changeVerify验证函数,实现change的各种控制
+## 1.4.7(2023-11-30)
+增加弹层容器高度可配置
+## 1.4.6(2023-11-28)
+修复bug
+## 1.4.5(2023-11-28)
+修复disabled是,需要显示灰色不可操作
+## 1.4.4(2023-11-28)
+增加说明
+## 1.4.3(2023-11-28)
+增加主题配置
+## 1.4.2(2023-11-28)
+增加异步加载时,子节点说明
+## 1.4.1(2023-11-27)
+修复说明bug
+## 1.4.0(2023-11-27)
+next-tree 全面说明文档
+## 1.3.6(2023-11-27)
+增加远程加载loadData,全面实现全功能覆盖
+## 1.3.5(2023-11-27)
+增加title的定义
+## 1.3.4(2023-11-27)
+增加title支持自定义定制
+## 1.3.3(2023-11-21)
+增加搜索模式searchModel=depHighlight模式,从属高亮显示模式
+## 1.3.2(2023-11-20)
+修复valueKey设置bug
+## 1.3.1(2023-11-17)
+增加说明文件,和demo
+## 1.3.0(2023-11-17)
+修复clear时不支持关联模式的设置
+## 1.2.9(2023-11-17)
+增加checkStrictlyModel模式设置,强关联,和弱关联
+## 1.2.8(2023-11-16)
+增加next-tree的辅助线模式
+## 1.2.7(2023-11-16)
+优化next-tree
+## 1.2.6(2023-11-16)
+修复搜索时,隐藏未打开的数据
+## 1.2.5(2023-11-16)
+修复搜索无法点击,和级联半选不生效问题
+## 1.2.4(2023-11-16)
+更新新功能插件使用说明
+## 1.2.3(2023-11-16)
+增加插槽模式,只是高ui要求定制
+## 1.2.2(2023-11-15)
+修复checkStrictly配置下,子关联父的选择状态
+## 1.2.1(2023-11-15)
+增加半选提示功能配置showHalfCheckedTips
+## 1.2.0(2023-11-14)
+修复disabled配置状态下,父子级联,不需要改变disabled设置项的选择状态
+## 1.1.9(2023-11-13)
+增强大数据量体验交互,增加筛选搜索模式
+## 1.1.8(2023-11-13)
+增加清除clear和取消cancel事件
+## 1.1.7(2023-11-08)
+更新next-tree插件功能清单说明
+## 1.1.6(2023-11-07)
+update说明文档
+## 1.1.5(2023-11-07)
+update
+## 1.1.4(2023-11-07)
+更新readme.md说明
+## 1.1.3(2023-11-07)
+更新说明demo
+## 1.1.2(2023-11-07)
+增加子节点按需渲染演示demo
+## 1.1.1(2023-11-07)
+增加清空功能
+## 1.1.0(2023-11-07)
+增加子孙节点按需渲染,扩展本插件支持大数据量渲染;
+## 1.0.9(2023-10-26)
+增加文件说明
+## 1.0.8(2023-09-14)
+增加禁用节点属性配置disabledKey
+## 1.0.7(2023-09-06)
+增加checkStrictly,实现父子节点关联
+## 1.0.6(2023-09-06)
+更新vue2使用过程视图不更新的技术说明
+## 1.0.5(2023-09-06)
+修复说明文档
+## 1.0.4(2023-06-19)
+修改demo
+## 1.0.3(2023-06-19)
+更新vue2的使用demo
+## 1.0.2(2023-06-19)
+修复说明文档
+
+## 1.0.1(2023-05-10)
+更新说明文件
+## 1.0.0(2023-05-09)
+初始化项目

Файловите разлики са ограничени, защото са твърде много
+ 151 - 0
src/uni_modules/next-tree/components/next-tree/next-tree.vue


+ 269 - 0
src/uni_modules/next-tree/components/next-tree/style.css

@@ -0,0 +1,269 @@
+@font-face {
+	font-family: 'iconfont';
+	src: url('//at.alicdn.com/t/c/font_4110624_qs48wckazsh.ttf?t=1712479573821') format('truetype');
+}
+@keyframes spin {
+	0% { transform: rotate(0deg); }
+	100% { transform: rotate(360deg); }
+}
+
+.iconfont {
+	font-family: iconfont;
+	font-style: normal;
+}
+.iconfont-loading {
+	font-family: iconfont;
+	display: inline-block;
+	font-style: normal;
+	animation: spin 1s linear infinite;
+}
+.next-tree-mask {
+  position: fixed;
+  top: 0rpx;
+  right: 0rpx;
+  bottom: 0rpx;
+  left: 0rpx;
+  z-index: 997;
+  background-color: rgba(0, 0, 0, 0.6);
+  opacity: 0;
+  transition: all 0.3s ease;
+  visibility: hidden;
+}
+.next-tree-mask.show {
+  visibility: visible;
+  opacity: 1;
+}
+.next-tree-cnt {
+  position: fixed;
+  top: 0rpx;
+  right: 0rpx;
+  bottom: 0rpx;
+  left: 0rpx;
+  z-index: 997;
+  top: 360rpx;
+  transition: all 0.3s ease;
+  transform: translateY(100%);
+}
+.next-tree-cnt.next-tree-cnt-page {
+	transition: none;
+}
+.next-tree-cnt.show {
+  transform: translateY(0);
+}
+.next-tree-bar {
+  background-color: #fff;
+  height: 72rpx;
+  padding-left: 20rpx;
+  padding-right: 20rpx;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  box-sizing: border-box;
+  border-bottom-width: 1rpx !important;
+  border-bottom-style: solid;
+  border-bottom-color: #f5f5f5;
+  font-size: 32rpx;
+  color: #757575;
+  line-height: 1;
+}
+.next-tree-bar-btns {
+	display: inline-block;
+	display: flex;
+	flex-direction: row;
+}
+.btn-divid {
+	display: inline-block;
+	width: 1px;
+	margin: 0 10px;
+	background-color: #ccc;
+}
+.next-tree-bar-confirm {
+  color: #f9ae3d;
+}
+.next-tree-view {
+  position: absolute;
+  top: 0rpx;
+  right: 0rpx;
+  bottom: 0rpx;
+  left: 0rpx;
+  top: 72rpx;
+  background-color: #fff;
+  padding-top: 20rpx;
+  padding-right: 20rpx;
+  padding-bottom: 20rpx;
+  padding-left: 20rpx;
+}
+.next-tree-view-sc {
+  height: 100%;
+  overflow: hidden;
+}
+.next-tree-view-sc .empty {
+	text-align: center;
+	color: #757575;
+	padding: 30rpx;
+}
+.next-tree-item-block {
+	
+}
+.next-tree-item {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  font-size: 26rpx;
+  color: #757575;
+  line-height: 1;
+  height: 0;
+  opacity: 0;
+  transition: 0.2s;
+  position: relative;
+  overflow: hidden;
+}
+.next-tree-item .icon-btn {
+	font-size: 30rpx;
+	margin-right: 20rpx;
+}
+.next-tree-item .left-line {
+	position: relative;
+	width: 1rpx;
+	height: 100%;
+	box-sizing: border-box;
+}
+.next-tree-item .left-line::before {
+	position: absolute;
+	content: "";
+	width: 1rpx;
+	height: 100%;
+	background-color: rgba(204,204,204,0.9);
+	box-sizing: border-box;
+	
+	left: -18rpx;
+}
+.next-tree-item .parent-horizontal-line {
+	width: 1rpx;
+	height: 100%;
+	position: absolute;
+	top: 0;
+	left: 0rpx;
+	box-sizing: border-box;
+	background-color: rgba(204,204,204,0.9);
+}
+.next-tree-item .left-line .horizontal-line {
+	width: 20rpx;
+	height: 1rpx;
+	position: absolute;
+	top: 40rpx;
+	left: 0rpx;
+	background-color: rgba(204,204,204,0.9);
+	box-sizing: border-box;
+}
+
+.next-tree-item.show {
+  height: 80rpx;
+  opacity: 1;
+}
+.next-tree-item.showchild:before {
+  transform: rotate(90deg);
+}
+.next-tree-item.border {
+  border-bottom: 1rpx solid rgba(204,204,204,0.2);
+}
+.next-tree-item.last:before {
+  opacity: 0;
+}
+.next-tree-item.disabled {
+  color: #ccc!important;
+}
+
+.next-tree-icon {
+  width: 26rpx;
+  height: 26rpx;
+  margin-right: 8rpx;
+}
+.next-tree-label {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  height: 100%;
+  line-height: 1.2;
+}
+.next-tree-label .label-input {
+	border: 1rpx solid #f0f0f0;
+	border-radius: 10rpx;
+	width: 100%;
+	padding: 12rpx 18rpx;
+	margin-right: 30rpx;
+}
+.next-tree-check {
+  width: 40px;
+  height: 40px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.next-tree-check-yes,
+.next-tree-check-no {
+  width: 20px;
+  height: 20px;
+  border-top-left-radius: 20%;
+  border-top-right-radius: 20%;
+  border-bottom-right-radius: 20%;
+  border-bottom-left-radius: 20%;
+  border-top-width: 1rpx;
+  border-left-width: 1rpx;
+  border-bottom-width: 1rpx;
+  border-right-width: 1rpx;
+  border-style: solid;
+  border-color: #f9ae3d;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  box-sizing: border-box;
+}
+.next-tree-check-yes-b {
+  border-top-left-radius: 20%;
+  border-top-right-radius: 20%;
+  border-bottom-right-radius: 20%;
+  border-bottom-left-radius: 20%;
+  background-color: #f9ae3d;
+	color: #fff;
+}
+.next-tree-check-yes-b .icon-text {
+	font-size: 14px;
+	font-weight: normal;
+	font-family: uicon-iconfont;
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+}
+.next-tree-check .radio {
+  border-top-left-radius: 50%;
+  border-top-right-radius: 50%;
+  border-bottom-right-radius: 50%;
+  border-bottom-left-radius: 50%;
+}
+.next-tree-check .radio .next-tree-check-yes-b {
+  border-top-left-radius: 50%;
+  border-top-right-radius: 50%;
+  border-bottom-right-radius: 50%;
+  border-bottom-left-radius: 50%;
+}
+
+.next-tree-item.disabled .next-tree-check-no {
+	color: #ccc!important;
+}
+.next-tree-item.disabled .next-tree-check-yes-b {
+	background-color: #ccc!important;
+}
+.hover-c {
+  opacity: 0.6;
+}
+
+.fixed-bottom-bar {
+	position: fixed;
+	bottom: 0rpx;
+	left: 0rpx;
+	right: 0rpx;
+	z-index: 998;
+}
+
+

+ 84 - 0
src/uni_modules/next-tree/package.json

@@ -0,0 +1,84 @@
+{
+  "id": "next-tree",
+  "displayName": "next-tree(超强树选择器、树组件、树插件、无限级联树、单选树、多选树、自定义样式树、树形选择器)",
+  "version": "1.8.6",
+  "description": "next-tree 弹窗树形选择器,支持多选,支持大数据, 无限级联,单选,父子级级联,远程/ajax加载,子节点增量/异步渲染,自定义样式定制,具名插槽等;支持h5/小程序/APP,全端通用",
+  "keywords": [
+    "树选择",
+    "tree",
+    "弹窗树选择器",
+    "多选树",
+    "单选树"
+],
+"engines": {
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "修改版本说明",
+      "permissions": "无"
+    },
+    "npmurl": "",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": ["next-search-more"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y",
+        "alipay": "n"
+      },
+      "client": {
+        "Vue": {
+          "vue2": "y",
+          "vue3": "y"
+        },
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "u"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "n",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "u"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "u",
+          "QQ": "y",
+          "钉钉": "y",
+          "快手": "u",
+          "飞书": "u",
+        "京东": "u"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        }
+      }
+    }
+  }
+}

+ 843 - 0
src/uni_modules/next-tree/readme.md

@@ -0,0 +1,843 @@
+
+## next-tree --下拉树
+
+> 遇到问题或有建议可以加入QQ群(<font color=#f00>455948571</font>)反馈  
+> 如果觉得组件不错,<font color=#f00>给五星鼓励鼓励</font>咯!
+
+## 亮点功能说明(打造你不得不用的好插件)
+
+### 本插件自1.5.0版本后支持一下功能    
+
+ >  1.大数据量渲染(本插件智能判断,如果子孙集数据量大于50时,会响应等待渲染视图;)  
+ >  2.子节点按需渲染(自动启用,无需配置)  
+ >  3.父子级联选择设置  
+ >  4.单选多选设置  
+ >  5.父节点是否可选设置  
+ >  6.回显默认选中值  
+ >  7.不可选项disabled设置  
+ >  8.增强大数据量体验交互,增加筛选搜索模式  
+ >  9.增强样式定制,提供自定义插槽,实现高要求样式定制  
+ >  10.增加辅助线模式,外观更加精美  
+ >  11.支持动态配置title  
+ >  12.支持搜索模式searchModel=depHighlight模式,从属高亮显示模式  
+ >  13.支持异步加载子节点,ajax加载子节点  
+ >  14.增加可配置主题,自由定制插件主题颜色  
+ >  15.支持动态校验,可以进行提示控制校验  
+ >  16.支持页面模式/弹层模式,可以进行单页面展示或者弹层展示  
+ >  17.支持半选提示状态显示  
+ >  18.支持展开项expandedKeys配置  
+ >  19.全面支持vue2/vue3  
+ >  20.增加无子节点的父节点配置支持(当item[childrenKey]为null时,代表无子节点的父节点)  
+ >  21.终极支持超数据量使用,增加展开模式配置单链路配置使用expandedMode=singe,使得ui组件使用进一步不在限制与数据量  
+ >  22.功能模式再次增强,支持单选tree,多选tree,编辑tree,展示tree;
+
+## 注意
+	
+### 作者不介意你对组件源码进行改造使用,为了开源更加高效,谢谢你的配合;为了节省不必要的沟通浪费,以下情况请不要再反馈给作者,请自行解决;
+### 在这感各位的理解,我支持开源,但是作者时间有限;谢谢各位的配合;在这里期望我写的小小插件能为你提供便捷;
+	
+ >  1.如果你对源码进行了修改使用,请不需要对作者做任何的反馈,作者确实没有空陪你做技术分析解答;  
+ >  2.如果你引入插件,连插件是否有正常被uniapp框架识别解析都不清楚,请你换个插件使用;  
+ >  3.如果你引入插件,针对自己项目进行功能改造的,请自行仔细阅读源码并了解其原理,自行改造;这里作者不愿意浪费过多时间进行技术解答;  
+ >  4.如果你不想进行全局加载next-tree,需要按需加载;next-tree中有相关依赖的组件,需要你自行在组件内部单独引入;依赖组件可以在package.json中找到;  
+ >  5.理论上作者不再解决由于本地开发环境问题所导致的插件使用问题,请自行到uniapp官网学习解决;	 
+
+## 使用
+### 超集功能即将不对外开源;
+
+>[从uniapp插件市场导入](https://ext.dcloud.net.cn/plugin?name=next-tree)
+
+## 关注作者的动态
+[点击进入主页,关注作者](https://ask.dcloud.net.cn/people/ponder_7464)
+
+## 关注作者其他开源
+
+npm开源包:[npm](https://www.npmjs.com/~lixueshiaa);
+github开源项目:[github](https://github.com/lixueshiaa);
+
+
+```html
+<template>
+	<view style="padding:10px;color: #333;font-weight: 500;">
+		<view style="padding: 10px 0"><text>1、设置单选和父级不可选</text></view>
+		<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(false, false)">设置</button>
+		<view style="padding: 10px 0"><text>2、设置多选和父级不可选</text></view>
+		<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, false)">设置</button>
+		<view style="padding: 10px 0"><text>3、设置单选和父级可选</text></view>
+		<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(false, true)">设置</button>
+		<view style="padding: 10px 0"><text>4、设置多选和父级可选</text></view>
+		<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, true)" >设置</button>
+		<view style="padding: 10px 0"><text>4、设置多选和父级可选和父级关联子级选择</text></view>
+		<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, true, true)" >设置</button>
+		<view style="padding: 10px 0"><text>5、设置默认回显(默认选中: '上海-2', '黄埔区-35')</text></view>
+		<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="echoDefault()" >设置</button>
+		<!-- 异步加载demo -->
+		<view style="padding: 10px 0"><text>6、异步加载渲染demo</text></view>
+		<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="openTree()" >设置</button>
+	</view>
+	
+	<!-- 异步加载demo -->
+	<next-tree :selectParent="false" :checkStrictly="true" funcMode="checkbox" ref="nextTreeAsyncRef" :treeData="asyncTreeData" :loadData="loadData" />
+	
+	<next-tree :expandedKeys="['3','3-1']" :changeVerify="changeVerify" :title="getTitle" ref="nextTreeRef" :checkStrictly="checkStrictly" :selectParent="selectParent" :funcMode="funcMode" :treeData="treeData"  @cancel="oncancel" @confirm="onconfirm">
+		<!-- label插槽示意代码 -->
+		<!-- <template #label="{data: {id, label, iconSrc, prev, post}}">
+			<view class="line-block">
+				<image class="img" v-if="iconSrc" :src="iconSrc"></image>
+				<text space="nbsp" v-if="prev">{{prev}}&nbsp;</text><text>{{label}}</text><text space="nbsp" v-if="post">&nbsp;{{post}}</text>
+			</view>
+		</template> -->
+		<!-- <template #topBar>
+			<view style="color: #666;padding:5px;"><text style="font-size: 12px;">历史记录</text></view>
+			<view style="display: flex;justify-content: space-between;padding-bottom: 10px;border-bottom: 1rpx solid #f0f0f0;">
+				<button @click="checkedFunc('1-3-3-4')"  :style="'background-color:'+ (activeId === '1-3-3-4' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">北京区-4</button>
+				<button @click="checkedFunc('3-1-2')"  :style="'background-color:'+ (activeId === '3-1-2' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">海珠区-2</button>
+				<button @click="checkedFunc('3-1-6')"  :style="'background-color:'+ (activeId === '3-1-6' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">海珠区-5</button>
+			</view>
+		</template> -->
+	</next-tree>
+</template>
+```
+
+### vue3 + ts 使用
+
+```ts
+<script setup lang="ts">
+import { ref, unref } from 'vue'
+import nextTree from '@/components/next-tree/next-tree.vue'
+
+const funcMode = ref('radio');
+const selectParent = ref(false)
+const nextTreeRef = ref()
+const nextTreeAsyncRef = ref()
+const activeId = ref('')
+
+const localData: any = {
+	'a1': [{id: 'a1-1', label: 'a1-1'}, {id: 'a1-2', label: 'a1-2',children: [] },{id: 'a1-3', label: 'a1-3'}],
+	'b1': [{id: 'b1-1', label: 'b1-1',children: []}, {id: 'b1-2', label: 'b1-2'},{id: 'b1-3', label: 'b1-3'}],
+	'c1': [{id: 'c1-1', label: 'c1-1'}, {id: 'c1-2', label: 'c1-2'},{id: 'c1-3', label: 'c1-3',children: []}],
+	'a1-2': [{id: 'a1-2-1', label: 'a1-2-1'}, {id: 'a1-2-2', label: 'a1-2-2'}],
+	'b1-1': [{id: 'b1-1-1', label: 'b1-1-1'}, {id: 'b1-1-2', label: 'b1-1-2'}],
+	'c1-3': [{id: 'c1-3-1', label: 'c1-3-1'}, {id: 'c1-3-2', label: 'c1-3-2'}]
+}
+
+const checkStrictly = ref(false)
+const asyncTreeData = ref([{id: 'a1', label: 'a1', children: []},{id: 'b1', label: 'b1', children: []},{id: 'c1', label: 'c1', children: []}])
+const treeData = ref([
+	{id: '1', label: '北京'},
+	{id: '2', label: '上海', children: [
+		{id: '2-1', label: '上海-1'},
+		{id: '2-2', label: '上海-2'},
+		{id: '2-3', label: '上海-3'},
+	] },
+	{id: '3', label: '广州', children: [
+			{id: '3-1', label: '海珠区', children: [
+				{id: '3-1-1', label: '海珠区-1'},
+				{id: '3-1-2', label: '海珠区-2'},
+				{id: '3-1-4', label: '海珠区-3'},
+				{id: '3-1-5', label: '海珠区-4'},
+				{id: '3-1-6', label: '海珠区-5'},
+				{id: '3-1-7', label: '海珠区-6'},
+				{id: '3-1-8', label: '海珠区-7'},
+				{id: '3-1-9', label: '海珠区-8'},
+				{id: '3-1-10', label: '海珠区-9'},
+				{id: '3-1-11', label: '海珠区-10'},
+			]},
+			{id: '3-2', label: '番禺区', children: [
+				{id: '3-2-1', label: '番禺区-1'},
+				{id: '3-2-2', label: '番禺区-2'},
+				{id: '3-2-4', label: '番禺区-3', children: null},	// 注意: 当childrenKey的值设为null,代表无子节点的父节点
+				{id: '3-2-5', label: '番禺区-4'},
+				{id: '3-2-6', label: '番禺区-5'},
+				{id: '3-2-7', label: '番禺区-6'},
+				{id: '3-2-8', label: '番禺区-7'},
+				{id: '3-2-9', label: '番禺区-8'},
+				{id: '3-2-10', label: '番禺区-9'},
+				{id: '3-2-11', label: '番禺区-10'},
+			]},
+			{id: '3-3', label: '黄埔区', children: [
+				{id: '3-3-1', label: '黄埔区-1'},
+				{id: '3-3-2', label: '黄埔区-2'},
+				{id: '3-3-3', label: '黄埔区-3'},
+				{id: '3-3-4', label: '黄埔区-4'},
+				{id: '3-3-5', label: '黄埔区-5'},
+				{id: '3-3-6', label: '黄埔区-6'},
+				{id: '3-3-7', label: '黄埔区-7'},
+				{id: '3-3-8', label: '黄埔区-8'},
+				{id: '3-3-9', label: '黄埔区-9'},
+				{id: '3-3-10', label: '黄埔区-10'},
+				{id: '3-3-12', label: '黄埔区-11'},
+				{id: '3-3-13', label: '黄埔区-12'},
+				{id: '3-3-13', label: '黄埔区-13'},
+				{id: '3-3-14', label: '黄埔区-14'},
+				{id: '3-3-15', label: '黄埔区-15'},
+				{id: '3-3-16', label: '黄埔区-16'},
+				{id: '3-3-17', label: '黄埔区-17'},
+				{id: '3-3-18', label: '黄埔区-18'},
+				{id: '3-3-19', label: '黄埔区-19'},
+				{id: '3-3-20', label: '黄埔区-20'},
+				{id: '3-3-21', label: '黄埔区-21'},
+				{id: '3-3-22', label: '黄埔区-22'},
+				{id: '3-3-23', label: '黄埔区-23'},
+				{id: '3-3-24', label: '黄埔区-24'},
+				{id: '3-3-25', label: '黄埔区-25'},
+				{id: '3-3-26', label: '黄埔区-26'},
+				{id: '3-3-27', label: '黄埔区-27'},
+				{id: '3-3-28', label: '黄埔区-28'},
+				{id: '3-3-29', label: '黄埔区-29'},
+				{id: '3-3-30', label: '黄埔区-30'},
+				{id: '3-3-31', label: '黄埔区-31'},
+				{id: '3-3-32', label: '黄埔区-32'},
+				{id: '3-3-33', label: '黄埔区-33'},
+				{id: '3-3-34', label: '黄埔区-34'},
+				{id: '3-3-35', label: '黄埔区-35'},
+				{id: '3-3-36', label: '黄埔区-36'},
+				
+			]},
+		],
+	}])
+function getTitle(checked) {
+	return `已选:${checked.length}项`
+}
+function itemclick (_multiple, _selectParent, _checkStrictly = false) {
+	funcMode.value = _multiple ? 'checkbox' : 'radio';
+	selectParent.value = _selectParent
+	checkStrictly.value = _checkStrictly
+	unref(nextTreeRef).showTree = true
+}
+function checkedFunc(id) {
+	if(unref(activeId) === id) {
+		activeId.value = '';
+		unref(nextTreeRef).checkedFunc(id, false)
+	} else {
+		activeId.value = id;
+		unref(nextTreeRef).checkedFunc(id)	
+	}
+}
+function changeVerify(current, chooseList) {
+	// 注意:返回非空字符串会阻止原有行为,并提示返回的字符串
+	// 如果函数体不做return返回值,即验证通过,控件正常处理业务
+	console.log('当前变化的数据', current)
+	console.log('已选择的数据', chooseList)
+	if(chooseList && chooseList.length > 4) {
+		
+		return '最多可以选择4个节点'
+	}
+}
+function openTree() {
+	unref(nextTreeAsyncRef).showTree = true
+}
+function echoDefault () {
+	const selectIds = ['2-1','3-3-35']
+	checkedTreeData(unref(treeData), selectIds)
+	console.log('treeData的数据:', unref(treeData))
+	funcMode.value = 'checkbox'
+	unref(nextTreeRef).showTree = true
+}
+function loadData(data) {
+	const type = data.$type;	// 加载类型
+	const source = data.source // 源数据
+	// 同步实现的代码处理方式
+	
+	if (type === 'nodeLoad') {
+		const  nodeItem = source;
+		// 同步实现的代码处理方式
+		// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
+		
+		// if(nodeItem && localData[nodeItem.id]) {
+		// 	return localData[nodeItem.id]
+		// } else {
+		// 	return []
+		// }
+		
+		// 异步的代码实现方式
+		// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
+		
+		return new Promise((resolve, reject) => {
+			setTimeout(() => {
+				if(nodeItem && localData[nodeItem.id]) {
+					return resolve(localData[nodeItem.id])
+				} else {
+					return resolve([])
+				}
+			}, 1000)
+		})
+	} else if(type === 'remoteSearch') {
+		// ...doing
+	}
+	
+}
+
+function checkedTreeData (treeData, selectIds) {
+	treeData.map(item => {
+		if (selectIds.indexOf(item.id) !== -1) {
+			item.checked = true
+		} else {
+			item.checked = false
+		}
+		if (item.children && item.children.length) {
+			checkedTreeData(item.children, selectIds)
+		}
+	})
+}
+function oncancel() {
+	// 清除treeData的选中状态
+	checkedTreeData(unref(treeData), [])
+}
+function onconfirm(list) {
+	console.log('选中项的数量列表list:', list)
+}
+</script>
+<style lang="scss">
+	.line-block {
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+		align-items: center;
+		.img {
+			width: 40rpx;
+			height: 40rpx;
+			border-radius: 10rpx;
+			margin: 0 20rpx;
+		}
+	}
+</style>
+
+```
+
+### vue2 使用
+```html
+<template>
+	<view>
+		<view style="padding:10px;color: #333;font-weight: 500;">
+			<view style="padding: 10px 0"><text>1、设置单选和父级不可选</text></view>
+			<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(false, false)">设置</button>
+			<view style="padding: 10px 0"><text>2、设置多选和父级不可选</text></view>
+			<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, false)">设置</button>
+			<view style="padding: 10px 0"><text>3、设置单选和父级可选</text></view>
+			<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(false, true)">设置</button>
+			<view style="padding: 10px 0"><text>4、设置多选和父级可选</text></view>
+			<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, true)" >设置</button>
+			<view style="padding: 10px 0"><text>4、设置多选和父级可选和父级关联子级选择</text></view>
+			<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, true, true)" >设置</button>
+			<view style="padding: 10px 0"><text>5、设置默认回显(默认选中: '上海-2', '黄埔区-35')</text></view>
+			<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="echoDefault()" >设置</button>
+			<!-- 异步加载demo -->
+			<view style="padding: 10px 0"><text>6、异步加载渲染demo</text></view>
+			<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="openTree()" >设置</button>
+		</view>
+		<!-- 异步加载demo -->
+		<next-tree :selectParent="false" :checkStrictly="true" funcMode="checkbox" ref="nextTreeAsyncRef" :treeData="asyncTreeData" :loadData="loadData" />
+		
+		<next-tree :expandedKeys="['3','3-1']" :changeVerify="changeVerify" :title="getTitle" ref="nextTreeRef" :checkStrictly="checkStrictly" :selectParent="selectParent" :funcMode="funcMode" :treeData="treeData" @cancel="oncancel" @confirm="onconfirm">
+			<!-- label插槽示意代码 -->
+			<!-- <template v-slot:label="{data}">
+				<view class="line-block">
+					<image class="img" v-if="data.iconSrc" :src="data.iconSrc"></image>
+					<text space="nbsp" v-if="data.prev">{{data.prev}}&nbsp;</text><text>{{data.label}}</text><text space="nbsp" v-if="data.post">&nbsp;{{data.post}}</text>
+				</view>
+			</template> -->
+			<!-- <template #topBar>
+				<view style="color: #666;padding:5px;"><text style="font-size: 12px;">历史记录</text></view>
+				<view style="display: flex;justify-content: space-between;padding-bottom: 10px;border-bottom: 1rpx solid #f0f0f0;">
+					<button @click="checkedFunc('1-3-3-4')"  :style="'background-color:'+ (activeId === '1-3-3-4' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">北京区-4</button>
+					<button @click="checkedFunc('3-1-2')"  :style="'background-color:'+ (activeId === '3-1-2' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">海珠区-2</button>
+					<button @click="checkedFunc('3-1-6')"  :style="'background-color:'+ (activeId === '3-1-6' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">海珠区-5</button>
+				</view>
+			</template> -->
+		</next-tree>
+	</view>
+</template>
+```
+
+```js
+<script>
+let self = null;
+export default {
+	data () {
+		return {
+			funcMode: 'radio',
+			selectParent: false,
+			checkStrictly: false,
+			activeId: '',
+			localData:{
+				'a1': [{id: 'a1-1', label: 'a1-1'}, {id: 'a1-2', label: 'a1-2',children: [] },{id: 'a1-3', label: 'a1-3'}],
+				'b1': [{id: 'b1-1', label: 'b1-1',children: []}, {id: 'b1-2', label: 'b1-2'},{id: 'b1-3', label: 'b1-3'}],
+				'c1': [{id: 'c1-1', label: 'c1-1'}, {id: 'c1-2', label: 'c1-2'},{id: 'c1-3', label: 'c1-3',children: []}],
+				'a1-2': [{id: 'a1-2-1', label: 'a1-2-1'}, {id: 'a1-2-2', label: 'a1-2-2'}],
+				'b1-1': [{id: 'b1-1-1', label: 'b1-1-1'}, {id: 'b1-1-2', label: 'b1-1-2'}],
+				'c1-3': [{id: 'c1-3-1', label: 'c1-3-1'}, {id: 'c1-3-2', label: 'c1-3-2'}]
+			},
+			asyncTreeData: [{id: 'a1', label: 'a1', children: []},{id: 'b1', label: 'b1', children: []},{id: 'c1', label: 'c1', children: []}],		
+			treeData: [
+				{id: '1', label: '北京', checked: false},
+				{id: '2', label: '上海', checked: false, children: [
+					{id: '2-1', label: '上海-1', checked: false},
+					{id: '2-2', label: '上海-2', checked: false},
+					{id: '2-3', label: '上海-3', checked: false},
+				] },
+				{id: '3', label: '广州', children: [
+						{id: '3-1', label: '海珠区', checked: false, children: [
+							{id: '3-1-1', label: '海珠区-1', checked: false, disabled: true},
+							{id: '3-1-2', label: '海珠区-2', checked: false},
+							{id: '3-1-4', label: '海珠区-3', checked: false},
+							{id: '3-1-5', label: '海珠区-4', checked: false},
+							{id: '3-1-6', label: '海珠区-5', checked: false},
+							{id: '3-1-7', label: '海珠区-6', checked: false},
+							{id: '3-1-8', label: '海珠区-7', checked: false},
+							{id: '3-1-9', label: '海珠区-8', checked: false},
+							{id: '3-1-10', label: '海珠区-9', checked: false},
+							{id: '3-1-11', label: '海珠区-10', checked: false},
+						]},
+						{id: '3-2', label: '番禺区', checked: false, children: [
+							{id: '3-2-1', label: '番禺区-1', checked: false},
+							{id: '3-2-2', label: '番禺区-2', checked: false},
+							{id: '3-2-4', label: '番禺区-3', checked: false},
+							{id: '3-2-5', label: '番禺区-4', checked: false},
+							{id: '3-2-6', label: '番禺区-5', checked: false},
+							{id: '3-2-7', label: '番禺区-6', checked: false},
+							{id: '3-2-8', label: '番禺区-7', checked: false},
+							{id: '3-2-9', label: '番禺区-8', checked: false},
+							{id: '3-2-10', label: '番禺区-9', checked: false},
+							{id: '3-2-11', label: '番禺区-10', checked: false},
+						]},
+						{id: '3-3', label: '黄埔区', checked: false, children: [
+							{id: '3-3-1', label: '黄埔区-1', checked: false},
+							{id: '3-3-2', label: '黄埔区-2', checked: false},
+							{id: '3-3-3', label: '黄埔区-3', checked: false},
+							{id: '3-3-4', label: '黄埔区-4', checked: false},
+							{id: '3-3-5', label: '黄埔区-5', checked: false},
+							{id: '3-3-6', label: '黄埔区-6', checked: false},
+							{id: '3-3-7', label: '黄埔区-7', checked: false},
+							{id: '3-3-8', label: '黄埔区-8', checked: false},
+							{id: '3-3-9', label: '黄埔区-9', checked: false},
+							{id: '3-3-10', label: '黄埔区-10', checked: false},
+							{id: '3-3-12', label: '黄埔区-11', checked: false},
+							{id: '3-3-13', label: '黄埔区-12', checked: false},
+							{id: '3-3-13', label: '黄埔区-13', checked: false},
+							{id: '3-3-14', label: '黄埔区-14', checked: false},
+							{id: '3-3-15', label: '黄埔区-15', checked: false},
+							{id: '3-3-16', label: '黄埔区-16', checked: false},
+							{id: '3-3-17', label: '黄埔区-17', checked: false},
+							{id: '3-3-18', label: '黄埔区-18', checked: false},
+							{id: '3-3-19', label: '黄埔区-19', checked: false},
+							{id: '3-3-20', label: '黄埔区-20', checked: false},
+							{id: '3-3-21', label: '黄埔区-21', checked: false},
+							{id: '3-3-22', label: '黄埔区-22', checked: false},
+							{id: '3-3-23', label: '黄埔区-23', checked: false},
+							{id: '3-3-24', label: '黄埔区-24', checked: false},
+							{id: '3-3-25', label: '黄埔区-25', checked: false},
+							{id: '3-3-26', label: '黄埔区-26', checked: false},
+							{id: '3-3-27', label: '黄埔区-27', checked: false},
+							{id: '3-3-28', label: '黄埔区-28', checked: false},
+							{id: '3-3-29', label: '黄埔区-29', checked: false},
+							{id: '3-3-30', label: '黄埔区-30', checked: false},
+							{id: '3-3-31', label: '黄埔区-31', checked: false},
+							{id: '3-3-32', label: '黄埔区-32', checked: false},
+							{id: '3-3-33', label: '黄埔区-33', checked: false},
+							{id: '3-3-34', label: '黄埔区-34', checked: false},
+							{id: '3-3-35', label: '黄埔区-35', checked: false},
+							{id: '3-3-36', label: '黄埔区-36', checked: false},					
+						]},
+					],
+				}]
+		}
+	},
+	methods: {
+		openTree: function() {
+			this.$refs.nextTreeAsyncRef.showTree = true
+		},
+		changeVerify: function(current, chooseList) {
+			// 注意:返回非空字符串会阻止原有行为,并提示返回的字符串
+			// 如果函数体不做return返回值,即验证通过,控件正常处理业务
+			console.log('当前变化的数据', current)
+			console.log('已选择的数据', chooseList)
+			if(chooseList && chooseList.length > 4) {
+				
+				return '最多可以选择4个节点'
+			}
+		},
+		checkedFunc: function(id) {
+			if(this.activeId === id) {
+				this.activeId = '';
+				this.$refs.nextTreeRef.checkedFunc(id, false)
+			} else {
+				this.activeId = id;
+				this.$refs.nextTreeRef.checkedFunc(id)	
+			}
+		},
+		function loadData(data) {
+			const type = data.$type;	// 加载类型
+			const source = data.source // 源数据
+			// 同步实现的代码处理方式
+			
+			if (type === 'nodeLoad') {
+				const  nodeItem = source;
+				// 同步实现的代码处理方式 可以返回单个子节点的集合也可以返回子孙节点的集合
+				// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
+				
+				// if(nodeItem && this.localData[nodeItem.id]) {
+				// 	return this.localData[nodeItem.id]
+				// } else {
+				// 	return []
+				// }
+				// 异步的代码实现方式 可以返回单个子节点的集合也可以返回子孙节点的集合
+				// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
+				return new Promise((resolve, reject) => {
+					setTimeout(() => {
+						if(nodeItem && self.localData[nodeItem.id]) {
+							return resolve(self.localData[nodeItem.id])
+						} else {
+							return resolve([])
+						}
+					}, 1000)
+				})	
+			} else if(type === 'remoteSearch') {
+				// ...doing
+			}
+			
+		},
+		
+		getTitle: function(checked) {
+			return `已选:${checked.length}项`
+		},
+		echoDefault: function() {
+			const selectIds = ['2-1','3-3-35']
+			this.checkedTreeData(this.treeData, selectIds)
+			console.log('treeData的数据:', this.treeData)
+			this.funcMode = 'checkbox'
+			this.$refs.nextTreeRef.showTree = true
+		},
+		itemclick: function(_multiple, _selectParent, _checkStrictly = false) {
+			this.funcMode = _multiple ? 'checkbox' : 'radio'
+			this.selectParent = _selectParent
+			this.checkStrictly = _checkStrictly
+			this.$refs.nextTreeRef.showTree = true
+		},
+		checkedTreeData: function(treeData, selectIds) {
+			// 注意 vue2当数据深嵌套时,如果没有在treeData里面初始化checked属性,那在改变数据的时候直接将checked属性赋值为true,这时候ui界面有可能不会更新,
+			// 这时候建议使用this.$set去更新checked属性值,或者在初始化this.treeData的时候初始化checked属性
+			(treeData || []).map(item => {
+				if (selectIds.indexOf(item.id) !== -1) {
+					item.checked = true
+				} else {
+					item.checked = false
+				}
+				if (item.children && item.children.length) {
+					this.checkedTreeData(item.children, selectIds)
+				}
+			})
+		},
+		onconfirm: function(list) {
+			console.log('选中项的数量列表list:', list)
+		},
+		oncancel: function() {
+			// 清除treeData的选中状态
+			this.checkedTreeData(this.treeData, [])
+		}
+	},
+	created() {
+		self = this
+	}
+}
+</script>
+<style lang="scss">
+	.line-block {
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+		align-items: center;
+		.img {
+			width: 40rpx;
+			height: 40rpx;
+			border-radius: 10rpx;
+			margin: 0 20rpx;
+		}
+	}
+</style>
+
+```
+
+### 个性化自定义样式渲染
+
+如果你的需求对样式需求比较高,请使用插槽模式渲染,本组件提供label插槽供你自定义定制;
+
+```js
+<script>
+// 提供参考一组自定义渲染数据demo,treeData如下;
+const treeData = [
+	{id: '1', label: '北京', prev: 'PonderNext-', iconSrc: 'https://img95.699pic.com/xsj/03/fg/hj.jpg%21/fh/300', children: [
+		{id: '1-3-3-1', label: '北京区-1', prev: '前置-'},
+		{id: '1-3-3-2', label: '北京区-2', post: '-后置'},
+		{id: '1-3-3-3', label: '北京区-3', post: '-后置', prev: '前置-'},
+		{id: '1-3-3-4', label: '北京区-4'},
+		{id: '1-3-3-5', label: '北京区-5'},
+		{id: '1-3-3-6', label: '北京区-6'},
+		{id: '1-3-3-7', label: '北京区-7'},
+		{id: '1-3-3-8', label: '北京区-8'},
+		{id: '1-3-3-9', label: '北京区-9'},
+		{id: '1-3-3-10', label: '北京区-10'},
+		{id: '1-3-3-12', label: '北京区-11'},
+		{id: '1-3-3-13', label: '北京区-12'},
+		{id: '1-3-3-13', label: '北京区-13'},
+		{id: '1-3-3-14', label: '北京区-14'},
+		{id: '1-3-3-15', label: '北京区-15'},
+		{id: '1-3-3-16', label: '北京区-16'},
+		{id: '1-3-3-17', label: '北京区-17'},
+		{id: '1-3-3-18', label: '北京区-18'},
+		{id: '1-3-3-19', label: '北京区-19'},
+		{id: '1-3-3-20', label: '北京区-20'},
+		{id: '1-3-3-21', label: '北京区-21'},
+		{id: '1-3-3-22', label: '北京区-22'},
+		{id: '1-3-3-23', label: '北京区-23'},
+		{id: '1-3-3-24', label: '北京区-24'},
+		{id: '1-3-3-25', label: '北京区-25'},
+		{id: '1-3-3-26', label: '北京区-26'},
+		{id: '1-3-3-27', label: '北京区-27'},
+		{id: '1-3-3-28', label: '北京区-28'},
+		{id: '1-3-3-29', label: '北京区-29'},
+		{id: '1-1-3-3-30', label: '北京区-30'},
+		{id: '1-3-3-31', label: '北京区-31'},
+		{id: '1-3-3-32', label: '北京区-32'},
+		{id: '1-3-3-33', label: '北京区-33'},
+		{id: '1-3-3-34', label: '北京区-34'},
+		{id: '1-3-3-35', label: '北京区-35'},
+		{id: '1-3-3-36', label: '北京区-36'},
+		{id: '1-3-3-37', label: '北京区-37'},
+		{id: '1-3-3-38', label: '北京区-38'},
+		{id: '1-3-3-39', label: '北京区-39'},
+		{id: '1-3-3-40', label: '北京区-40'},
+		{id: '1-3-3-41', label: '北京区-41'},
+		{id: '1-3-3-42', label: '北京区-42'},
+		{id: '1-3-3-43', label: '北京区-43'},
+		{id: '1-3-3-44', label: '北京区-44'},
+		{id: '1-3-3-45', label: '北京区-45'},
+		{id: '1-3-3-46', label: '北京区-46'},
+		{id: '1-3-3-47', label: '北京区-47'},
+		{id: '1-3-3-48', label: '北京区-48'},
+		{id: '1-3-3-49', label: '北京区-49'},
+		{id: '1-3-3-50', label: '北京区-50'},
+		{id: '1-3-3-51', label: '北京区-51'},
+		{id: '1-3-3-52', label: '北京区-52'},
+		{id: '1-3-3-53', label: '北京区-53'},
+		{id: '1-3-3-54', label: '北京区-54'},
+	]},
+	{id: '2', label: '上海', prev: 'PonderNext-',  iconSrc: 'https://img95.699pic.com/xsj/0g/hb/tc.jpg%21/fh/300', children: [
+		{id: '2-1', label: '上海-1', iconSrc: 'https://img1.baidu.com/it/u=1997340124,765201109&fm=253&fmt=auto&app=120&f=JPEG?w=285&h=285'},
+		{id: '2-2', label: '上海-2', iconSrc: 'https://img1.baidu.com/it/u=1997340124,765201109&fm=253&fmt=auto&app=120&f=JPEG?w=285&h=285'},
+		{id: '2-3', label: '上海-3', iconSrc: 'https://img1.baidu.com/it/u=1997340124,765201109&fm=253&fmt=auto&app=120&f=JPEG?w=285&h=285'},
+	] },
+	{id: '3', label: '广州', prev: 'PonderNext-', iconSrc: 'https://storage-public.zhaopin.cn/user/avatar/1589350028141684980/d00a1afa-e3ec-40a5-a68e-aef1f684b189.jpg', children: [
+			{id: '3-1', label: '海珠区', iconSrc: 'https://img95.699pic.com/xsj/0u/f3/5h.jpg%21/fh/300', children: [
+				{id: '3-1-1', label: '海珠区-1', disabled: true},
+				{id: '3-1-2', label: '海珠区-2', post: '-后置', prev: '前置-'},
+				{id: '3-1-4', label: '海珠区-3', post: '-后置',},
+				{id: '3-1-5', label: '海珠区-4', children: [
+						{ id: '3-1-5-1', label: '海珠区-4-200号'},
+						{ id: '3-1-5-2', label: '海珠区-4-201号', children: [
+							{ id: '3-1-5-1-1', label: '海珠区-4-200号-2'},
+							{ id: '3-1-5-2-1', label: '海珠区-4-201号-3'},
+						]},
+				]},
+				{id: '3-1-6', label: '海珠区-5'},
+				{id: '3-1-7', label: '海珠区-6'},
+				{id: '3-1-8', label: '海珠区-7', post: '-后置',},
+				{id: '3-1-9', label: '海珠区-8'},
+				{id: '3-1-10', label: '海珠区-9'},
+				{id: '3-1-11', label: '海珠区-10'},
+				{id: '3-1-1', label: '海珠区-11', disabled: true},
+				{id: '3-1-2', label: '海珠区-12'},
+				{id: '3-1-4', label: '海珠区-13'},
+				{id: '3-1-5', label: '海珠区-14'},
+				{id: '3-1-6', label: '海珠区-15'},
+				{id: '3-1-7', label: '海珠区-16'},
+				{id: '3-1-8', label: '海珠区-17'},
+				{id: '3-1-9', label: '海珠区-18'},
+				{id: '3-1-10', label: '海珠区-19', prev: '前置-'},
+				{id: '3-1-11', label: '海珠区-20'},
+				{id: '3-1-1', label: '海珠区-21', disabled: true},
+				{id: '3-1-2', label: '海珠区-22'},
+				{id: '3-1-4', label: '海珠区-23'},
+				{id: '3-1-5', label: '海珠区-24'},
+				{id: '3-1-6', label: '海珠区-25'},
+				{id: '3-1-7', label: '海珠区-26'},
+				{id: '3-1-8', label: '海珠区-27'},
+				{id: '3-1-9', label: '海珠区-28'},
+				{id: '3-1-10', label: '海珠区-29'},
+				{id: '3-1-11', label: '海珠区-30'},
+				{id: '3-1-1', label: '海珠区-31', disabled: true},
+				{id: '3-1-2', label: '海珠区-32'},
+				{id: '3-1-4', label: '海珠区-33'},
+				{id: '3-1-5', label: '海珠区-34'},
+				{id: '3-1-6', label: '海珠区-35'},
+				{id: '3-1-7', label: '海珠区-36'},
+				{id: '3-1-8', label: '海珠区-37'},
+				{id: '3-1-9', label: '海珠区-38'},
+				{id: '3-1-10', label: '海珠区-39'},
+				{id: '3-1-11', label: '海珠区-40'},
+				{id: '3-1-1', label: '海珠区-41', disabled: true},
+				{id: '3-1-2', label: '海珠区-42'},
+				{id: '3-1-4', label: '海珠区-43'},
+				{id: '3-1-5', label: '海珠区-44'},
+				{id: '3-1-6', label: '海珠区-45'},
+				{id: '3-1-7', label: '海珠区-46'},
+				{id: '3-1-8', label: '海珠区-47'},
+				{id: '3-1-9', label: '海珠区-48'},
+				{id: '3-1-10', label: '海珠区-49'},
+				{id: '3-1-11', label: '海珠区-50'},
+				{id: '3-1-11', label: '海珠区-51'},
+			]},
+			{id: '3-2', label: '番禺区', iconSrc: 'https://img1.baidu.com/it/u=931648192,3196263841&fm=253&fmt=auto&app=120&f=JPEG?w=285&h=285', disabled: true, checked: true, children: [
+				{id: '3-2-1', label: '番禺区-1'},
+				{id: '3-2-2', label: '番禺区-2'},
+				{id: '3-2-4', label: '番禺区-3'},
+				{id: '3-2-5', label: '番禺区-4'},
+				{id: '3-2-6', label: '番禺区-5'},
+				{id: '3-2-7', label: '番禺区-6'},
+				{id: '3-2-8', label: '番禺区-7'},
+				{id: '3-2-9', label: '番禺区-8'},
+				{id: '3-2-10', label: '番禺区-9'},
+				{id: '3-2-11', label: '番禺区-10'},
+			]},
+			{id: '3-3', label: '黄埔区', iconSrc: 'https://img.jiaoyubao.cn/43423/20210423113959473-20210423114005024.jpeg', children: [
+				{id: '3-3-1', label: '黄埔区-1'},
+				{id: '3-3-2', label: '黄埔区-2'},
+				{id: '3-3-3', label: '黄埔区-3'},
+				{id: '3-3-4', label: '黄埔区-4'},
+				{id: '3-3-5', label: '黄埔区-5'},
+				{id: '3-3-6', label: '黄埔区-6'},
+				{id: '3-3-7', label: '黄埔区-7'},
+				{id: '3-3-8', label: '黄埔区-8'},
+				{id: '3-3-9', label: '黄埔区-9'},
+				{id: '3-3-10', label: '黄埔区-10'},
+				{id: '3-3-12', label: '黄埔区-11'},
+				{id: '3-3-13', label: '黄埔区-12'},
+				{id: '3-3-13', label: '黄埔区-13'},
+				{id: '3-3-14', label: '黄埔区-14'},
+				{id: '3-3-15', label: '黄埔区-15'},
+				{id: '3-3-16', label: '黄埔区-16'},
+				{id: '3-3-17', label: '黄埔区-17'},
+				{id: '3-3-18', label: '黄埔区-18'},
+				{id: '3-3-19', label: '黄埔区-19'},
+				{id: '3-3-20', label: '黄埔区-20'},
+				{id: '3-3-21', label: '黄埔区-21'},
+				{id: '3-3-22', label: '黄埔区-22'},
+				{id: '3-3-23', label: '黄埔区-23'},
+				{id: '3-3-24', label: '黄埔区-24'},
+				{id: '3-3-25', label: '黄埔区-25'},
+				{id: '3-3-26', label: '黄埔区-26'},
+				{id: '3-3-27', label: '黄埔区-27'},
+				{id: '3-3-28', label: '黄埔区-28'},
+				{id: '3-3-29', label: '黄埔区-29'},
+				{id: '3-3-30', label: '黄埔区-30'},
+				{id: '3-3-31', label: '黄埔区-31'},
+				{id: '3-3-32', label: '黄埔区-32'},
+				{id: '3-3-33', label: '黄埔区-33'},
+				{id: '3-3-34', label: '黄埔区-34'},
+				{id: '3-3-35', label: '黄埔区-35'},
+				{id: '3-3-36', label: '黄埔区-36'},
+				{id: '3-3-37', label: '黄埔区-37'},
+				{id: '3-3-38', label: '黄埔区-38'},
+				{id: '3-3-39', label: '黄埔区-39'},
+				{id: '3-3-40', label: '黄埔区-40'},
+				{id: '3-3-41', label: '黄埔区-41'},
+				{id: '3-3-42', label: '黄埔区-42'},
+				{id: '3-3-43', label: '黄埔区-43'},
+				{id: '3-3-44', label: '黄埔区-44'},
+				{id: '3-3-45', label: '黄埔区-45'},
+				{id: '3-3-46', label: '黄埔区-46'},
+				{id: '3-3-47', label: '黄埔区-47'},
+				{id: '3-3-48', label: '黄埔区-48'},
+				{id: '3-3-49', label: '黄埔区-49'},
+				{id: '3-3-50', label: '黄埔区-50'},
+				{id: '3-3-51', label: '黄埔区-51'},
+				{id: '3-3-52', label: '黄埔区-52'},
+				{id: '3-3-53', label: '黄埔区-53'},
+				{id: '3-3-54', label: '黄埔区-54'},		
+			]},
+		],
+	}]
+</script>
+```
+
+### 预览
+### 
+***
+
+|                 						功能预览               				   			   |   	                       父子级关联演示               				   			|   	      全面支持大数据量,子孙节点ui按需渲染(按需渲染数据)    	   			  |
+| :------------------------------------------------------------------: | :------------------------------------------------------------------:  |  :------------------------------------------------------------------: |
+| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree.gif)   | ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-b.gif)  |  ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-d.gif) |
+
+
+
+|          增强控件交互能力,增加筛选search模式,全面支持大数据量交互    	   |          超强的样式定制能力,满足你高精美组件的需求                   	    |          打开精美的辅助线模式,让你的控件更加友好                   	      |
+| :------------------------------------------------------------------: |  :------------------------------------------------------------------: | :------------------------------------------------------------------:  |
+| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-e.gif) |  ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-f.gif) |  ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-u.gif) |
+
+
+|          增加搜索模式searchModel=depHighlight模式,从属高亮显示模式    	 |          支持异步加载子节点,子树集,ajax远程加载数据等    	              |          支持不同主题的切换,ui定制更简单    	                            |
+| :------------------------------------------------------------------: |  :------------------------------------------------------------------: | :------------------------------------------------------------------:  |
+| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-p.gif) | ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-k.gif)  | ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-n.gif)  |
+
+|          增加验证函数和topBar插槽使得更加容易和组件进行交互    	         |          增加页面模式,支持整页ui展示模式    	                          |  增加展开模式expandedMode配置,支持单链路展开,理论上支持几万数据量  	     |
+| :------------------------------------------------------------------: | :------------------------------------------------------------------: | :------------------------------------------------------------------:   |
+| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-cc.gif)| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-uu.gif)| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-aab.gif) |
+
+
+
+### 超集功能预览(增值功能)
+### 
+|          实现tree的功能模式扩展,让你的tree组件实现可编辑态     	         |
+| :--------------------------------------------------------------------: |
+| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-eeee.gif)|
+
+## 参数
+可选参数属性列表
+
+|参数名				|说明																																																						                                                       |类型		            |是否必填	|默认值		|可选值	                      |
+|----				|----																																																							                                                       |----		          |----			|----			|-----------------------      |
+|uiMode			  |ui表现方式;popup<弹窗>, page<页面>;默认是	popup																																					                                             |String	          |是				|popup		|page			                    |
+|funcMode			 |功能模式配置;display<展示模式>, edit<编辑模式>,checkbox<多选模式>, radio<单选模式>;默认是	radio																																			 |String	          |是				|radio		|dispaly,edit,checkbox		    |
+|treeData			|树源数据列表																																																		                                                       |Array	            |是				|[]				|-			                      |
+|valueKey			|绑定value的键属性(项的唯一key标识)																																							                                                         |String	          |否				|id				|-			                      |
+|labelKey			|用于显示的字段																																																	                					                               |String	          |否				|label		|-			                      |
+|disabledKey	|禁用节点绑定属性																																																                                                         |String	          |否				|disabled	|-  		                      |
+|childrenKey	|子节点绑定属性	(注意:当item[childrenKey]的值设为null时,代表是无下级数据的父节点,即非叶子节点)											                                                         |String	          |否				|children	|-			                      |
+|title			|	弹出标题(如果是函数时会返回所选项的值作为回调参数如;title: (checked):String => {})																													                               |String, Function	|否				|''				|-			                      |
+|selectParent			|作用于funcMode=display模式下;是否可以选父级																																													                               |Boolean           |否				|false		|true		                      |
+|foldAll|	折叠时关闭所有已经打开的子集,再次打开时需要一级一级打开																																                                                         |Boolean           |否				|false		|true		                      |
+|themeColor				|主题颜色																																															                                                             |String	          |否				|#f9ae3d	|-			                      |
+|cancelColor				|取消按钮颜色																																															                                                       |String	          |否				|#757575	|-			                      |
+|titleColor				|标题颜色																																																		                                                       |String	          |否				|#757575	|-			                      |
+|border				|是否有分割线																																																		                                                       |Boolean           |否				|false		|true		                      |
+|checkStrictly|作用于funcMode=checkbox模式下; 状态下节点选择完全受控(父子节点选中状态不再关联)																                             |Boolean           |否				|false		|true		                      |
+|checkStrictlyModel|作用于funcMode=checkbox模式下;父子节点关联模式:strong:强关联(不再受限节点的disabled控制),weak:弱关联(节点关联受disabled控制)	       |String            |是				  |weak   |strong	                      |
+|showHalfCheckedTips|作用于funcMode=checkbox模式下; checkStrictly为false的状态下生效;父子节点选中状态不再关联,是否展示半选提示;                             |Boolean           |否				|false		|true		                      |
+|ifSearch| 筛选search模式																																																	                                                           |Boolean           |否				|true		  |false		                    |
+|searchModel| 搜索模式配置		depHighlight: 从属高亮(显示层级并高亮显示);common: 一般																													                                         |String            |否				|common	  |depHighlight		              |
+|showAuxiliaryLine| 是否打开辅助线																																														                                                         |Boolean           |否				|false		|true		                      |
+|loadData| 异步加载函数  (node):Promise([childData]) => {} // demo有说明																																								                               |Function          |否				|-		    |-		                        |
+|height| 只在uiMode=popup时生效;弹层容器的高度,默认是500																																										                                           |Number            |否				|500		  |-		                        |
+|changeVerify|作用于funcMode=display模式下; 验证函数  (current as any, chooseList as any []):String => {} // 验证函数会把当前控件的选择值作为参数返给函数体,demo有说明									   |Function          |否				|-		    |-		                        |
+|expandedKeys| (Controlled) Specifies the keys of the expanded treeNodes 展开配置项,格式为[valueKey]									   																	                             |Array          |否					|[]		    |-		                        |
+|expandedMode| 展开模式配置: common:  一般模式;singe: 单一模式;									   																	                                                                 |String          |否				|common		    |singe	                    |
+
+
+# Event 事件
+|事件名	|说明						|类型	|回调参数	|
+|----	|----						|----	|----		|
+|confirm|菜单收起时返回的筛选结果	|emit	|array		|
+|clear|点击清除按钮时触发	|emit	|-		|
+|cancel|关闭弹层和点击取消时触发	|emit	|-		|
+|change|选项改变时触发	|emit	|array		|
+
+## Slot 插槽
+
+|名称		        |说明									|参数																          |
+|----		        |----									|----																          |
+|label	        |label插槽  						|data(当前项对于treeData里面的数据)		          |
+|topBar	        |topBar插槽  					|----滚动区域顶部topBar插槽                     |
+|bottomBar	    |bottomBar插槽  				|----滚动区域底部bottomBar插槽                  |
+|fixedBottomBar	|fixedBottomBar插槽  	|----固定在页面的底部,使用fixed进行定位          |
+|empty	        |empty插槽  	          |----数据为空的插槽                             |
+

+ 23 - 23
src/uni_modules/uv-ui-tools/libs/css/vue.scss

@@ -1,10 +1,10 @@
 // 历遍生成4个方向的底部安全区
 @each $d in top, right, bottom, left {
-	.uv-safe-area-inset-#{$d} {
-		padding-#{$d}: 0;
-		padding-#{$d}: constant(safe-area-inset-#{$d});  
-		padding-#{$d}: env(safe-area-inset-#{$d});  
-	}
+    .uv-safe-area-inset-#{$d} {
+        padding-#{$d}: 0;
+        padding-#{$d}: constant(safe-area-inset-#{$d});
+        padding-#{$d}: env(safe-area-inset-#{$d});
+    }
 }
 
 //提升H5端uni.toast()的层级,避免被uvui的modal等遮盖
@@ -13,28 +13,28 @@ uni-toast {
     z-index: 10090;
 }
 uni-toast .uni-toast {
-   z-index: 10090;
+    z-index: 10090;
 }
 /* #endif */
 
 // 隐藏scroll-view的滚动条
 ::-webkit-scrollbar {
-    display: none;  
-    width: 0 !important;  
-    height: 0 !important;  
-    -webkit-appearance: none;  
-    background: transparent;  
+    display: none;
+    width: 0 !important;
+    height: 0 !important;
+    -webkit-appearance: none;
+    background: transparent;
 }
 
-$uvui-nvue-style: true !default;
-@if $uvui-nvue-style == false {
-	view, scroll-view, swiper-item {
-		display: flex;
-		flex-direction: column;
-		flex-shrink: 0;
-		flex-grow: 0;
-		flex-basis: auto;
-		align-items: stretch;
-		align-content: flex-start;
-	}
-}
+// $uvui-nvue-style: true !default;
+// @if $uvui-nvue-style == false {
+// 	view, scroll-view, swiper-item {
+// 		display: flex;
+// 		flex-direction: column;
+// 		flex-shrink: 0;
+// 		flex-grow: 0;
+// 		flex-basis: auto;
+// 		align-items: stretch;
+// 		align-content: flex-start;
+// 	}
+// }

Някои файлове не бяха показани, защото твърде много файлове са промени