wenhongquan 3 年之前
父節點
當前提交
f2d6e963ee

+ 3 - 1
package.json

@@ -10,6 +10,8 @@
     },
     "dependencies": {
         "@element-plus/icons": "^0.0.11",
+        "@wangeditor/editor": "^5.0.0",
+        "@wangeditor/editor-for-vue": "^5.1.10",
         "axios": "^0.24.0",
         "clsx": "^1.1.1",
         "core-js": "^3.6.5",
@@ -55,4 +57,4 @@
         "last 2 versions",
         "not dead"
     ]
-}
+}

二進制
src/assets/icons/incident/article@2x.png


二進制
src/assets/icons/incident/delete@2x.png


+ 2 - 0
src/assets/icons/incident/location.svg

@@ -0,0 +1,2 @@
+<svg t="1650013281404" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2563" width="64" height="64" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M960 480h-65.6C879.2 293.6 730.4 144.8 544 129.6V64h-64v65.6C293.6 144.8 144.8 293.6 129.6 480H64v64h65.6c15.2 186.4 164 335.2 350.4 350.4v65.6h64v-65.6c186.4-15.2 335.2-164 350.4-350.4h65.6v-64z m-448 352c-176.8 0-320-143.2-320-320s143.2-320 320-320 320 143.2 320 320-143.2 320-320 320z m128-320c0 70.4-57.6 128-128 128s-128-57.6-128-128 57.6-128 128-128 128 57.6 128 128z" p-id="2564" fill="#13227a"></path></svg>

二進制
src/assets/icons/incident/location1.png


二進制
src/assets/icons/incident/materials@2x.png


二進制
src/assets/icons/incident/storehouse@2x.png


+ 28 - 0
src/router/index.ts

@@ -42,6 +42,34 @@ const routes: RouteRecordRaw[] = [
         path: '/warehouse/detail',
         component: () => import('@/views/Warehouse/index.vue'),
       },
+      {
+        path: '/warehouse/edit',
+        component: () => import('@/views/WarehouseEdit/index.vue'),
+      },
+      {
+        path: '/warehouse/list',
+        component: () => import('@/views/WarehouseList/index.vue'),
+      },
+      {
+        path: '/warehouse/all',
+        component: () => import('@/views/WarehouseListRead/index.vue'),
+      },
+      {
+        path: '/warehouse/search',
+        component: () => import('@/views/WarehouseSearch/index.vue'),
+      },
+      {
+        path: '/chemical/search',
+        component: () => import('@/views/WHPSearch/index.vue'),
+      },
+      {
+        path: '/chemical/list',
+        component: () => import('@/views/WHPList/index.vue'),
+      },
+      {
+        path: '/chemical/detail',
+        component: () => import('@/views/WHPDetail/index.vue'),
+      },
     ],
   },
   {

+ 16 - 0
src/service/warehouse.ts

@@ -10,6 +10,22 @@ export const api_getresource = (parmares:object) => {
    });
 }
 
+export const api_getchemicalList = (name: String) => {
+  return request<Object>('GET', {
+    url: `zhdd/chemicalData/list`,
+    params: { name: name },
+  });
+};
+
+export const api_getckList = (name: String) => {
+  return request<Object>('GET', {
+    url: `zhdd/resource/goodsList`,
+    params: { goodsName: name },
+  });
+};
+
+
+
 
 export const api_getresourcedetail = (id: number) => {
   return request<Object>('GET', {

+ 27 - 9
src/views/IncidentManagementReport/index.scss

@@ -2,13 +2,31 @@
     position: relative;
     margin-top: 46px;
     .title {
-      background: #ffffff;
-      line-height: 22px;
-      font-size: 16px;
-      font-weight: 500;
-      color: #333333;
-      padding: 12px 15px;
-      margin-bottom: 10px;
+        background: #ffffff;
+        line-height: 22px;
+        font-size: 16px;
+        font-weight: 500;
+        color: #333333;
+        padding: 12px 15px;
+        margin-bottom: 10px;
     }
-  }
-  
+    .mark {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        transform: translate(-50%, -50%);
+        img {
+            width: 24px;
+            height: 24px;
+        }
+    }
+    .marklocation {
+        img {
+            width: 24px;
+            height: 24px;
+        }
+        position: absolute;
+        bottom: 10%;
+        right: 20px;
+    }
+}

+ 358 - 141
src/views/IncidentManagementReport/index.tsx

@@ -9,9 +9,10 @@ import {
 import { useRoute, useRouter } from 'vue-router';
 import { upload, UploadData } from '@/api/common';
 import cloneDeep from 'lodash/cloneDeep';
-import div from '@/components/div';
+
 import { useCommonStore, useIncidentStore } from '@/store';
 import QueryMap from '@/components/QueryMap';
+import Map from '@/components/MapView';
 import { BaseMediaUrl } from '@/utils/index';
 import { api_getusergps } from '@/service/login';
 // import MediaUpload from '@/components/MediaUpload';
@@ -20,6 +21,10 @@ import { api_getusergps } from '@/service/login';
 import icon_map_location from '@/assets/icons/home/icon_map_location@2x.png';
 /** @ts-ignore */
 import icon_location from '@/assets/icons/incident/location.png';
+
+/** @ts-ignore */
+import icon_location_svg1 from '@/assets/icons/incident/location1.png';
+
 import './index.scss';
 import {
   DropdownItemOption,
@@ -42,7 +47,7 @@ import {
   Notify,
   Uploader,
   UploaderFileListItem,
-  Toast,
+  Toast
 } from 'vant';
 import { isArray } from 'lodash';
 
@@ -69,41 +74,53 @@ export default defineComponent({
     const videosrclist = reactive([]);
     const imagessrclist = reactive([]);
     const videop = ref();
-    const videopsrc = ref("");
-
-  
-
+    const videopsrc = ref('');
+
+    const isshowmove = ref(false);
+    const state = reactive({
+      map: null,
+      _marker: null,
+      loading: false,
+      postition: {
+        longitude: '',
+        latitude: '',
+        name: '',
+      },
+    });
+    let allmark:Array<any> = [];
 
     const handleUpload = (file) => {
-         Toast.loading({
-           message: '上传中...',
-           duration: 0,
-           forbidClick: true,
-         });
-      upload(file).then((res) => {
-        Toast.clear();
-        let type = /\w+([.jpg|.png|.gif|.swf|.bmp|.jpeg]){1}$/.test(
-          res.data.fileName?.substr( res.data.fileName?.lastIndexOf('.') + 1 ) ?? '',
-        );
-        if (!type) {
-          videosrclist.push(res.data);
-        } else {
-          imagessrclist.push(res.data);;
-        }
-
-      }).catch((error) => {
-        Toast.clear();
-
+      Toast.loading({
+        message: '上传中...',
+        duration: 0,
+        forbidClick: true,
       });
+      upload(file)
+        .then((res) => {
+          Toast.clear();
+          let type = /\w+([.jpg|.png|.gif|.swf|.bmp|.jpeg]){1}$/.test(
+            res.data.fileName?.substr(
+              res.data.fileName?.lastIndexOf('.') + 1,
+            ) ?? '',
+          );
+          if (!type) {
+            videosrclist.push(res.data);
+          } else {
+            imagessrclist.push(res.data);
+          }
+        })
+        .catch((error) => {
+          Toast.clear();
+        });
     };
 
     const handleSaveReport = async () => {
       const { id } = route.query;
 
-       const saveFn = id ? store.putIncidentItem : store.postIncidentItem;
+      const saveFn = id ? store.putIncidentItem : store.postIncidentItem;
       // console.log(formRef);
 
-       const result = await saveFn({
+      const result = await saveFn({
         ...form.value,
         // level: Number(form.value.level) ?? null,
         // type: Number(form.value.type) ?? null,
@@ -113,120 +130,281 @@ export default defineComponent({
         // status: route.params.status as unknown as number,
       });
       if (result) {
-        router.push("/")
+        router.push('/');
       }
+    };
 
+    // const getLocation = () => {
+    //   api_getusergps().then((res) => {
+    //     var lat = null;
+    //     var lon = null;
+    //     var iserror = false;
+    //     try {
+    //       lat = res.result[0].lat;
+    //       lon = res.result[0].lon;
+    //       if (lat == null || lat == undefined) iserror = true;
+    //     } catch (e) {
+    //       iserror = true;
+    //     }
+    //     if (!iserror) {
+    //       var location = `${lon},${lat}`;
+    //       fetch(
+    //         `https://minedata.cn/service/lbs/reverse/v1/regeo?location=${location}&key=${window.key}`,
+    //         {
+    //           method: 'GET',
+    //           headers: new Headers({
+    //             'Content-Type': 'application/json',
+    //           }),
+    //         },
+    //       )
+    //         .then((res) => res.json())
+    //         .then((data) => {
+    //           //  console.log(data)
+    //           //  console.log(data.regeocodes[0].formatted_address);
+    //           var ll = data.regeocodes[0].formatted_address;
+    //           if (!window.map) {
+    //             Notify({
+    //               type: 'danger',
+    //               message: '地图插件初始化异常, 请刷新页面 (Ctrl + R)',
+    //             });
+
+    //             return;
+    //           }
+    //           window.map.flyTo({
+    //             center: [
+    //               Number(location.split(',')[0]),
+    //               Number(location.split(',')[1]),
+    //             ],
+    //             zoom: 14,
+    //             bearing: 0,
+    //             pitch: 0,
+    //             duration: 2000,
+    //           });
+    //           if (window.map && window._marker) {
+    //             window._marker.remove();
+    //             window._marker = null;
+    //           }
+    //           if (window.map) {
+    //             var el = document.createElement('div');
+    //             el.id = 'marker';
+    //             el.style.backgroundImage = `url(${icon_map_location})`;
+    //             el.style.backgroundSize = 'cover';
+    //             el.style.width = '24px';
+    //             el.style.height = '24px';
+    //             el.style.borderRadius = '50%';
+
+    //             const popup = new window.minemap.Popup({
+    //               closeOnClick: false,
+    //               closeButton: false,
+    //               offset: [0, -15],
+    //             }).setText(ll);
+
+    //             window._marker = new window.minemap.Marker(el, {
+    //               offset: [-12, -12],
+    //             })
+    //               .setLngLat([
+    //                 Number(location.split(',')[0]),
+    //                 Number(location.split(',')[1]),
+    //               ])
+    //               .setPopup(popup)
+    //               .addTo(window.map);
+    //           }
+    //           window._marker.togglePopup();
+    //           //  var ll =
+    //           //    data.regeocodes[0].formatted_address.replaceAll(
+    //           //      '江苏省宿迁市',
+    //           //    "");
+
+    //           form.value.locations = location;
+    //           form.value.addr = ll;
+    //         });
+    //       // minemap.service
+    //       //   .adminByPointData({
+    //       //     location: `${position.coords.longitude},${position.coords.latitude}`,
+    //       //   })
+    //       //   .then(function (response) {
+    //       //     console.log(response.data);
+    //       //   })
+    //       //   .catch(function (error) {
+    //       //     console.error(error);
+    //       //   });
+
+    //       //  (ee) => {
+    //       //    console.log(ee);
+    //       //  },
+    //     } else {
+    //       Notify({
+    //         type: 'danger',
+    //         message: 'App不支持地理定位。',
+    //       });
+    //     }
+    //   });
+    // };
+
+    const selectpoint = () => {
+      if (isshowmove.value) {
+        var center = state.map.getCenter();
+        getlocalname(center.lng.toFixed(6) + ',' + center.lat.toFixed(6));
+      } else {
+        isshowmove.value = true;
+        state._marker.remove();
+      }
     };
+    const setpoint = (longitude, latitude, name) => {
+      if (state._marker) {
+        state._marker.remove();
+      }
 
+      var el = document.createElement('div');
+      el.id = 'marker';
+      el.style.backgroundImage = `url(${icon_map_location})`;
+      el.style.backgroundSize = 'cover';
+      el.style.width = '24px';
+      el.style.height = '24px';
+      el.style.borderRadius = '50%';
+
+      const popup = new window.minemap.Popup({
+        closeOnClick: false,
+        closeButton: false,
+        offset: [0, -15],
+      }).setText(name);
+
+      state._marker = new window.minemap.Marker(el, {
+        offset: [-12, -12],
+      })
+        .setLngLat([longitude, latitude])
+        .setPopup(popup)
+        .addTo(state.map);
+      state.map.flyTo({
+        center: [longitude, latitude],
+        zoom: 14,
+        bearing: 0,
+        pitch: 0,
+        duration: 2000,
+      });
+      state._marker.togglePopup();
+      form.value.addr = name;
+      form.value.locations = latitude + ',' + longitude;
+      // whdata.value.longitude = longitude;
+      isshowmove.value = false;
+    };
+    const searchaddr = () => {
+      isshowmove.value = false;
+      fetch(
+        `https://minedata.cn/service/lbs/search/v1/keywords?keywords=${form.value.addr}&city=宿迁&citylimit=true&page_idx=1&page_size=10&key=${window.key}`,
+      )
+        .then((res) => res.json())
+        .then((data) => {
+          // console.log(data.pois)
+          var clearallmark = () => {
+            state._marker.remove();
+            if (allmark.length > 0) {
+              allmark.map((item) => {
+                item.remove();
+              });
+              allmark = [];
+            }
+          };
+          clearallmark();
+          var top = [];
+          var bottom = [];
+          data.pois.map((item) => {
+            if (top.length < 1) {
+              top = [
+                Number(item.location.split(',')[0]),
+                Number(item.location.split(',')[1]),
+              ];
+              bottom = [
+                Number(item.location.split(',')[0]),
+                Number(item.location.split(',')[1]),
+              ];
+            }
+            var el = document.createElement('div');
+            el.id = 'marker';
+            el.style.backgroundImage = `url(${icon_map_location})`;
+            el.style.backgroundSize = 'cover';
+            el.style.width = '24px';
+            el.style.height = '24px';
+            el.style.borderRadius = '50%';
+            el.onclick = () => {
+              clearallmark();
+              setpoint(
+                Number(item.location.split(',')[0]),
+                Number(item.location.split(',')[1]),
+                item.name,
+              );
+            };
+
+            const popup = new window.minemap.Popup({
+              closeOnClick: false,
+              closeButton: false,
+              offset: [0, -15],
+            }).setText(item.name);
+
+            var mark = new window.minemap.Marker(el, {
+              offset: [-12, -12],
+            })
+              .setLngLat([
+                Number(item.location.split(',')[0]),
+                Number(item.location.split(',')[1]),
+              ])
+              .setPopup(popup)
+              .addTo(state.map);
+            allmark.push(mark);
+            mark.togglePopup();
+            if (top[0] < Number(item.location.split(',')[0])) {
+              top[0] = Number(item.location.split(',')[0]);
+            }
+            if (top[1] > Number(item.location.split(',')[1])) {
+              top[1] = Number(item.location.split(',')[1]);
+            }
+            if (bottom[0] > Number(item.location.split(',')[0])) {
+              bottom[0] = Number(item.location.split(',')[0]);
+            }
+            if (bottom[1] < Number(item.location.split(',')[1])) {
+              bottom[1] = Number(item.location.split(',')[1]);
+            }
+          });
+          state.map.fitBounds([top, bottom]);
+        });
+    };
+    const getlocalname = (location) => {
+      fetch(
+        `https://minedata.cn/service/lbs/reverse/v1/regeo?location=${location}&key=${window.key}`,
+      )
+        .then((res) => res.json())
+        .then((data) => {
+          setpoint(
+            Number(location.split(',')[0]),
+            Number(location.split(',')[1]),
+            data.regeocodes[0].formatted_address,
+          );
+        });
+    };
     const getLocation = () => {
-
-      api_getusergps().then((res) => { 
+      api_getusergps().then((res) => {
         var lat = null;
         var lon = null;
         var iserror = false;
         try {
-            lat = res.result[0].lat;
+          lat = res.result[0].lat;
           lon = res.result[0].lon;
           if (lat == null || lat == undefined) iserror = true;
-        } catch (e) { 
+        } catch (e) {
           iserror = true;
         }
-         if (!iserror) {      
-               var location = `${lon},${lat}`;
-               fetch(
-                 `https://minedata.cn/service/lbs/reverse/v1/regeo?location=${location}&key=${window.key}`,
-                 {
-                   method: 'GET',
-                   headers: new Headers({
-                     'Content-Type': 'application/json',
-                   }),
-                 },
-               )
-                 .then((res) => res.json())
-                 .then((data) => {
-                   //  console.log(data)
-                   //  console.log(data.regeocodes[0].formatted_address);
-                   var ll = data.regeocodes[0].formatted_address;
-                   if (!window.map) {
-                     Notify({
-                       type: 'danger',
-                       message: '地图插件初始化异常, 请刷新页面 (Ctrl + R)',
-                     });
-
-                     return;
-                   }
-                   window.map.flyTo({
-                     center: [
-                       Number(location.split(',')[0]),
-                       Number(location.split(',')[1]),
-                     ],
-                     zoom: 14,
-                     bearing: 0,
-                     pitch: 0,
-                     duration: 2000,
-                   });
-                   if (window.map && window._marker) {
-                     window._marker.remove();
-                     window._marker = null;
-                   }
-                   if (window.map) {
-                     var el = document.createElement('div');
-                     el.id = 'marker';
-                     el.style.backgroundImage = `url(${icon_map_location})`;
-                     el.style.backgroundSize = 'cover';
-                     el.style.width = '24px';
-                     el.style.height = '24px';
-                     el.style.borderRadius = '50%';
-
-                     const popup = new window.minemap.Popup({
-                       closeOnClick: false,
-                       closeButton: false,
-                       offset: [0, -15],
-                     }).setText(ll);
-
-                     window._marker = new window.minemap.Marker(el, {
-                       offset: [-12, -12],
-                     })
-                       .setLngLat([
-                         Number(location.split(',')[0]),
-                         Number(location.split(',')[1]),
-                       ])
-                       .setPopup(popup)
-                       .addTo(window.map);
-                   }
-                   window._marker.togglePopup();
-                   //  var ll =
-                   //    data.regeocodes[0].formatted_address.replaceAll(
-                   //      '江苏省宿迁市',
-                   //    "");
-
-                   form.value.locations = location;
-                   form.value.addr = ll;
-                 });
-               // minemap.service
-               //   .adminByPointData({
-               //     location: `${position.coords.longitude},${position.coords.latitude}`,
-               //   })
-               //   .then(function (response) {
-               //     console.log(response.data);
-               //   })
-               //   .catch(function (error) {
-               //     console.error(error);
-               //   });
-             
-            //  (ee) => {
-            //    console.log(ee);
-            //  },
-           
-         } else {
-           Notify({
-             type: 'danger',
-             message: 'App不支持地理定位。',
-           });
-         }
-      })
-
-     
+        if (!iserror) {
+          //  debugger
+          var location = `${lon},${lat}`;
+          getlocalname(location);
+          //  setpoint(lon,lat,data.regeocodes[0].formatted_address)
+        } else {
+          Notify({
+            type: 'danger',
+            message: 'App不支持地理定位。',
+          });
+        }
+      });
     };
 
     onMounted(async () => {
@@ -236,9 +414,7 @@ export default defineComponent({
 
       try {
         getLocation();
-
-      } catch (E) { }
-      
+      } catch (E) {}
 
       route.query.id && (await store.getIncidentItem(route.query.id as string));
       addr.value = detail?.value?.addr ?? '';
@@ -269,9 +445,8 @@ export default defineComponent({
             //    data: 'test',
             //  });
             try {
-               uni.navigateBack();
-            } catch (E) { }
-            
+              uni.navigateBack();
+            } catch (E) {}
           }}
         />
         <Popup
@@ -403,25 +578,41 @@ export default defineComponent({
               type="textarea"
               placeholder="请输入"
             />
-            <div style={"position:relative"}>
+            <div style={'position:relative'}>
               <Field
                 v-model={form.value.addr}
                 name="事件地点"
                 label="事件地点"
                 placeholder="请输入"
                 required
-                style={'width:85%'}
+                // style={'width:85%'}
                 onChange={(add: string) => {
                   addr.value = add.target.value;
                 }}
                 rules={[{ required: true, message: '事件地点必填' }]}
-              />
-              <Button style={'border:none;position:absolute;right:10px;top:0'} onClick={() => { getLocation();}}>
+                v-slots={{
+                  button: () => {
+                    return (
+                      <van-button
+                        size="small"
+                        type="primary"
+                        color="#f2f4fa"
+                        onClick={searchaddr}>
+                        <van-icon color="black" name="search" />
+                      </van-button>
+                    );
+                  },
+                }}></Field>
+              {/* <Button
+                style={'border:none;position:absolute;right:10px;top:0'}
+                onClick={() => {
+                  getLocation();
+                }}>
                 <img style={'width:20px;height:20px'} src={icon_location} />
-              </Button>
+              </Button> */}
             </div>
 
-            <QueryMap
+            {/* <QueryMap
               address={addr.value}
               v-model:locations={form.value.locations}
               v-model:longitude={(form.value.locations ?? '').split(',')[0]}
@@ -434,7 +625,33 @@ export default defineComponent({
                 form.value.addr = store.incidentDetail.baseInfo?.addr;
                 form.value.locations = store.incidentDetail.baseInfo?.locations;
               }}
-            />
+            /> */}
+            {
+              <div style="padding: 15px; background: #fff; position: relative">
+                <Map
+                  v-model:map={state.map}
+                  style={
+                    'height: 240px;borderradius: 2px;boxshadow: 0px 0px 0px 1px #d9d9d9;'
+                  }
+                />
+                {isshowmove.value ? (
+                  <div class="mark">
+                    <img src={icon_map_location} />
+                  </div>
+                ) : (
+                  ''
+                )}
+
+                <div class="marklocation" onClick={getLocation}>
+                  <img src={icon_location_svg1} />
+                </div>
+                <div style={'position: absolute; right: 21px; top: 21px'}>
+                  <van-button type="primary" size="mini" onClick={selectpoint}>
+                    {isshowmove.value ? '确定' : '选点'}
+                  </van-button>
+                </div>
+              </div>
+            }
 
             <Field
               name="上传图片"

+ 76 - 0
src/views/WHPDetail/index.vue

@@ -0,0 +1,76 @@
+<template>
+  <div>
+    <van-nav-bar title="详情" left-arrow placeholder @click-left="goback" :fixed="true" >
+    </van-nav-bar>
+     <Editor
+            style="height: 100%; overflow-y: hidden;"
+            v-model:defaultConfig="editorConfig"
+            :mode="mode"
+            @onCreated="onCreated"
+        />
+   </div>
+</template>
+
+<script setup>
+import { ref, reactive, onUpdated, onMounted, watch,onBeforeUnmount,computed} from 'vue';
+import { RouterView, useRoute, useRouter } from 'vue-router';
+import {
+  api_getresource,
+  api_getresourcedetail,
+  api_putresource,
+  api_bj,
+  api_isbj,
+} from '@/service/warehouse';
+import { Toast, Notify, Dialog, Search } from 'vant';
+import { BaseMediaUrl } from '@/utils';
+import { upload } from '@/api/common';
+import cloneDeep from 'lodash/cloneDeep';
+
+
+import '@wangeditor/editor/dist/css/style.css'
+import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
+import { SlateTransforms } from '@wangeditor/editor'
+
+
+const editor=ref(null);
+const mode = ref("simple");
+const defaultContent = ref([]);
+const getDefaultContent = computed(() => cloneDeep(defaultContent.value));
+const editorConfig = ref({ placeholder: '请输入内容...',readOnly:false});
+const onCreated=(editor1) =>{
+       editor.value= Object.seal(editor1) // 一定要用 Object.seal() ,否则会报错
+       SlateTransforms.insertNodes(editor1,JSON.parse(cdata.value.content))
+      //  editorConfig.value.readOnly = true;
+      editor1.disable()
+ };
+
+ onBeforeUnmount(()=>{
+   const editor1 = editor.value
+   if (editor1 == null) return
+   editor1.destroy() // 组件销毁时,及时销毁编辑器
+ })
+
+
+const goback = () => {
+  try {
+    uni.navigateBack();
+  } catch (E) {}
+  window.history.back();
+};
+const cdata = ref({});
+onMounted(() => {
+  cdata.value = JSON.parse(localStorage.getItem('cwhp'));
+  if(cdata.value.id==undefined){
+    Toast("无数据");
+    goback();
+    return;
+  }
+  // editorConfig.value.readOnly = true
+  
+});
+
+</script>
+
+<style lang="scss">
+
+</style>

+ 137 - 0
src/views/WHPList/index.vue

@@ -0,0 +1,137 @@
+<template>
+  <div>
+    <van-nav-bar title="危化品" left-arrow placeholder @click-left="goback" :fixed="true" >
+       <template #right>
+          <router-link to="/chemical/search"><van-icon name="search" size="18" /></router-link>
+      </template>
+    </van-nav-bar>
+
+    <div v-if="!isempt">
+      <div class="content">
+        <div class="item" v-for="item in reslist" @click="opendetail(item)">
+          <img src="../../assets/icons/incident/article@2x.png" /> {{item.name}}
+        </div>
+      </div>
+    </div>
+
+    <div><van-empty v-if="isempt" description="无结果" /></div>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onUpdated, onMounted, watch } from 'vue';
+import { RouterView, useRoute, useRouter } from 'vue-router';
+import {
+    api_getchemicalList
+} from '@/service/warehouse';
+
+import { Toast, Notify, Dialog, Search } from 'vant';
+import router from '@/router';
+
+
+const isempt = ref(false);
+
+const goback = () => {
+  try {
+    uni.navigateBack();
+  } catch (E) {}
+   window.history.back();
+};
+
+const opendetail = (item)=>{
+   localStorage.setItem("cwhp",JSON.stringify(item));
+   router.push("/chemical/detail")
+}
+
+onMounted(()=>{
+  Toast.loading({
+    message: '加载中...',
+    duration: 0,
+    forbidClick: true,
+  });
+  api_getchemicalList("").then(res=>{
+    Toast.clear();
+    // console.log(res);
+    reslist.value = res.rows;
+  })
+
+})
+
+const reslist = ref([])
+
+
+</script>
+
+<style lang="scss">
+.content label,
+.content span {
+  font-size: 15px;
+  font-family: PingFangSC, PingFangSC-Regular;
+  color: #333333;
+}
+
+.bjbtn {
+  font-size: 14px;
+  font-weight: 500;
+  color: #ffffff;
+  font-size: 13px;
+  font-weight: 500;
+  background: #bb0000;
+  padding: 3px 8px;
+  border-radius: 2px;
+}
+
+.hiscontent {
+  background: #ffffff;
+  font-size: 12px;
+  .title {
+    color: #999999;
+    padding: 15px;
+    padding-bottom: 10px;
+    position: relative;
+    .delbtn {
+      background: url('../../assets/icons/incident/delete@2x.png');
+      background-size: 100% 100%;
+      width: 14px;
+      height: 14px;
+      position: absolute;
+      right: 10px;
+      top: 15px;
+    }
+  }
+  .ccontent {
+    padding: 12px 15px;
+    .cname {
+      display: inline-block;
+      color: #333333;
+      background: #f0f2f5;
+      padding: 5px 8px;
+      border-radius: 4px;
+      font-size: 12px;
+      margin-right: 8px;
+      margin-bottom: 8px;
+    }
+  }
+}
+
+.content {
+  background: #ffffff;
+  .item {
+    padding: 12px 15px;
+    font-size: 16px;
+    font-family: PingFangSC, PingFangSC-Medium;
+    font-weight: 500;
+    color: #003a8c;
+    border-bottom:1px solid #F0F2F5 ;
+
+    img {
+      width: 16px;
+      height: 16px;
+      vertical-align: middle;
+      margin-top: -4px;
+      margin-right: 11px;
+    }
+  }
+}
+
+</style>

+ 208 - 0
src/views/WHPSearch/index.vue

@@ -0,0 +1,208 @@
+<template>
+  <div>
+    <!-- <van-nav-bar title="应急仓库" left-arrow placeholder @click-left="goback" :fixed="true" @click-right="bjclick">
+                <template #right>
+</template>
+    </van-nav-bar> -->
+    <van-search
+      v-model="searchvalue"
+      show-action
+      placeholder="请输入危化品名称关键词"
+      @search="onSearch"
+      @cancel="onCancel"
+      @focus="onfouse"
+      @blur="onblur"
+    />
+
+    <div class="hiscontent" v-if="hisshow">
+      <div class="title">
+        历史搜索
+        <div class="delbtn" @click="delallhis"></div>
+      </div>
+      <div class="ccontent">
+        <div class="cname" v-for="item in searchhisname" @click="searchvalue =item ">{{ item }}</div>
+      </div>
+    </div>
+
+    <div v-if="!isempt">
+       <div class="content">
+        <div class="item" v-for="item in reslist" @click="opendetail(item)">
+          <img src="../../assets/icons/incident/article@2x.png" /> {{item.name}}
+        </div>
+      </div>
+    </div>
+
+    <div><van-empty v-if="isempt" description="无结果" /></div>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onUpdated, onMounted, watch } from 'vue';
+import { RouterView, useRoute, useRouter } from 'vue-router';
+import {
+  api_getresource,
+  api_getresourcedetail,
+  api_putresource,
+  api_bj,
+  api_isbj,
+} from '@/service/warehouse';
+import { Toast, Notify, Dialog, Search } from 'vant';
+import { BaseMediaUrl } from '@/utils';
+import { upload } from '@/api/common';
+import {
+    api_getchemicalList
+} from '@/service/warehouse';
+import router from '@/router';
+
+const isempt = ref(false);
+const hisshow = ref(false);
+const onSearch = (val) => {
+  var hissc = localStorage.getItem('whsearch');
+  if (hissc) {
+    hissc = JSON.parse(hissc);
+  } else {
+    hissc = [];
+  }
+  
+  hissc.push(val);
+  function dedupe(array){
+       return Array.from(new Set(array));
+  }
+  hissc = dedupe(hissc);
+  localStorage.setItem('whsearch', JSON.stringify(hissc));
+  //搜索开始
+   api_getchemicalList(searchvalue.value).then(res=>{
+        // console.log(res);
+      reslist.value = res.rows;
+    })
+};
+const onCancel = () => {
+goback();
+};
+const searchhisname = ref([]);
+
+const searchvalue = ref('');
+const onfouse = () => {
+  if (searchvalue.value == '') {
+    hisshow.value = true;
+  }
+};
+const delallhis = () => {
+  localStorage.setItem('whsearch', JSON.stringify([]));
+  searchhisname.value = [];
+};
+const opendetail = (item)=>{
+   localStorage.setItem("cwhp",JSON.stringify(item));
+   router.push("/chemical/detail")
+}
+watch(
+  () => hisshow.value,
+  (nex, la) => {
+    if (hisshow.value) {
+      var hissc = localStorage.getItem('whsearch');
+      if (hissc) {
+        hissc = JSON.parse(hissc);
+      } else {
+        hissc = [];
+      }
+      searchhisname.value = hissc;
+    }
+  },
+);
+watch(
+  () => searchvalue.value,
+  (last, next) => {
+    if (searchvalue.value == '') {
+      hisshow.value = true;
+    } else {
+      hisshow.value = false;
+     
+
+
+    }
+  },
+);
+
+const goback = () => {
+  try {
+    uni.navigateBack();
+  } catch (E) {}
+   window.history.back();
+};
+const onblur = () => {};
+
+const reslist = ref([])
+</script>
+
+<style lang="scss">
+.content label,
+.content span {
+  font-size: 15px;
+  font-family: PingFangSC, PingFangSC-Regular;
+  color: #333333;
+}
+
+.bjbtn {
+  font-size: 14px;
+  font-weight: 500;
+  color: #ffffff;
+  font-size: 13px;
+  font-weight: 500;
+  background: #bb0000;
+  padding: 3px 8px;
+  border-radius: 2px;
+}
+
+.hiscontent {
+  background: #ffffff;
+  font-size: 12px;
+  .title {
+    color: #999999;
+    padding: 15px;
+    padding-bottom: 10px;
+    position: relative;
+    .delbtn {
+      background: url('../../assets/icons/incident/delete@2x.png');
+      background-size: 100% 100%;
+      width: 14px;
+      height: 14px;
+      position: absolute;
+      right: 10px;
+      top: 15px;
+    }
+  }
+  .ccontent {
+    padding: 12px 15px;
+    .cname {
+      display: inline-block;
+      color: #333333;
+      background: #f0f2f5;
+      padding: 5px 8px;
+      border-radius: 4px;
+      font-size: 12px;
+      margin-right: 8px;
+      margin-bottom: 8px;
+    }
+  }
+}
+
+.content {
+  background: #ffffff;
+  .item {
+    padding: 12px 15px;
+    font-size: 16px;
+    font-family: PingFangSC, PingFangSC-Medium;
+    font-weight: 500;
+    color: #003a8c;
+    border-bottom:1px solid #F0F2F5 ;
+
+    img {
+      width: 16px;
+      height: 16px;
+      vertical-align: middle;
+      margin-top: -4px;
+      margin-right: 11px;
+    }
+  }
+}
+</style>

+ 18 - 13
src/views/Warehouse/index.vue

@@ -32,7 +32,6 @@
             />
             <van-field
               v-model="whdata.value.contactName"
-              required
               :readonly="isedit"
               label="联系人"
               input-align="right"
@@ -40,7 +39,6 @@
             />
             <van-field
               v-model="whdata.value.contactPhone"
-              required
               label="联系方式"
               :readonly="isedit"
               input-align="right"
@@ -52,7 +50,7 @@
         <div v-for="(item, index) in wzdata.aar" v-bind:key="index">
           <div class="cell-header">
             <span>应急物资({{ index + 1 }})</span>
-            <div style="float: right" @click="deletewz(index)">删除</div>
+            <div style="float: right" @click="deletewz(index)" v-if="isedit">删除</div>
           </div>
           <van-cell-group style="">
             <van-field
@@ -95,13 +93,13 @@
             />
             <van-field name="uploader" label="图片" input-align="right">
                <template #input>
-                 <van-uploader :max-count="1" v-model='item.pic' :before-read="beforeRead" />
+                 <van-uploader :max-count="1" v-model='item.pic' :before-read="beforeRead" :disabled="!isedit" />
                </template>
              </van-field>
           </van-cell-group>
         </div>
       </div>
-      <div style="text-align: center">
+      <div style="text-align: center" v-if="isedit">
         <van-button
           @click="doaddwzClick"
           icon="plus"
@@ -110,7 +108,7 @@
         >
       </div>
 
-      <div style="padding: 10px 20px">
+      <div style="padding: 10px 20px" v-if="isedit">
         <van-button
           type="primary"
           block
@@ -211,9 +209,7 @@ const doaddwzClick = () => {
   };
   wzdata.aar.push(wz);
 };
-const editclick = () => {
-  isedit.value = false;
-};
+
 const deletewz = (index) => {
   if (index >= wzdata.aar.length) {
     return;
@@ -225,6 +221,7 @@ const goback = () => {
   try {
     uni.navigateBack();
   } catch (E) {}
+   window.history.back();
 };
 const dosavedata = () => {
   
@@ -266,12 +263,15 @@ const isbj = ref(true);
 
 const route = useRoute();
 onMounted(()=>{
+   whdata.value = JSON.parse(localStorage.getItem('cck'));
+  //  isedit.value  = true;
+   isedit.value = localStorage.getItem("cedit")=="true"?true:false;
+   getdata();
   var taskid =  route.query.taskid;
   if(taskid){
     api_isbj(taskid).then((res)=>{
         isbj.value = !res.data;
         console.log(isbj.value)
-      
     })
   }
 
@@ -283,6 +283,7 @@ const getdata = () => {
     duration: 0,
     forbidClick: true,
   });
+ 
   api_getresource({
     resourceType: 1,
   })
@@ -291,7 +292,11 @@ const getdata = () => {
       if (res.rows.length > 0) {
         isempt.value = false;
         // whdata.value = res.rows.find(i=>i.id=="1481549762984415233")
-        whdata.value = res.rows[0];
+        
+        if(whdata.value.id==undefined){
+           whdata.value = res.rows[0];
+        }
+       
         api_getresourcedetail(whdata.value.id).then((res1) => {
           if (
             res1.data.resourceDetailList == null ||
@@ -302,7 +307,7 @@ const getdata = () => {
           } else {
             res1.data.resourceDetailList.map(item=>{
               if(item.pic!="" && item.pic!=null){
-                item.pic = [{url:BaseMediaUrl+item.pic}]
+                item.pic = [{url:BaseMediaUrl+item.pic, deletable: isedit.value,}]
               }else{
                  item.pic = []
               }
@@ -321,7 +326,7 @@ const getdata = () => {
       Toast.clear();
     });
 };
-getdata();
+// getdata();
 
 // onUpdated(()=>{
 //     //根据管理单位获取仓库信息

+ 435 - 0
src/views/WarehouseEdit/index.vue

@@ -0,0 +1,435 @@
+<template>
+  <div>
+    <van-nav-bar
+      title="应急仓库编辑"
+      left-arrow
+      placeholder
+      @click-left="goback"
+      :fixed="true"
+      @click-right="bjclick"
+    >
+    </van-nav-bar>
+    <div>
+      <div class="content">
+        <div>
+          <van-cell-group>
+            <van-field
+              v-model="whdata.value.name"
+              label="仓库命名"
+              input-align="right"
+              :readonly="isedit"
+              placeholder="请输入仓库命名"
+            />
+            <van-field
+              v-model="whdata.value.manageUnit"
+              label="管理单位"
+              input-align="right"
+              :readonly="isedit"
+              placeholder="请输入管理单位"
+            />
+            <van-field
+              v-model="whdata.value.contactName"
+              required
+              :readonly="isedit"
+              label="联系人"
+              input-align="right"
+              placeholder="请输入联系人"
+            />
+            <van-field
+              v-model="whdata.value.contactPhone"
+              required
+              label="联系方式"
+              :readonly="isedit"
+              input-align="right"
+              placeholder="请输入联系方式"
+            />
+
+            <van-field
+              v-model="whdata.value.address"
+              label="地址"
+              :readonly="isedit"
+              input-align="right"
+              placeholder="请输入地址"
+            >
+              <template #button v-if="isedit">
+                <van-button
+                  size="small"
+                  type="primary"
+                  color="#f2f4fa"
+                  @click="searchaddr"
+                  ><van-icon name="search"
+                /></van-button>
+              </template>
+            </van-field>
+          </van-cell-group>
+        </div>
+      </div>
+
+      <div style="padding: 15px; background: #fff; position: relative">
+        <Map
+          v-model:map="state.map"
+          style="
+            height: 240px;
+            borderradius: 2px;
+            boxshadow: 0px 0px 0px 1px #d9d9d9;
+          "
+        />
+        <div v-if="isshowmove" class="mark">
+          <img :src="icon_map_location" />
+        </div>
+        <div v-if="isedit" class="marklocation" @click="getLocation">
+          <img src="../../assets/icons/incident/location.svg" />
+        </div>
+
+        <div v-if="isedit" style="position: absolute; right: 21px; top: 21px">
+          <van-button type="primary" size="mini" @click="selectpoint">{{
+            isshowmove ? '确定' : '选点'
+          }}</van-button>
+        </div>
+      </div>
+
+      <div style="padding: 30px 20px" v-if="isedit">
+        <van-button
+          type="primary"
+          block
+          style="border-radius: 30px"
+          @click="dosavedata"
+          >保存</van-button
+        >
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onUpdated, onMounted, watch } from 'vue';
+import { RouterView, useRoute, useRouter } from 'vue-router';
+import icon_map_location from '@/assets/icons/home/icon_map_location@2x.png';
+import {
+  api_getresource,
+  api_getresourcedetail,
+  api_putresource,
+  api_bj,
+  api_isbj,
+} from '@/service/warehouse';
+import { api_getusergps } from '@/service/login';
+import { Toast, Notify, Dialog } from 'vant';
+import { BaseMediaUrl } from '@/utils';
+import { upload } from '@/api/common';
+import Map from '@/components/MapView';
+
+const state = reactive({
+  map: null,
+  _marker: null,
+  loading: false,
+  postition: {
+    longitude: '',
+    latitude: '',
+    name: '',
+  },
+});
+
+const whdata = reactive({
+  value: {
+    name: '',
+    manageUnit: '',
+    contactName: '',
+    contactPhone: '',
+    longitude: '',
+    latitude: '',
+  },
+});
+const isedit = ref(false);
+const isempt = ref(true);
+
+
+onMounted(() => {
+  whdata.value = JSON.parse(localStorage.getItem('cck'));
+  // isedit.value = true;
+  isedit.value = localStorage.getItem("cedit")=="true"?true:false;
+  // debugger
+
+  var taskid = route.query.taskid;
+  if (taskid) {
+    api_isbj(taskid).then((res) => {
+      isbj.value = !res.data;
+      console.log(isbj.value);
+    });
+  }
+
+  state.postition = {
+    longitude: whdata.value.longitude,
+    latitude: whdata.value.latitude,
+    name: whdata.value.address,
+  };
+
+  if (state.map && state._marker) {
+    state._marker.remove();
+    state._marker = null;
+  }
+  if (state.map) {
+    setpoint(
+      Number(whdata.value.longitude),
+      Number(whdata.value.latitude),
+      whdata.value.address,
+    );
+  }
+});
+
+const isshowmove = ref(false);
+let allmark = [];
+
+const selectpoint = () => {
+  if (isshowmove.value) {
+    var center = state.map.getCenter();
+    getlocalname(center.lng.toFixed(6) + ',' + center.lat.toFixed(6));
+  } else {
+    isshowmove.value = true;
+    state._marker.remove();
+  }
+};
+const setpoint = (longitude, latitude, name) => {
+  if (state._marker) {
+    state._marker.remove();
+  }
+
+  var el = document.createElement('div');
+  el.id = 'marker';
+  el.style.backgroundImage = `url(${icon_map_location})`;
+  el.style.backgroundSize = 'cover';
+  el.style.width = '24px';
+  el.style.height = '24px';
+  el.style.borderRadius = '50%';
+
+  const popup = new window.minemap.Popup({
+    closeOnClick: false,
+    closeButton: false,
+    offset: [0, -15],
+  }).setText(name);
+
+  state._marker = new window.minemap.Marker(el, {
+    offset: [-12, -12],
+  })
+    .setLngLat([longitude, latitude])
+    .setPopup(popup)
+    .addTo(state.map);
+  state.map.flyTo({
+    center: [longitude, latitude],
+    zoom: 14,
+    bearing: 0,
+    pitch: 0,
+    duration: 2000,
+  });
+  state._marker.togglePopup();
+  whdata.value.address = name;
+  whdata.value.latitude = latitude;
+  whdata.value.longitude = longitude;
+  isshowmove.value = false;
+};
+
+const searchaddr = () => {
+  isshowmove.value = false;
+  fetch(
+    `https://minedata.cn/service/lbs/search/v1/keywords?keywords=${whdata.value.address}&city=宿迁&citylimit=true&page_idx=1&page_size=10&key=${window.key}`,
+  )
+    .then((res) => res.json())
+    .then((data) => {
+      // console.log(data.pois)
+      var clearallmark = () => {
+        state._marker.remove();
+        if (allmark.length > 0) {
+          allmark.map((item) => {
+            item.remove();
+          });
+          allmark = [];
+        }
+      };
+      clearallmark();
+      var top = [];
+      var bottom = [];
+      data.pois.map((item) => {
+        if (top.length < 1) {
+          top = [
+            Number(item.location.split(',')[0]),
+            Number(item.location.split(',')[1]),
+          ];
+          bottom = [
+            Number(item.location.split(',')[0]),
+            Number(item.location.split(',')[1]),
+          ];
+        }
+        var el = document.createElement('div');
+        el.id = 'marker';
+        el.style.backgroundImage = `url(${icon_map_location})`;
+        el.style.backgroundSize = 'cover';
+        el.style.width = '24px';
+        el.style.height = '24px';
+        el.style.borderRadius = '50%';
+        el.onclick = () => {
+          clearallmark();
+          setpoint(
+            Number(item.location.split(',')[0]),
+            Number(item.location.split(',')[1]),
+            item.name,
+          );
+        };
+
+        const popup = new window.minemap.Popup({
+          closeOnClick: false,
+          closeButton: false,
+          offset: [0, -15],
+        }).setText(item.name);
+
+        var mark = new window.minemap.Marker(el, {
+          offset: [-12, -12],
+        })
+          .setLngLat([
+            Number(item.location.split(',')[0]),
+            Number(item.location.split(',')[1]),
+          ])
+          .setPopup(popup)
+          .addTo(state.map);
+        allmark.push(mark);
+        mark.togglePopup();
+        if (top[0] < Number(item.location.split(',')[0])) {
+          top[0] = Number(item.location.split(',')[0]);
+        }
+        if (top[1] > Number(item.location.split(',')[1])) {
+          top[1] = Number(item.location.split(',')[1]);
+        }
+        if (bottom[0] > Number(item.location.split(',')[0])) {
+          bottom[0] = Number(item.location.split(',')[0]);
+        }
+        if (bottom[1] < Number(item.location.split(',')[1])) {
+          bottom[1] = Number(item.location.split(',')[1]);
+        }
+      });
+      state.map.fitBounds([top, bottom]);
+    });
+};
+
+const getlocalname = (location) => {
+  fetch(
+    `https://minedata.cn/service/lbs/reverse/v1/regeo?location=${location}&key=${window.key}`,
+  )
+    .then((res) => res.json())
+    .then((data) => {
+      setpoint(
+        Number(location.split(',')[0]),
+        Number(location.split(',')[1]),
+        data.regeocodes[0].formatted_address,
+      );
+    });
+};
+const getLocation = () => {
+  api_getusergps().then((res) => {
+    var lat = null;
+    var lon = null;
+    var iserror = false;
+    try {
+      lat = res.result[0].lat;
+      lon = res.result[0].lon;
+      if (lat == null || lat == undefined) iserror = true;
+    } catch (e) {
+      iserror = true;
+    }
+    if (!iserror) {
+      //  debugger
+      var location = `${lon},${lat}`;
+      getlocalname(location);
+      //  setpoint(lon,lat,data.regeocodes[0].formatted_address)
+    } else {
+      Notify({
+        type: 'danger',
+        message: 'App不支持地理定位。',
+      });
+    }
+  });
+};
+
+const goback = () => {
+  try {
+    uni.navigateBack();
+  } catch (E) {}
+  window.history.back();
+};
+const dosavedata = () => {
+  Toast.loading({
+    message: '加载中...',
+    duration: 0,
+    forbidClick: true,
+  });
+  var data = whdata.value;
+  api_putresource(data)
+    .then((res) => {
+      Toast.clear();
+      setTimeout(() => {
+        Toast('保存成功');
+      }, 1000);
+
+      // Notify({ type: 'success', message: '保存成功'});
+      getdata();
+    })
+    .catch((ee) => {
+      Toast.clear();
+    });
+};
+
+const isbj = ref(true);
+
+const route = useRoute();
+
+</script>
+
+<style lang="scss">
+.content label,
+.content span {
+  font-size: 15px;
+  font-family: PingFangSC, PingFangSC-Regular;
+  color: #333333;
+}
+.bjbtn {
+  font-size: 14px;
+  font-weight: 500;
+  color: #ffffff;
+  font-size: 13px;
+  font-weight: 500;
+  background: #bb0000;
+  padding: 3px 8px;
+  border-radius: 2px;
+}
+.content {
+  .cell-header {
+    font-family: PingFangSC, PingFangSC-Regular;
+    font-weight: 400;
+    line-height: 42px;
+    padding: 0px 15px;
+    span {
+      font-size: 12px;
+    }
+    div {
+      font-size: 14px;
+      color: #0b33a8;
+    }
+  }
+}
+.mark {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  img {
+    width: 24px;
+    height: 24px;
+  }
+}
+.marklocation {
+  img {
+    width: 24px;
+    height: 24px;
+  }
+  position: absolute;
+  bottom: 10%;
+  right: 20px;
+}
+</style>

+ 190 - 0
src/views/WarehouseList/index.vue

@@ -0,0 +1,190 @@
+<template>
+    <div>
+        <van-nav-bar title="应急仓库" left-arrow placeholder @click-left="goback" :fixed="true" @click-right="bjclick">
+            <template #right>
+            </template>
+    </van-nav-bar>
+    <div v-if="!isempt">
+      <div class="content">
+        <div class="itemc" v-for="item in cklist" >
+          <div class="itemcc">
+            <div class="title" @click="gotockedit(item)">{{item.name}}
+              <div class="btng">
+                <!-- <div class="wbtn"></div> -->
+                <div class="hbtn" @click.stop="gotowzedit(item)"></div>
+              </div>
+            </div>
+            <div class="content">
+              <div>
+                <span class="left-title">管理单位:</span
+                ><span class="left-content">{{item.manageUnit}}</span>
+              </div>
+              <div>
+                <span class="left-title">联系人:</span
+                ><span class="left-content">{{item.contactName}}</span>
+              </div>
+              <div>
+                <span class="left-title">联系方式:</span
+                ><span class="left-content">{{item.contactPhone}}</span>
+              </div>
+              <div>
+                <span class="left-title">地址:</span
+                ><span class="left-content"
+                  >{{item.address}}</span
+                >
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div><van-empty v-if="isempt" description="无仓库" /></div>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onUpdated, onMounted, watch } from 'vue';
+import { RouterView, useRoute, useRouter } from 'vue-router';
+import {
+    api_getresource,
+    api_getresourcedetail,
+    api_putresource,
+    api_bj,
+    api_isbj,
+} from '@/service/warehouse';
+import { Toast, Notify, Dialog } from 'vant';
+import { BaseMediaUrl } from '@/utils';
+import { upload } from '@/api/common';
+import router from '@/router';
+
+
+const cklist = ref([])
+const gotockedit=(item)=>{
+  localStorage.setItem("cck",JSON.stringify(item))
+  localStorage.setItem("cedit",true)
+
+  router.push("/warehouse/edit"+(taskid==""?"":`taskid=${taskid}`))
+
+}
+const gotowzedit=(item)=>{
+  localStorage.setItem("cck",JSON.stringify(item))
+   localStorage.setItem("cedit",true)
+  router.push("/warehouse/detail"+(taskid==""?"":`taskid=${taskid}`))
+}
+
+const goback = () => {
+  try {
+    uni.navigateBack();
+  } catch (E) {}
+   window.history.back();
+};
+let taskid = "";
+onMounted(()=>{
+  try{
+     taskid =  route.query.taskid;
+  }catch(E){
+
+  }
+
+  Toast.loading({
+    message: '加载中...',
+    duration: 0,
+    forbidClick: true,
+  });
+  api_getresource({
+    resourceType: 1,
+  }).then(res=>{
+    Toast.clear();
+    // console.log(res);
+    cklist.value = res.rows;
+  })
+})
+
+</script>
+
+<style lang="scss">
+.content label,
+.content span {
+    font-size: 15px;
+    font-family: PingFangSC, PingFangSC-Regular;
+    color: #333333;
+}
+
+.bjbtn {
+    font-size: 14px;
+    font-weight: 500;
+    color: #ffffff;
+    font-size: 13px;
+    font-weight: 500;
+    background: #bb0000;
+    padding: 3px 8px;
+    border-radius: 2px;
+}
+
+.content {
+    .itemc {
+        padding: 12px 15px;
+        padding-bottom: 0;;
+        .itemcc {
+            background: #ffffff;
+            border-radius: 2%;
+            box-shadow: 0px 2px 6px 0px rg;
+            .title {
+                font-size: 16px;
+                font-family: PingFangSC, PingFangSC-Medium;
+                font-weight: 500;
+                padding: 11px 15px;
+                border-bottom: 1px solid #f0f2f5;
+                position: relative;color:#0b33a8;
+
+                .btng {
+                    position: absolute;
+                    right:15px;
+                    top:11px;
+                    .wbtn {
+                        background: url("../../assets/icons/incident/storehouse@2x.png");
+                        width: 24px;
+                        height: 24px;
+                        background-size: 100% 100%;
+                        display:inline-block;
+                        margin-right:16px;
+                    }
+                    .hbtn {
+                        background: url("../../assets/icons/incident/materials@2x.png");
+                        width: 24px;
+                        height: 24px;
+                        background-size: 100% 100%;
+                        display:inline-block;
+                    }
+                }
+            }
+            .content {
+                padding: 11px 15px;
+                margin-bottom: 3px;
+                font-size: 14px;
+                word-wrap: break-word;
+                .left-title {
+                    color: #999999;
+                }
+                .left-content {
+                    color: rgb(38, 38, 38);
+                    word-wrap: break-word;
+                }
+            }
+        }
+    }
+    .cell-header {
+        font-family: PingFangSC, PingFangSC-Regular;
+        font-weight: 400;
+        line-height: 42px;
+        padding: 0px 15px;
+        span {
+            font-size: 12px;
+        }
+        div {
+            font-size: 14px;
+            color: #0b33a8;
+        }
+    }
+}
+</style>

+ 182 - 0
src/views/WarehouseListRead/index.vue

@@ -0,0 +1,182 @@
+<template>
+    <div>
+        <van-nav-bar title="应急仓库" left-arrow placeholder @click-left="goback" :fixed="true" @click-right="bjclick">
+            <template #right>
+          <router-link to="/warehouse/search"><van-icon name="search" size="18" /></router-link>
+      </template>
+    </van-nav-bar>
+    <div v-if="!isempt">
+      <div class="content">
+        <div class="itemc" v-for="item in cklist" >
+          <div class="itemcc">
+            <div class="title" @click="gotockedit(item)">{{item.name}}
+              <div class="btng">
+                <!-- <div class="wbtn"></div> -->
+                <div class="hbtn" @click.stop="gotowzedit(item)"></div>
+              </div>
+            </div>
+            <div class="content">
+              <div>
+                <span class="left-title">管理单位:</span
+                ><span class="left-content">{{item.manageUnit}}</span>
+              </div>
+              <div>
+                <span class="left-title">联系人:</span
+                ><span class="left-content">{{item.contactName}}</span>
+              </div>
+              <div>
+                <span class="left-title">联系方式:</span
+                ><span class="left-content">{{item.contactPhone}}</span>
+              </div>
+              <div>
+                <span class="left-title">地址:</span
+                ><span class="left-content"
+                  >{{item.address}}</span
+                >
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div><van-empty v-if="isempt" description="无仓库" /></div>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onUpdated, onMounted, watch } from 'vue';
+import { RouterView, useRoute, useRouter } from 'vue-router';
+import {
+    api_getckList,
+    
+} from '@/service/warehouse';
+import { Toast, Notify, Dialog } from 'vant';
+import { BaseMediaUrl } from '@/utils';
+import { upload } from '@/api/common';
+import router from '@/router';
+
+
+const cklist = ref([])
+const gotockedit=(item)=>{
+  localStorage.setItem("cck",JSON.stringify(item))
+  localStorage.setItem("cedit",false)
+
+  router.push("/warehouse/edit"+(taskid==""?"":`taskid=${taskid}`))
+
+}
+const gotowzedit=(item)=>{
+  localStorage.setItem("cck",JSON.stringify(item))
+   localStorage.setItem("cedit",false)
+  router.push("/warehouse/detail"+(taskid==""?"":`taskid=${taskid}`))
+}
+
+const goback = () => {
+  try {
+    uni.navigateBack();
+  } catch (E) {}
+   window.history.back();
+};
+let taskid = "";
+onMounted(()=>{
+
+
+  Toast.loading({
+    message: '加载中...',
+    duration: 0,
+    forbidClick: true,
+  });
+  api_getckList("").then(res=>{
+    Toast.clear();
+    // console.log(res);
+    cklist.value = res.rows;
+  })
+})
+
+</script>
+
+<style lang="scss">
+.content label,
+.content span {
+    font-size: 15px;
+    font-family: PingFangSC, PingFangSC-Regular;
+    color: #333333;
+}
+
+.bjbtn {
+    font-size: 14px;
+    font-weight: 500;
+    color: #ffffff;
+    font-size: 13px;
+    font-weight: 500;
+    background: #bb0000;
+    padding: 3px 8px;
+    border-radius: 2px;
+}
+
+.content {
+    .itemc {
+        padding: 12px 15px;
+        padding-bottom: 0;;
+        .itemcc {
+            background: #ffffff;
+            border-radius: 2%;
+            box-shadow: 0px 2px 6px 0px rg;
+            .title {
+                font-size: 16px;
+                font-family: PingFangSC, PingFangSC-Medium;
+                font-weight: 500;
+                padding: 11px 15px;
+                border-bottom: 1px solid #f0f2f5;
+                position: relative;color:#0b33a8;
+
+                .btng {
+                    position: absolute;
+                    right:15px;
+                    top:11px;
+                    .wbtn {
+                        background: url("../../assets/icons/incident/storehouse@2x.png");
+                        width: 24px;
+                        height: 24px;
+                        background-size: 100% 100%;
+                        display:inline-block;
+                        margin-right:16px;
+                    }
+                    .hbtn {
+                        background: url("../../assets/icons/incident/materials@2x.png");
+                        width: 24px;
+                        height: 24px;
+                        background-size: 100% 100%;
+                        display:inline-block;
+                    }
+                }
+            }
+            .content {
+                padding: 11px 15px;
+                margin-bottom: 3px;
+                font-size: 14px;
+                word-wrap: break-word;
+                .left-title {
+                    color: #999999;
+                }
+                .left-content {
+                    color: rgb(38, 38, 38);
+                    word-wrap: break-word;
+                }
+            }
+        }
+    }
+    .cell-header {
+        font-family: PingFangSC, PingFangSC-Regular;
+        font-weight: 400;
+        line-height: 42px;
+        padding: 0px 15px;
+        span {
+            font-size: 12px;
+        }
+        div {
+            font-size: 14px;
+            color: #0b33a8;
+        }
+    }
+}
+</style>

+ 282 - 0
src/views/WarehouseSearch/index.vue

@@ -0,0 +1,282 @@
+<template>
+    <div>
+        <!-- <van-nav-bar title="应急仓库" left-arrow placeholder @click-left="goback" :fixed="true" @click-right="bjclick">
+            <template #right>
+            </template>
+    </van-nav-bar> -->
+    <van-search v-model="searchvalue"  show-action
+    placeholder="请输入仓库名称关键词"
+    @search="onSearch"
+    @cancel="onCancel"
+    @focus="onfouse"
+    @blur="onblur"
+     />
+   
+    <div class="hiscontent" v-if="hisshow">
+      <div class="title">历史搜索
+       <div class="delbtn" @click="delallhis"></div>
+      </div>
+      <div class="ccontent">
+         <div class="cname" v-for="item in searchhisname" @click="searchvalue =item ">{{item}}</div>
+      </div>
+    </div>
+
+
+    <div v-if="!isempt">
+      <div class="content">
+        <div class="itemc" v-for="item in cklist" >
+          <div class="itemcc">
+            <div class="title" @click="gotockedit(item)">{{item.name}}
+              <div class="btng">
+                <!-- <div class="wbtn"></div> -->
+                <div class="hbtn" @click.stop="gotowzedit(item)"></div>
+              </div>
+            </div>
+            <div class="content">
+              <div>
+                <span class="left-title">管理单位:</span
+                ><span class="left-content">{{item.manageUnit}}</span>
+              </div>
+              <div>
+                <span class="left-title">联系人:</span
+                ><span class="left-content">{{item.contactName}}</span>
+              </div>
+              <div>
+                <span class="left-title">联系方式:</span
+                ><span class="left-content">{{item.contactPhone}}</span>
+              </div>
+              <div>
+                <span class="left-title">地址:</span
+                ><span class="left-content"
+                  >{{item.address}}</span
+                >
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div><van-empty v-if="isempt" description="无仓库" /></div>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onUpdated, onMounted, watch } from 'vue';
+import { RouterView, useRoute, useRouter } from 'vue-router';
+import {
+       api_getckList,
+} from '@/service/warehouse';
+import { Toast, Notify, Dialog,Search } from 'vant';
+import { BaseMediaUrl } from '@/utils';
+import { upload } from '@/api/common';
+import router from '@/router';
+
+
+const isempt = ref(true);
+const hisshow = ref(false);
+const cklist = ref([])
+const onSearch = (val) => {
+  var hissc = localStorage.getItem("cksearch");
+  if(hissc){
+    hissc = JSON.parse(hissc);
+  }else{
+    hissc = [];
+  }
+  hissc.push(val);
+   function dedupe(array){
+       return Array.from(new Set(array));
+  }
+  hissc = dedupe(hissc);
+  localStorage.setItem("cksearch",JSON.stringify(hissc));
+  //搜索开始
+
+  api_getckList(searchvalue.value).then(res=>{
+    if(res.rows.length<1){
+      isempt.value = true;
+    }else{
+      isempt.value = false;
+    }
+  
+    // console.log(res);
+    cklist.value = res.rows;
+    console.log(cklist.value)
+  })
+
+
+};
+
+
+const gotockedit=(item)=>{
+  localStorage.setItem("cck",JSON.stringify(item))
+  localStorage.setItem("cedit",false)
+
+  router.push("/warehouse/edit")
+
+}
+const gotowzedit=(item)=>{
+  localStorage.setItem("cck",JSON.stringify(item))
+   localStorage.setItem("cedit",false)
+  router.push("/warehouse/detail")
+}
+const onCancel = () => {
+
+};
+const searchhisname = ref([])
+
+const searchvalue = ref("");
+const onfouse = ()=>{
+  if(searchvalue.value == ""){
+     hisshow.value = true;
+  }
+}
+const delallhis = ()=>{
+   localStorage.setItem("cksearch",JSON.stringify([]));
+   searchhisname.value = [];
+}
+watch(()=>hisshow.value,(nex,la)=>{
+  if(hisshow.value){
+    var hissc = localStorage.getItem("cksearch");
+  if(hissc){
+    hissc = JSON.parse(hissc);
+  }else{
+    hissc = [];
+  }
+  searchhisname.value = hissc;
+  }
+
+});
+watch(()=>searchvalue.value,(last,next)=>{
+   if(searchvalue.value==""){
+      hisshow.value = true;
+   }else{
+      hisshow.value = false;
+   }
+})
+
+const onblur = ()=>{
+  
+}
+
+
+</script>
+
+<style lang="scss">
+.content label,
+.content span {
+    font-size: 15px;
+    font-family: PingFangSC, PingFangSC-Regular;
+    color: #333333;
+}
+
+.bjbtn {
+    font-size: 14px;
+    font-weight: 500;
+    color: #ffffff;
+    font-size: 13px;
+    font-weight: 500;
+    background: #bb0000;
+    padding: 3px 8px;
+    border-radius: 2px;
+}
+
+.hiscontent{
+  background: #ffffff;
+  font-size: 12px;
+  .title{
+     color: #999999;
+     padding: 15px;
+     padding-bottom: 10px;
+     position: relative;
+     .delbtn{
+       background: url("../../assets/icons/incident/delete@2x.png");
+       background-size: 100% 100%;
+       width:14px;
+       height:14px;
+       position: absolute;
+       right: 10px;
+       top:15px;
+     }
+  }
+ 
+  .ccontent{
+    padding: 12px 15px;
+    .cname{
+      display: inline-block;
+      color:#333333;
+      background: #f0f2f5;
+      padding: 5px 8px;
+      border-radius: 4px;
+      font-size: 12px;
+      margin-right: 8px;
+      margin-bottom: 8px;
+    }
+
+  }
+}
+
+.content {
+    .itemc {
+        padding: 12px 15px;
+        padding-bottom: 0;;
+        .itemcc {
+            background: #ffffff;
+            border-radius: 2%;
+            box-shadow: 0px 2px 6px 0px rg;
+            .title {
+                font-size: 16px;
+                font-family: PingFangSC, PingFangSC-Medium;
+                font-weight: 500;
+                padding: 11px 15px;
+                border-bottom: 1px solid #f0f2f5;
+                position: relative;color:#0b33a8;
+                .btng {
+                    position: absolute;
+                    right:15px;
+                    top:11px;
+                    .wbtn {
+                        background: url("../../assets/icons/incident/storehouse@2x.png");
+                        width: 24px;
+                        height: 24px;
+                        background-size: 100% 100%;
+                        display:inline-block;
+                        margin-right:16px;
+                    }
+                    .hbtn {
+                        background: url("../../assets/icons/incident/materials@2x.png");
+                        width: 24px;
+                        height: 24px;
+                        background-size: 100% 100%;
+                        display:inline-block;
+                    }
+                }
+            }
+            .content {
+                padding: 11px 15px;
+                margin-bottom: 3px;
+                font-size: 14px;
+                word-wrap: break-word;
+                .left-title {
+                    color: #999999;
+                }
+                .left-content {
+                    color: rgb(38, 38, 38);
+                    word-wrap: break-word;
+                }
+            }
+        }
+    }
+    .cell-header {
+        font-family: PingFangSC, PingFangSC-Regular;
+        font-weight: 400;
+        line-height: 42px;
+        padding: 0px 15px;
+        span {
+            font-size: 12px;
+        }
+        div {
+            font-size: 14px;
+            color: #0b33a8;
+        }
+    }
+}
+</style>

+ 356 - 0
yarn.lock

@@ -230,6 +230,13 @@
     "@babel/helper-plugin-utils" "^7.14.5"
     "@babel/plugin-syntax-typescript" "^7.14.5"
 
+"@babel/runtime@^7.12.0":
+  version "7.17.9"
+  resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72"
+  integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
 "@babel/template@^7.0.0", "@babel/template@^7.15.4":
   version "7.15.4"
   resolved "https://registry.nlark.com/@babel/template/download/@babel/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194"
@@ -340,11 +347,21 @@
     estree-walker "^2.0.1"
     picomatch "^2.2.2"
 
+"@transloadit/prettier-bytes@0.0.7":
+  version "0.0.7"
+  resolved "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz#cdb5399f445fdd606ed833872fa0cabdbc51686b"
+  integrity sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==
+
 "@trysound/sax@0.2.0":
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
   integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
 
+"@types/event-emitter@^0.3.3":
+  version "0.3.3"
+  resolved "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.3.tgz#727032a9fc67565f96bbd78b2e2809275c97d7e7"
+  integrity sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q==
+
 "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
   version "7.0.9"
   resolved "https://registry.nlark.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz?cache=0&sync_timestamp=1629708189890&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
@@ -440,6 +457,49 @@
     "@typescript-eslint/types" "5.2.0"
     eslint-visitor-keys "^3.0.0"
 
+"@uppy/companion-client@^2.0.4":
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.0.6.tgz#a1d8535404fac249615f2b2edec503d97f66f639"
+  integrity sha512-a2tsKhNPekW52CYUjBa7oVcK+aPm/Rd9FY/4wMbkjSsyj0BVjNdkR7jSEXfddUyKf+H5qLqNFXEHfGp/p9FOEA==
+  dependencies:
+    "@uppy/utils" "^4.0.6"
+    namespace-emitter "^2.0.1"
+
+"@uppy/core@^2.1.1":
+  version "2.1.8"
+  resolved "https://registry.npmmirror.com/@uppy/core/-/core-2.1.8.tgz#a25b1de1d1d2310ecad37ae5121278130a192b89"
+  integrity sha512-VeViHpdFjXJxGlu9g9Byil6O5F5nbUcTBeulMR0KUwlARTB/+GKDngfTRfzI3Hh4FOXN6dTm7Szsd/UDa65zDw==
+  dependencies:
+    "@transloadit/prettier-bytes" "0.0.7"
+    "@uppy/store-default" "^2.0.3"
+    "@uppy/utils" "^4.0.6"
+    lodash.throttle "^4.1.1"
+    mime-match "^1.0.2"
+    namespace-emitter "^2.0.1"
+    nanoid "^3.1.25"
+    preact "^10.5.13"
+
+"@uppy/store-default@^2.0.3":
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.0.3.tgz#47ad4fc4816d21955ff37d6bb5096a93278c29e2"
+  integrity sha512-2BGlN1sW0cFv4rOqTK8dfSg579S984N1HxCJxLFqeW9nWD6zd/O8Omyd85tbxGQ+FLZLTmLOm/feD0YeCBMahg==
+
+"@uppy/utils@^4.0.4", "@uppy/utils@^4.0.6":
+  version "4.0.6"
+  resolved "https://registry.npmmirror.com/@uppy/utils/-/utils-4.0.6.tgz#298638721e87e751f82e53981e583cc2e2bc6098"
+  integrity sha512-40wXzjpE6Xu6eohZtoZzUxqjzYJhHcXSgtNIfT7uFeVIapPqdgMNjdSmvQqSc+UE2YF+pEL+Ys6np1zf9WmZ0Q==
+  dependencies:
+    lodash.throttle "^4.1.1"
+
+"@uppy/xhr-upload@^2.0.3":
+  version "2.0.7"
+  resolved "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.0.7.tgz#d9128be1fdde78edc61878e23930a2855f607df5"
+  integrity sha512-bzCc654B0HfNmL4BIr7gGTvg2pQBucYgPmAb4ST7jGyWlEJWbSxMXR/19zvISQzpJ6v1uP6q2ppgxGMqNdj/rA==
+  dependencies:
+    "@uppy/companion-client" "^2.0.4"
+    "@uppy/utils" "^4.0.4"
+    nanoid "^3.1.25"
+
 "@vant/icons@^1.7.1":
   version "1.7.1"
   resolved "https://registry.yarnpkg.com/@vant/icons/-/icons-1.7.1.tgz#49ae420302b5581e54e6894891e5a05bc76e9f87"
@@ -618,6 +678,84 @@
   dependencies:
     vue-demi "*"
 
+"@wangeditor/basic-modules@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.0.0.tgz#07e8f9096876da5437e2126ed53a2e8b9ea8c802"
+  integrity sha512-s+xkK6UbQg7ALzd6IxpnYdxMOZMOj6v4lPYYF0xVE5yjGsoZ1Ez/meTSH7MErE4lH/8ZAt2opfEe5B4jhgVBvg==
+  dependencies:
+    is-url "^1.2.4"
+
+"@wangeditor/code-highlight@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.0.tgz#b7a95e742827c63130b9273cdc3ce153f6e60884"
+  integrity sha512-1l97wm9K2GKcENDNrHgPa+9qPkXtvcyxHnMvmIxxLe8VoPcc8URQDf7FO2ZQYkGqsZiL6NdYgVT79gRh9vLsUQ==
+  dependencies:
+    prismjs "^1.23.0"
+
+"@wangeditor/core@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@wangeditor/core/-/core-1.0.0.tgz#0eb1d691672443068e1c2255629d0ca4c8de39f6"
+  integrity sha512-rHtDLEWbfyGjK8oQPfk+O0OckhsDc4nDulaci9hSR69+KqcIQAc6s7qkoUEuMuGax+Q3Csg8yDCGogWDQ7OPQA==
+  dependencies:
+    "@types/event-emitter" "^0.3.3"
+    event-emitter "^0.3.5"
+    html-void-elements "^2.0.0"
+    i18next "^20.4.0"
+    scroll-into-view-if-needed "^2.2.28"
+    slate-history "^0.66.0"
+
+"@wangeditor/editor-for-vue@^5.1.10":
+  version "5.1.10"
+  resolved "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.10.tgz#0dbab6227c46950a63ad23898edc1c37cfc294de"
+  integrity sha512-OdtMnMt0HpYriY1+Efo3KHviUB5zwlZIaHypNw5MPRn8uFq3MFLET5u8pbB/PiEF5Ff88YAp7T9Xw1dvJzT8sA==
+
+"@wangeditor/editor@^5.0.0":
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.0.0.tgz#8ccca4bee639343e560a78b7063c63a1013724a2"
+  integrity sha512-yOoGafe8lH3oXGDuWs7niZPTCPQNuqqcWA7638cusI41FTRO+0G638HWLq3gpKpnp+kTzxzXxNlC4ok0sK71pw==
+  dependencies:
+    "@uppy/core" "^2.1.1"
+    "@uppy/xhr-upload" "^2.0.3"
+    "@wangeditor/basic-modules" "^1.0.0"
+    "@wangeditor/code-highlight" "^1.0.0"
+    "@wangeditor/core" "^1.0.0"
+    "@wangeditor/list-module" "^1.0.0"
+    "@wangeditor/table-module" "^1.0.0"
+    "@wangeditor/upload-image-module" "^1.0.0"
+    "@wangeditor/video-module" "^1.0.0"
+    dom7 "^3.0.0"
+    is-hotkey "^0.2.0"
+    lodash.camelcase "^4.3.0"
+    lodash.clonedeep "^4.5.0"
+    lodash.debounce "^4.0.8"
+    lodash.foreach "^4.5.0"
+    lodash.isequal "^4.5.0"
+    lodash.throttle "^4.1.1"
+    lodash.toarray "^4.4.0"
+    nanoid "^3.2.0"
+    slate "^0.72.0"
+    snabbdom "^3.1.0"
+
+"@wangeditor/list-module@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.0.tgz#654c64b345648445dc032c63331a31980cb064e2"
+  integrity sha512-kRh8qqmebqCBJAiINFJnfQP6hA0wBqKOVWcSaQgUiDRC2PRf91HQrCjdza8xeaNzB+/qAPLbz/lmp+ru/1v1Yg==
+
+"@wangeditor/table-module@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.0.0.tgz#a279680cf8203f63013a42bb17f9a004d64f4b0c"
+  integrity sha512-+DDRjKgBJn24oczx6skEjP5ApggThzTxG8I9tbGmEF3wPQFmidiW+OEiMON57bqMMmQ51qMVeYl1vL4BcYm3ew==
+
+"@wangeditor/upload-image-module@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.0.tgz#2d22cb9d51e8d8d77e380e12dbf436b7b47a819c"
+  integrity sha512-WaxtlgxfEP7/+Qo4JA0wOtEBn4uqNRDoWPshbzB25J0KeMaHpst9DvpqCjMxYBzjYjtJoEhYeyazvrT/vnzzzA==
+
+"@wangeditor/video-module@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.0.0.tgz#0302b99012e17e864e1c64f84fe561183cf19052"
+  integrity sha512-TBN+aUWVFR4Og1+usqLsVZQ/SbFVy238SnZcJ6fanhm1VAFbi8CMU40OO9iXmFcVNe0yh+8EPvNuULNgb0f5xA==
+
 acorn-jsx@^5.2.0:
   version "5.3.2"
   resolved "https://registry.nlark.com/acorn-jsx/download/acorn-jsx-5.3.2.tgz?cache=0&sync_timestamp=1625793240297&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-jsx%2Fdownload%2Facorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
@@ -909,6 +1047,11 @@ commander@^7.2.0:
   resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
   integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
 
+compute-scroll-into-view@^1.0.17:
+  version "1.0.17"
+  resolved "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab"
+  integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==
+
 concat-map@0.0.1:
   version "0.0.1"
   resolved "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -987,6 +1130,14 @@ csstype@^2.6.8:
   resolved "https://registry.nlark.com/csstype/download/csstype-2.6.18.tgz#980a8b53085f34af313410af064f2bd241784218"
   integrity sha1-mAqLUwhfNK8xNBCvBk8r0kF4Qhg=
 
+d@1, d@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+  integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+  dependencies:
+    es5-ext "^0.10.50"
+    type "^1.0.1"
+
 dayjs@^1.10.7:
   version "1.10.7"
   resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468"
@@ -1027,6 +1178,13 @@ dom-serializer@^1.0.1:
     domhandler "^4.2.0"
     entities "^2.0.0"
 
+dom7@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz#b861ce5d67a6becd7aaa3ad02942ff14b1240331"
+  integrity sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==
+  dependencies:
+    ssr-window "^3.0.0-alpha.1"
+
 domelementtype@^2.0.1, domelementtype@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
@@ -1109,6 +1267,32 @@ es-module-lexer@^0.9.3:
   resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
   integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
 
+es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14:
+  version "0.10.60"
+  resolved "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.60.tgz#e8060a86472842b93019c31c34865012449883f4"
+  integrity sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==
+  dependencies:
+    es6-iterator "^2.0.3"
+    es6-symbol "^3.1.3"
+    next-tick "^1.1.0"
+
+es6-iterator@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+  integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+  dependencies:
+    d "^1.0.1"
+    ext "^1.1.2"
+
 esbuild-android-arm64@0.13.9:
   version "0.13.9"
   resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.9.tgz#6cc4a0c623332c0830a311ddd8242b1f496ff940"
@@ -1391,6 +1575,21 @@ esutils@^2.0.2:
   resolved "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
   integrity sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=
 
+event-emitter@^0.3.5:
+  version "0.3.5"
+  resolved "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+ext@^1.1.2:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52"
+  integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==
+  dependencies:
+    type "^2.5.0"
+
 external-editor@^3.0.3:
   version "3.1.0"
   resolved "https://registry.npm.taobao.org/external-editor/download/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
@@ -1613,6 +1812,18 @@ html-tags@^3.1.0:
   resolved "https://registry.npm.taobao.org/html-tags/download/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
   integrity sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=
 
+html-void-elements@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f"
+  integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==
+
+i18next@^20.4.0:
+  version "20.6.1"
+  resolved "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz#535e5f6e5baeb685c7d25df70db63bf3cc0aa345"
+  integrity sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==
+  dependencies:
+    "@babel/runtime" "^7.12.0"
+
 iconv-lite@^0.4.24:
   version "0.4.24"
   resolved "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1621826342262&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -1635,6 +1846,11 @@ ignore@^5.1.4, ignore@^5.1.8:
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
   integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
 
+immer@^9.0.6:
+  version "9.0.12"
+  resolved "https://registry.npmmirror.com/immer/-/immer-9.0.12.tgz#2d33ddf3ee1d247deab9d707ca472c8c942a0f20"
+  integrity sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==
+
 import-fresh@^3.0.0:
   version "3.3.0"
   resolved "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.3.0.tgz?cache=0&sync_timestamp=1608469579940&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -1723,6 +1939,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
   dependencies:
     is-extglob "^2.1.1"
 
+is-hotkey@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz#1835a68171a91e5c9460869d96336947c8340cef"
+  integrity sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==
+
 is-number@^7.0.0:
   version "7.0.0"
   resolved "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -1733,6 +1954,16 @@ is-observable@^2.1.0:
   resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-2.1.0.tgz#5c8d733a0b201c80dff7bb7c0df58c6a255c7c69"
   integrity sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==
 
+is-plain-object@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
+  integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
+
+is-url@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+  integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
 isexe@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@@ -1821,6 +2052,41 @@ local-pkg@^0.1.0:
   dependencies:
     mlly "^0.2.2"
 
+lodash.camelcase@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+  integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
+
+lodash.clonedeep@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+  integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
+
+lodash.debounce@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+  integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.foreach@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
+  integrity sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==
+
+lodash.isequal@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+  integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
+
+lodash.throttle@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
+  integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==
+
+lodash.toarray@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
+  integrity sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==
+
 lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21:
   version "4.17.21"
   resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@@ -1875,6 +2141,13 @@ micromatch@^4.0.4:
     braces "^3.0.1"
     picomatch "^2.2.3"
 
+mime-match@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8"
+  integrity sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==
+  dependencies:
+    wildcard "^1.1.0"
+
 mimic-fn@^2.1.0:
   version "2.1.0"
   resolved "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz?cache=0&sync_timestamp=1617823583529&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
@@ -1916,11 +2189,21 @@ mute-stream@0.0.8:
   resolved "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
   integrity sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=
 
+namespace-emitter@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz#978d51361c61313b4e6b8cf6f3853d08dfa2b17c"
+  integrity sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==
+
 nanocolors@^0.1.12:
   version "0.1.12"
   resolved "https://registry.yarnpkg.com/nanocolors/-/nanocolors-0.1.12.tgz#8577482c58cbd7b5bb1681db4cf48f11a87fd5f6"
   integrity sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==
 
+nanoid@^3.1.25, nanoid@^3.2.0:
+  version "3.3.2"
+  resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557"
+  integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==
+
 nanoid@^3.1.28, nanoid@^3.1.30:
   version "3.1.30"
   resolved "https://registry.npmmirror.com/nanoid/download/nanoid-3.1.30.tgz?cache=0&sync_timestamp=1634166192601&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnanoid%2Fdownload%2Fnanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362"
@@ -1936,6 +2219,11 @@ neo-async@^2.6.2:
   resolved "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
   integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8=
 
+next-tick@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+  integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
 nice-try@^1.0.4:
   version "1.0.5"
   resolved "https://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz?cache=0&sync_timestamp=1614510039289&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnice-try%2Fdownload%2Fnice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
@@ -2141,6 +2429,11 @@ postcss@^8.3.8:
     picocolors "^1.0.0"
     source-map-js "^0.6.2"
 
+preact@^10.5.13:
+  version "10.7.1"
+  resolved "https://registry.npmmirror.com/preact/-/preact-10.7.1.tgz#bdd2b2dce91a5842c3b9b34dfe050e5401068c9e"
+  integrity sha512-MufnRFz39aIhs9AMFisonjzTud1PK1bY+jcJLo6m2T9Uh8AqjD77w11eAAawmjUogoGOnipECq7e/1RClIKsxg==
+
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.nlark.com/prelude-ls/download/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -2158,6 +2451,11 @@ prettier@^2.4.1:
   resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c"
   integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==
 
+prismjs@^1.23.0:
+  version "1.28.0"
+  resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6"
+  integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==
+
 progress@^2.0.0:
   version "2.0.3"
   resolved "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
@@ -2197,6 +2495,11 @@ readdirp@~3.6.0:
   dependencies:
     picomatch "^2.2.1"
 
+regenerator-runtime@^0.13.4:
+  version "0.13.9"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
+  integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
+
 regexpp@^2.0.1:
   version "2.0.1"
   resolved "https://registry.nlark.com/regexpp/download/regexpp-2.0.1.tgz?cache=0&sync_timestamp=1623669331185&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregexpp%2Fdownload%2Fregexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
@@ -2320,6 +2623,13 @@ schema-utils@^3.0.0:
     ajv "^6.12.5"
     ajv-keywords "^3.5.2"
 
+scroll-into-view-if-needed@^2.2.28:
+  version "2.2.29"
+  resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz#551791a84b7e2287706511f8c68161e4990ab885"
+  integrity sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==
+  dependencies:
+    compute-scroll-into-view "^1.0.17"
+
 semver@^5.5.0:
   version "5.7.1"
   resolved "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
@@ -2368,6 +2678,22 @@ slash@^3.0.0:
   resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
   integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
 
+slate-history@^0.66.0:
+  version "0.66.0"
+  resolved "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz#ac63fddb903098ceb4c944433e3f75fe63acf940"
+  integrity sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==
+  dependencies:
+    is-plain-object "^5.0.0"
+
+slate@^0.72.0:
+  version "0.72.8"
+  resolved "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz#5a018edf24e45448655293a68bfbcf563aa5ba81"
+  integrity sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==
+  dependencies:
+    immer "^9.0.6"
+    is-plain-object "^5.0.0"
+    tiny-warning "^1.0.3"
+
 slice-ansi@^2.1.0:
   version "2.1.0"
   resolved "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz?cache=0&sync_timestamp=1618554953055&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslice-ansi%2Fdownload%2Fslice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
@@ -2377,6 +2703,11 @@ slice-ansi@^2.1.0:
     astral-regex "^1.0.0"
     is-fullwidth-code-point "^2.0.0"
 
+snabbdom@^3.1.0:
+  version "3.4.0"
+  resolved "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.4.0.tgz#c76ed02643729f84a63875b7894a0fbcdc95c710"
+  integrity sha512-Sr5H1l5QxJa0B/68ZtpWi7MuGIzLWS2Up64QqXe/wzvWOjXvM9rL7+C8GhMmDVtJ7dFWypvyWJHR3nmeZN8YIQ==
+
 snake-case@^3.0.4:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c"
@@ -2428,6 +2759,11 @@ sprintf-js@~1.0.2:
   resolved "https://registry.nlark.com/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
   integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
 
+ssr-window@^3.0.0-alpha.1:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz#fd5b82801638943e0cc704c4691801435af7ac37"
+  integrity sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==
+
 stable@^0.1.8:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
@@ -2534,6 +2870,11 @@ through@^2.3.6:
   resolved "https://registry.nlark.com/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
   integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
 
+tiny-warning@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
+  integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
+
 "tiny-worker@>= 2":
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/tiny-worker/-/tiny-worker-2.3.0.tgz#715ae34304c757a9af573ae9a8e3967177e6011e"
@@ -2599,6 +2940,16 @@ type-fest@^0.8.1:
   resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
   integrity sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=
 
+type@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+  integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.5.0:
+  version "2.6.0"
+  resolved "https://registry.npmmirror.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f"
+  integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==
+
 typescript@^4.4.4:
   version "4.4.4"
   resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c"
@@ -2774,6 +3125,11 @@ which@^1.2.9:
   dependencies:
     isexe "^2.0.0"
 
+wildcard@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5"
+  integrity sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==
+
 word-wrap@~1.2.3:
   version "1.2.3"
   resolved "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"