Prechádzať zdrojové kódy

Merge branch '165' of uskycloud/usky-web-mobile into master

xf15575941817 1 rok pred
rodič
commit
2c6415161f
59 zmenil súbory, kde vykonal 2122 pridanie a 347 odobranie
  1. 10 0
      src/api/common/applicationInfo.js
  2. 10 0
      src/api/common/customManage.js
  3. 0 0
      src/api/common/export.js
  4. 0 0
      src/api/common/invoicing.js
  5. 10 0
      src/api/mine/secure/loginLog.js
  6. 198 0
      src/components/oa-scroll/index.vue
  7. 2 0
      src/config.js
  8. 2 0
      src/main.js
  9. 4 3
      src/manifest.json
  10. 28 0
      src/pages.json
  11. 34 14
      src/pages/business/fireIot/deviceSelect/components/deviceDetailsList.vue
  12. 12 11
      src/pages/business/fireIot/deviceSelect/index.vue
  13. 44 54
      src/pages/business/fireIot/facilitiesGather/mapGather.vue
  14. 32 11
      src/pages/business/fireIot/facilitiesView/facilitiesDetailsList.vue
  15. 20 10
      src/pages/business/fireIot/facilitiesView/index.vue
  16. 81 0
      src/pages/business/fireIot/facilitiesView/mapGatherView.vue
  17. 7 7
      src/pages/business/mhxf/fireReport/index.vue
  18. 12 21
      src/pages/business/mhxf/needMatter/index.vue
  19. 176 0
      src/pages/common/applicationInfo/index.vue
  20. 257 0
      src/pages/common/customManage/index.vue
  21. 8 5
      src/pages/common/invoicing/index.vue
  22. 1 1
      src/pages/common/success/index.vue
  23. 6 2
      src/pages/common/textview/index1.vue
  24. 45 46
      src/pages/index.vue
  25. 24 0
      src/pages/info.vue
  26. 3 1
      src/pages/mine/about/index.vue
  27. 0 17
      src/pages/mine/help/index.vue
  28. 5 0
      src/pages/mine/secure/index.vue
  29. 143 0
      src/pages/mine/secure/loginLog/index.vue
  30. 66 2
      src/plugins/common.plugins.js
  31. 8 13
      src/static/amap/coordination.html
  32. 0 0
      src/static/amap/js/uni.webview.1.5.4.js
  33. 268 83
      src/static/amap/mapGather.html
  34. 193 0
      src/static/amap/mapGatherView.html
  35. 8 4
      src/static/iconfont/iconfont.css
  36. BIN
      src/static/iconfont/iconfont.ttf
  37. BIN
      src/static/images/common/applicationInfo.png
  38. 6 4
      src/uni_modules/uview-plus/changelog.md
  39. 1 1
      src/uni_modules/uview-plus/components/u-back-top/u-back-top.vue
  40. 3 1
      src/uni_modules/uview-plus/components/u-calendar/header.vue
  41. 1 1
      src/uni_modules/uview-plus/components/u-calendar/month.vue
  42. 1 1
      src/uni_modules/uview-plus/components/u-calendar/u-calendar.vue
  43. 1 1
      src/uni_modules/uview-plus/components/u-calendar/util.js
  44. 2 2
      src/uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker.vue
  45. 2 1
      src/uni_modules/uview-plus/components/u-form-item/u-form-item.vue
  46. 1 1
      src/uni_modules/uview-plus/components/u-list/u-list.vue
  47. 318 0
      src/uni_modules/uview-plus/components/u-message-input/u-message-input.vue
  48. 1 2
      src/uni_modules/uview-plus/components/u-picker/u-picker.vue
  49. 1 1
      src/uni_modules/uview-plus/components/u-scroll-list/u-scroll-list.vue
  50. 3 3
      src/uni_modules/uview-plus/components/u-sticky/u-sticky.vue
  51. 17 12
      src/uni_modules/uview-plus/components/u-transition/transition.js
  52. 1 0
      src/uni_modules/uview-plus/components/u-transition/u-transition.vue
  53. 0 1
      src/uni_modules/uview-plus/components/u-upload/u-upload.vue
  54. 1 0
      src/uni_modules/uview-plus/index.scss
  55. 1 3
      src/uni_modules/uview-plus/libs/config/props.js
  56. 39 0
      src/uni_modules/uview-plus/libs/css/flex.scss
  57. 4 4
      src/uni_modules/uview-plus/libs/function/platform.js
  58. 1 1
      src/uni_modules/uview-plus/package.json
  59. 0 2
      src/utils/jssdk.js

+ 10 - 0
src/api/common/applicationInfo.js

@@ -0,0 +1,10 @@
+import { request } from "@/utils/request";
+
+//消息列表-查询
+export function infoList(param) {
+    return request({
+        url: "/system/notice/list",
+        method: "GET",
+        data: param,
+    });
+}

+ 10 - 0
src/api/common/customManage.js

@@ -0,0 +1,10 @@
+import { request } from "@/utils/request";
+
+//消息列表-查询
+export function crmCustomInfo(param) {
+    return request({
+        url: "/service-iot/crmCustomInfo/page",
+        method: "POST",
+        data: param,
+    });
+}

+ 0 - 0
src/api/common/export.js


+ 0 - 0
src/api/common/invoicing/index.js → src/api/common/invoicing.js


+ 10 - 0
src/api/mine/secure/loginLog.js

@@ -0,0 +1,10 @@
+import { request } from "@/utils/request";
+
+//消息列表-查询
+export function loginLogList(param) {
+    return request({
+        url: "/system/logininfor/list",
+        method: "GET",
+        data: param,
+    });
+}

+ 198 - 0
src/components/oa-scroll/index.vue

@@ -0,0 +1,198 @@
+<template>
+  <scroll-view
+    :scroll-y="true"
+    scroll-with-animation
+    :refresher-threshold="refresherThreshold"
+    :refresher-default-style="refresherDefaultStyle"
+    :refresherEnabled="refresherEnabled"
+    :refresher-triggered="triggered"
+    :refresher-background="refresherBackground"
+    :scroll-top="scrollTop"
+    @refresherrefresh="onRefresh"
+    @scrolltolower="scrolltolower"
+  >
+    <slot name="topLoading" v-if="refresherDefaultStyle === 'none'">
+      <view
+        class="topBox"
+        :style="{
+          marginTop: '-' + refresherThreshold + 'px',
+          height: refresherThreshold + 'px',
+        }"
+      >
+        <view class="loader">
+          <view v-for="(v, i) in 10" :key="v" :style="{ transform: 'rotate(' + i * 36 + 'deg)', animationDelay: v == 10 ? 1 + 's' : '0.' + v + 's' }"> </view>
+        </view>
+        <view class="title">
+          {{ topTis }}
+        </view>
+      </view>
+    </slot>
+    <slot name="default"> </slot>
+    <slot name="bottomLoading">
+      <div
+        class="bottoBox"
+        :style="{
+          marginTop: lowerThreshold + 'px',
+        }"
+        v-if="refresherLoad"
+      >
+        {{ pageSize >= total ? "没有更多啦~" : isScrolltolower }}
+      </div>
+    </slot>
+  </scroll-view>
+</template>
+<script setup>
+import { onReady, onLoad, onShow, onNavigationBarButtonTap, onPullDownRefresh, onReachBottom } from "@dcloudio/uni-app";
+import { ref, onMounted, inject, shallowRef, reactive, getCurrentInstance, watchEffect, toRefs, toRef, watch } from "vue";
+
+const emit = defineEmits(["load", "refresh"]);
+const props = defineProps({
+  //当前页数量
+  pageSize: {
+    type: Number,
+    default: 30,
+  },
+  //数据总数
+  total: {
+    type: Number,
+    default: 0,
+  },
+
+  //设置滚动条位置
+  scrollTop: {
+    type: String,
+    default: "",
+  },
+  //是否开启上拉加载
+  refresherLoad: {
+    type: Boolean,
+    default: false,
+  },
+  // 距离底部上拉加载距离
+  lowerThreshold: {
+    type: Number,
+    default: 20,
+  },
+  //是否开启下拉刷新
+  refresherEnabled: {
+    type: Boolean,
+    default: false,
+  },
+  //距离顶部下拉刷新距离
+  refresherThreshold: {
+    type: Number,
+    default: 45,
+  },
+  //是否使用默认下拉刷新样式(支持设置 black、white、none/none 表示不使用默认样式)
+  refresherDefaultStyle: {
+    type: String,
+    default: "black",
+  },
+  //设置自定义下拉刷新区域背景颜色
+  refresherBackground: {
+    type: String,
+    default: "#fff",
+  },
+});
+
+const { pageSize, total, scrollTop, refresherLoad, lowerThreshold, refresherEnabled, refresherThreshold, refresherDefaultStyle, refresherBackground } = toRefs(props);
+
+const defaultOption = reactive({});
+
+const {} = toRefs(defaultOption);
+
+const defaultArray = reactive({
+  triggered: false,
+  topTis: "松手刷新",
+  isScrolltolower: "上拉加载更多",
+});
+
+const { triggered, topTis, isScrolltolower } = toRefs(defaultArray);
+
+/**
+ * @scrollView上拉刷新
+ */
+function onRefresh() {
+  isScrolltolower.value = "上拉加载更多";
+  topTis.value = "努力加载中";
+  //做一个判断,判断triggered 是否为true
+  if (!triggered.value) {
+    triggered.value = true;
+    setTimeout((e) => {
+      triggered.value = false;
+      topTis.value = "松手刷新";
+      emit("refresh");
+    }, 1000);
+  }
+}
+
+/**
+ * @scrollView触底事件
+ */
+function scrolltolower(e) {
+  if (!refresherLoad.value || pageSize.value >= total.value) {
+    return;
+  } else {
+    isScrolltolower.value = "正在加载中~";
+    setTimeout(() => {
+      emit("load");
+      isScrolltolower.value = "上拉加载更多";
+    }, 1000);
+  }
+}
+
+onLoad((option) => {});
+</script>
+
+<style scoped>
+.topBox {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: gray;
+}
+
+.topBox .loader {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 100%;
+  position: relative;
+  margin-top: -25rpx;
+}
+
+.topBox .loader view {
+  width: 2px;
+  height: 6px;
+  background-color: gray;
+  transform-origin: 50% 150%;
+  position: absolute;
+  animation: color-change 1s infinite;
+}
+
+.topBox .title {
+  position: relative;
+  margin-left: 35rpx;
+  color: #909399;
+  font-size: 0.75rem;
+}
+
+@keyframes color-change {
+  from {
+    background-color: gray;
+  }
+
+  to {
+    background-color: white;
+  }
+}
+
+.bottoBox {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #909399;
+  font-size: 0.75rem;
+}
+</style>

+ 2 - 0
src/config.js

@@ -24,6 +24,8 @@ export default {
     hotline: "021-65376655",
     // 官方网站
     site_url: "http://www.usky.cn/",
+    // 版权
+    copyright:"Copyright © 2021- 2025 Usky. All Rights Reserved. 永天股份 版权所有",
     // 政策协议
     agreements: [
       {

+ 2 - 0
src/main.js

@@ -18,6 +18,7 @@ import oaTabbar from "@/components/oa-tabbar/index";
 import oaTimeLine from "@/components/oa-timeLine/index"
 import oaTimeLineItem from "@/components/oa-timeLine-item/index"
 import oaUpload from "@/components/oa-upload/index"
+import oaScroll from "@/components/oa-scroll/index"
 
 export function createApp() {
   const app = createSSRApp(App);
@@ -28,6 +29,7 @@ export function createApp() {
   app.component('oa-timeLine', oaTimeLine)
   app.component('oa-timeLine-item', oaTimeLineItem)
   app.component('oa-upload', oaUpload)
+  app.component('oa-scroll', oaScroll)
 
   // 挂载全局json导出
   app.component("downloadExcel", JsonExcel);

+ 4 - 3
src/manifest.json

@@ -2,8 +2,8 @@
     "name" : "综合智慧云",
     "appid" : "__UNI__36DE3A0",
     "description" : "综合智慧云",
-    "versionName" : "2.0.3",
-    "versionCode" : 5,
+    "versionName" : "2.0.4",
+    "versionCode" : 6,
     "transformPx" : false,
     /* 5+App特有相关 */
     "app-plus" : {
@@ -151,7 +151,8 @@
                 }
             }
         },
-        "safearea" : { //可选,JSON对象,安全区域配置
+        "safearea" : {
+            //可选,JSON对象,安全区域配置
             "offset" : "none"
         }
     },

+ 28 - 0
src/pages.json

@@ -126,6 +126,13 @@
             "enablePullDownRefresh": false
           }
         },
+        {
+          "path": "customManage/index",
+          "style": {
+            "navigationBarTitleText": "客户管理",
+            "enablePullDownRefresh": false
+          }
+        },
         {
           "path": "success/index",
           "style": {
@@ -133,6 +140,13 @@
             "navigationStyle": "custom",
             "enablePullDownRefresh": false
           }
+        },
+        {
+          "path": "applicationInfo/index",
+          "style": {
+            "navigationBarTitleText": "应用消息",
+            "enablePullDownRefresh": false
+          }
         }
       ]
     },
@@ -162,6 +176,13 @@
             "navigationBarTitleText": "账号与安全"
           }
         },
+        {
+          "path": "secure/loginLog/index",
+          "style": {
+            "navigationBarTitleText": "登录日志",
+            "enablePullDownRefresh": false
+          }
+        },
         {
           "path": "avatar/index",
           "style": {
@@ -494,6 +515,13 @@
             "enablePullDownRefresh": false
           }
         },
