npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

anytrek-front-public-component

v1.6.17

Published

some common component

Downloads

2,233

Readme

front-public-component

A public component library

📦 Installation

npm install anytrek-front-public-component --save

🚀 Usage

import frontPublicComponent from 'anytrek-front-public-component';
import 'anytrek-front-public-component/style.css';
app.use(frontPublicComponent);

🧩 Component: <anytrekTimerangePick>

Select a time range

<anytrekTimerangePick
  v-model:visible="visible"
  v-model:value="value"
  v-model:valueType="valueType"
  v-model:startTime="startTime"
  v-model:endTime="endTime"
  v-model:timeZone="timeZone"
  :showQuick="true"
  :immediate="true"
  @change="onRangeChange"
/>

🔧 Example Setup

const visible = ref(false);
const value = ref<'custom' | '' | number>('custom');
const valueType = ref<string>('week');
const startTime = ref<string>('');
const endTime = ref<string>('');
const timeZone = ref<string>('');

function onRangeChange(start: string, end: string, tz: string) {
  console.log(start, end, tz);
}

📋 Props Reference

| 参数名称 | 描述 | 数据类型 | 默认值 | | ---------- | --------------------- | ---------------- | ------------------- | | value | 当选择快捷选项时,这个字段是数量。value为1,valueType为'month'时表示选择的时间段为从现在开始往前推一个月到现在,当自定义时间时这个字段固定为'custom'。 | custom \| '' \| number | 'custom' | | valueType | 快捷选项的单位(当value值为custom时,这个字段无效) | hour \| day \| week \| month \| quarter \| year | '' | | startTime | 开始时间 | String | '' | | endTime | 结束时间 | String | '' | | valueFormat | startTime、endTime值的格式(如果自定义这个格式没有带上小时,则认为是只选择日期,此时showFormat也应该不带小时及以后部分) | String | YYYY-MM-DDTHH:mm:ssZ | | showFormat | startTime、endTime显示格式 | String | YYYY-MM-DD HH:mm | | timeZone | 时区 | String | 当前网页时区(当needNowTimeZone为false时,timeZone默认取PST) | | visible | popover弹框的展示与否 | Boolean | false | | teleported | 将popover弹框插入至 body 元素 | Boolean | true | | disabled | 禁用选择器 | Boolean | false | | showQuick | 是否显示快捷选项 | Boolean | true | | hourList | 小时快捷选项 | Number[] | [] | | dayList | 天快捷选项 | Number[] | [] | | weekList | 周快捷选项 | Number[] | [1, 2] | | monthList | 月快捷选项 | Number[] | [1] | | quarterList | 季度快捷选项 | Number[] | [] | | yearList | 年快捷选项 | Number[] | [] | | disabledDate | 最多可以选择多少天 | Number | 31 | | immediate | 是否需要开始时执行一次change事件 | Boolean | false | | needNowTimeZone | 是否需要在时区列表显示当前网页时区 | Boolean | true | | haveRangSwitch | 是否需要左右进行区间移动 | Boolean | false | | needMaxIndex | 是否需要弹框在最上层 | Boolean | false | | timeZoneList | 时区选项 | Object[] | [{value:'PST',label:'PST'},{value:'PDT',label:'PDT'},{value:'MST',label:'MST'},{value:'MDT',label:'MDT'},{value:'CST',label:'CST'},{value:'CDT',label:'CDT'},{value:'EST',label:'EST'},{value:'EDT',label:'EDT'},{value:'AST',label:'AST'},{value:'ADT',label:'ADT'},{value:'AKST',label:'AKST'},{value:'AKDT',label:'AKDT'}] | | unlinkPanels | 是否取消两个日期面板之间的联动 | Boolean | true | | isLast | 默认快捷选项都是最近一天,最近一年,要想设置成当天、当月就得把这个值改成false | Boolean | true | | showTimeZoneChoose | 是否允许选择时区 | Boolean | true | | disableDayFuntion | 一个用来判断该日期是否被禁用的函数,接受一个Date对象作为参数。 应该返回一个Boolean值。 | (date:String,tz:String ) => Boolean | | | disableHourFuntion | 禁止选择部分小时选项。数组内有效的值为0-23 | (date:String,tz:String ) => Number[] | | | disableMinuteFuntion | 禁止选择部分分钟选项。数组内有效的值为0-59 | (date:String,hour:String,tz:String ) => Number[] | | | showTime | 没选时间时默认指定哪个月份(最好为15号) | YYYY-MM-DDTHH:mm:ssZ | | | quarterMessage | 当前只能选择哪个季度(季度值取1、2、3、4) | { year: Number, quarter: Number } | | | assetTimeList | 资产利用率数据数组 | { startTime: Number(时间戳或者YYYY-MM-DDTHH:mm:ssZ), endTime: Number(时间戳或者YYYY-MM-DDTHH:mm:ssZ) } | |

🧩 Component: <anytrekTimePick>

Select a time

<anytrekTimePick
  v-model:value="anytrekTimePickValue"
  v-model:timeZone="anytrekTimePickTimeZone"
  v-model:visible="anytrekTimePickVisible"
  :immediate="true"
  @change="timeChange"
/>

🔧 Example Setup

const anytrekTimePickValue = ref<string>('2018-01-31T14:32:19.213Z');
const anytrekTimePickTimeZone = ref<string>('');
const anytrekTimePickVisible = ref<boolean>(false);
function timeChange(time: string, tz: string) {
  console.log(time, tz);
}

📋 Props Reference

| 参数名称 | 描述 | 数据类型 | 默认值 | | ---------- | --------------------- | ---------------- | ------------------- | | value | 选择的时间值 | String | '' | | valueFormat | value 值的格式(如果自定义这个格式没有带上小时,则认为是只选择日期,此时showFormat也应该不带小时及以后部分) | String | YYYY-MM-DDTHH:mm:ssZ | | showFormat | value 显示格式 | String | YYYY-MM-DD HH:mm | | timeZone | 时区 | String | 当前网页时区(当needNowTimeZone为false时,timeZone默认取PST) | | visible | popover弹框的展示与否 | Boolean | false | | teleported | 将popover弹框插入至 body 元素 | Boolean | true | | disabled | 禁用选择器 | Boolean | false | | immediate | 是否需要开始时执行一次 change事件 | Boolean | false | | disableFuntion | 一个用来判断该日期是否被禁用的函数,接受一个Date对象作为参数。 应该返回一个Boolean值。 | (date:String,tz:String ) => Boolean | | | needNowTimeZone | 是否需要在时区列表显示当前网页时区 | Boolean | true | | needMaxIndex | 是否需要弹框在最上层 | Boolean | false | | showTimeZoneChoose | 是否允许选择时区 | Boolean | true | | showTime | 没选时间时默认指定哪个月份(最好为15号) | YYYY-MM-DDTHH:mm:ssZ | | | quarterMessage | 当前只能选择哪个季度(季度值取1、2、3、4) | { year: Number, quarter: Number } | |

🧩 Component: <vehicle-select>

Viewing and selecting vehicles

<div style="height: 500px">
  <vehicleSelect
    :data="testData"
    :loading="loading"
    :keyword="keyword"
    :modleList="modleList"
    v-model:sortKey="sortKey"
    v-model:vehicleId="vehicleId"
    v-model:deviceId="deviceId"
    v-model:retract="retract"
  />
</div>

🔧 Example Setup

const testData = ref<any>({});
const loading = ref<boolean>(true);
const keyword = ref<string>('');
const modleList = ref<number[]>([62]);
const sortKey = ref<string>('asc')
const vehicleId = ref<number>(15884)
const deviceId = ref<number>(0)
const retract = ref<boolean>(false);
onMounted(() => {
  testData.value = {
    tagList: [],
    deviceStatusList: [],
    vehicleDeviceList: [],
    landmarkDeviceList: [],
    landmarkList: [],
    vehicleType: [],
    deviceList: [],
    vehicleList: [],
    landmarkGroupList: [],
  }
  loading.value = false;
});

📋 Props Reference

| 参数名称 | 描述 | 数据类型 | 默认值 | | ---------- | --------------------- | ---------------- | ------------------- | | keyword | 搜索的关键字,用此字段搜索车辆/设备(右上角搜索框) | String | '' | | loading | 加载中,做状态显示,只要为true,就会出现一层盖在上面的遮罩(第一次loading变成false时,会去合并data中的数据,所以必须在请求到data中的数据之后置为false) | Boolean | true | | data | 接口返回的原始数据(见下方备注) | Object | {} | | sortKey | 排序规则(默认A->Z排序。可选值(driving,idle,waring,offline,battery,last,create,asc,desc)) | String | asc | | modleList | 如果需要只筛选某些型号的设备及其关联的车辆,可以将型号Id加入这个数组 | Number[] | [](比如只想显示型号为2002和2310的设备及其关联的车辆,可以传[37, 54];如果只想显示型号为2308的设备,可以传[62]) | | vehicleId | 当前选择的车辆ID(如果匹配不上,会默认到第一辆车)(外部改变选择的车辆/设备靠这个参数和下面的deviceId) | Number | 0 | | deviceId | 当前选择的设备ID(如果上述vehicleId为0且deviceId有值时才生效)(外部改变选择的车辆/设备靠这个参数和上面的vehicleId) | Number | 0 | | immediate | 当vehicleId和deviceId都为0时是否需要选择第一辆车 | Boolean | false | | align | | String | middle | | retract | 外面控制组件关闭的功能 false 打开 true关闭 | Boolean | false | | clikcOutRetract | 是否开启点击组件外部关闭组件的功能 false 关闭 true 打开 | Boolean | false | | showLoading | 整个组件上方显示加载样式(只做样式控制) | Boolean | false | | haveBorderRadius | 四个角是否有圆角 | Boolean | false | | haveLeftBorder | 是否有左边框 | Boolean | false | | isArray | 选择是否以数组的方式进行 | Boolean | false | | vehicleArray | isArray为true时绑定的值,每一项为{ vehicleId:xxx, deviceId: 0, isChoose: Boolean }或者{ vehicleId:0, deviceId: xxx, isChoose: Boolean } | Object[] | [] | | vehicleMaxlength | isArray为true时最多同时选择的车辆数量 | Number | 3 | | showAllName | 收起来之后显示全称 | Boolean | false | | clickToMdvr | 点击跳到mdvr界面 | Function | | | useCompleteVehicleScope | 是否显示全部车辆(此时不显示设备) | Boolean | false |

备注:现在data支持2种情况了: 1.包含数组:tagList,deviceStatusList,vehicleDeviceList,landmarkDeviceList,landmarkList,vehicleType,deviceList,vehicleList 2.包含数组:relationDeviceList,tagList,landmarkList,vehicleType

📋 Events Reference

| 事件名 | 描述 | 备注 | | -------- | --------------------- | ----------------- | | clickItem | 通过监听此事件得知车辆/设备选择变化 | 参数为两个(第一个为{vehicleId: xxx,deviceId: xxx},第二个为选择的车辆/设备信息) | | chooseItem | 只有点击车辆后会触发 | 参数为两个(第一个为{vehicleId: xxx,deviceId: xxx},第二个为选择的车辆/设备信息) | | onlyClickChange | 只有点击车辆后会触发 | 参数为两个(第一个为{vehicleId: xxx,deviceId: xxx},第二个为选择的车辆/设备信息) | | clickLandmarkOrTag | 点击tag或者landmark(关闭/打开)触发 | 参数为三个(1.tag/landmark,2.是否关闭,3.选择的tag/landmark信息) | | eventTracking | 触发埋点 | 参数为一个(是具体触发的埋点名称) | | changeArray | isArray为true时车辆选择变化时触发 | 参数为两个(第一个为{vehicleId: xxx,deviceId: xxx}数组,第二个为选择的车辆/设备信息数组) |

🧩 Component: <addOrEditVehicle>

add or edit vehicle

<add-or-edit-vehicle
  v-model="drawerShow"
  :loginInfo="loginInfo"
  :customerHabit="customerHabit"
  :vehicleData="drawerForm"
  :allAssetTypes="allAssetTypes"
  :allVehicles="allVehicles"
  :allDevices="allDevices"
  :modelTypes="modelTypes"
  :allVehicleToDevice="allVehicleToDevice"
  :allTags="allTags"
  :assetTypeFn="assetTypeFn"
  :bindDeviceHis="bindDeviceHis"
  :deviceBindTimeLimit="deviceBindTimeLimit"
  :saveFunctionVehicle="saveFunctionVehicle"
  :allLandmarks="allLandmarks"
  :landmarkGroup="landmarkGroup"
  :saveFunctionTag="saveFunctionTag"
  :unitAllState="unitAllState"
  :GOOGLE_MAP_API_KEY="GOOGLE_MAP_API_KEY"
  :MAP_STYLES="MAP_STYLES"
  :searhTrimblemapAddress="searhTrimblemapAddress"
  :saveFunctionLandmark="saveFunctionLandmark"
  :conDetSensorList="conDetSensorList"
  :needConDetSensor="needConDetSensor"
  ></add-or-edit-vehicle>

🔧 Example Setup

const assetTypeFn = async (data: any, flag: 'add' | 'delete') => {
  if (flag === 'delete') {
    const res = await Api.editCustomizeVehicleType([
      {
        id: data.id,
        isDelete: 1,
      },
    ]);
    if (!res || (res.errorCode && res.errorCode !== 200)) return;
  } else if (flag === 'add') {
    const result = await Api.addCustomizeVehicleType([data]);
    if (!result || result.errorCode) return;
  }
  await getCustomizeVehicleType();
};

const bindDeviceHis = async (params: any) => {
  const res = await Api.loadBoundDevices(params);
  if (!res || (res.errorCode && res.errorCode !== 200)) return;
  return res;
};

const deviceBindTimeLimit = async (deviceId: any) => {
  const res = await Api.getDeviceTimeLimitApi({
    deviceId: deviceId,
  });

  if (!res || res.errorCode) return;

  if (res.length) {
    return [
      res[0].limitStartTime,
      dayjs(new Date()).utc().format('YYYY-MM-DDTHH:mm:ss[Z]'),
    ];
  } else {
    return [null, dayjs(new Date()).utc().format('YYYY-MM-DDTHH:mm:ss[Z]')];
  }
};

const saveFunctionVehicle = async (
  params: any,
  flag = false,
  successFn: Function,
  failFn: Function,
) => {
  let result;
  if (params.id) {
    result = await Api.editVehicleNEW([params]);
  } else {
    result = await Api.addVehicleNEW([params]);
  }

  // 设备状态为1的需要切换为2
  if (flag) {
    const res = await Api.editDeviceNew([
      {
        id: params.deviceId,
        content: {
          deviceStatus: 2,
          modifyTime: dayjs(new Date()).utc().format(),
          activateTime: dayjs(new Date()).utc().format(),
        },
      },
    ]);

    if (!res || res.errorCode) return failFn();
    if (Array.isArray(result) && result[0].errorCode) {
    let errorCode = result[0].errorCode;

    const errLang1 = errLang[errorCode as string];
    const errMessage = errLang1 || `Error Code: ${errorCode}`;

    return failFn(errMessage);
  }
  }

  if (!result || result.errorCode) return failFn();
  successFn();
  refresh();
};

📋 Props Reference

| 参数名称 | 描述 | 数据类型 | 默认值 | | ---------- | --------------------- | ---------------- | ------------------- | | drawerShow | 控制drawer的显示和隐藏 | Boolean | false | | loginInfo | 用户信息,包含用户的type和customerId | Object | {} | | customerHabit | 用户的偏好设置,包含localTimezone、timeZone | Object | {} | | vehicleData | 新增/编辑的车辆,编辑是需要传id | Object | { } | | allAssetTypes | 资产类型列表 | Array | [] | | allVehicles | 车辆列表 | Array | [] | | allDevices | 设备列表 | Array | [] | | modelTypes | 设备类型列表 | Object | {} | | allVehicleToDevice | 车辆设备绑定关系列表 | Array | [] | | allTags | tag列表 | Array | [] | | assetTypeFn |资产类型新增/删除方法 | Function | | | bindDeviceHis |车辆绑定历史记录 | Function | | | deviceBindTimeLimit | 设备绑定时间限制 | Function | | | saveFunctionVehicle | 车辆保存 | Function | | | allLandmarks | landmark列表 | Array | [] | | landmarkGroup | landmarkGroup列表 | Array | [] | | saveFunctionTag | tag保存 | Function | | | unitAllState | 城市列表 | Array | [] | | GOOGLE_MAP_API_KEY | 地图apikey | String | | | MAP_STYLES | 地图样式 | Array | [] | | searhTrimblemapAddress |查询地址api | Function | | | saveFunctionLandmark | landmark保存 | Function | | | conDetSensorList | 传感器列表 | Array | [] | | needConDetSensor | 是否显示集装箱检测传感器功能 | Boolean | true |

🧩 Component: <addOrEditTag>

add or edit tag

<add-or-edit-tag
  v-model="drawerShow"
  :loginInfo="loginInfo"
  :customerHabit="customerHabit"
  :itemData="drawerForm"
  :allVehicles="allVehicles"
  :allAssetTypes="allAssetTypes"
  :allDevices="allDevices"
  :modelTypes="modelTypes"
  :allVehicleToDevice="allVehicleToDevice"
  :allTags="allTags"
  :allLandmarks="allLandmarks"
  :landmarkGroup="landmarkGroup"
  :saveFunctionTag="saveFunctionTag"
  :assetTypeFn="assetTypeFn"
  :bindDeviceHis="bindDeviceHis"
  :deviceBindTimeLimit="deviceBindTimeLimit"
  :saveFunctionVehicle="saveFunctionVehicle"
  :unitAllState="unitAllState"
  :GOOGLE_MAP_API_KEY="GOOGLE_MAP_API_KEY"
  :MAP_STYLES="MAP_STYLES"
  :searhTrimblemapAddress="searhTrimblemapAddress"
  :saveFunctionLandmark="saveFunctionLandmark"
  :conDetSensorList="conDetSensorList"
  :needConDetSensor="needConDetSensor"
  ></add-or-edit-tag>

🔧 Example Setup

const saveFunctionTag = async (
  params: any,
  successFn: Function,
  failFn: Function,
) => {
  let result;
  if (params.id) {
    result = await Api.updateTagsList([params]);
  } else {
    result = await Api.saveTagsList([params]);
  }

  if (!result || result.errorCode) return failFn();
  successFn();

  handleClose();
};

const handleAddBurialPoint = (type: string) => {
  Api.addBurialPoint(type);
};

📋 Props Reference

| 参数名称 | 描述 | 数据类型 | 默认值 | | ---------- | --------------------- | ---------------- | ------------------- | | drawerShow | 控制drawer的显示和隐藏 | Boolean | false | | loginInfo | 用户信息,包含用户的type和customerId | Object | {} | | customerHabit | 用户的偏好设置,包含localTimezone、timeZone | Object | {} | | itemData | 新增/编辑的tag,编辑是需要传id | Object | { } | | allVehicles | 车辆列表 | Array | [] | | allDevices | 设备列表 | Array | [] | | modelTypes | 设备类型列表 | Object | {} | | allVehicleToDevice | 车辆设备绑定关系列表 | Array | [] | | allTags | tag列表 | Array | [] | | allLandmarks | landmark列表 | Array | [] | | landmarkGroup | landmarkGroup列表 | Array | [] | | saveFunctionTag | tag保存 | Function | | | assetTypeFn |资产类型新增/删除方法 | Function | | | bindDeviceHis |车辆绑定历史记录 | Function | | | deviceBindTimeLimit | 设备绑定时间限制 | Function | | | saveFunctionVehicle | 车辆保存 | Function | | | unitAllState | 城市列表 | Array | [] | | GOOGLE_MAP_API_KEY | 地图apikey | String | | | MAP_STYLES | 地图样式 | Array | [] | | searhTrimblemapAddress |查询地址api | Function | | | saveFunctionLandmark | landmark保存 | Function | | | conDetSensorList | 传感器列表 | Array | [] | | needConDetSensor | 是否显示集装箱检测传感器功能 | Boolean | true |

🧩 Component: <addOrEditLandmark>

add or edit landmark

<add-or-edit-landmark
  v-model="drawerShow"
  :itemData="drawerForm"
  :unitAllState="unitAllState"
  :GOOGLE_MAP_API_KEY="GOOGLE_MAP_API_KEY"
  :MAP_STYLES="MAP_STYLES"
  :allLandmarkGroup="landmarkGroup"
  :searhTrimblemapAddress="searhTrimblemapAddress"
  :saveFunctionLandmark="saveFunctionLandmark"
  @addGroup="handleAddGroup"
  ></add-or-edit-landmark>

🔧 Example Setup

const searhTrimblemapAddress = async (params: any) => {
  const res = await Api.searhTrimblemapAddress(params);
  return res;
};

const saveFunctionLandmark = async (
  params: any,
  successFn: Function,
  failFn: Function,
) => {
  let result;

  if (params.id) {
    result = await Api.editLandmark([params]);
  } else {
    result = await Api.addLandmark([params]);
  }

  if (!result || result.errorCode) return failFn();
  successFn();
  initData();
};

const handleAddGroup = (params: any) => {
  groupFormVisible.value = true;
  groupForm = params;
};

📋 Props Reference

| 参数名称 | 描述 | 数据类型 | 默认值 | | ---------- | --------------------- | ---------------- | ------------------- | | drawerShow | 控制drawer的显示和隐藏 | Boolean | false | | itemData | 新增/编辑的landmark | Object | | | unitAllState | 城市列表 | Array | [] | | GOOGLE_MAP_API_KEY | 地图apikey | String | | | MAP_STYLES | 地图样式 | Array | [] | | allLandmarkGroup | landmarkGroup列表 | Array | [] | | searhTrimblemapAddress |查询地址api | Function | | | saveFunctionLandmark | landmark保存 | Function | | | @addGroup | 新增group | Function | |

🧩 Component: <AddOrEditShare>

add or edit Share

<AddOrEditShare
  v-model="addVisible"
  :vehicleLoading="vehicleLoading"
  :readOnly=""
  :data="testData"
  :itemData="itemData"
  :unitAllState="unitAllState"
  :getShareHistoryUrl="getShareHistoryUrl"
  :uploadShareFile="uploadShareFile"
  :saveFunctionShare="saveFunctionShare"
  :loginInfo="loginInfo"
  :assetTypeFn="assetTypeFn"
  :bindDeviceHis="bindDeviceHis"
  :deviceBindTimeLimit="deviceBindTimeLimit"
  :saveFunctionVehicle="saveFunctionVehicle"
  :saveFunctionTag="saveFunctionTag"
  :unitAllState="unitAllState"
  :GOOGLE_MAP_API_KEY="GOOGLE_MAP_API_KEY"
  :MAP_STYLES="MAP_STYLES"
  :searhTrimblemapAddress="searhTrimblemapAddress"
  :saveFunctionLandmark="saveFunctionLandmark"
  ></AddOrEditShare>

🔧 Example Setup

const addVisible = ref(false);
const vehicleLoading = ref(false);
const testData = ref<any>({});
onMounted(() => {
  testData.value = {
    tagList: [],
    deviceStatusList: [],
    vehicleDeviceList: [],
    landmarkDeviceList: [],
    landmarkList: [],
    vehicleType: [],
    deviceList: [],
    vehicleList: [],
    landmarkGroupList: [],
  }
  vehicleLoading.value = false;
});
const readOnly = ref(false);
const itemData = ref<any>({});
const getShareHistoryUrl = Api.getHistoryUrl;
const uploadShareFile = Api.uploadFile;

const saveFunctionShare = async (
  params: any,
  successFn: Function,
  failFn: Function,
) => {
  let result;

  if (params.id) {
    result = await Api.editShare([params]);
  } else {
    result = await Api.addShare([params]);
  }

  if (!result || result.errorCode) return failFn();
  successFn();
  initData();
};
const { loginInfo } = store;

const assetTypeFn = async (data: any, flag: 'add' | 'delete') => {
  if (flag === 'delete') {
    const res = await Api.editCustomizeVehicleType([
      {
        id: data.id,
        isDelete: 1,
      },
    ]);
    if (!res || (res.errorCode && res.errorCode !== 200)) return;
  } else if (flag === 'add') {
    const result = await Api.addCustomizeVehicleType([data]);
    if (!result || result.errorCode) return;
  }
  await getCustomizeVehicleType();
};

const bindDeviceHis = async (params: any) => {
  const res = await Api.loadBoundDevices(params);
  if (!res || (res.errorCode && res.errorCode !== 200)) return;
  return res;
};

const deviceBindTimeLimit = async (deviceId: any) => {
  const res = await Api.getDeviceTimeLimitApi({
    deviceId: deviceId,
  });

  if (!res || res.errorCode) return;

  if (res.length) {
    return [
      res[0].limitStartTime,
      dayjs(new Date()).utc().format('YYYY-MM-DDTHH:mm:ss[Z]'),
    ];
  } else {
    return [null, dayjs(new Date()).utc().format('YYYY-MM-DDTHH:mm:ss[Z]')];
  }
};

const saveFunctionVehicle = async (
  params: any,
  flag = false,
  successFn: Function,
  failFn: Function,
) => {
  let result;
  if (params.id) {
    result = await Api.editVehicleNEW([params]);
  } else {
    result = await Api.addVehicleNEW([params]);
  }

  // 设备状态为1的需要切换为2
  if (flag) {
    const res = await Api.editDeviceNew([
      {
        id: params.deviceId,
        content: {
          deviceStatus: 2,
          modifyTime: dayjs(new Date()).utc().format(),
          activateTime: dayjs(new Date()).utc().format(),
        },
      },
    ]);

    if (!res || res.errorCode) return failFn();
  }

  if (!result || result.errorCode) return failFn();
  successFn();
  refresh();
};

const saveFunctionTag = async (
  params: any,
  successFn: Function,
  failFn: Function,
) => {
  let result;
  if (params.id) {
    result = await Api.updateTagsList([params]);
  } else {
    result = await Api.saveTagsList([params]);
  }

  if (!result || result.errorCode) return failFn();
  successFn();

  handleClose();
};

const unitAllState = ref<any[]>([]);
const GOOGLE_MAP_API_KEY: string = 'xxxx;
const MAP_STYLES: any = {};

const searhTrimblemapAddress = async (params: any) => {
  const res = await Api.searhTrimblemapAddress(params);
  return res;
};

const saveFunctionLandmark = async (
  params: any,
  successFn: Function,
  failFn: Function,
) => {
  let result;

  if (params.id) {
    result = await Api.editLandmark([params]);
  } else {
    result = await Api.addLandmark([params]);
  }

  if (!result || result.errorCode) return failFn();
  successFn();
  initData();
};

📋 Props Reference

| 参数名称 | 描述 | 数据类型 | 默认值 | | ---------- | --------------------- | ---------------- | ------------------- | | modelValue | 控制drawer的显示和隐藏 | Boolean | false | | readOnly | 是否只看 | Boolean | false | | data | 接口返回的原始数据(包含数组:tagList,deviceStatusList,vehicleDeviceList,landmarkDeviceList,landmarkList,vehicleType,deviceList,vehicleList,landmarkGroupList) | Object | {} | | itemData | 新增/编辑的share | Object | {} | | getShareHistoryUrl | 获取分享的历史logo | Function | | | uploadShareFile | 上传logo | Function | | | saveFunctionShare | share保存 | Function | | | loginInfo | 登录信息 | Object | {} | | assetTypeFn |资产类型新增/删除方法 | Function | | | bindDeviceHis |车辆绑定历史记录 | Function | | | deviceBindTimeLimit | 设备绑定时间限制 | Function | | | saveFunctionVehicle | 车辆保存 | Function | | | saveFunctionTag | tag保存 | Function | | | unitAllState | 城市列表 | Array | [] | | GOOGLE_MAP_API_KEY | 地图apikey | String | | | MAP_STYLES | 地图样式 | Array | [] | | searhTrimblemapAddress |查询地址api | Function | | | saveFunctionLandmark | landmark保存 | Function | | | nowChooseVehicleId | 当前选择的车辆id | Number | |