+        {
+          "path": "facilitiesView/mapGatherView",
+          "style": {
+            "navigationBarTitleText": "设施查看",
+            "enablePullDownRefresh": false
+          }
+        },
         {
           "path": "facilitiesView/facilitiesDetailsList",
           "style": {

+ 34 - 14
src/pages/business/fireIot/deviceSelect/components/deviceDetailsList.vue

@@ -1,5 +1,5 @@
 <template>
-  <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
+  <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name" @scrolltolower="scrolltolower">
     <u-sticky class="example-body" style="top: 0px">
       <view class="padding-sm padding-tb-10" :class="'bg-' + proxy.$settingStore.themeColor.name">
         <u--input
@@ -14,7 +14,8 @@
       </view>
     </u-sticky>
 
-    <view class="deviceDetailsList-container">
+    <u-empty v-show="dataList.length <= 0" text="暂无数据" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png"> </u-empty>
+    <view v-if="dataList.length > 0" class="deviceDetailsList-container">
       <view class="menu-list margin-0">
         <view class="list-cell list-cell-arrow" v-for="(base, index) in dataList" :key="index" @click="handleToDevice(base)">
           <view class="menu-item-box">
@@ -22,8 +23,7 @@
           </view>
         </view>
       </view>
-
-      <uni-pagination class="block app-pagination bg-white" :current="current" :total="total" :pageSize="pageSize" prev-text="上一页" next-text="下一页" @change="paginationChange" />
+      <u-loadmore :status="status" @click="scrolltolower" />
     </view>
   </scroll-view>
 </template>
@@ -39,7 +39,7 @@ const { proxy } = getCurrentInstance();
 const publicStore = publicStores();
 
 const dataList = ref([]);
-
+const status = ref("loadmore");
 const deviceName = ref("");
 const productId = ref("");
 const productName = ref("");
@@ -51,6 +51,15 @@ const total = ref(0);
  * @页面初始化
  */
 function init() {
+  dmpDeviceInfoApi();
+}
+
+/**
+ * @列表查询
+ * @api接口查询
+ */
+
+function dmpDeviceInfoApi() {
   dmpDeviceInfo({ productId: productId.value, deviceName: deviceName.value, current: current.value, size: pageSize.value }).then((requset) => {
     if (requset.status === "SUCCESS") {
       dataList.value = requset.data.records;
@@ -59,18 +68,14 @@ function init() {
       uni.setNavigationBarTitle({
         title: `${productName.value}(${total.value})`,
       });
+
+      if (total.value == dataList.value.length) {
+        status.value = "nomore";
+      }
     }
   });
 }
 
-/**
- * @分页chage事件
- */
-function paginationChange(e) {
-  current.value = e.current;
-  init();
-}
-
 /**
  * @设备详情跳转点击事件
  */
@@ -81,6 +86,22 @@ function handleToDevice(array) {
   publicStore.$state.deviceDetailsArray.productName = productName.value;
 }
 
+/**
+ * @scrollView触底事件
+ */
+function scrolltolower(e) {
+  if (total.value == dataList.value.length) {
+    status.value = "nomore";
+    return;
+  } else {
+    status.value = "loading";
+    pageSize.value += 10;
+    setTimeout(() => {
+      dmpDeviceInfoApi();
+    }, 1000);
+  }
+}
+
 onReady(() => {});
 
 onShow(() => {
@@ -97,7 +118,6 @@ onLoad((options) => {
     init();
   }
 });
-
 </script>
 
 <style lang="scss" scoped>

+ 12 - 11
src/pages/business/fireIot/deviceSelect/index.vue

@@ -1,14 +1,15 @@
 <template>
   <scroll-view class="bg-white scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.type">
-    <u-grid :border="true">
-      <u-grid-item v-for="(base, index) in dataList" :key="index" @click="handleToDevice(base.id, base.productName)">
-        <u-badge type="primary" max="9999" :value="base.deviceCount" :showZero="true" :absolute="true" :offset="[10, 10, 0, 0]"></u-badge>
-        <image class="margin-b-15" style="width: 40px; height: 40px; margin-top: 35px" :src="base.imagePath" mode="aspectFill"></image>
-        <text class="margin-b-15 grid-text">{{ base.productName }}</text>
-      </u-grid-item>
-    </u-grid>
-
-    <!-- <uni-pagination class="app-pagination bg-white" :current="current" :total="total" :pageSize="pageSize" prev-text="前一页" next-text="后一页" @change="paginationChange" /> -->
+    <u-empty v-if="dataList.length <= 0" text="暂无数据" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png"> </u-empty>
+    <view v-else class="deviceSelect">
+      <u-grid :border="true">
+        <u-grid-item v-for="(base, index) in dataList" :key="index" @click="handleToDevice(base.id, base.productName)">
+          <u-badge type="primary" max="9999" :value="base.deviceCount" :showZero="true" :absolute="true" :offset="[10, 10, 0, 0]"></u-badge>
+          <image class="margin-b-15" style="width: 40px; height: 40px; margin-top: 35px" :src="base.typeImg" mode="aspectFill"></image>
+          <text class="margin-b-15 grid-text">{{ base.productName }}</text>
+        </u-grid-item>
+      </u-grid>
+    </view>
   </scroll-view>
 </template>
 
@@ -33,8 +34,8 @@ function init() {
   dmpProductInfo({ productName: "", current: current.value, size: pageSize.value }).then((requset) => {
     if (requset.status === "SUCCESS") {
       requset.data.records.forEach((el) => {
-        if ("imagePath" in el == false) {
-          el.imagePath = "/static/images/404.png";
+        if ("typeImg" in el == false) {
+          el.typeImg = "/static/images/404.png";
         }
 
         if (el.deviceCount == null) {

+ 44 - 54
src/pages/business/fireIot/facilitiesGather/mapGather.vue

@@ -1,15 +1,14 @@
 <template>
-  <view id="mapF">
-    <web-view
-      ref="amapView"
-      src="/static/amap/mapGather.html"
-      bindmessage="receiveMessage"
-      :webview-styles="{
-        height: proxy.$settingStore.webViewHeight,
-      }"
-      @message="onMessage"
-    ></web-view>
-  </view>
+  <web-view
+    id="amapView"
+    ref="amapView"
+    src="/static/amap/mapGather.html"
+    bindmessage="receiveMessage"
+    :webview-styles="{
+      height: proxy.$settingStore.webViewHeight,
+    }"
+    @message="onMessage"
+  ></web-view>
 </template>
 
 <script setup>
@@ -21,58 +20,49 @@ const publicStore = publicStores(); //全局公共Store
 
 const { proxy } = getCurrentInstance();
 
-const webviewStyle = ref({});
+const pages = getCurrentPages();
 
-function onMessage(e) {
-  console.log("Received message from web page:", e.detail.data);
-  uni.showToast({
-    title: e.detail.data,
-    icon: "none",
-  });
-}
+const dataArray = publicStore.$state.facilitiesGatherArray;
+const dataType = publicStore.$state.facilitiesGatherType;
 
 // #ifdef APP-PLUS
-let wv = plus.webview.create(
-  "/static/amap/mapGather.html?t=" + new Date().getTime(), //date保证不走缓存
-  "batch_view",
-  {
-    top: "0",
-    left: "0",
-    height: "100%",
-    width: "100%",
-  },
-  {
-    data: {
-      token: 1,
-      userInfo: 1,
-      implantType: "uniapp",
-    },
-  }
-); //不用data键值对的方式传的话,h5接收后会是多个字段,而非一个对象
-let pages = getCurrentPages();
-let page = pages[pages.length - 1];
-let ws = page.$getAppWebview();
+setTimeout(() => {
+  var currentWebview = pages[pages.length - 1].$getAppWebview();
+  var wv = currentWebview.children()[0];
+  wv.evalJS(`receiveData(${JSON.stringify({ dataArray: dataArray, dataType: dataType })})`);
+}, 1000);
 // #endif
 
+function onMessage(e) {
+  console.log("父页面:", e.detail.data);
+  publicStore.$state.facilitiesGatherArray = JSON.parse(e.detail.data);
+  uni.redirectTo({
+    url: "/pages/business/fireIot/facilitiesGather/index",
+  });
+}
+
 // #ifdef H5
-window.addEventListener(
-  "message",
-  (event) => {
-    console.log("父页面:", event);
-  },
-  false
-);
-// #endif
+setTimeout(() => {
+  var iframe = document.getElementById("amapView");
+  var message = {
+    funcName: "children",
+    param: JSON.stringify(dataArray),
+    typeName: dataType,
+  };
+
+  iframe.contentWindow.postMessage(message, "*");
+}, 1000);
 
-// 自定义导航事件
-onNavigationBarButtonTap((e) => {
-  if (e.float == "right") {
-    uni.navigateTo({
-      url: "pages/business/fireIot/facilitiesGather/index",
+window.onmessage = function (event) {
+  if ("funcName" in event.data) {
+    console.log("父页面:", event);
+    publicStore.$state.facilitiesGatherArray = JSON.parse(event.data.param);
+    uni.redirectTo({
+      url: "/pages/business/fireIot/facilitiesGather/index",
     });
-  } else {
   }
-});
+};
+// #endif
 
 onLoad((options) => {});
 

+ 32 - 11
src/pages/business/fireIot/facilitiesView/facilitiesDetailsList.vue

@@ -1,5 +1,5 @@
 <template>
-  <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
+  <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name" @scrolltolower="scrolltolower">
     <u-sticky class="example-body" style="top: 0px">
       <view class="padding-sm padding-tb-10" :class="'bg-' + proxy.$settingStore.themeColor.name">
         <u--input
@@ -14,7 +14,8 @@
       </view>
     </u-sticky>
 
-    <view class="facilitiesDetailsList-container">
+    <u-empty v-show="dataList.length <= 0" text="暂无数据" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png"> </u-empty>
+    <view v-if="dataList.length > 0" class="facilitiesDetailsList-container">
       <view class="menu-list margin-0">
         <view class="list-cell list-cell-arrow" v-for="(base, index) in dataList" :key="index" @click="handleToDevice(base.id)">
           <view class="menu-item-box">
@@ -23,7 +24,7 @@
         </view>
       </view>
 
-      <uni-pagination class="block app-pagination bg-white" :current="current" :total="total" :pageSize="pageSize" prev-text="上一页" next-text="下一页" @change="paginationChange" />
+      <u-loadmore :status="status" @click="scrolltolower" />
     </view>
   </scroll-view>
 </template>
@@ -38,7 +39,7 @@ import { baseGgpFacility } from "@/api/business/fireIot/facilitiesView/index";
 const { proxy } = getCurrentInstance();
 
 const dataList = ref([]);
-
+const status = ref("loadmore");
 const facilityType = ref(undefined);
 const facilityName = ref("");
 const facilityTypeName = ref("");
@@ -50,6 +51,14 @@ const total = ref(0);
  * @页面初始化
  */
 function init() {
+  selectListApi();
+}
+
+/**
+ * @列表查询
+ * @api接口查询
+ */
+function selectListApi() {
   baseGgpFacility({ facilityType: facilityType.value, facilityName: facilityName.value, current: current.value, size: pageSize.value }).then((requset) => {
     if (requset.status === "SUCCESS") {
       if (requset.data.records.length > 0) {
@@ -60,23 +69,35 @@ function init() {
 
       dataList.value = requset.data.records;
       total.value = requset.data.total;
+
+      if (total.value == dataList.value.length) {
+        status.value = "nomore";
+      }
     }
   });
 }
 
 /**
- * @分页chage事件
+ * @设备详情跳转点击事件
  */
-function paginationChange(e) {
-  current.value = e.current;
-  init();
+function handleToDevice(id) {
+  proxy.$tab.navigateTo(`/pages/business/fireIot/facilitiesView/facilitiesDetails?id=${id}&typeName=${facilityTypeName.value}`);
 }
 
 /**
- * @设备详情跳转点击事件
+ * @scrollView触底事件
  */
-function handleToDevice(id) {
-  proxy.$tab.navigateTo(`/pages/business/fireIot/facilitiesView/facilitiesDetails?id=${id}&typeName=${facilityTypeName.value}`);
+function scrolltolower(e) {
+  if (total.value == dataList.value.length) {
+    status.value = "nomore";
+    return;
+  } else {
+    status.value = "loading";
+    pageSize.value += 10;
+    setTimeout(() => {
+      selectListApi();
+    }, 1000);
+  }
 }
 
 onReady(() => {});

+ 20 - 10
src/pages/business/fireIot/facilitiesView/index.vue

@@ -1,30 +1,33 @@
 <template>
   <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
     <view class="flex padding-tb-sm bg-white">
-      <view class="padding-lr-sm text-center" style="width: 50%">设施类型:{{ typeNum ? typeNum : 0 }}</view>
+      <view class="padding-lr-sm text-center" style="width: 50%">设施类型:{{ typeNum || 0 }}</view>
       <view class="divider-default"></view>
-      <view class="padding-lr-sm text-center" style="width: 50%">设施总数:{{ facilityNum ? facilityNum : 0 }}</view>
+      <view class="padding-lr-sm text-center" style="width: 50%">设施总数:{{ facilityNum || 0 }}</view>
     </view>
 
-    <view class="flex bg-white margin-lr-sm margin-top-sm padding-sm shadow-default radius" v-for="(data, index) in dataList" :key="index" @click="handleToDevice(data.id, data.typeName)">
-      <view class="margin-right-sm" style="margin-top: auto; margin-bottom: auto">
+    <view class="flex bg-white margin-lr-sm margin-top-sm padding-sm shadow-default radius" v-for="(data, index) in dataList" :key="index">
+      <view class="margin-right-sm" style="margin-top: auto; margin-bottom: auto" @click="handleToDevice(data.id, data.typeName)">
         <image style="width: 40px; height: 40px" :src="data.typeImg ? data.typeImg : '/static/images/404.png'" mode="aspectFill"></image>
       </view>
 
-      <view style="width: 100%">
+      <view style="width: 100%" @click="handleToDevice(data.id, data.typeName)">
         <view class="flex margin-bottom-xl">
           <view class="text-dfl text-bold">{{ data.typeName }}</view>
-          <view style="font-size: 14px; margin-top: auto; margin-right: auto">({{ data.typeFacilityNum ? data.typeFacilityNum : 0 }})</view>
-          <view style="font-size: 14px; margin-top: auto" :style="{ color: proxy.$settingStore.themeColor.color }">查看地图</view>
+          <view style="font-size: 14px; margin-top: auto; margin-right: auto">({{ data.typeFacilityNum || 0 }})</view>
         </view>
         <view>
           <view class="flex">
-            <view style="font-size: 14px; width: 33.33%">正常:{{ data.normalFacilityNum ? data.normalFacilityNum : 0 }}</view>
-            <view style="font-size: 14px; width: 33.33%">维修:{{ data.upkeepFacilityNum ? data.upkeepFacilityNum : 0 }}</view>
-            <view style="font-size: 14px; width: 33.33%">关闭:{{ data.closeFacilityNum ? data.closeFacilityNum : 0 }}</view>
+            <view style="font-size: 14px; width: 33.33%">正常:{{ data.normalFacilityNum || 0 }}</view>
+            <view style="font-size: 14px; width: 33.33%">维修:{{ data.upkeepFacilityNum || 0 }}</view>
+            <view style="font-size: 14px; width: 33.33%">关闭:{{ data.closeFacilityNum || 0 }}</view>
           </view>
         </view>
       </view>
+
+      <view style="margin-top: auto; margin-bottom: auto" @click="handleToMap(data.id)">
+        <view class="iconfont ucicon-app-map icon" :style="{ color: proxy.$settingStore.themeColor.color, fontSize: '22px' }"></view>
+      </view>
     </view>
   </scroll-view>
 </template>
@@ -67,6 +70,13 @@ function handleToDevice(id, typeName) {
   proxy.$tab.navigateTo(`/pages/business/fireIot/facilitiesView/facilitiesDetailsList?id=${id}&typeName=${typeName}`);
 }
 
+/**
+ * @设施地图查看
+ */
+function handleToMap(id) {
+  proxy.$tab.navigateTo(`/pages/business/fireIot/facilitiesView/mapGatherView?facilitiesId=${id}`);
+}
+
 onLoad(() => {
   init();
 });

+ 81 - 0
src/pages/business/fireIot/facilitiesView/mapGatherView.vue

@@ -0,0 +1,81 @@
+<template>
+  <web-view
+    id="amapView"
+    ref="amapView"
+    src="/static/amap/mapGatherView.html"
+    bindmessage="receiveMessage"
+    :webview-styles="{
+      height: proxy.$settingStore.webViewHeight,
+    }"
+    @message="onMessage"
+  ></web-view>
+</template>
+
+<script setup>
+import { onReady, onLoad, onShow, onNavigationBarButtonTap } from "@dcloudio/uni-app";
+import { ref, onMounted, inject, shallowRef, reactive, getCurrentInstance, toRefs, nextTick } from "vue";
+import { publicStores, useStores } from "@/store/modules/index";
+
+const publicStore = publicStores(); //全局公共Store
+
+const { proxy } = getCurrentInstance();
+
+const pages = getCurrentPages();
+
+const dataArray = publicStore.$state.facilitiesGatherArray;
+const dataType = publicStore.$state.facilitiesGatherType;
+
+// #ifdef APP-PLUS
+setTimeout(() => {
+  var currentWebview = pages[pages.length - 1].$getAppWebview();
+  var wv = currentWebview.children()[0];
+  wv.evalJS(`receiveData(${JSON.stringify({ dataArray: dataArray, dataType: dataType })})`);
+}, 1000);
+// #endif
+
+function onMessage(e) {
+  console.log("父页面:", e.detail.data);
+  publicStore.$state.facilitiesGatherArray = JSON.parse(e.detail.data);
+  uni.redirectTo({
+    url: "/pages/business/fireIot/facilitiesGather/index",
+  });
+}
+
+// #ifdef H5
+setTimeout(() => {
+  var iframe = document.getElementById("amapView");
+  var message = {
+    funcName: "children",
+    param: JSON.stringify(dataArray),
+    typeName: dataType,
+  };
+
+  iframe.contentWindow.postMessage(message, "*");
+}, 1000);
+
+window.onmessage = function (event) {
+  if ("funcName" in event.data) {
+    console.log("父页面:", event);
+    publicStore.$state.facilitiesGatherArray = JSON.parse(event.data.param);
+    uni.redirectTo({
+      url: "/pages/business/fireIot/facilitiesGather/index",
+    });
+  }
+};
+// #endif
+
+onLoad((options) => {
+  if ("facilitiesId" in options) {
+    var facilitiesId = options.facilitiesId;
+  }
+});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+
+onReady(() => {});
+
+onMounted(() => {});
+</script>

+ 7 - 7
src/pages/business/mhxf/fireReport/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
+  <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name" @scrolltolower="scrolltolower">
     <view class="fireReport">
       <u-empty v-if="dataList.length <= 0" text="暂无数据" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png"> </u-empty>
       <view class="reportContent" v-else>
@@ -14,7 +14,7 @@
             <view style="color: #3c9cff; cursor: pointer" @click="handleDownload(li.reportPath)">下载报告</view>
           </view>
         </view>
-        <u-loadmore :status="status" />
+        <u-loadmore :status="status" @click="scrolltolower" />
       </view>
     </view>
   </scroll-view>
@@ -57,7 +57,6 @@ function reportInfoListApi() {
     companyId: "",
     sourceType: 2,
   }).then((res) => {
-    console.log(res);
     dataList.value = res.data.records;
     total.value = res.data.total;
 
@@ -140,9 +139,10 @@ function handleDownload(reportPath) {
   }, 2000);
 }
 
-watchEffect(() => {});
-
-onReachBottom(() => {
+/**
+ * @scrollView触底事件
+ */
+function scrolltolower(e) {
   if (total.value == dataList.value.length) {
     status.value = "nomore";
     return;
@@ -153,7 +153,7 @@ onReachBottom(() => {
       reportInfoListApi();
     }, 1000);
   }
-});
+}
 
 // 自定义导航事件
 onNavigationBarButtonTap((e) => {

+ 12 - 21
src/pages/business/mhxf/needMatter/index.vue

@@ -426,29 +426,20 @@ function leftscroll(dista) {
  */
 function tabsClick(e) {
   current.value = e.index;
+  goSearch();
 }
 
 /**
  * @列表查询
  */
 function goSearch() {
-  if (current.value == 0) {
-    classifySearch({
-      companyId: "", //	单位Id
-      reformId: "", //整改单编号
-      reformStatus: "", //整改状态(1 已接收、2 整改中、3 整改完成、4 审核不通过、5 审核通过)
-      pageNum: 1, //当前页
-      pageSize: 20, //每页条数
-    });
-  } else {
-    classifySearch({
-      companyId: "", //	单位Id
-      reformId: "", //整改单编号
-      reformStatus: current.value, //整改状态(1 已接收、2 整改中、3 整改完成、4 审核不通过、5 审核通过)
-      pageNum: 1, //当前页
-      pageSize: 20, //每页条数
-    });
-  }
+  classifySearch({
+    companyId: "", //	单位Id
+    reformId: "", //整改单编号
+    reformStatus: current.value == 0 ? "" : current.value, //整改状态(1 已接收、2 整改中、3 整改完成、4 审核不通过、5 审核通过)
+    pageNum: 1, //当前页
+    pageSize: 20, //每页条数
+  });
 }
 
 /**
@@ -479,9 +470,7 @@ async function classifySearch(params) {
   });
 }
 
-watchEffect(() => {
-  goSearch();
-});
+watchEffect(() => {});
 
 // 自定义导航事件
 onNavigationBarButtonTap((e) => {
@@ -493,7 +482,9 @@ onNavigationBarButtonTap((e) => {
   }
 });
 
-onLoad((options) => {});
+onLoad((options) => {
+  goSearch();
+});
 
 onShow(() => {
   //调用系统主题颜色

+ 176 - 0
src/pages/common/applicationInfo/index.vue

@@ -0,0 +1,176 @@
+<template>
+  <u-sticky class="shadow-default" bgColor="#fff" style="top: 0">
+    <u-tabs :list="tabsList" :current="tabsCurrent" @click="tabsClick" lineColor="#333" :activeStyle="{ color: '#333' }" :inactiveStyle="{ color: '#909399' }" :scrollable="true"></u-tabs>
+  </u-sticky>
+
+  <scroll-view class="scroll-height" :scroll-y="true" :scroll-into-view="scrollIntoView" :data-theme="'theme-' + proxy.$settingStore.themeColor.name" style="padding-bottom: 44px">
+    <view class="applicationInfo-container">
+      <view class="content-area" v-show="tabsCurrent == 0">
+        <u-empty v-show="allInfoList.length <= 0" text="暂无数据" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png"> </u-empty>
+        <view :id="index == allInfoList.length - 1 ? 'bottomInfo' : ''" v-for="(all, index) in allInfoList" :key="index" v-show="allInfoList.length > 0" @click="goContentDetails(all)">
+          <view class="content-area-time text-sm">{{ all.listTime }}</view>
+          <view class="content-area-center radius bg-white">
+            <view class="content-area-center-title">{{ all.typeTitle }}</view>
+            <view class="content-area-center-cont">{{ all.listTitle }}</view>
+          </view>
+        </view>
+      </view>
+      <view class="content-area" v-show="tabsCurrent == 1">
+        <u-empty v-show="noticeList.length <= 0" text="暂无数据" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png"> </u-empty>
+        <view :id="index == noticeList.length - 1 ? 'bottomInfo' : ''" v-for="(all, index) in noticeList" :key="index" v-show="noticeList.length > 0" @click="goContentDetails(all)">
+          <view class="content-area-time text-sm">{{ all.listTime }}</view>
+          <view class="content-area-center radius bg-white">
+            <view class="content-area-center-title">{{ all.typeTitle }}</view>
+            <view class="content-area-center-cont">{{ all.listTitle }}</view>
+          </view>
+        </view>
+      </view>
+    </view>
+  </scroll-view>
+</template>
+
+<script setup>
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
+import { publicStores, useStores } from "@/store/modules/index";
+
+import { infoList } from "@/api/common/applicationInfo.js";
+
+const useStore = useStores();
+
+const { proxy } = getCurrentInstance();
+
+const data = reactive({
+  scrollIntoView: "",
+
+  tabsList: [
+    {
+      name: "全部",
+    },
+    {
+      name: "通知公告",
+    },
+  ],
+  tabsCurrent: 0,
+
+  allInfoList: [],
+  noticeList: [],
+});
+
+const { scrollIntoView, scrollIntoViewBool, tabsList, tabsCurrent, allInfoList, noticeList } = toRefs(data);
+
+/**
+ * @初始化
+ */
+function init() {
+  infoListApi();
+}
+
+/**
+ * @tabs点击事件
+ */
+function tabsClick(e) {
+  tabsCurrent.value = e.index;
+}
+
+/**
+ * @跳转
+ */
+function goContentDetails(e) {
+  if (e.type == "通知公告") {
+    proxy.$tab.navigateTo(`/pages/common/textview/index1?title=${e.typeTitle}&content=${e.listContent}&contentTitle=${e.listTitle}`);
+  }
+}
+
+/**
+ * @通知公告列表
+ * @api接口调用
+ */
+function infoListApi() {
+  proxy.$modal.loading("加载中");
+  infoList({
+    pageNum: 1,
+    pageSize: 20000,
+  }).then((requset) => {
+    if (requset.status === "SUCCESS") {
+      requset.data.rows.forEach((el) => {
+        allInfoList.value.push({
+          type: "通知公告",
+          typeTitle: el.noticeType === "1" ? "系统通知" : el.noticeType === "2" ? "系统公告" : "系统消息",
+          listTime: proxy.$common.jktTimes(el.createTime),
+          listCreateTime: el.createTime,
+          listTitle: el.noticeTitle,
+          listContent: el.noticeContent,
+        });
+
+        noticeList.value.push({
+          type: "通知公告",
+          typeTitle: el.noticeType === "1" ? "系统通知" : el.noticeType === "2" ? "系统公告" : "系统消息",
+          listTime: proxy.$common.jktTimes(el.createTime),
+          listCreateTime: proxy.$common.jktTimes(el.createTime),
+          listTitle: el.noticeTitle,
+          listContent: el.noticeContent,
+        });
+      });
+
+      setTimeout(() => {
+        scrollIntoView.value = "bottomInfo";
+      }, 0);
+
+      setTimeout(() => {
+        proxy.$modal.closeLoading();
+      }, 100);
+    }
+  });
+}
+
+onLoad((options) => {
+  init();
+});
+
+onReady(() => {});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+
+// 自定义导航事件
+onNavigationBarButtonTap((e) => {
+  if (e.float == "right") {
+    proxy.$tab.navigateTo("/pages/mine/setting/index");
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+:deep(.uni-page-head__title) {
+  opacity: 1 !important;
+}
+
+.applicationInfo-container {
+  padding-bottom: 1px;
+
+  .content-area {
+    &-time {
+      padding: 10px 0;
+      text-align: center;
+      color: #909399;
+    }
+
+    &-center {
+      margin: 0 10px 20px 10px;
+      padding: 15px;
+
+      &-title {
+        margin: 0 0 15px 0;
+        color: #909399;
+      }
+
+      &-cont {
+        font-weight: 600;
+      }
+    }
+  }
+}
+</style>

+ 257 - 0
src/pages/common/customManage/index.vue

@@ -0,0 +1,257 @@
+<template>
+  <oa-scroll
+    class="scroll-height"
+    :pageSize="pageSize"
+    :total="total"
+    :refresherLoad="true"
+    :refresherEnabled="true"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    @load="load"
+    @refresh="refresh"
+  >
+    <template #default>
+      <view class="customManage-container" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
+        <view class="flex bg-white padding-10" style="position: relative">
+          <u--input
+            v-model="projectName"
+            placeholder="搜索"
+            prefixIcon="search"
+            prefixIconStyle="font-size: 22px;color: #909399"
+            customStyle="height:30px;background-color:#f5f6fa;"
+            @confirm="selectListApi()"
+            clearable
+          ></u--input>
+          <view class="margin-l-10" style="margin-top: auto; margin-bottom: auto" @click="dropdownShow = !dropdownShow">筛选</view>
+        </view>
+
+        <view class="dropdown" :class="dropdownShow ? 'show' : 'none'">
+          <view class="padding-10">
+            <u-radio-group v-model="radioValue" placement="column" iconPlacement="right" @change="radioChange">
+              <u-radio v-for="ra in radioList" :key="ra" :activeColor="proxy.$settingStore.themeColor.color" :label="ra.label" :name="ra.value"></u-radio>
+            </u-radio-group>
+          </view>
+        </view>
+        <view class="dropdown" :class="dropdownShow ? 'mask' : 'none'" @click="dropdownShow = !dropdownShow"> </view>
+
+        <view class="container-area menu-list margin-lr-0" v-for="data in dataList" :key="data">
+          <view class="list-cell" style="color: #666666; line-height: 30px">
+            <view class="menu-item-box" style="font-size: 16px; font-weight: 600; color: #000000">
+              <view> {{ data.projectName }} </view>
+            </view>
+            <view class="menu-item-box" style="font-size: 13px">
+              <view style="width: 50%"> 项目编号:{{ data.projectId }} </view>
+              <view style="width: 50%"> 到期时间:{{ data.expireTime ? data.expireTime.split("T")[0] : "" }} </view>
+            </view>
+            <view class="menu-item-box" style="font-size: 13px">
+              <view style="width: 50%"> 客户负责人:{{ data.customPerson }} </view>
+              <view style="width: 50%"> 维保费:¥{{ data.maintainAmount }} </view>
+            </view>
+            <view class="menu-item-box" style="font-size: 13px">
+              <view style="width: 50%; display: flex">
+                客户电话:{{ data.phone }}
+                <view class="iconfont ucicon-a-copy menu-icon" style="font-size: 14px; color: #909399; margin-left: 5px" @click="copy(data.phone)"> </view>
+              </view>
+              <view style="width: 50%">
+                状态:
+                <span :style="`color: ${data.maintainStatus == 1 ? '#16bf00' : 'red'} `">
+                  {{ data.maintainStatus == 1 ? "使用中" : "已到期" }}
+                </span>
+              </view>
+            </view>
+            <view class="menu-item-box" style="font-size: 13px">
+              <view> 客户地址: {{ data.customAddress }} </view>
+            </view>
+          </view>
+        </view>
+      </view>
+    </template>
+  </oa-scroll>
+</template>
+
+<script setup>
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
+import { publicStores, useStores } from "@/store/modules/index";
+
+import { crmCustomInfo } from "@/api/common/customManage.js";
+
+const { proxy } = getCurrentInstance();
+
+const dataList = ref([]);
+const pageSize = ref(20);
+const current = ref(1);
+const total = ref(0);
+
+const data = reactive({
+  radioList: [
+    {
+      label: "全部",
+      value: "",
+    },
+    {
+      label: "7天",
+      value: 7,
+    },
+    {
+      label: "30天",
+      value: 30,
+    },
+    {
+      label: "90天",
+      value: 90,
+    },
+  ],
+  radioValue: "",
+  startTime: "",
+  endTime: "",
+  projectName: "",
+  dropdownShow: false,
+});
+
+const { radioList, radioValue, startTime, endTime, projectName, dropdownShow } = toRefs(data);
+
+/**
+ * @初始化
+ */
+function init() {
+  selectListApi();
+}
+
+/**
+ * @列表查询
+ * @api接口调用
+ */
+function selectListApi() {
+  crmCustomInfo({
+    projectName: projectName.value,
+    current: current.value,
+    size: pageSize.value,
+    endTime: endTime.value,
+    startTime: startTime.value,
+  }).then((requset) => {
+    if (requset.status === "SUCCESS") {
+      dataList.value = requset.data.records;
+      total.value = requset.data.total;
+    }
+  });
+}
+
+/**
+ * @复制粘贴板
+ */
+function copy(value) {
+  // 触发方法
+  proxy.$common.uniCopy({
+    content: value,
+    success: (res) => {
+      uni.showToast({
+        title: res,
+        icon: "none",
+      });
+    },
+    error: (e) => {
+      uni.showToast({
+        title: e,
+        icon: "none",
+        duration: 3000,
+      });
+    },
+  });
+}
+
+/**
+ * @单选change事件
+ */
+function radioChange(e) {
+  radioValue.value = e;
+  if (e) {
+    let getDays = proxy.$common.getDays(e);
+    startTime.value = getDays.startTime;
+    endTime.value = getDays.endTime;
+  }
+  selectListApi();
+}
+
+/**
+ * @scrollView加载数据
+ */
+function load() {
+  pageSize.value += 10;
+  selectListApi();
+}
+
+/**
+ * @scrollView刷新数据
+ */
+function refresh() {
+  radioValue.value = "";
+  startTime.value = "";
+  endTime.value = "";
+  pageSize.value = 20;
+  total.value = 0;
+  selectListApi();
+}
+
+onLoad((options) => {
+  init();
+});
+
+onReady(() => {});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+
+// 自定义导航事件
+onNavigationBarButtonTap((e) => {
+  if (e.float == "right") {
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+:deep(.uni-page-head__title) {
+  opacity: 1 !important;
+}
+
+.customManage-container {
+  .container-area {
+  }
+
+  .dropdown {
+    position: absolute;
+    width: 100%;
+    background-color: #fff;
+    max-height: 0;
+    overflow: hidden;
+    z-index: 90;
+
+    &.show {
+      animation: dropdown 3s ease forwards;
+    }
+
+    &.mask {
+      position: fixed;
+      top: 0;
+      left: 0;
+      right: 0;
+      bottom: 0;
+      background-color: transparent;
+      max-height: 100%;
+      z-index: 50;
+    }
+  }
+
+  @keyframes dropdown {
+    from {
+      max-height: 0;
+    }
+    to {
+      max-height: 100%;
+    }
+  }
+}
+</style>

+ 8 - 5
src/pages/common/invoicing/index.vue

@@ -3,9 +3,9 @@
     <u-tabs :list="tabsList" :current="tabsCurrent" @click="tabsClick" lineColor="#333" :activeStyle="{ color: '#333' }" :inactiveStyle="{ color: '#909399' }" :scrollable="false"></u-tabs>
   </u-sticky>
 
-  <scroll-view class="invoicing-container scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
+  <scroll-view class="invoicing-container scroll-height" :scroll-y="true" :scroll-into-view="scrollIntoView" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
     <view v-show="tabsCurrent == 0">
-      <u-notice-bar v-if="promptStatus" text="注:查询到您近期有开票记录,请勿重复开票" :duration="9000" color="#FF0000" bgColor="#FFFFFF"></u-notice-bar>
+      <u-notice-bar id="noticeBar" v-if="promptStatus" text="注:查询到您近期有开票记录,请勿重复开票" :duration="9000" color="#FF0000" bgColor="#FFFFFF"></u-notice-bar>
 
       <view class="menu-list" style="font-size: 15px; line-height: 30px">
         <view class="list-cell">
@@ -135,7 +135,7 @@
           <view class="menu-item-box">
             <view style="width: 90px">开户行</view>
             <view style="color: #666666">上海银行徐家汇支行</view>
-          </view>
+          </view> 
         </view>
         <view class="list-cell">
           <view class="menu-item-box">
@@ -161,7 +161,7 @@ import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, on
 import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
 import { publicStores, useStores } from "@/store/modules/index";
 
-import { crmInvoiceInfo, page } from "@/api/common/invoicing/index";
+import { crmInvoiceInfo, page } from "@/api/common/invoicing.js";
 
 const { proxy } = getCurrentInstance();
 const publicStore = publicStores();
@@ -281,15 +281,17 @@ const data = reactive({
     ],
   },
 
+  scrollIntoView: "",
   promptStatus: false,
 });
 
-const { tabsList, tabsCurrent, form, rules, promptStatus } = toRefs(data);
+const { tabsList, tabsCurrent, form, rules, scrollIntoView, promptStatus } = toRefs(data);
 
 /**
  * @提交
  */
 function handleSubmit(value) {
+  scrollIntoView.value = "";
   uForm.value
     .validate()
     .then((res) => {
@@ -305,6 +307,7 @@ function handleSubmit(value) {
         if (requset.status === "SUCCESS") {
           if (requset.data.records.length > 0) {
             promptStatus.value = true;
+            scrollIntoView.value = "noticeBar";
           } else {
             var param = {
               customId: parseInt(form.value.customId), //客户管理id

+ 1 - 1
src/pages/common/success/index.vue

@@ -25,7 +25,7 @@ const publicStore = publicStores();
 const { proxy } = getCurrentInstance();
 
 /**
- * @跳转登录
+ * @返回上一级
  */
 function navigateTo() {
   proxy.$tab.navigateBack(1);

+ 6 - 2
src/pages/common/textview/index1.vue

@@ -1,6 +1,8 @@
 <template>
   <view class="view-text">
-    <u-parse class="uni-body view-content" :content="content"></u-parse>
+    <!-- <u-parse class="uni-body view-content" :content="content"></u-parse> -->
+    <h3 style="text-align: center; line-height: 45px">{{ contentTitle }}</h3>
+    <view>{{ content }}</view>
   </view>
 </template>
 
@@ -16,13 +18,15 @@ const { proxy } = getCurrentInstance();
 const data = reactive({
   title: "",
   content: "",
+  contentTitle: "",
 });
 
-const { title, content } = toRefs(data);
+const { title, content, contentTitle } = toRefs(data);
 
 onLoad((options) => {
   title.value = options.title;
   content.value = options.content;
+  contentTitle.value = options.contentTitle;
   uni.setNavigationBarTitle({
     title: options.title,
   });

+ 45 - 46
src/pages/index.vue

@@ -23,7 +23,7 @@
     <!-- <u-loadmore :status="arrayList.loadStatus" loadingText="" loadmoreText="" :icon="true" /> -->
     <view class="uni-content-body">
       <!-- 下拉列表 开始 -->
-      <u-transition :show="arrayList.dialogFlag" :duration="200" mode="fade">
+      <u-transition :show="dialogFlag" :duration="200" mode="fade">
         <view class="transition" @click="rightButtonClick()">
           <view class="transition-section" :style="{ top: proxy.$settingStore.barHightTop }">
             <view class="transition-section-content" @click="scanCode()">
@@ -41,27 +41,12 @@
       <!-- 下拉列表 结束 -->
 
       <!-- 轮播图 开始 -->
-      <u-swiper
-        v-if="arrayList.swiperBool"
-        :list="arrayList.swiperList"
-        :interval="arrayList.swiperTime"
-        indicator
-        indicatorMode="line"
-        radius="0"
-        height="160"
-        circular
-        @click="swiperClick"
-        @change="swiperChange"
-        :displayMultipleItems="6"
-      >
-      </u-swiper>
-
-      <image v-if="!arrayList.swiperBool" src="@/static/images/index/banner1.png" style="width: 100%; height: 160px"></image>
+      <u-swiper :list="swiperList" :interval="swiperTime" indicatorMode="line" radius="0" height="160" indicator circular keyName="url" @click="swiperClick" @change="swiperChange"> </u-swiper>
 
       <view class="app-info-notice bg-white radius shadow-default margin-lr-sm margin-bottom-sm">
         <view class="flex">
           <view class="info-title text-df">综合智慧云</view>
-          <view class="info-time text-sm">03-21 19:23</view>
+          <view class="info-time text-sm">07-25 19:23</view>
         </view>
         <view class="info-content text-sm">综合智慧云app,助力企业数字化转型升级,超多业务功能,全新部署上线,操作简单流畅...</view>
       </view>
@@ -69,10 +54,10 @@
       <!-- 轮播图 结束 -->
 
       <!-- 宫格列表 -->
-      <view class="section2 section bg-white margin-bottom-sm" v-if="arrayList.recentlyUsed.length > 0">
+      <view class="section2 section bg-white margin-bottom-sm" v-if="recentlyUsed.length > 0">
         <view style="color: #000000; font-size: 14px; padding: 10px 10px 5px 10px">最近使用</view>
         <view class="cu-list grid col-5 no-border">
-          <view class="cu-item justify-center align-center" @tap="navItemClick(item)" v-for="(item, index) in arrayList.recentlyUsed.slice(0, 5)" :key="index">
+          <view class="cu-item justify-center align-center" @tap="navItemClick(item)" v-for="(item, index) in recentlyUsed.slice(0, 5)" :key="index">
             <image :src="item.meta.icon" style="width: 40px; height: 40px"></image>
             <!-- <view class="cu-tag badge" v-if="item.badge != 0">
               <block v-if="item.badge != 0">{{ item.badge > 99 ? "99+" : item.badge }}</block>
@@ -87,7 +72,7 @@
       <view class="section2 section bg-white">
         <view style="color: #000000; font-size: 14px; padding: 10px 10px 5px 10px">常用功能</view>
         <view class="cu-list grid col-5 no-border">
-          <view class="cu-item justify-center align-center" @tap="navItemClick(item)" v-for="(item, index) in arrayList.cuIconList" :key="index">
+          <view class="cu-item justify-center align-center" @tap="navItemClick(item)" v-for="(item, index) in cuIconList" :key="index">
             <image :src="item.meta.icon" style="width: 40px; height: 40px"></image>
             <!-- <view class="cu-tag badge" v-if="item.badge != 0">
               <block v-if="item.badge != 0">{{ item.badge > 99 ? "99+" : item.badge }}</block>
@@ -109,7 +94,7 @@ import searchSelect from "@/components/searchSelect/searchSelect.vue";
 import * as jwx from "@/utils/jssdk.js"; //引入js sdk的封装
 
 import { onReady, onLoad, onShow, onNavigationBarButtonTap, onPullDownRefresh, onReachBottom } from "@dcloudio/uni-app";
-import { ref, onMounted, inject, shallowRef, reactive, getCurrentInstance } from "vue";
+import { ref, onMounted, inject, shallowRef, reactive, getCurrentInstance, toRefs } from "vue";
 import { getToken } from "@/utils/auth";
 import { useStores, publicStores } from "@/store/modules/index";
 
@@ -128,16 +113,18 @@ const arrayList = reactive({
   swiperTime: 5000,
   swiperList: [],
 
-  // cuIconList: proxy.$grid.cuIconList,
+  cuIconList: [],
   recentlyUsed: [],
 });
 
+const { dialogFlag, swiperBool, swiperIndex, swiperTime, swiperList, cuIconList, recentlyUsed } = toRefs(arrayList);
+
 /**
  * @获取轮播图下标
  * @change事件
  */
 function swiperChange(e) {
-  arrayList.swiperIndex = e.current;
+  swiperIndex.value = e.current;
 }
 
 /**
@@ -145,8 +132,8 @@ function swiperChange(e) {
  */
 function swiperClick(list) {
   if (typeof list == "object") {
-    let linkType = arrayList.swiperList[arrayList.swiperIndex].linkType;
-    let url = arrayList.swiperList[arrayList.swiperIndex].link;
+    let linkType = swiperList.value[swiperIndex.value].linkType;
+    let url = swiperList.value[swiperIndex.value].link;
 
     if (url) {
       if (linkType == 1) {
@@ -171,18 +158,30 @@ function getMobileBannerApi() {
     tenantId: useStore.$state.tenantId,
   }).then((res) => {
     if (res.data.length > 0) {
-      arrayList.swiperList = [];
-      arrayList.swiperBool = res.data[0].openNot == 1 ? true : false;
-      arrayList.swiperTime = res.data[0].carouselTime * 1000;
-
-      for (let i = 1; i <= 5; i++) {
-        if (res.data[0]["bannerPath" + i]) {
-          arrayList.swiperList.push({
-            url: res.data[0]["bannerPath" + i],
-            link: res.data[0]["linkUrl" + i],
-            linkType: res.data[0]["linkType" + i],
-          });
+      swiperList.value = [];
+      swiperBool.value = res.data[0].openNot == 1 ? true : false;
+      swiperTime.value = res.data[0].carouselTime * 1000;
+
+      if (swiperBool.value) {
+        for (let i = 1; i <= 5; i++) {
+          if (res.data[0]["bannerPath" + i]) {
+            swiperList.value.push({
+              url: res.data[0]["bannerPath" + i],
+              link: res.data[0]["linkUrl" + i],
+              linkType: res.data[0]["linkType" + i],
+              type: "image",
+            });
+          }
         }
+      } else {
+        swiperList.value = [
+          {
+            url: "/static/images/index/banner1.png",
+            link: "",
+            linkType: 1,
+            type: "image",
+          },
+        ];
       }
     }
   });
@@ -192,7 +191,7 @@ onLoad((option) => {
   uni.hideTabBar(); //隐藏自带tabbar
 
   if (uni.getStorageSync(useStore.$state.name + useStore.$state.tenantId)) {
-    arrayList.recentlyUsed = uni.getStorageSync(useStore.$state.name + useStore.$state.tenantId);
+    recentlyUsed.value = uni.getStorageSync(useStore.$state.name + useStore.$state.tenantId);
   }
 
   getAppRoutersData();
@@ -269,23 +268,23 @@ function navItemClick(item) {
   if (item.path) {
     item.sort = 0;
 
-    arrayList.recentlyUsed.push(item);
+    recentlyUsed.value.push(item);
 
-    if (arrayList.recentlyUsed.length > 0) {
-      arrayList.recentlyUsed = arrayList.recentlyUsed.filter((currentValue, currentIndex, selfArr) => {
+    if (recentlyUsed.value.length > 0) {
+      recentlyUsed.value = recentlyUsed.value.filter((currentValue, currentIndex, selfArr) => {
         return selfArr.findIndex((x) => x.path === currentValue.path) === currentIndex;
       });
 
-      arrayList.recentlyUsed.filter((el) => {
+      recentlyUsed.value.filter((el) => {
         if (el.path === item.path) {
           el.sort++;
         }
       });
     }
 
-    arrayList.recentlyUsed = publicStore.sortEvent(arrayList.recentlyUsed, 1);
+    recentlyUsed.value = publicStore.sortEvent(recentlyUsed.value, 1);
 
-    uni.setStorageSync(useStore.$state.name + useStore.$state.tenantId, arrayList.recentlyUsed);
+    uni.setStorageSync(useStore.$state.name + useStore.$state.tenantId, recentlyUsed.value);
 
     if (item.path.indexOf("http") != -1) {
       uni.navigateTo({
@@ -315,7 +314,7 @@ function navItemClick(item) {
  */
 function rightButtonClick() {
   console.log(1);
-  arrayList.dialogFlag = !arrayList.dialogFlag;
+  dialogFlag.value = !dialogFlag.value;
 }
 
 /**
@@ -334,7 +333,7 @@ function getAppRoutersData() {
       el.meta.icon = `/static/icons/index/${el.meta.icon}.svg`;
     });
 
-    arrayList.cuIconList = res.data;
+    cuIconList.value = res.data;
   });
 }
 

+ 24 - 0
src/pages/info.vue

@@ -29,6 +29,26 @@
       </view>
     </view> -->
 
+    <view class="uni-content-body">
+      <view class="uni-list padding" @tap="goApplicationInfo()">
+        <view class="uni-avatar">
+          <image class="image-bg" src="@/static/images/common/applicationInfo.png" />
+        </view>
+        <view class="uni-content">
+          <view class="uni-item">
+            <view class="uni-item-cont text-dfl" style="color: #000000">应用消息</view>
+            <!-- <view class="uni-item-right text-sm" style="color: #909399">5月15日</view> -->
+          </view>
+          <view class="flex uni-item">
+            <view class="uni-item-cont text-df" style="color: #909399">您收到一条最新消息,请及时查看</view>
+            <!-- <view class="uni-item-right text-df" style="margin: auto 0">
+              <u-badge numberType="overflow" max="99" :value="1"></u-badge>
+            </view> -->
+          </view>
+        </view>
+      </view>
+    </view>
+
     <view class="uni-content-body">
       <view class="uni-list padding" @tap="goFireBase()">
         <view class="uni-avatar">
@@ -68,6 +88,10 @@ const data = reactive({
 
 const { indexBackgroundImage } = toRefs(data);
 
+function goApplicationInfo() {
+  proxy.$tab.navigateTo("/pages/common/applicationInfo/index");
+}
+
 function goFireBase() {
   proxy.$tab.navigateTo("/pages/info/fireBase/fireBase");
 }

+ 3 - 1
src/pages/mine/about/index.vue

@@ -47,7 +47,8 @@
     </view>
 
     <view class="copyright">
-      <view>Copyright &copy; 2021 - 2025 Usky. All Rights Reserved. 永天股份 版权所有</view>
+      <!-- <view>Copyright &copy; 2021 - 2025 Usky. All Rights Reserved. 永天股份 版权所有</view> -->
+      <view>{{ copyright }}</view>
     </view>
   </view>
 </template>
@@ -66,6 +67,7 @@ const url = ref(config.appInfo.site_url);
 const version = ref(config.appInfo.version);
 const email = ref(config.appInfo.email);
 const hotline = ref(config.appInfo.hotline);
+const copyright = ref(config.appInfo.copyright);
 
 onShow(() => {
   //调用系统主题颜色

+ 0 - 17
src/pages/mine/help/index.vue

@@ -34,23 +34,6 @@ const { proxy } = getCurrentInstance();
 
 const data = reactive({
   list: [
-    // {
-    //   icon: 'iconfont icon-github',
-    //   title: '若依问题',
-    //   childList: [{
-    //     title: '若依开源吗?',
-    //     content: '开源'
-    //   }, {
-    //     title: '若依可以商用吗?',
-    //     content: '可以'
-    //   }, {
-    //     title: '若依官网地址多少?',
-    //     content: 'http://ruoyi.vip'
-    //   }, {
-    //     title: '若依文档地址多少?',
-    //     content: 'http://doc.ruoyi.vip'
-    //   }]
-    // },
     {
       icon: "iconfont ucicon-Help",
       title: "其他问题",

+ 5 - 0
src/pages/mine/secure/index.vue

@@ -40,6 +40,11 @@
       </view>
 
       <view class="menu-list margin-t-0 margin-lr-0">
+        <view class="list-cell list-cell-arrow" @click="proxy.$tab.navigateTo(`/pages/mine/secure/loginLog/index`)">
+          <view class="menu-item-box">
+            <view class="title">登录日志</view>
+          </view>
+        </view>
         <view class="list-cell list-cell-arrow" @click="proxy.$modal.showToast('模块建设中~')">
           <view class="menu-item-box">
             <view class="title">常用设备管理</view>

+ 143 - 0
src/pages/mine/secure/loginLog/index.vue

@@ -0,0 +1,143 @@
+<template>
+  <oa-scroll
+    class="scroll-height"
+    :pageSize="pageSize"
+    :total="total"
+    :refresherLoad="true"
+    :refresherEnabled="true"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    @load="load"
+    @refresh="refresh"
+  >
+    <template #default>
+      <view class="loginLog-container" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
+        <view class="container-area">
+          <view class="container-area-content bg-white" v-for="data in dataList" :key="data">
+            <view class="container-area-content-img">
+              <image style="width: 35px; height: 35px" :src="'/static/images/404.png'" mode="aspectFill"></image>
+            </view>
+            <view class="container-area-content-center">
+              <view
+                :style="{
+                  fontSize: '15px',
+                  color: data.status == '0' ? '#16bf00' : 'red',
+                }"
+                >{{ data.status == "0" ? "登录成功" : "登录失败" }}</view
+              >
+              <view>登陆时间:{{ data.accessTime }}</view>
+              <view>访问IP:{{ data.ipaddr }}</view>
+              <!-- <view>登录地址:未知</view>
+              <view>登录方式:未知</view>
+              <view>系统型号:未知</view> -->
+              <view v-if="data.status == '1'">登录失败原因:{{ data.msg }}</view>
+            </view>
+          </view>
+        </view>
+      </view>
+    </template>
+  </oa-scroll>
+</template>
+
+<script setup>
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
+import { publicStores, useStores } from "@/store/modules/index";
+
+import { loginLogList } from "@/api/mine/secure/loginLog.js";
+
+const useStore = useStores();
+
+const { proxy } = getCurrentInstance();
+
+const dataList = ref([]);
+const pageSize = ref(20);
+const current = ref(1);
+const total = ref(0);
+
+/**
+ * @初始化
+ */
+function init() {
+  selectListApi();
+}
+
+/**
+ * @scrollView加载数据
+ */
+function load() {
+  pageSize.value += 10;
+  selectListApi();
+}
+
+/**
+ * @scrollView刷新数据
+ */
+function refresh() {
+  pageSize.value = 20;
+  total.value = 0;
+  selectListApi();
+}
+
+/**
+ * @通知公告列表
+ * @api接口调用
+ */
+function selectListApi() {
+  loginLogList({
+    pageNum: current.value,
+    pageSize: pageSize.value,
+    userName: useStore.$state.user.userName,
+  }).then((requset) => {
+    if (requset.status === "SUCCESS") {
+      dataList.value = requset.data.rows;
+      total.value = requset.data.total;
+    }
+  });
+}
+
+onLoad((options) => {
+  init();
+});
+
+onReady(() => {});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+
+// 自定义导航事件
+onNavigationBarButtonTap((e) => {
+  if (e.float == "right") {
+    proxy.$tab.navigateTo("/pages/mine/setting/index");
+  }
+});
+</script>
+<style lang="scss" scoped>
+:deep(.uni-page-head__title) {
+  opacity: 1 !important;
+}
+
+.loginLog-container {
+  padding-bottom: 1px;
+
+  .container-area {
+    &-content {
+      display: flex;
+      border-bottom: 0.5px solid #d6d7d9;
+
+      &-img {
+        margin: auto 15px auto 15px;
+      }
+
+      &-center {
+        width: 100%;
+        font-size: 13px;
+        color: #909399;
+        padding: 15px 0 15px 0;
+      }
+    }
+  }
+}
+</style>

+ 66 - 2
src/plugins/common.plugins.js

@@ -36,7 +36,7 @@ export default {
     /**
      * 小程序端 和 app端的复制逻辑
      */
-    //#ifndef H5 || APP-PLUS || MP-WEIXIN
+    //#ifdef APP-PLUS || MP-WEIXIN
     uni.setClipboardData({
       data: content,
       success: function () {
@@ -71,5 +71,69 @@ export default {
     }
     textarea.remove()
     // #endif
-  }
+  },
+
+  /**
+   * @param {时间处理(今日,昨日)} 
+   * @param {传入值} time 
+   * @returns 
+   */
+  jktTimes(time) {
+    if (time == undefined) return "";
+    var today = new Date().getDate();//当前时间-日
+    var day = new Date(time).getDate();//传入时间-日
+
+    var newday = today - day
+    if (newday == 0) {
+      var newTime = time.split(" ")[1]
+      var newTime2 = newTime.split(":")
+      return "今天" + newTime2[0] + ":" + newTime2[1];
+    } else if (newday == 1) {
+      var newTime = time.split(" ")[1]
+      var newTime2 = newTime.split(":")
+      return "昨天" + newTime2[0] + ":" + newTime2[1];
+    } else {
+      var newTime = time.split(" ")[0]
+      return newTime
+    }
+  },
+
+  /**
+   * @指定获取当前时间前几天的日期
+   */
+  getDays(value) {
+    let oneDay = 24 * 60 * 60 * 1000;
+    let endTime = new Date(Date.now());
+    endTime = this.formatterDate(endTime, "yyyy-MM-dd");
+    let startTime = new Date(Date.now() - value * oneDay);
+    startTime = this.formatterDate(startTime, "yyyy-MM-dd");
+    const days = {
+      startTime,
+      endTime,
+    };
+    return days;
+  },
+
+  /**
+   * @处理公共日期格式
+   */
+  formatterDate(date, fmt) {
+    let nowDate = {
+      yyyy: date.getFullYear(), // 年
+      MM: date.getMonth() + 1, // 月份
+      dd: date.getDate(), //日
+      hh: date.getHours(),
+      mm: date.getMinutes(),
+      ss: date.getSeconds(),
+    };
+    if (/(y+)/.test(fmt)) {
+      fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
+    }
+    for (var k in nowDate) {
+      if (new RegExp("(" + k + ")").test(fmt)) {
+        fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? nowDate[k] : ("00" + nowDate[k]).substr(("" + nowDate[k]).length));
+      }
+    }
+    return fmt;
+  },
 };

+ 8 - 13
src/static/amap/coordination.html

@@ -34,21 +34,16 @@
         <div class="content"> </div>
     </div>
 
-
-    <!-- 高德地图web端 -->
-    <!-- <script type="text/javascript">
-		window._AMapSecurityConfig = {
-			securityJsCode: 'be916fcd16d0b33d228c49f0ff096b17',
-		}
-	</script> -->
-    <!-- <script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=d4d73a7d572b6ff6028d5f67de62029a">
-	</script> -->
-
-
-
     <script src="https://a.amap.com/jsapi_demos/static/china.js"></script>
-    <script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=ffc71dfd4e576596027f8f45a1b8fb2f">
+    <script type="text/javascript">
+        window._AMapSecurityConfig = {
+            securityJsCode: 'ce0e44758ad6b69607e23bf8e6a6ac11',
+        }
+    </script>
+    <script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=14aefebea926bb958032d5daf836fadf">
     </script>
+
+
     <!-- <script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=8e266e1ac2ad2383c7773ff504ac248f">
     </script> -->
     <!-- <script src="https://webapi.amap.com/loader.js"></script> -->

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
src/static/amap/js/uni.webview.1.5.4.js


+ 268 - 83
src/static/amap/mapGather.html

@@ -22,83 +22,52 @@
 <body>
     <div id="mapF" class="map" tabindex="0"></div>
 
-    <div style="padding: 0 10px;">
-        <div style="position: absolute;top: 0;display:inline-block;width: 50%;padding-top: 10px;">
-            <select id="selectId" class="select02">
-            </select>
-        </div>
+    <div id="myPageTop">
+        <input id="tipinput" />
     </div>
 
-    <div id="notification" style="display: none;">
-        <div class="mask"> </div>
-        <div class="content"> </div>
-    </div>
-
-    <div class="input-card" style="width: 120px;bottom: 40px;">
-        <button class="btn" onclick="handlePolygon('新增')" style="margin-bottom: 5px">新建</button>
-        <button class="btn" onclick="handlePolygon('编辑')" style="margin-bottom: 5px">开始编辑</button>
-        <button class="btn" onclick="handlePolygon('保存')" style="margin-bottom: 5px">结束编辑</button>
-
-        <button class="btn btn-red" type="button" id="postMessage" onclick="sendMessage()"> postMessage</button>
+    <div style="display:flex; width: 100%; position: absolute; bottom: 50px;justify-content: center;">
+        <button class="btn" onclick="handleButtom('重画')"
+            style="width: 80px;border: 0;background-color: #d9001b; color:#fff;padding: 0.60rem 0.5rem;margin-right: 15px;">重画</button>
+        <button class="btn" onclick="handleButtom('保存')"
+            style="width: 80px;border: 0;background-color: #25A5F7; color:#fff;padding: 0.60rem 0.5rem;margin-left: 15px;">保存</button>
     </div>
 
     <script src="https://a.amap.com/jsapi_demos/static/china.js"></script>
-    <script type="text/javascript"
-        src="https://webapi.amap.com/maps?v=2.0&key=8e266e1ac2ad2383c7773ff504ac248f&plugin=AMap.PolygonEditor"></script>
+    <script type="text/javascript">
+        window._AMapSecurityConfig = {
+            securityJsCode: 'ce0e44758ad6b69607e23bf8e6a6ac11',
+        }
+    </script>
+    <script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=14aefebea926bb958032d5daf836fadf">
+    </script>
+
     <script type="text/javascript" src="https://webapi.amap.com/ui/1.1/main.js"></script>
     <script type="text/javascript" src="./js/jquery-2.2.1.min.js"></script>
-    <script src="./js/M_select/M_select.js"></script>
 
     <!-- uni 的 SDK -->
     <!-- 需要把 uni.webview.1.5.4.js 下载到自己的服务器 -->
-    <script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.3/index.js"></script>
+    <script type="text/javascript" src="./js/uni.webview.1.5.4.js"></script>
 
     <script type="text/javascript">
-        var checkedArray = {
-            checkedData: 1,
-            checkedList: [
-                { value: 1, label: "消防站" },
-                { value: 2, label: "消防车" },
-                { value: 3, label: "监控" },
-                { value: 4, label: "重点单位" },
-                { value: 5, label: "消火栓/天然水源" },
-            ],
-        }//类型筛选
-
-        $.each(checkedArray.checkedList, function (i, item) {
-            $("#selectId").append(`<option value="${item.value}">${item.label}</option>`)
-        })
-        $(function () {
-            $(".select02").M_select({
-                // 手动添加下拉款图片(以html页面为起始位置写路径)
-                "Img": "./js/M_select/up4.png",
-                "Img2": "./js/M_select/down4.png",
-                "radius": "15px",
-                "Title": "--请选择--",
-                "inputName": "selected_value",
-                // 默认选中的值(参数值写需要选中的select的value值)
-                "selected": "1",
-                Succee: function () {
-                    checkedArray.checkedData = parseInt($(".inputHidden").val())
-                    mapCluster();
-                }
-            });
-        });
 
-        //点击遮罩层关闭
-        $('#notification .mask').on('click', function (e) {
-            $('#notification').css('display', 'none')
+        var form = {};
+        var typeName = "";
 
-            $('#notification .content #xxxx').remove()
-        })
-    </script>
+        var map = [];
 
-    <script type="text/javascript">
+        var marker = null;//创建点标记
+        var regeocode = {};//获取解析详细地址数据存储
+        var longitude = "";//点标记经度数据存储
+        var latitude = "";//点标记纬度数据存储
 
-        var map = [];
-        var polyEditor = null; //创建画布数据存储
-        var polygon1 = null; //选中地图区域数据存储
+        var polyEditor = null; //创建画布
+        var polyEditorArray = [];//画布数据存储
 
+
+        /**
+         * 初始化
+         */
         function initMap() {
             map = new AMap.Map("mapF", {
                 // mapStyle: 'amap://styles/d0ddc09bd7cbd7331a8e8fa691e5b0da', //设置地图的显示样式
@@ -110,50 +79,266 @@
 
             map.setFitView();
 
-            polyEditor = new AMap.PolygonEditor(map);
+            setTimeout(() => {
+                AMap.plugin(["AMap.PolygonEditor,AMap.PolylineEditor"], function () {
+                    handleAutoComplete();//调用输入提示功能
+
+                    if (typeName === "点") {
+                        marker = new AMap.Marker({});//初始化点标记
+                        handleMarker();
+                    } else if (typeName === "线") {
+                        polyEditor = new AMap.PolylineEditor(map);//初始化画布
+                        handlePolyline();
+                    } else if (typeName === "面") {
+                        polyEditor = new AMap.PolygonEditor(map);//初始化画布
+                        handlePolygon();
+                    }
+                })
+            }, 1000);
         }
 
         /**
-         * 面
+         * 输入提示
          */
-        function handlePolygon(clickType) {
-            if (clickType === "新增") {
+        function handleAutoComplete() {
+            AMap.plugin(["AMap.PlaceSearch", "AMap.AutoComplete", "AMap.Geocoder"], function () {
+                var autoOptions = {
+                    input: "tipinput",
+                };
+                var auto = new AMap.AutoComplete(autoOptions);
+
+                var placeSearch = new AMap.PlaceSearch({
+                    city: "全国",
+                    map: map,
+                }); //构造地点查询类
+                auto.on("select", select); //注册监听,当选中某条记录时会触发
+                function select(e) {
+                    longitude = e.lnglat.getLng()
+                    latitude = e.lnglat.getLat()
+
+                    placeSearch.setCity(e.poi.adcode);
+                    placeSearch.search(e.poi.name); //关键字查询查询
+
+                    handleAddress()
+                }
+            });
+        }
+
+        /**
+         * 点
+         */
+        function handleMarker() {
+            //地图点标记回显
+            if (form.longitude && form.latitude) {
+                longitude = form.longitude
+                latitude = form.latitude
+
+                marker = new AMap.Marker({
+                    position: new AMap.LngLat(form.longitude, form.latitude), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
+                });
+
+                handleAddress()
+            }
+
+            //为地图注册click事件获取鼠标点击出的经纬度坐标
+            map.on("click", function (e) {
+                longitude = e.lnglat.getLng()
+                latitude = e.lnglat.getLat()
+
+                map.remove([marker]);
+                marker = new AMap.Marker({
+                    position: new AMap.LngLat(e.lnglat.getLng(), e.lnglat.getLat()), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
+                });
+
+                handleAddress()
+            });
+        }
+
+        /**
+         * 线
+         */
+        function handlePolyline() {
+            var polygon = new AMap.Polyline({
+                path: form.gpsAreas
+            })
+
+            if (form.gpsAreas.length > 0) {
+                map.add([polygon]);
+
                 polyEditor.close();
-                polyEditor.setTarget();
+                polyEditor.setTarget(polygon);
                 polyEditor.open();
-            } else if (clickType === "编辑") {
-                polyEditor.open();
-            } else if (clickType === "保存") {
+
+                polyEditorArray = form.gpsAreas
+            } else {
                 polyEditor.close();
+                polyEditor.setTarget();
+                polyEditor.open();
             }
+
+            polyEditor.on("end", function (event) {
+                //绘制结束后坐标集合
+                polyEditorArray = event.target.$x[0]
+            });
         }
 
-        initMap();
+        /**
+         * 面
+         */
+        function handlePolygon() {
+            var polygon = new AMap.Polygon({
+                path: form.gpsAreas
+            })
+
+            if (form.gpsAreas.length > 0) {
+                map.add([polygon]);
 
+                polyEditor.close();
+                polyEditor.setTarget(polygon);
+                polyEditor.open();
 
-        if (window.plus) {
-            plusReady();
-        }//加上此判断以免再浏览器打开h5页面时报plus is not define
-        function plusReady() {
-            if (plus.webview.getWebviewById("batch_view")) {
-                const appData = plus.webview.getWebviewById("batch_view").data;
-                alert(JSON.stringfy(appData))
+                polyEditorArray = form.gpsAreas
+            } else {
+                polyEditor.close();
+                polyEditor.setTarget();
+                polyEditor.open();
             }
+
+            polyEditor.on("end", function (event) {
+                //绘制结束后坐标集合
+                polyEditorArray = event.target._opts.path
+            });
         }
 
-        function sendMessage() {
-            uni.postMessage({
-                data: 'Hello from web page!'
+        /**
+         * 反解析地址
+         */
+        function handleAddress() {
+            AMap.plugin(["AMap.Geocoder"], function () {
+                let zb = [longitude, latitude];
+                map.add(marker);
+                marker.setPosition(zb);
+                var geocoder = new AMap.Geocoder({
+                    city: "", //城市设为北京,默认:“全国”
+                    radius: 1000, //范围,默认:500
+                });
+                geocoder.getAddress(zb, function (status, result) {
+                    if (status === "complete" && result.regeocode) {
+                        regeocode = result.regeocode
+                    } else {
+                        alert("根据经纬度查询地址失败");
+                    }
+                });
             });
+        }
 
+        /**
+         * APP-PLUS
+         * 接收父页面传过来的值
+         */
+        window.receiveData = function (msg) {
+            // console.log("子页面:", msg)
+            // alert(msg.dataType)
+            form = msg.dataArray
+            typeName = msg.dataType
+            initMap();
+        }
 
-            var item = "previewFile";
-            if (window.parent) {
-                window.parent.postMessage(item, '*');
+        /**
+         * H5
+         * 接收父页面传过来的值
+         */
+        window.addEventListener("message", function (event) {
+            if ("funcName" in event.data) {
+                console.log("子页面:", event);
+                form = JSON.parse(event.data.param)
+                typeName = event.data.typeName
             }
-        }
+            initMap();
+        });
+
+        /**
+         * 按钮点击事件
+         */
+        function handleButtom(value) {
+            if (value == '重画') {
+                if (typeName === "点") {
+                    map.remove([marker]);
+                    form.longitude = ""
+                    form.latitude = ""
+                    form.province = ""
+                    form.city = ""
+                    form.area = ""
+                    form.streetTown = ""
+                    form.facilityAddress = ""
+                    form.address = ""
+                } else if (typeName === "线" || typeName === "面") {
+                    polyEditor.close();
+                    polyEditor.setTarget();
+                    polyEditor.open();
+                    map.clearMap();
+                    polyEditorArray = []
+                }
+
+            } else if (value == '保存') {
+
+                if (typeName === "点") {
+                    form.longitude = longitude
+                    form.latitude = latitude
+
+                    form.province = regeocode.addressComponent.province
+                    form.city = regeocode.addressComponent.city
+                    form.area = regeocode.addressComponent.district
+                    form.streetTown = regeocode.addressComponent.township;
+                    form.facilityAddress = regeocode.addressComponent.street + regeocode.addressComponent.streetNumber;
+                    form.address =
+                        form.province + form.city + form.area + form.streetTown + regeocode.addressComponent.street + regeocode.addressComponent.streetNumber;
+                } else if (typeName === "线" || typeName === "面") {
+                    polyEditor.close();
+                    form.gpsAreas = polyEditorArray
+                }
+
+                //向主页面推送消息
 
+                //APP-PLUS
+                uni.postMessage({
+                    data: JSON.stringify(form)
+                });
+
+                //H5
+                var message = {
+                    funcName: "message",
+                    param: JSON.stringify(form),
+                };
+                if (window.parent) {
+                    window.parent.postMessage(message, '*');
+                }
+            }
+        }
     </script>
+    <style>
+        #myPageTop {
+            position: absolute;
+            left: 10px;
+            top: 10px;
+            background: transparent;
+            font-family: "Microsoft Yahei", "微软雅黑", "Pinghei";
+            font-size: 13px;
+        }
+
+        #myPageTop input {
+            width: 18rem;
+            border: 1px solid #ced4da;
+            border-radius: 5px;
+            padding: 5px;
+        }
+
+        #myPageTop input:focus {
+            outline: none;
+            border-radius: 5px;
+            border: 1px solid #25A5F7;
+        }
+    </style>
 </body>
 
 </html>

+ 193 - 0
src/static/amap/mapGatherView.html

@@ -0,0 +1,193 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <title>设施查看</title>
+    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
+    <link rel="stylesheet" type="text/css" href="./js/M_select/M_select.css">
+    <link rel="stylesheet" type="text/css" href="./js/notification/index.css">
+    <style>
+        html,
+        body,
+        #mapF {
+            height: 100%;
+            width: 100%;
+        }
+    </style>
+</head>
+
+<body>
+    <div id="mapF" class="map" tabindex="0"></div>
+
+    <div id="myPageTop">
+        <input id="tipinput" />
+
+        <div class="myPageTop-type">
+            <div class="title">设施汇总(120)</div>
+            <div class="center">11111111111111</div>
+        </div>
+    </div>
+
+
+    <script src="https://a.amap.com/jsapi_demos/static/china.js"></script>
+    <script type="text/javascript">
+        window._AMapSecurityConfig = {
+            securityJsCode: 'ce0e44758ad6b69607e23bf8e6a6ac11',
+        }
+    </script>
+    <script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=14aefebea926bb958032d5daf836fadf">
+    </script>
+
+    <script type="text/javascript" src="https://webapi.amap.com/ui/1.1/main.js"></script>
+    <script type="text/javascript" src="./js/jquery-2.2.1.min.js"></script>
+
+    <!-- uni 的 SDK -->
+    <!-- 需要把 uni.webview.1.5.4.js 下载到自己的服务器 -->
+    <script type="text/javascript" src="./js/uni.webview.1.5.4.js"></script>
+
+    <script type="text/javascript">
+
+        var form = {};
+        var typeName = "";
+
+        var map = [];
+
+        var marker = null;//创建点标记
+        var regeocode = {};//获取解析详细地址数据存储
+        var longitude = "";//点标记经度数据存储
+        var latitude = "";//点标记纬度数据存储
+
+        var polyEditor = null; //创建画布
+        var polyEditorArray = [];//画布数据存储
+
+
+        /**
+         * 初始化
+         */
+        function initMap() {
+            map = new AMap.Map("mapF", {
+                // mapStyle: 'amap://styles/d0ddc09bd7cbd7331a8e8fa691e5b0da', //设置地图的显示样式
+                resizeEnable: true,
+                center: [121.4737021, 31.2303904],
+                zoom: 13,
+                zooms: [3, 16],
+            });
+
+            map.setFitView();
+
+            setTimeout(() => {
+                AMap.plugin(["AMap.PolygonEditor,AMap.PolylineEditor"], function () {
+
+                    if (typeName === "点") {
+                        marker = new AMap.Marker({});//初始化点标记
+                        handleMarker();
+                    }
+                })
+            }, 1000);
+        }
+
+        /**
+         * 点
+         */
+        function handleMarker() {
+            //地图点标记回显
+            if (form.longitude && form.latitude) {
+                longitude = form.longitude
+                latitude = form.latitude
+
+                marker = new AMap.Marker({
+                    position: new AMap.LngLat(form.longitude, form.latitude), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
+                });
+
+                handleAddress()
+            }
+
+            //为地图注册click事件获取鼠标点击出的经纬度坐标
+            map.on("click", function (e) {
+                longitude = e.lnglat.getLng()
+                latitude = e.lnglat.getLat()
+
+                map.remove([marker]);
+                marker = new AMap.Marker({
+                    position: new AMap.LngLat(e.lnglat.getLng(), e.lnglat.getLat()), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
+                });
+
+                handleAddress()
+            });
+        }
+
+        /**
+         * APP-PLUS
+         * 接收父页面传过来的值
+         */
+        window.receiveData = function (msg) {
+            // console.log("子页面:", msg)
+            // alert(msg.dataType)
+            form = msg.dataArray
+            typeName = msg.dataType
+            initMap();
+        }
+
+        /**
+         * H5
+         * 接收父页面传过来的值
+         */
+        window.addEventListener("message", function (event) {
+            if ("funcName" in event.data) {
+                console.log("子页面:", event);
+                form = JSON.parse(event.data.param)
+                typeName = event.data.typeName
+            }
+            initMap();
+        });
+
+        /**
+         * 按钮点击事件
+         */
+        function handleButtom(value) {
+
+        }
+    </script>
+    <style>
+        #myPageTop {
+            position: absolute;
+            left: 10px;
+            top: 10px;
+            background: transparent;
+            font-family: "Microsoft Yahei", "微软雅黑", "Pinghei";
+            font-size: 13px;
+        }
+
+        #myPageTop input {
+            width: 18rem;
+            border: 1px solid #ced4da;
+            border-radius: 5px;
+            padding: 5px;
+        }
+
+        #myPageTop input:focus {
+            outline: none;
+            border-radius: 5px;
+            border: 1px solid #25A5F7;
+        }
+
+        #myPageTop .myPageTop-type {
+            padding: 10px;
+            margin-top: 10px;
+            background: #fff;
+            font-family: "Microsoft Yahei", "微软雅黑", "Pinghei";
+            font-size: 13px;
+        }
+
+
+        #myPageTop .myPageTop-type .title {
+            font-weight: 600;
+            text-align: center;
+        }
+    </style>
+</body>
+
+</html>

+ 8 - 4
src/static/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 3620854 */
-  src: url('https://at.alicdn.com/t/c/font_3620854_xb9fkqucr3.woff2?t=1688535027394') format('woff2'),
-       url('https://at.alicdn.com/t/c/font_3620854_xb9fkqucr3.woff?t=1688535027394') format('woff'),
-       url('https://at.alicdn.com/t/c/font_3620854_xb9fkqucr3.ttf?t=1688535027394') format('truetype');
+  src: url('https://at.alicdn.com/t/c/font_3620854_kj985d7f2u.woff2?t=1689669584145') format('woff2'),
+       url('https://at.alicdn.com/t/c/font_3620854_kj985d7f2u.woff?t=1689669584145') format('woff'),
+       url('https://at.alicdn.com/t/c/font_3620854_kj985d7f2u.ttf?t=1689669584145') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,10 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.ucicon-app-map:before {
+  content: "\e60a";
+}
+
 .ucicon-chenggong:before {
   content: "\e609";
 }
@@ -153,7 +157,7 @@
   content: "\e66d";
 }
 
-.ucicon-xingzhuang14kaobei2:before {
+.ucicon-shangchuan:before {
   content: "\e66e";
 }
 

BIN
src/static/iconfont/iconfont.ttf


BIN
src/static/images/common/applicationInfo.png


+ 6 - 4
src/uni_modules/uview-plus/changelog.md

@@ -1,7 +1,9 @@
-## 3.1.31(2023-05-15)
-本地累计修复一些问题提交
-## 3.0.9(2022-07-14)
-修复u-search双向绑定
+## 3.1.34(2023-07-27)
+修复App打包uni.$u.mpMixin方式sdk暂时不支持导致报错
+## 3.1.33(2023-07-13)
+修复弹窗进入动画、模板页面样式等
+## 3.1.31(2023-07-11)
+修复dayjs引用
 ## 3.0.8(2022-07-12)
 修复u-tag默认宽度撑满容器
 ## 3.0.7(2022-07-12)

+ 1 - 1
src/uni_modules/uview-plus/components/u-back-top/u-back-top.vue

@@ -51,7 +51,7 @@
 	 */
 	export default {
 		name: 'u-back-top',
-		mixins: [mpMixin, mixin,props],
+		mixins: [mpMixin, mixin, props],
 		computed: {
 			backTopStyle() {
 				// 动画组件样式

+ 3 - 1
src/uni_modules/uview-plus/components/u-calendar/header.vue

@@ -21,9 +21,11 @@
 </template>
 
 <script>
+	import mpMixin from '../../libs/mixin/mpMixin.js';
+	import mixin from '../../libs/mixin/mixin.js';
 	export default {
 		name: 'u-calendar-header',
-		mixins: [uni.$u.mpMixin, uni.$u.mixin],
+		mixins: [mpMixin, mixin],
 		props: {
 			// 标题
 			title: {

+ 1 - 1
src/uni_modules/uview-plus/components/u-calendar/month.vue

@@ -35,7 +35,7 @@
 	import mixin from '../../libs/mixin/mixin.js';
 	import defprops from '../../libs/config/props';
 	// import dayjs from '../../libs/util/dayjs.js';
-	import dayjs from 'dayjs'
+	import dayjs from 'dayjs/esm/index'
 	export default {
 		name: 'u-calendar-month',
 		mixins: [mpMixin, mixin],

+ 1 - 1
src/uni_modules/uview-plus/components/u-calendar/u-calendar.vue

@@ -69,7 +69,7 @@ import uMonth from './month.vue'
 import props from './props.js'
 import util from './util.js'
 // import dayjs from '../../libs/util/dayjs.min.js'
-import dayjs from 'dayjs'
+import dayjs from 'dayjs/esm/index'
 import Calendar from '../../libs/util/calendar.js'
 import mpMixin from '../../libs/mixin/mpMixin.js'
 import mixin from '../../libs/mixin/mixin.js'

+ 1 - 1
src/uni_modules/uview-plus/components/u-calendar/util.js

@@ -1,4 +1,4 @@
-import dayjs from 'dayjs'
+import dayjs from 'dayjs/esm/index'
 export default {
     methods: {
         // 设置月份数据

+ 2 - 2
src/uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker.vue

@@ -34,7 +34,7 @@
 	import mpMixin from '../../libs/mixin/mpMixin.js';
 	import mixin from '../../libs/mixin/mixin.js';
 	// import dayjs from '../../libs/util/dayjs.js';
-	import dayjs from 'dayjs'
+	import dayjs from 'dayjs/esm/index'
 
 	/**
 	 * DatetimePicker 时间日期选择器
@@ -188,7 +188,7 @@
 				// 发出change时间,value为当前选中的时间戳
 				this.$emit('change', {
 					value: selectValue,
-					// #ifndef MP-WEIXIN || MP-TOUTIAO
+					// #ifndef MP-WEIXIN
 					// 微信小程序不能传递this实例,会因为循环引用而报错
 					picker: this.$refs.picker,
 					// #endif

+ 2 - 1
src/uni_modules/uview-plus/components/u-form-item/u-form-item.vue

@@ -151,7 +151,8 @@
 			},
 			// 点击组件
 			clickHandler() {
-				this.$emit('click')
+				// console.log(1)
+				// this.$emit('click')
 			}
 		},
 	}

+ 1 - 1
src/uni_modules/uview-plus/components/u-list/u-list.vue

@@ -18,7 +18,7 @@
 		class="u-list"
 		:scroll-into-view="scrollIntoView"
 		:style="[listStyle]"
-		scroll-y
+		:scroll-y="scrollable"
 		:scroll-top="Number(scrollTop)"
 		:lower-threshold="Number(lowerThreshold)"
 		:upper-threshold="Number(upperThreshold)"

+ 318 - 0
src/uni_modules/uview-plus/components/u-message-input/u-message-input.vue

@@ -0,0 +1,318 @@
+<template>
+	<view class="u-char-box">
+		<view class="u-char-flex">
+			<input :disabled="disabledKeyboard" :value="valueModel" type="number" :focus="focus" :maxlength="maxlength" class="u-input" @input="getVal"/>
+			<view v-for="(item, index) in loopCharArr" :key="index">
+				<view :class="[breathe && charArrLength == index ? 'u-breathe' : '', 'u-char-item',
+				charArrLength === index && mode == 'box' ? 'u-box-active' : '',
+				mode === 'box' ? 'u-box' : '']" :style="{
+					fontWeight: bold ? 'bold' : 'normal',
+					fontSize: fontSize + 'rpx',
+					width: width + 'rpx',
+					height: width + 'rpx',
+					color: inactiveColor,
+					borderColor: charArrLength === index && mode == 'box' ? activeColor : inactiveColor
+				}">
+					<view class="u-placeholder-line" :style="{
+							display: charArrLength === index ? 'block' : 'none',
+							height: width * 0.5 +'rpx'
+						}"
+						v-if="mode !== 'middleLine'"
+					></view>
+					<view v-if="mode === 'middleLine' && charArrLength <= index" :class="[breathe && charArrLength == index ? 'u-breathe' : '', charArrLength === index ? 'u-middle-line-active' : '']"
+					 class="u-middle-line" :style="{height: bold ? '4px' : '2px', background: charArrLength === index ? activeColor : inactiveColor}"></view>
+					<view v-if="mode === 'bottomLine'" :class="[breathe && charArrLength == index ? 'u-breathe' : '', charArrLength === index ? 'u-bottom-line-active' : '']"
+					 class="u-bottom-line" :style="{height: bold ? '4px' : '2px', background: charArrLength === index ? activeColor : inactiveColor}"></view>
+					<block v-if="!dotFill"> {{ charArr[index] ? charArr[index] : ''}}</block>
+					<block v-else>
+						<text class="u-dot">{{ charArr[index] ? '●' : ''}}</text>
+					</block>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * messageInput 验证码输入框
+	 * @description 该组件一般用于验证用户短信验证码的场景,也可以结合uView的键盘组件使用
+	 * @tutorial https://www.uviewui.com/components/messageInput.html
+	 * @property {String Number} maxlength 输入字符个数(默认4)
+	 * @property {Boolean} dot-fill 是否用圆点填充(默认false)
+	 * @property {String} mode 模式选择,见上方"基本使用"说明(默认box)
+	 * @property {String Number} value 预置值
+	 * @property {Boolean} breathe 是否开启呼吸效果,见上方说明(默认true)
+	 * @property {Boolean} focus 是否自动获取焦点(默认false)
+	 * @property {Boolean} bold 字体和输入横线是否加粗(默认true)
+	 * @property {String Number} font-size 字体大小,单位rpx(默认60)
+	 * @property {String} active-color 当前激活输入框的样式(默认#2979ff)
+	 * @property {String} inactive-color 非激活输入框的样式,文字颜色同此值(默认#606266)
+	 * @property {String | Number} width 输入框宽度,单位rpx,高等于宽(默认80)
+	 * @property {Boolean} disabled-keyboard 禁止点击输入框唤起系统键盘(默认false)
+	 * @event {Function} change 输入内容发生改变时触发,具体见官网说明
+	 * @event {Function} finish 输入字符个数达maxlength值时触发,见官网说明
+	 * @example <u-message-input mode="bottomLine"></u-message-input>
+	 */
+	export default {
+		name: "u-message-input",
+		props: {
+			// 最大输入长度
+			maxlength: {
+				type: [Number, String],
+				default: 4
+			},
+			// 是否用圆点填充
+			dotFill: {
+				type: Boolean,
+				default: false
+			},
+			// 显示模式,box-盒子模式,bottomLine-横线在底部模式,middleLine-横线在中部模式
+			mode: {
+				type: String,
+				default: "box"
+			},
+			// 预置值
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+			// 当前激活输入item,是否带有呼吸效果
+			breathe: {
+				type: Boolean,
+				default: true
+			},
+			// 是否自动获取焦点
+			focus: {
+				type: Boolean,
+				default: false
+			},
+			// 字体是否加粗
+			bold: {
+				type: Boolean,
+				default: false
+			},
+			// 字体大小
+			fontSize: {
+				type: [String, Number],
+				default: 60
+			},
+			// 激活样式
+			activeColor: {
+				type: String,
+				default: '#2979ff'
+			},
+			// 未激活的样式
+			inactiveColor: {
+				type: String,
+				default: '#606266'
+			},
+			// 输入框的大小,单位rpx,宽等于高
+			width: {
+				type: [Number, String],
+				default: '80'
+			},
+			// 是否隐藏原生键盘,如果想用自定义键盘的话,需设置此参数为true
+			disabledKeyboard: {
+				type: Boolean,
+				default: false
+			}
+		},
+		watch: {
+			// maxlength: {
+			// 	// 此值设置为true,会在组件加载后无需maxlength变化就会执行一次本监听函数,无需再created生命周期中处理
+			// 	immediate: true,
+			// 	handler(val) {
+			// 		this.maxlength = Number(val);
+			// 	}
+			// }, 
+			modelValue: {
+				immediate: true,
+				handler(val) {
+					// 转为字符串
+					val = String(val);
+					// 超出部分截掉
+					this.valueModel = val.substring(0, this.maxlength);
+				}
+			},
+		},
+		data() {
+			return {
+				valueModel: ""
+			}
+		},
+		emits: ['change', 'finish'],
+		computed: {
+			// 是否显示呼吸灯效果
+			animationClass() {
+				return (index) => {
+					if (this.breathe && this.charArr.length == index) return 'u-breathe';
+					else return '';
+				}
+			},
+			// 用于显示字符
+			charArr() {
+				return this.valueModel.split('');
+			},
+			charArrLength() {
+				return this.charArr.length;
+			},
+			// 根据长度,循环输入框的个数,因为头条小程序数值不能用于v-for
+			loopCharArr() {
+				return new Array(this.maxlength);
+			}
+		},
+		methods: {
+			getVal(e) {
+				let {
+					value
+				} = e.detail
+				this.valueModel = value;
+				// 判断长度是否超出了maxlength值,理论上不会发生,因为input组件设置了maxlength属性值
+				if (String(value).length > this.maxlength) return;
+				// 未达到maxlength之前,发送change事件,达到后发送finish事件
+				this.$emit('change', value);
+				if (String(value).length == this.maxlength) {
+					this.$emit('finish', value);
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	// 定义混入指令,用于在非nvue环境下的flex定义,因为nvue没有display属性,会报错
+	@mixin vue-flex($direction: row) {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		flex-direction: $direction;
+		/* #endif */
+	}
+
+	@keyframes breathe {
+		0% {
+			opacity: 0.3;
+		}
+
+		50% {
+			opacity: 1;
+		}
+
+		100% {
+			opacity: 0.3;
+		}
+	}
+
+	.u-char-box {
+		text-align: center;
+	}
+
+	.u-char-flex {
+		@include vue-flex;
+		justify-content: center;
+		flex-wrap: wrap;
+		position: relative;
+	}
+
+	.u-input {
+		position: absolute;
+		top: 0;
+		left: -100%;
+		width: 200%;
+		height: 100%;
+		text-align: left;
+		z-index: 9;
+		opacity: 0;
+		background: none;
+	}
+
+	.u-char-item {
+		position: relative;
+		width: 90rpx;
+		height: 90rpx;
+		margin: 10rpx 10rpx;
+		font-size: 60rpx;
+		font-weight: bold;
+		color: $u-main-color;
+		line-height: 90rpx;
+		@include vue-flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.u-middle-line {
+		border: none;
+	}
+
+	.u-box {
+		box-sizing: border-box;
+		border: 2rpx solid #cccccc;
+		border-radius: 6rpx;
+	}
+
+	.u-box-active {
+		overflow: hidden;
+		animation-timing-function: ease-in-out;
+		animation-duration: 1500ms;
+		animation-iteration-count: infinite;
+		animation-direction: alternate;
+		border: 2rpx solid $u-primary;
+	}
+
+	.u-middle-line-active {
+		background: $u-primary;
+	}
+
+	.u-breathe {
+		animation: breathe 2s infinite ease;
+	}
+
+	.u-placeholder-line {
+		/* #ifndef APP-NVUE */
+		display: none;
+		/* #endif */
+		position: absolute;
+		left: 50%;
+		top: 50%;
+		transform: translate(-50%, -50%);
+		width: 2rpx;
+		height: 40rpx;
+		background: #333333;
+		animation: twinkling 1.5s infinite ease;
+	}
+
+	.u-animation-breathe {
+		animation-name: breathe;
+	}
+
+	.u-dot {
+		font-size: 34rpx;
+		line-height: 34rpx;
+	}
+
+	.u-middle-line {
+		height: 4px;
+		background: #000000;
+		width: 80%;
+		position: absolute;
+		border-radius: 2px;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+	}
+
+	.u-bottom-line-active {
+		background: $u-primary;
+	}
+
+	.u-bottom-line {
+		height: 4px;
+		background: #000000;
+		width: 80%;
+		position: absolute;
+		border-radius: 2px;
+		bottom: 0;
+		left: 50%;
+		transform: translate(-50%);
+	}
+</style>

+ 1 - 2
src/uni_modules/uview-plus/components/u-picker/u-picker.vue

@@ -164,7 +164,7 @@ export default {
 			this.setIndexs(value)
 
 			this.$emit('change', {
-				// #ifndef MP-WEIXIN || MP-LARK || MP-TOUTIAO
+				// #ifndef MP-WEIXIN || MP-LARK
 				// 微信小程序不能传递this,会因为循环引用而报错
 				picker: this,
 				// #endif
@@ -214,7 +214,6 @@ export default {
 		},
 		// 设置整体各列的columns的值
 		setColumns(columns) {
-			console.log(columns)
 			this.innerColumns = uni.$u.deepClone(columns)
 			// 如果在设置各列数据时,没有被设置默认的各列索引defaultIndex,那么用0去填充它,数组长度为列的数量
 			if (this.innerIndex.length === 0) {

+ 1 - 1
src/uni_modules/uview-plus/components/u-scroll-list/u-scroll-list.vue

@@ -106,7 +106,7 @@ export default {
 	mixins: [mpMixin, mixin, props],
 	// #endif
 	// #ifdef APP-NVUE
-	mixins: [uni.$u.mpMixin, uni.$u.mixin, nvueMixin, props],
+	mixins: [mpMixin, mixin, nvueMixin, props],
 	// #endif
 	data() {
 		return {

+ 3 - 3
src/uni_modules/uview-plus/components/u-sticky/u-sticky.vue

@@ -153,7 +153,7 @@
 				}
 
 				// APP-Vue和微信平台,通过computedStyle判断是否支持css sticky
-				// #ifdef APP-VUE || MP-WEIXIN
+				// #ifdef APP-VUE || MP-WEIXIN || MP-TOUTIAO
 				this.cssSticky = await this.checkComputedStyle()
 				// #endif
 
@@ -170,7 +170,7 @@
 			// 在APP和微信小程序上,通过uni.createSelectorQuery可以判断是否支持css sticky
 			checkComputedStyle() {
 				// 方法内进行判断,避免在其他平台生成无用代码
-				// #ifdef APP-VUE || MP-WEIXIN
+				// #ifdef APP-VUE || MP-WEIXIN || MP-TOUTIAO
 				return new Promise(resolve => {
 					uni.createSelectorQuery().in(this).select('.u-sticky').fields({
 						computedStyle: ["position"]
@@ -206,7 +206,7 @@
 
 <style lang="scss" scoped>
 	.u-sticky {
-		/* #ifdef APP-VUE || MP-WEIXIN */
+		/* #ifdef APP-VUE || MP-WEIXIN || MP-TOUTIAO */
 		// 此处默认写sticky属性,是为了给微信和APP通过uni.createSelectorQuery查询是否支持css sticky使用
 		position: sticky;
 		/* #endif */

+ 17 - 12
src/uni_modules/uview-plus/components/u-transition/transition.js

@@ -1,5 +1,5 @@
 // 定义一个一定时间后自动成功的promise,让调用nextTick方法处,进入下一个then方法
-const nextTick = () => new Promise(resolve => setTimeout(resolve, 1000 / 50))
+const waitTick = () => new Promise(resolve => setTimeout(resolve, 1000 / 50))
 // nvue动画模块实现细节抽离在外部文件
 // #ifdef APP-NVUE
 import animationMap from './nvue-ani-map.js'
@@ -22,6 +22,8 @@ const animation = uni.requireNativePlugin('animation')
 const getStyle = (name) => animationMap[name]
 // #endif
 
+import { nextTick } from 'vue'
+
 export default {
     methods: {
         // 组件被点击发出事件
@@ -30,7 +32,7 @@ export default {
         },
         // #ifndef APP-NVUE
         // vue版本的组件进场处理
-         vueEnter() {
+        async vueEnter() {
             // 动画进入时的类名
             const classNames = getClassNames(this.mode)
             // 定义状态和发出动画进入前事件
@@ -39,7 +41,8 @@ export default {
             this.inited = true
             this.display = true
             this.classes = classNames.enter
-            this.$nextTick(async () => {
+			await nextTick();
+			{
 				// #ifdef H5
 				await uni.$u.sleep(20)
 				// #endif
@@ -50,10 +53,10 @@ export default {
                 this.$emit('afterEnter')
                 // 赋予组件enter-to类名
                 this.classes = classNames['enter-to']
-            })
+            }
         },
         // 动画离场处理
-        vueLeave() {
+        async vueLeave() {
             // 如果不是展示状态,无需执行逻辑
             if (!this.display) return
             const classNames = getClassNames(this.mode)
@@ -63,19 +66,20 @@ export default {
             // 获得类名
             this.classes = classNames.leave
 
-            this.$nextTick(() => {
+            await nextTick();
+			{
                // 动画正在离场的状态
                this.transitionEnded = false
                this.$emit('leave')
                 // 组件执行动画,到了执行的执行时间后,执行一些额外处理
                 setTimeout(this.onTransitionEnd, this.duration)
                 this.classes = classNames['leave-to']
-            })
+            }
         },
         // #endif
         // #ifdef APP-NVUE
         // nvue版本动画进场
-        nvueEnter() {
+        async nvueEnter() {
             // 获得样式的名称
             const currentStyle = getStyle(this.mode)
             // 组件动画状态和发出事件
@@ -90,11 +94,12 @@ export default {
                 opacity: 0
             }
             // 等待弹窗内容渲染完成
-            this.$nextTick(() => {
+            await nextTick();
+			{
                 // 合并样式
                 this.viewStyle = currentStyle.enter
                 Promise.resolve()
-                    .then(nextTick)
+                    .then(waitTick)
                     .then(() => {
                         // 组件开始进入前的事件
                         this.$emit('enter')
@@ -111,7 +116,7 @@ export default {
                         })
                     })
                     .catch(() => {})
-            })
+            }
         },
         nvueLeave() {
             if (!this.display) {
@@ -125,7 +130,7 @@ export default {
             this.viewStyle = currentStyle.leave
             // 放到promise中处理执行过程
             Promise.resolve()
-                .then(nextTick) // 等待几十ms
+                .then(waitTick) // 等待几十ms
                 .then(() => {
                     this.transitionEnded = false
                     // 动画正在离场的状态

+ 1 - 0
src/uni_modules/uview-plus/components/u-transition/u-transition.vue

@@ -47,6 +47,7 @@ export default {
 			classes: '', // 应用的类名
 		}
 	},
+	emits: ['click', 'beforeEnter', 'enter', 'afterEnter', 'beforeLeave', 'leave', 'afterLeave'],
 	computed: {
 	    mergeStyle() {
 	        const { viewStyle, customStyle } = this

+ 0 - 1
src/uni_modules/uview-plus/components/u-upload/u-upload.vue

@@ -181,7 +181,6 @@
 		watch: {
 			// 监听文件列表的变化,重新整理内部数据
 			fileList: {
-				immediate: true,
 				handler() {
 					this.formatFileList()
 				},

+ 1 - 0
src/uni_modules/uview-plus/index.scss

@@ -1,5 +1,6 @@
 // 引入公共基础类
 @import "./libs/css/common.scss";
+@import "./libs/css/flex.scss";
 @import "./libs/css/color.scss";
 
 // 非nvue的样式

+ 1 - 3
src/uni_modules/uview-plus/libs/config/props.js

@@ -93,7 +93,6 @@ import Toolbar from './props/toolbar'
 import Tooltip from './props/tooltip'
 import Transition from './props/transition'
 import Upload from './props/upload'
-import drawer from './props/drawer'
 
 const {
     color
@@ -187,6 +186,5 @@ export default {
     ...Toolbar,
     ...Tooltip,
     ...Transition,
-    ...Upload,
-    ...drawer,
+    ...Upload
 }

+ 39 - 0
src/uni_modules/uview-plus/libs/css/flex.scss

@@ -255,3 +255,42 @@
 	flex-shrink: 1
 }
 
+// 定义内外边距,历遍1-80
+@for $i from 0 through 80 {
+	// 只要双数和能被5除尽的数
+	@if $i % 2 == 0 or $i % 5 == 0 {
+		// 得出:u-margin-30或者u-m-30
+		.u-margin-#{$i}, .u-m-#{$i} {
+			margin: $i + rpx!important;
+		}
+		
+		// 得出:u-padding-30或者u-p-30
+		.u-padding-#{$i}, .u-p-#{$i} {
+			padding: $i + rpx!important;
+		}
+		
+		@each $short, $long in l left, t top, r right, b bottom {
+			// 缩写版,结果如: u-m-l-30
+			// 定义外边距
+			.u-m-#{$short}-#{$i} {
+				margin-#{$long}: $i + rpx!important;
+			}
+			
+			// 定义内边距
+			.u-p-#{$short}-#{$i} {
+				padding-#{$long}: $i + rpx!important;
+			}
+			
+			// 完整版,结果如:u-margin-left-30
+			// 定义外边距
+			.u-margin-#{$long}-#{$i} {
+				margin-#{$long}: $i + rpx!important;
+			}
+			
+			// 定义内边距
+			.u-padding-#{$long}-#{$i} {
+				padding-#{$long}: $i + rpx!important;
+			}
+		}
+	}
+}

+ 4 - 4
src/uni_modules/uview-plus/libs/function/platform.js

@@ -28,6 +28,10 @@ platform = 'nvue'
 platform = 'h5'
 // #endif
 
+// #ifdef MP
+platform = 'mp'
+// #endif
+
 // #ifdef MP-WEIXIN
 platform = 'weixin'
 // #endif
@@ -56,10 +60,6 @@ platform = 'kuaishou'
 platform = '360'
 // #endif
 
-// #ifdef MP
-platform = 'mp'
-// #endif
-
 // #ifdef QUICKAPP-WEBVIEW
 platform = 'quickapp-webview'
 // #endif

+ 1 - 1
src/uni_modules/uview-plus/package.json

@@ -2,7 +2,7 @@
 	"id": "uview-plus",
 	"name": "uview-plus",
 	"displayName": "uview-plus3.0重磅发布,全面的Vue3移动组件库。",
-	"version": "3.1.31",
+	"version": "3.1.34",
 	"description": "uview-plus已兼容vue3,全面的组件和便捷的工具会让您信手拈来,如鱼得水",
 	"keywords": [
         "uview",

+ 0 - 2
src/utils/jssdk.js

@@ -10,9 +10,7 @@ export function configWeiXin(callback) {
 	if (window.location.host) {
 		url = window.location.host;
 	}
-	//#endif
 
-	//#ifdef APP-PLUS || MP-WEIXIN
 	if (uni.getStorageSync("serveUrl")) {
 		url = uni.getStorageSync("serveUrl");
 	}

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov