From 608507489a06d31e2e48f41c5ef570a94c7faa5d Mon Sep 17 00:00:00 2001 From: chenJinxu <2183691628@qq.com> Date: Sat, 16 Dec 2023 09:35:51 +0800 Subject: [PATCH] =?UTF-8?q?`2023=E5=B9=B412=E6=9C=8816=E6=97=A5`=20FETURE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加 接口文件 - 增加 store 文件 - 增加 封装的 toast 和 dialog 文件 --- README.md | 6 + src/api/command-list.js | 27 +++ src/api/command.js | 245 +++++++++++++++++++++++ src/api/core.js | 111 +++++++++++ src/api/demo.js | 2 +- src/api/device.js | 355 +++++++++++++++++++++++++++++++++ src/api/heathly.js | 222 +++++++++++++++++++++ src/api/user.js | 93 +++++++-- src/api/wx.js | 32 +++ src/components/SubmenuList.vue | 116 +++++++++++ src/config/models.js | 85 ++++++++ src/config/request.js | 85 ++++++++ src/main.js | 3 +- src/services/dialog-service.js | 30 +++ src/services/toast-service.js | 77 +++++++ src/services/utils-service.js | 195 ++++++++++++++++++ src/store/getters.js | 3 +- src/store/index.js | 292 ++++++++++++++++++++++++++- src/store/prefix.js | 2 + src/utils/request.js | 58 ------ src/views/myself/index.scss | 97 ++++++++- src/views/myself/index.vue | 191 +++++++++++++++++- 22 files changed, 2230 insertions(+), 97 deletions(-) create mode 100644 src/api/command-list.js create mode 100644 src/api/command.js create mode 100644 src/api/core.js create mode 100644 src/api/device.js create mode 100644 src/api/heathly.js create mode 100644 src/api/wx.js create mode 100644 src/components/SubmenuList.vue create mode 100644 src/config/request.js create mode 100644 src/services/dialog-service.js create mode 100644 src/services/toast-service.js create mode 100644 src/services/utils-service.js create mode 100644 src/store/prefix.js delete mode 100644 src/utils/request.js diff --git a/README.md b/README.md index 2274152..b58bea1 100644 --- a/README.md +++ b/README.md @@ -38,3 +38,9 @@ npm run lint - 增加 navbar 组件 - 增加 样式初始化 css - 增加 day.js,echarts 和高德地图 + +`2023年12月16日` FETURE + +- 增加 接口文件 +- 增加 store 文件 +- 增加 封装的 toast 和 dialog 文件 diff --git a/src/api/command-list.js b/src/api/command-list.js new file mode 100644 index 0000000..c4db39c --- /dev/null +++ b/src/api/command-list.js @@ -0,0 +1,27 @@ +import store from '@/store'; +import request from '@/config/request'; +import { DeviceCommandModel } from '@/config/models'; +import { isNotNull } from '@/services/utils-service'; + +const APICommandList = { + getClocks() { + const data = { deviceId: store.getters.deviceId }; + return request({ url: '/api/Command/CommandList', method: 'post', data }); + }, + setClocks(cmdValue) { + const data = { + deviceId: store.getters.deviceId, + userId: store.getters.userId, + serialNo: store.getters.serialNo, + cmdCode: DeviceCommandModel.clock, + cmdValue + }; + return request({ url: '/api/Command/SendCommand', method: 'post', data }); + }, + getCmdValue(data, deviceCommandModel) { + const result = data.filter(v => v.cmdCode === deviceCommandModel); + return isNotNull(result) ? JSON.parse(result[0].cmdValue).Items : []; + } +}; + +export default APICommandList; diff --git a/src/api/command.js b/src/api/command.js new file mode 100644 index 0000000..28c0d41 --- /dev/null +++ b/src/api/command.js @@ -0,0 +1,245 @@ +import request from '@/config/request'; + +export const APICommand = { + commandList, //获取设备所有指令列表 + sendCommand, //发送一个指令给设备 + SetIotWhiteList, // 设置白名单 + Effective, //中亿SIM自动激活接口 + CheckImei, //检查imei属于哪家厂商 + GetCardInfo, //获取小台风物联网卡信息 + HealthCode, //健康码 + ocr, //ocr识别 + GetHealthCodeList, ///api/Command/GetHealthCodeList + CheckHealthCodeAuth, //检查该设备 健康码是否已经授权 + SetPayPassword, //修改支付密码 + NucleicCode, // 新增核酸码 + GetNucleicCode, //获取核酸码记录 + GetIotCardWiteList, //获取第三方亲情号码同步状态 + CheckImeiHealth, //检查是否可以显示核酸码菜单 + setFlyModePwd, //设置飞行模式密码 + setPicUrl, //设置设备卡片头像参数 + getPicUrl, //获取设备头像参数 + setSchoolName, //设置设备卡片学校名称参数 + getSchoolName, //获取设备卡片学校名称参数 + setClassAndName, //设置设备卡片班级名称参数 + getClassAndName, //获取设备卡片班级名称参数 + setIotCtlMode, //设置设备iot连接控制属性 + getIotCtlMode, //获取设备iot连接控制属性 + SetBloodPressCalibrationConfig, //设置设备血压标定参数 + GetBloodPressCalibrationConfig //获取设备血压标定参数 +}; + +// 获取设备所有指令列表 +function commandList(params) { + return request({ + url: '/api/Command/CommandList', + method: 'post', + data: params + }); +} + +//发送一个指令给设备 +function sendCommand(params) { + return request({ + url: '/api/Command/SendCommand', + method: 'post', + data: params + }); +} +//设置白名单 +function SetIotWhiteList(params) { + return request({ + url: '/api/Command/SetIotWhiteList', + method: 'post', + data: params + }); +} + +// 中亿SIM自动激活接口 +function Effective(params) { + return request({ + url: '/api/Command/Effective', + method: 'post', + data: params + }); +} +//检查imei属于哪家厂商 +function CheckImei(params) { + return request({ + url: '/api/Command/CheckImei', + method: 'post', + data: params + }); +} +//获取小台风物联网卡信息 +function GetCardInfo(params) { + return request({ + url: '/api/Command/GetCardInfo', + method: 'post', + data: params + }); +} +function HealthCode(params) { + return request({ + url: '/api/Command/HealthCode', + headers: { AuthKey: 'key1' }, + method: 'post', + data: params + }); +} +function ocr(params) { + return request({ + url: '/api/Command/WxIdCardOcr', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function GetHealthCodeList(imei) { + return request({ + url: '/api/Command/GetHealthCodeList', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} +function CheckHealthCodeAuth(params) { + return request({ + url: '/api/Command/CheckHealthCodeAuth', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function SetPayPassword(params) { + return request({ + url: '/api/Command/SetPayPassword', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} + +function NucleicCode(params) { + return request({ + url: '/api/Command/NucleicCode', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function GetNucleicCode(params) { + return request({ + url: '/api/Command/GetNucleicCode', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function GetIotCardWiteList(imei) { + return request({ + url: '/api/Command/GetIotCardWiteList', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} +function CheckImeiHealth(params) { + return request({ + url: '/api/Command/CheckImeiHealth', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function setFlyModePwd(params) { + return request({ + url: '/api/Command/setFlyModePwd', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function setPicUrl(params) { + return request({ + url: '/api/Command/SetPicUrl', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function getPicUrl(imei) { + return request({ + url: '/api/Command/GetPicUrl', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} + +function setSchoolName(params) { + return request({ + url: '/api/Command/SetSchoolName', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function getSchoolName(imei) { + return request({ + url: '/api/Command/GetSchoolName', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} +function setClassAndName(params) { + return request({ + url: '/api/Command/SetClassAndName', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function getClassAndName(imei) { + return request({ + url: '/api/Command/GetClassAndName', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} +function setIotCtlMode(params) { + return request({ + url: '/api/Command/SetIotCtlMode', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function SetBloodPressCalibrationConfig(params) { + return request({ + url: '/api/Command/SetBloodPressCalibrationConfig', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} + +function getIotCtlMode(imei) { + return request({ + url: '/api/Command/GetIotCtlMode', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} +function GetBloodPressCalibrationConfig(imei) { + return request({ + url: '/api/Command/GetBloodPressCalibrationConfig', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} +export default APICommand; diff --git a/src/api/core.js b/src/api/core.js new file mode 100644 index 0000000..31b7bed --- /dev/null +++ b/src/api/core.js @@ -0,0 +1,111 @@ +// b端的接口, 每次调用前先获取token +import axios from 'axios'; +const baseUrl = process.env.VUE_APP_BASE_API.replace('webapi', 'gateway'); +const service = axios.create({ + baseURL: baseUrl +}); +service.interceptors.request.use(request => { + if (localStorage.getItem('gatewayToken')) { + request.headers.AccessToken = localStorage.getItem('gatewayToken'); + } + return request; +}); +export const APIAlarm = { + areaAlarmDetail, //获取告警详情 + getAuth, //获取b端接口token + changeAlarmStatus, //修改非法区域告警推送状态 + QueryLiveBasePackage, //获取基本套餐 + payLiveBaseDevice, //微信统一下单 + GpsDeviceFence, //围栏 redis + drownReportFilterAdd, //添加过滤危险水域区域 + getDrownReportFilterQuery, //获取水域告警白名单 + drownReportFilterDelete, //删除过滤危险水域区域 + devicePayPackage, + CheckWzLocation //定位校准 +}; +/* const headerAuth = this.$store.getters.gatewayToken; */ +// 获取告警详情 +function areaAlarmDetail(data) { + return service({ + url: `${baseUrl}/core/api/v1/Fence/AreaAlarmDetail`, + method: 'get', + params: data + }); +} +// 获取告警授权token +function getAuth(params) { + return service({ + url: `${baseUrl}/core/api/v1/Ability/study_ai/terminal/auth`, + method: 'post', + data: params + }); +} +function changeAlarmStatus(params) { + return service({ + url: `${baseUrl}/core/api/v1/Fence/AddAreaUserFilter`, + method: 'post', + data: params + }); +} +function GpsDeviceFence(params) { + return service({ + url: `${baseUrl}/core/api/v1/Redis/GpsDeviceFence`, + method: 'post', + data: params + }); +} +// 获取基本套餐信息 +function QueryLiveBasePackage(params) { + return service({ + url: `${baseUrl}/core/api/v1/Device/QueryLiveBasePackage`, + method: 'post', + data: params + }); +} +// 统一下单 +// 获取基本套餐信息 +function payLiveBaseDevice(params) { + return service({ + url: `${baseUrl}/core/api/v1/Device/PayLiveBaseDevice`, + method: 'post', + data: params + }); +} +function drownReportFilterAdd(data) { + return service({ + url: `${baseUrl}/core/api/v1/Device/DrownReportFilterAdd`, + method: 'post', + data + }); +} +function getDrownReportFilterQuery(data) { + return service({ + url: `${baseUrl}/core/api/v1/Device/DrownReportFilterQuery`, + method: 'get', + params: data + }); +} +function devicePayPackage(imei) { + return service({ + url: `${baseUrl}/core/api/v1/open/card/GetDevicePayPackage`, + method: 'get', + params: { imei } + }); +} +function drownReportFilterDelete(data) { + return service({ + url: `${baseUrl}/core/api/v1/Device/DrownReportFilterDelete`, + method: 'get', + params: data + }); +} + +function CheckWzLocation(params) { + return service({ + url: `${baseUrl}/core/api/v1/GeoCode/CheckWzLocation`, + method: 'post', + data: params + }); +} + +export default APIAlarm; diff --git a/src/api/demo.js b/src/api/demo.js index 2b24379..60866b9 100644 --- a/src/api/demo.js +++ b/src/api/demo.js @@ -1,5 +1,5 @@ // axios -import request from '@/utils/request'; +import request from '@/config/request'; export const APIUser = { getUser, diff --git a/src/api/device.js b/src/api/device.js new file mode 100644 index 0000000..ed6170f --- /dev/null +++ b/src/api/device.js @@ -0,0 +1,355 @@ +import request from '@/config/request'; + +export const APIDevice = { + addPolygonFence, + editPolygonFence, + delPolygonFence, + getPolygonFence, + deleteGeofence, //删除围栏 + getAllFence, //获取全部围栏列表 + geofenceList, //围栏列表 + editGeofence, //编辑围栏 + addGeofence, //增加围栏 + getPersonInfo, //获取宝贝信息 + deviceTimeRelatedParam, //查看设备激活时间,有效时间 + updatePersonInfo, //编辑宝贝信息 + bindingScan, //设备绑定-扫码 + bindingInput, //设备绑定-输入 + deviceList, //获取设备列表 + locateInstance, //立即定位设备 + sendCommand, //发送一个指令给设备 + unbindDevice, //解绑设备 + getCallLogList, //通话清单 + setSMSLog, //短信代收 + getDeviceStep, //健康计步 + temperatureInfoList, //健康温度 + historyDetailList, //查询设备历史轨迹 + historyDetailListByIMEI, //根据时间段查看设备历史轨迹 + history, //历史轨迹 + bindDevice, //绑定设备 + bindDeviceSsjl, //设备绑定, 只接受 + bindDeviceResult, //设备绑定结果 + addVoiceMessage, //上传录音文件 + queryVoicePage, //获取分页 + decodeSerialNo, //通过密文解析获取imei + LckjCreateOrderPackage, //零川物联网卡加油包订购 + LckjGetOrderPackageShow, //查询零川物联网卡加油包订购记录 + checkWxPayResult, //查询微信支付状态 + updateDrownReportAiStatus, //修改溺水告警状态(ai-呼叫) + psychQuestionAutoCommit //自动提交心里问卷调查答案 +}; +const baseUrl = + process.env.NODE_ENV === 'production' + ? 'https://ai.ssjlai.com/telpopay/api/wx/order/callback' + : 'https://id.ssjlai.com/telpopay/api/wx/order/callback'; +export default APIDevice; +// 增加多边形围栏 +function addPolygonFence({ fencePoints, fenceName, serialNo, appType, address }) { + return request({ + url: '/api/Geofence/AddPolygonFence', + method: 'post', + headers: { AuthKey: 'key1' }, + data: { fencePoints, fenceName, serialNo, appType, address } + }); +} + +// 修改多边形围栏 +function editPolygonFence({ fenceId, fencePoints, fenceName, serialNo, address }) { + return request({ + url: '/api/Geofence/EditPolygonFence', + method: 'post', + headers: { AuthKey: 'key1' }, + data: { fenceId, fencePoints, fenceName, serialNo, address } + }); +} + +// 删除多边形围栏 +function delPolygonFence({ geofenceId }) { + return request({ + url: '/api/Geofence/DeletePolygonFence', + method: 'post', + headers: { AuthKey: 'key1' }, + data: { geofenceId } + }); +} +// 删除围栏 +function deleteGeofence(params) { + return request({ + url: '/api/Geofence/Delete', + method: 'post', + data: params + }); +} + +// 获取全部围栏:包括圆形和多边形 +function getPolygonFence(serialNo) { + return request({ + url: '/api/Geofence/GetPolygonFence', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { serialNo } + }); +} + +// 获取全部围栏:包括圆形和多边形 +function getAllFence(deviceId) { + return request({ + url: '/api/Geofence/GeofenceList', + method: 'post', + data: { deviceId } + }); +} + +// 围栏列表 +function geofenceList(params) { + return request({ + url: '/api/Geofence/GeofenceList', + method: 'post', + data: params + }); +} +// 编辑围栏 +function editGeofence(params) { + return request({ + url: '/api/Geofence/Edit', + method: 'post', + data: params + }); +} + +// 增加围栏 +function addGeofence(params) { + return request({ + url: '/api/Geofence/Add', + method: 'post', + data: params + }); +} +// 获取宝贝信息 +function getPersonInfo(params) { + return request({ + url: '/api/Device/GetPersonInfo', + method: 'post', + data: params + }); +} +//查看设备激活时间,有效时间 +function deviceTimeRelatedParam(sn) { + return request({ + url: '/api/DeviceFeatures/DeviceTimeRelatedParam', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { sn } + }); +} +// 编辑宝贝信息 +function updatePersonInfo(params) { + return request({ + url: '/api/Device/UpdatePersonInfo', + method: 'post', + data: params + }); +} +// 设备绑定-扫码 +function bindingScan({ url }) { + return request({ + url: '/api/Device/BindingScan', + method: 'post', + data: { url } + }); +} +// 通过密文解析获取imei +function decodeSerialNo({ code }) { + return request({ + url: '/api/Device/DecodeImei', + method: 'post', + headers: { authKey: 'key1' }, + data: { code } + }); +} +// 设备绑定-输入 +function bindingInput({ serialNo }) { + return request({ + url: '/api/Device/BindingInput', + method: 'post', + data: { serialNo } + }); +} +// 获取设备列表 +function deviceList(params) { + return request({ + url: '/api/Location/DeviceList', + method: 'post', + data: params + }); +} +//立即定位设备 +function locateInstance(params) { + return request({ + url: '/api/Command/LocateInstance', + method: 'post', + data: params + }); +} +//发送一个指令给设备 +function sendCommand(params) { + return request({ + url: '/api/Command/SendCommand', + method: 'post', + data: params + }); +} +//解绑设备 +function unbindDevice(params) { + return request({ + url: '/api/Device/UnbindDevice', + method: 'post', + data: params + }); +} +//通话清单 +function getCallLogList(params) { + return request({ + url: '/api/DeviceCommunication/GetCallLogList', + method: 'post', + data: params + }); +} +//短信代收 +function setSMSLog(params) { + return request({ + url: '/api/DeviceCommunication/SetSMSLog', + method: 'post', + data: params + }); +} +//健康计步 +function getDeviceStep(params) { + return request({ + url: '/api/DeviceFeatures/GetDeviceStep', + method: 'post', + data: params + }); +} +//健康温度 +function temperatureInfoList({ sn, c }) { + return request({ + url: '/api/DeviceFeatures/TemperatureInfoList', + method: 'get', + headers: { authKey: 'key1' }, + params: { sn, c } + }); +} + +//查询设备历史轨迹 +function historyDetailList({ imei, queryDate }) { + return request({ + url: '/api/Location/HistoryDetailList', + method: 'get', + params: { imei, queryDate } + }); +} +//根据时间段查询设备历史轨迹 +function historyDetailListByIMEI(params) { + return request({ + url: '/api/Location/HistoryListByIMEI', + method: 'post', + data: params + }); +} +//历史轨迹 +function history(params) { + return request({ + url: '/api/Location/History', + method: 'post', + data: params + }); +} + +// 设备绑定 +function bindDevice({ headers, body }) { + return request({ + url: '/api/Device/BindDevice', + method: 'post', + headers: headers, + data: body + }); +} + +// 设备绑定,只接收 +function bindDeviceSsjl({ headers, body }) { + return request({ + url: '/api/Device/BindDeviceSsjl', + method: 'post', + headers: headers, + data: body + }); +} + +// 设备绑定结果 +function bindDeviceResult({ headers, body }) { + return request({ + url: '/api/Device/BindDeviceResult', + method: 'post', + headers: headers, + data: body + }); +} + +// 上传录音文件 +function addVoiceMessage(params) { + return request({ + url: '/voicemessage/voiceMessage/addVoiceMessage', + method: 'post', + data: params + }); +} +// 获取录音文件和文字留言分页 +function queryVoicePage({ gpsUserId, pageNum, pageSize }) { + return request({ + url: '/voicemessage/voiceMessage/queryVoicePage', + method: 'get', + params: { gpsUserId, pageNum, pageSize } + }); +} + +// 随手精灵(零川物联卡加油包套餐订购) +function LckjCreateOrderPackage(params) { + return request({ + url: 'api/IOTCard/LckjCreateOrderPackage', + method: 'post', + data: params + }); +} + +// 随手精灵(查询零川物联卡加油包已订购套餐) +function LckjGetOrderPackageShow({ iccid, imei }) { + return request({ + url: '/api/IOTCard/LckjGetOrderPackageShow', + method: 'get', + params: { iccid, imei } + }); +} + +function checkWxPayResult(params) { + return request({ + url: `${baseUrl}`, + method: 'post', + data: params + }); +} + +function updateDrownReportAiStatus(data) { + return request({ + url: '/api/Device/UpdateDrownReportAiStatus', + method: 'get', + params: data + }); +} +function psychQuestionAutoCommit(data) { + return request({ + url: '/api/Device/PsychQuestionAutoCommit', + method: 'get', + params: data + }); +} diff --git a/src/api/heathly.js b/src/api/heathly.js new file mode 100644 index 0000000..e7dcfab --- /dev/null +++ b/src/api/heathly.js @@ -0,0 +1,222 @@ +import request from '@/config/request'; +export const APIHealthy = { + getSpoList, //获取血氧列表 + getHeartRateList, //获取心率列表 + getTemperatureList, //获取体温列表 + setLocationConfig, //设置设备定位控制参数 + getLocationConfig, //获取设备定位控制参数 + getHealthConfig, //获取设备健康控制参数(心率、血氧、测温) + setHealthConfig, //设置设备健康控制参数(心率、血氧、测温) + setUploadConfig, //置设备上报周期参数 + getUploadConfig, //取设备上报周期参数 + setDrownConfig, //设置设备防溺水参数 + getDrownConfig, //获取设备防溺水参数 + setNowearConfig, //设置设备未佩戴检测参数 + getNowearConfig, //设置设备未佩戴检测参数 + setWatchConfig, //设置设备未佩戴检测参数 + getWatchConfig, //设置设备未佩戴检测参数 + setBloodPressConfig, //设置设备血压检测参数 + getBloodPressConfig, //获取设备血压检测参数 + getBloodPressList, //获取设备血压数据 + setPsychAbilityConfig, //心理监测能力开通(下发参数) + getPsychAbilityConfig, //获取心理监测能力开通参数 + setLongSitReminder, //设置设备久坐提醒参数 + getLongSitReminder, //获取设备久坐提醒参数 + setRaiseToLightScreen, //设置设备抬腕亮屏参数 + getRaiseToLightScreen //获取设备抬腕亮屏参数 +}; +export default APIHealthy; + +function getSpoList(params) { + return request({ + url: '/api/Healthy/SpoList', + method: 'post', + data: params + }); +} + +function getHeartRateList(params) { + return request({ + url: '/api/Healthy/HeartRateList', + method: 'post', + data: params + }); +} +function getTemperatureList(params) { + return request({ + url: '/api/Healthy/TemperatureList', + method: 'post', + data: params + }); +} + +function setLocationConfig(params) { + return request({ + url: '/api/Command/SetLocationConfig', + method: 'post', + headers: { authKey: 'key1' }, + data: params + }); +} +function getLocationConfig({ imei }) { + return request({ + url: '/api/Command/GetLocationConfig', + method: 'get', + headers: { authKey: 'key1' }, + params: { imei } + }); +} +function setHealthConfig(params) { + return request({ + url: '/api/Command/SetHealthConfig', + method: 'post', + headers: { authKey: 'key1' }, + data: params + }); +} +function getHealthConfig({ imei }) { + return request({ + url: '/api/Command/GetHealthConfig', + method: 'get', + headers: { authKey: 'key1' }, + params: { imei } + }); +} + +function setUploadConfig(params) { + return request({ + url: '/api/Command/SetUploadConfig', + method: 'post', + headers: { authKey: 'key1' }, + data: params + }); +} +function getUploadConfig({ imei }) { + return request({ + url: '/api/Command/GetUploadConfig', + method: 'get', + headers: { authKey: 'key1' }, + params: { imei } + }); +} +function setDrownConfig(params) { + return request({ + url: '/api/Command/SetDrownConfig', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function getDrownConfig(imei) { + return request({ + url: '/api/Command/GetDrownConfig', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} + +function setNowearConfig(params) { + return request({ + url: '/api/Command/SetNowearConfig', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function getNowearConfig(imei) { + return request({ + url: '/api/Command/GetNowearConfig', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} +function setWatchConfig(params) { + return request({ + url: '/api/Device/SetWatchConfig', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function getWatchConfig(imei) { + return request({ + url: '/api/Device/GetWatchConfig', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} +function setBloodPressConfig(params) { + return request({ + url: '/api/Command/SetBloodPressConfig', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function getBloodPressConfig(imei) { + return request({ + url: '/api/Command/GetBloodPressConfig', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} +function getBloodPressList(params) { + return request({ + url: '/api/Healthy/BloodPressList', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function setPsychAbilityConfig(params) { + return request({ + url: '/api/Command/SetPsychAbilityConfig', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function getPsychAbilityConfig(imei) { + return request({ + url: '/api/Command/GetPsychAbilityConfig', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} +function setLongSitReminder(params) { + return request({ + url: '/api/Command/SetLongSitReminder', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function getLongSitReminder(imei) { + return request({ + url: '/api/Command/GetLongSitReminder', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} +function setRaiseToLightScreen(params) { + return request({ + url: '/api/Command/SetRaiseToLightScreen', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} +function getRaiseToLightScreen(imei) { + return request({ + url: '/api/Command/GetRaiseToLightScreen', + method: 'get', + headers: { AuthKey: 'key1' }, + params: { imei } + }); +} diff --git a/src/api/user.js b/src/api/user.js index 959af68..9363358 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -1,32 +1,87 @@ -import api from './index'; -// axios -import request from '@/utils/request'; +import request from '@/config/request'; -// 登录 -export function login(data) { +export const APIUser = { + getUserInfos, + updateUserInfo, + loginOut, + processList, + process, + modifyPassword, + alarmList, + getAdminList, //管理员列表 + wxAutoLogin //微信自动登录 +}; +export default APIUser; +// 获取用户信息 +function getUserInfos(params) { return request({ - url: api.Login, + url: `/api/User/UserInfo`, method: 'post', - data + data: params }); } - -// 用户信息 get 方法 -export function getUserInfo(data) { +// 编辑用户信息 +function updateUserInfo(params) { + return request({ + url: `/api/User/UpdateUserInfo`, + method: 'post', + data: params + }); +} +// 退出登录 +function loginOut({ headers, body }) { + return request({ + url: `/api/User/WxLoginOut`, //2022.1.5 接口修改 LoginOut => WxLoginOut + method: 'post', + headers: headers, + data: body + }); +} +// 获取用户系统消息 +function processList(params) { + return request({ + url: `/api/Request/ProcessList`, + method: 'post', + data: params + }); +} +// 是否同意申请关注 +function process(params) { return request({ - url: api.UserInfo, + url: `/api/Request/Process`, method: 'post', - data, - hideloading: true + data: params + }); +} +// 修改密码 +function modifyPassword(params) { + return request({ + url: `/api/User/ModifyPassword`, + method: 'post', + data: params + }); +} +// 消息通知 +function alarmList(params) { + return request({ + url: `/api/Alarm/AlarmList`, + method: 'post', + data: params + }); +} +// 管理员列表 +function getAdminList(params) { + return request({ + url: `/api/User/AdminList`, + method: 'post', + data: params }); } -// 用户名称 get 方法 -export function getUserName(params) { +function wxAutoLogin(params) { return request({ - url: api.UserName, - method: 'get', - params, - hideloading: true + url: `/api/User/WxAutoLogin`, + method: 'post', + data: params }); } diff --git a/src/api/wx.js b/src/api/wx.js new file mode 100644 index 0000000..c0deb4d --- /dev/null +++ b/src/api/wx.js @@ -0,0 +1,32 @@ +import request from '@/config/request'; + +export const APIWx = { + createJSSDK, + checkIsNewCustomer, //获取微信用户是否首次关注,即是否是新用户 + ocr //ocr识别 +}; +export default APIWx; +function createJSSDK({ userId, sUrl, appId }) { + return request({ + url: '/api/WX/CreateJsSdk', + method: 'get', + params: { userId, sUrl, appId } + }); +} +function checkIsNewCustomer(params) { + return request({ + url: '/api/User/getOpenId', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} + +function ocr(params) { + return request({ + url: '/api/WX/ocr', + method: 'post', + headers: { AuthKey: 'key1' }, + data: params + }); +} diff --git a/src/components/SubmenuList.vue b/src/components/SubmenuList.vue new file mode 100644 index 0000000..9b83902 --- /dev/null +++ b/src/components/SubmenuList.vue @@ -0,0 +1,116 @@ + + + + + + {{ title }} + + + + + + + + + + + {{ item.text }} + + + + + + + + + + + diff --git a/src/config/models.js b/src/config/models.js index 40d1eb0..35eabf1 100644 --- a/src/config/models.js +++ b/src/config/models.js @@ -1,2 +1,87 @@ // 项目版本号 export const VersionModel = '1.0.1'; +export const DeviceCommandModel = { + locate: '0001', // 立即定位 + locateType: '0002', // 定位模式 + prohibition: '0003', // 上课禁用时段 + sleep: '0004', // 休眠时段 + remoteSetting: '0005', // 远程设置 + familyNum: '0006', // 亲情号码 + remoteListening: '0007', // 远程监听 + clock: '0008', // 闹钟设置 + safeArea: '0009', // 电子围栏 + sim: '0010', // 设置sim卡 + activateDevice: '0011', // 激活设备 + deviceName: '0012', // 设备昵称 + deviceCode: '0013', // 设备安全码 + sendMsg: '0014' // 下发信息 +}; +export const FamilyNumberModel = { + appType: { + parentWeb: 0, + manufactor: 1, + commonWeb: 2 + }, + editable: { + parentWeb: true, + manufactor: false, + commonWeb: true + }, + level: 1, + callOut: 1, + outtime: '0000~2400|1+2+3+4+5+6+7', + inComing: 1, + incomingTime: '0000~2400|1+2+3+4+5+6+7' +}; +export const ProhibitModel = { + recordType: { + parentWeb: 0, + manufactor: 1, + commonWeb: 2 + }, + editable: { + parentWeb: true, + manufactor: false, + commonWeb: true + } +}; + +export const SafeAreaModel = { + appType: { + parentWeb: 0, + manufactor: 1 + }, + fenceType: { + circle: 1, // 圆形 + polygon: 2 // 多边形 + } +}; +export const WechatHomeModel = { + production: 'https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU2NzkxNjI2MA==&scene=124#wechat_redirect', // 随手精灵公众号 + test: 'https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI5ODIxNTU0MQ==&scene=124#wechat_redirect', // 校乐园 + development: 'https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI5ODIxNTU0MQ==&scene=124#wechat_redirect' // 校乐园 +}; +export const LocationType = { + GPS: 1, + LBS: 2, + WIFI: 3 +}; +export const msgType = { + record: 1, + text: 2 +}; +export const MsgStatus = { + alreadyRead: 1, + notRead: 2 +}; +export const BaiduStatisticsModel = { + production: 'https://hm.baidu.com/hm.js?ef364e6446439911bc4ced79bece7715', // 随手精灵百度流量统计 正式环境 + test: 'https://hm.baidu.com/hm.js?d1eec257a45f71d12db8b1eacb43ba18', // 随手精灵百度流量统计 测试环境 + development: 'https://hm.baidu.com/hm.js?d1eec257a45f71d12db8b1eacb43ba18' // 随手精灵百度流量统计 测试环境 +}; +// 微信ocr Service ID +export const WxOcrServiceId = { + production: 'wx79ac3de8be320b71', + test: 'wx79ac3de8be320b71', + development: 'wx79ac3de8be320b71' +}; diff --git a/src/config/request.js b/src/config/request.js new file mode 100644 index 0000000..54ddaa9 --- /dev/null +++ b/src/config/request.js @@ -0,0 +1,85 @@ +/* + * @Author: linwl + * @Date: 2020-04-13 14:47:59 + * @LastEditTime: 2023-06-15 10:32:04 + * @LastEditors: JinxChen + * @Description: axios请求配置 + * @FilePath: \ParentWeb\src\config\request.js + */ +import axios from 'axios'; +import router from '@/router'; +import { baseApi } from '@/config'; +import prefix from '@/store/prefix'; +const httpProxyPrefix = baseApi; + +// create an axios instance axios.create创建一个实例 +const service = axios.create({ + // baseURL: process.env.VUE_APP_BASE_API, + baseURL: httpProxyPrefix + // timeout: 5000 // request timeout +}); + +const errorHandler = error => { + // const status = get(error, 'response.status'); + const status = error.response.status; + console.log(status); + switch (status) { + case 400: + error.message = '请求错误'; + break; + case 401: + error.message = '未授权,请登录'; + break; + case 403: + error.message = '拒绝访问'; + break; + case 404: + error.message = '请求地址出错'; + break; + case 408: + error.message = '请求超时'; + break; + case 500: + error.message = '服务器内部错误'; + break; + case 501: + error.message = '服务未实现'; + break; + case 502: + error.message = '网关错误'; + break; + case 503: + error.message = '服务器不可用'; + break; + case 504: + error.message = '网关超时'; + break; + case 505: + error.message = 'HTTP版本不受支持'; + break; + default: + break; + } + this.$notify({ message: `您的网络异常(${error.message})`, type: 'warning' }); + return Promise.reject(error); +}; + +// 请求拦截器,增加 token interceptors拦截 +service.interceptors.request.use(request => { + if (localStorage.getItem(prefix + 'authToken')) { + request.headers.AuthToken = localStorage.getItem(prefix + 'authToken'); + } else if ( + window.location.href.indexOf('login') < 0 && + window.location.href.indexOf('forgetPassword') < 0 && + window.location.href.indexOf('verifyInfos') < 0 && + window.location.href.indexOf('register') < 0 && + window.location.href.indexOf('verificationLogin') < 0 && + window.location.href.indexOf('changePassword') < 0 + ) { + router.push({ name: 'login' }); + return request; + } + return request; +}, errorHandler); + +export default service; diff --git a/src/main.js b/src/main.js index 50a4197..1a9649a 100644 --- a/src/main.js +++ b/src/main.js @@ -6,7 +6,7 @@ import 'regenerator-runtime/runtime'; import Vue from 'vue'; import App from './App.vue'; import router from './router'; -import store from './store'; +import store from './store/index'; // 设置 js中可以访问 $cdn import { $cdn } from '@/config'; Vue.prototype.$cdn = $cdn; @@ -21,6 +21,7 @@ import '@/assets/css/index.scss'; import 'amfe-flexible'; Vue.prototype.$dayjs = dayjs; Vue.prototype.$echarts = echarts; +Vue.prototype.$store = store; // filters import './filters'; diff --git a/src/services/dialog-service.js b/src/services/dialog-service.js new file mode 100644 index 0000000..f9be8fc --- /dev/null +++ b/src/services/dialog-service.js @@ -0,0 +1,30 @@ +import { Dialog } from 'vant'; + +let DialogService = { + confirm({ + title, + message, + className, + showCancelButton, + confirmButtonColor, + messageAlign, + confirmButtonText, + cancelButtonText + }) { + return Dialog.confirm({ + title: title || '信息提示', + message: message || '', + className: className || 'device_confirm', + showCancelButton: showCancelButton || false, + confirmButtonColor: confirmButtonColor || '#1989fa', //确认按钮颜色 + messageAlign: messageAlign || 'center', //文字对齐方式 + confirmButtonText: confirmButtonText || '确认', //确认文字 + cancelButtonText: cancelButtonText || '取消' + }); + }, + close() { + return Dialog.close(); + } +}; + +export default DialogService; diff --git a/src/services/toast-service.js b/src/services/toast-service.js new file mode 100644 index 0000000..c3be010 --- /dev/null +++ b/src/services/toast-service.js @@ -0,0 +1,77 @@ +import { Toast } from 'vant'; + +/** + * + * @type {{loading: (function({message?: *, className?: *, loadingType?: *, overlay?: *, forbidClick?: *, duration?: *})), success: (function({message?: *, className?: *, loadingType?: *, overlay?: *, forbidClick?: *, duration?: *})), fail: (function({message?: *, className?: *, loadingType?: *, overlay?: *, forbidClick?: *, duration?: *})), clear: (function())}} + */ +let ToastService = { + loading({ + message, + className, + loadingType, + overlay, + forbidClick, + duration, + getContainer, + closeOnClick, + onClose + } = {}) { + const sec = 2000; + if (onClose) { + const timer = setTimeout(() => { + onClose(); + clearTimeout(timer); + }, duration || sec); + } + return Toast.loading({ + message: message || '', + className: className || 'device_toast', + loadingType: loadingType || 'circular', + overlay: overlay || false, + forbidClick: forbidClick || true, + duration: duration || 0, + getContainer: getContainer || 'body', + closeOnClick: closeOnClick || true + }); + }, + success({ message, className, loadingType, overlay, forbidClick, duration, onClose }) { + const sec = 2000; + if (onClose) { + const timer = setTimeout(() => { + onClose(); + clearTimeout(timer); + }, duration || sec); + } + return Toast.success({ + message: message || '', + className: className || 'device_toast', + loadingType: loadingType || 'circular', + overlay: overlay || false, + forbidClick: forbidClick || true, + duration: duration || sec + }); + }, + fail({ message, className, loadingType, overlay, forbidClick, duration, onClose }) { + const sec = 2000; + // 官方的onoClose方法有bug,已暂停使用 + if (onClose) { + const timer = setTimeout(() => { + onClose(); + clearTimeout(timer); + }, duration || sec); + } + return Toast.fail({ + message: message || '操作失败', + className: className || 'device_toast', + loadingType: loadingType || 'circular', + overlay: overlay || false, + forbidClick: forbidClick || true, + duration: duration || 2000 + }); + }, + clear() { + return Toast.clear(); + } +}; + +export default ToastService; diff --git a/src/services/utils-service.js b/src/services/utils-service.js new file mode 100644 index 0000000..b5132f1 --- /dev/null +++ b/src/services/utils-service.js @@ -0,0 +1,195 @@ +/** + * 判断是否为空 + */ +export function isNull(o) { + if (o === null || o === undefined || o === '') { + return true; + // eslint-disable-next-line + } else if (Array.prototype.isPrototypeOf(o) && o.length === 0) { + return true; + // eslint-disable-next-line + } else if (Object.prototype.isPrototypeOf(o) && Object.keys(o).length === 0) { + return true; + } + return false; +} + +/** + * 判断是否为非空 + */ +export function isNotNull(o) { + return !isNull(o); +} + +/** + * 防抖 + * vue中method的this指向为vue实例,所以在调用时 fnName 得写函数名 + * @param fnName + * @param time + * @returns {Function} + */ +export function debounce(fnName, time = 500) { + let timer = null; + return function () { + if (timer) { + clearTimeout(timer); + } + timer = setTimeout(() => { + this[fnName](); + }, time); + }; +} + +/** + * 节流 + * @param fnName + * @param time + * @returns {Function} + */ +export function throttle(fnName, time = 500) { + let canRun = true; + return function () { + if (!canRun) return; + canRun = false; + setTimeout(() => { + this[fnName](); + canRun = true; + }, time); + }; +} + +/** + * 例如:生成x轴单位:过去一周(包括今天),'yyyy-mm-dd' + * return ['2020-01-20'] | ['01-20'] + * 假如出现跨年,字符串带上年份,反之不带 + * @returns [ date_string ] + */ +export function generateDayPassed(number = 7) { + let arr = []; + for (let i = 0; i < number; i++) { + arr.push(getDay(i - (number - 1))); + } + // 假如出现跨年,字符串带上年份,反之不带 + let tempYear = arr[0].slice(0, 4); + arr = arr.map(item => { + if (tempYear === item.slice(0, 4)) { + return item.slice(5); // '03-31' + } else { + return item; // '2020-03-31' + } + }); + return arr; +} + +// 工具:参数为整数,0为当天,1为明天,-1为昨天;return 2020-01-20 +function getDay(day) { + let today = new Date(), + targetDay_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day; + today.setTime(targetDay_milliseconds); //注意,这行是关键代码 + let tYear = today.getFullYear(), + tMonth = today.getMonth(), + tDate = today.getDate(); + tMonth = doHandleMonth(tMonth + 1); + tDate = doHandleMonth(tDate); + return tYear + '-' + tMonth + '-' + tDate; +} + +// 补零 +function doHandleMonth(month) { + let m = month; + if (month.toString().length == 1) { + m = '0' + month; + } + return m; +} +// 判断开始时间不能大于结束时间 +export function checkStartAndEnd(target = { startTime: '', endTime: '' }) { + console.log('', target.startTime, target.endTime); + let isTimeContained = false; + const target_startTime = stringTimeToNumber(target.startTime); + const target_endTime = stringTimeToNumber(target.endTime); + if (target_startTime < target_endTime) { + isTimeContained = true; + } + return isTimeContained; +} +/** + * 判断时间是否在参数时间区间中 + * 先判断 周期 + * 再判断 时间区间 + * 参数:时间类型为 'HH:mm',weekdays为 '1234567' + * target 新增的 + * origin 存在的 + */ +export function checkPeriodExist(target = { startTime: '', endTime: '', weekdays: '' }, origin) { + let isWeekdaysContained = false; + let isTimeContained = false; + if (isNotNull(target.weekdays) && isNotNull(origin.weekdays)) { + // 存在周期 + target.weekdays.split('').forEach(d => { + if (origin.weekdays.indexOf(d) >= 0) { + isWeekdaysContained = true; + } + }); + } + if (isWeekdaysContained) { + // 周期存在交叉时,判断时间区间 + // 先改为数字 + const target_startTime = stringTimeToNumber(target.startTime); + const target_endTime = stringTimeToNumber(target.endTime); + const origin_startTime = stringTimeToNumber(origin.startTime); + const origin_endTime = stringTimeToNumber(origin.endTime); + if ( + (target_startTime >= origin_startTime && target_startTime < origin_endTime) || + (target_endTime > origin_startTime && target_endTime <= origin_endTime) + ) { + isTimeContained = true; + } + } + return isTimeContained; +} + +export function stringTimeToNumber(strTime) { + let result = null; + try { + result = parseInt(strTime.replace(':', '')); + } catch (e) { + console.error('时间区间判断:::时间格式转换发生错误:::stringTimeToNumber()', e); + } + return result; +} + +// 判断是否存在逗号, 存在以逗号分割成一个数组并且返回第二个数据, 否者直接返回该数据 +export function isComma(o) { + let index = o.indexOf(','); + if (index > 0) { + // 大于0 则存在 + let newArray = o.split(','); + console.log('扫码返回的参数::', o); + if (newArray.length === 3) { + // 兼容 imei,rfid,iccid 方式 + return { type: 'rfIdAndiccId', data: newArray[2], imei: newArray[0] }; + } else { + // 正常 imei和iccid + return newArray[1].length <= 10 + ? { type: 'rfId', data: newArray[1], imei: newArray[0] } + : { type: 'iccId', data: newArray[1], imei: newArray[0] }; + } + } else if (index < 0) { + // 只有imei + return o; + } +} + +// 名字脱敏 +export function nameConvert(name) { + let userName = ''; + if (name.length == 2) { + userName = name.substring(0, 1) + '*'; //截取name 字符串截取第一个字符, + } else if (name.length == 3) { + userName = name.substring(0, 1) + '*' + name.substring(2, 3); //截取第一个和第三个字符 + } else if (name.length > 3) { + userName = name.substring(0, 1) + '*' + '*' + name.substring(3, name.length); //截取第一个和大于第4个字符 + } + return userName; +} diff --git a/src/store/getters.js b/src/store/getters.js index 54417e0..ab0a2e8 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -7,6 +7,7 @@ const getters = { } }, */ userName: state => state.app.userName, - testName: state => state.app.testName + testName: state => state.app.testName, + userId: state => state.app.userId }; export default getters; diff --git a/src/store/index.js b/src/store/index.js index b78d84d..7478e1c 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,4 +1,4 @@ -import Vue from 'vue'; +/* import Vue from 'vue'; import Vuex from 'vuex'; import getters from './getters'; import app from './modules/app'; @@ -13,3 +13,293 @@ const store = new Vuex.Store({ }); export default store; + */ +import Vue from 'vue'; +import Vuex from 'vuex'; +import prefix from '@/store/prefix'; +import { isNotNull } from '@/services/utils-service'; +Vue.use(Vuex); +export default new Vuex.Store({ + state: { + authToken: '', + userId: '', + deviceId: '', + code: '', + serialNo: '', + isAdmin: '', // 绑定时申请人是否管理员/家属 + openId: '', + bindSerialNo: '', //设备绑定成功时的输入的serialNo + loginName: '', //用户登录用的手机号码 + fenceNameList: '', //用户所拥有的全部围栏名字 + familyNameList: '', //用户所拥有的全部亲情名字 + currentAddressAndPostion: '', //导航界面用户当前地址 + wxRecAuth: false, //获取微信第一次授权 + familyShortKeyList: '', //亲情号码快捷键 + isRegister: '', //判断用户是否是第一次进入公众号并且注册成功 + isLogin: '', //判断用户是否是已经登录成功 + gatewayToken: '', //gateway接口token + isFromWx: '', //是否从微信过来的 + uniPhone: '', //物联网卡号 + roleUser: '', //身份角色, 1 学生; 2 长辈 + deviceType: '', //设备类型 1 电子设备 2 手表 + uploadinteval: '', //设备-手表采集频率 + notJump: null, + showLogin: '', //是否显示登录 + watchRole: '', + iotCardTitle: '', //物联网卡商名字 + fromRuoter: null, + deviceVersion: '' //设备版本号 + }, + mutations: { + authToken(state, token) { + state.authToken = token; + window.localStorage[prefix + 'authToken'] = token; + }, + userId(state, userId) { + state.userId = userId; + window.localStorage[prefix + 'userId'] = userId; + }, + deviceId(state, deviceId) { + state.deviceId = deviceId; + window.localStorage[prefix + 'deviceId'] = deviceId; + }, + code(state, code) { + state.code = code; + window.localStorage[prefix + 'code'] = code; + }, + serialNo(state, serialNo) { + state.serialNo = serialNo; + window.localStorage[prefix + 'serialNo'] = serialNo; + }, + isAdmin(state, isAdmin) { + const result = isAdmin ? 1 : 0; + state.isAdmin = result; + window.localStorage[prefix + 'isAdmin'] = result; + }, + openId(state, openId) { + state.openId = openId; + window.localStorage[prefix + 'openId'] = openId; + }, + bindSerialNo(state, bindSerialNo) { + state.bindSerialNo = bindSerialNo; + window.localStorage[prefix + 'bindSerialNo'] = bindSerialNo; + }, + // 用户登录用的手机号码 + loginName(state, loginName) { + state.loginName = loginName; + window.localStorage[prefix + 'loginName'] = loginName; + }, + // 圆形围栏和多边形围栏 + fenceNameList(state, fenceNameList) { + state.fenceNameList = fenceNameList; + window.localStorage[prefix + 'fenceNameList'] = fenceNameList; + }, + // 亲情号码名字 + familyNameList(state, familyNameList) { + state.familyNameList = familyNameList; + window.localStorage[prefix + 'familyNameList'] = familyNameList; + }, + // currentAddressAndPostion + currentAddressAndPostion(state, currentAddressAndPostion) { + state.currentAddressAndPostion = currentAddressAndPostion; + window.localStorage[prefix + 'currentAddressAndPostion'] = currentAddressAndPostion; + }, + wxRecAuth(state, wxRecAuth) { + state.wxRecAuth = wxRecAuth; + window.localStorage[prefix + 'wxRecAuth'] = wxRecAuth; + }, + familyShortKeyList(state, familyShortKeyList) { + state.familyShortKeyList = familyShortKeyList; + window.localStorage[prefix + 'familyShortKeyList'] = familyShortKeyList; + }, + isRegister(state, isRegister) { + state.isRegister = isRegister; + window.localStorage[prefix + 'isRegister'] = isRegister; + }, + isLogin(state, isLogin) { + state.isLogin = isLogin; + window.localStorage[prefix + 'isLogin'] = isLogin; + }, + gatewayToken(state, gatewayToken) { + state.gatewayToken = gatewayToken; + window.localStorage[prefix + 'gatewayToken'] = gatewayToken; + }, + isFromWx(state, isFromWx) { + state.isFromWx = isFromWx; + window.localStorage[prefix + 'isFromWx'] = isFromWx; + }, + uniPhone(state, uniPhone) { + state.uniPhone = uniPhone; + window.localStorage[prefix + 'uniPhone'] = uniPhone; + }, + roleUser(state, roleUser) { + state.roleUser = roleUser; + window.localStorage[prefix + 'roleUser'] = roleUser; + }, + deviceType(state, deviceType) { + state.deviceType = deviceType; + window.localStorage[prefix + 'deviceType'] = deviceType; + }, + uploadinteval(state, uploadinteval) { + state.uploadinteval = uploadinteval; + window.localStorage[prefix + 'uploadinteval'] = uploadinteval; + }, + notJump(state, notJump) { + state.notJump = notJump; + window.localStorage[prefix + 'notJump'] = notJump; + }, + showLogin(state, showLogin) { + state.showLogin = showLogin; + window.localStorage[prefix + 'showLogin'] = showLogin; + }, + watchRole(state, watchRole) { + state.watchRole = watchRole; + window.localStorage[prefix + 'watchRole'] = watchRole; + }, + iotCardTitle(state, iotCardTitle) { + state.iotCardTitle = iotCardTitle; + window.localStorage[prefix + 'iotCardTitle'] = iotCardTitle; + }, + fromRuoter(state, fromRuoter) { + state.fromRuoter = fromRuoter; + window.localStorage[prefix + 'fromRuoter'] = fromRuoter; + }, + deviceVersion(state, deviceVersion) { + state.deviceVersion = deviceVersion; + window.localStorage[prefix + 'deviceVersion'] = deviceVersion; + } + }, + getters: { + authToken: state => { + if (state.authToken != '') { + return state.authToken; + } else { + return window.localStorage[prefix + 'authToken'] == null ? '' : window.localStorage[prefix + 'authToken']; + } + }, + userId: state => { + if (state.userId != '') return state.userId; + return window.localStorage[prefix + 'userId'] == null ? '' : window.localStorage[prefix + 'userId']; + }, + deviceId: state => { + if (state.deviceId != '') return state.deviceId; + return window.localStorage[prefix + 'deviceId'] == null ? '' : window.localStorage[prefix + 'deviceId']; + }, + code: state => { + if (state.code != '') return state.code; + return window.localStorage[prefix + 'code'] == null ? '' : window.localStorage[prefix + 'code']; + }, + serialNo: state => { + if (state.serialNo != '') return state.serialNo; + return window.localStorage[prefix + 'serialNo'] == null ? '' : window.localStorage[prefix + 'serialNo']; + }, + isAdmin: state => { + if (state.isAdmin != '') return state.isAdmin; + return window.localStorage[prefix + 'isAdmin'] == null ? '' : window.localStorage[prefix + 'isAdmin']; + }, + openId: state => { + if (state.openId != '') return state.openId; + return window.localStorage[prefix + 'openId'] == null ? '' : window.localStorage[prefix + 'openId']; + }, + bindSerialNo: state => { + if (state.bindSerialNo != '') return state.bindSerialNo; + return window.localStorage[prefix + 'bindSerialNo'] == null ? '' : window.localStorage[prefix + 'bindSerialNo']; + }, + loginName: state => { + if (state.loginName != '') return state.loginName; + return window.localStorage[prefix + 'loginName'] == null ? '' : window.localStorage[prefix + 'loginName']; + }, + // 圆形围栏和多边形围栏 + fenceNameList: state => { + if (isNotNull(state.fenceNameList)) return state.fenceNameList; + else + return window.localStorage[prefix + 'fenceNameList'] == null + ? '' + : window.localStorage[prefix + 'fenceNameList']; + }, + familyNameList: state => { + if (isNotNull(state.familyNameList)) return state.familyNameList; + else + return window.localStorage[prefix + 'familyNameList'] == null + ? '' + : window.localStorage[prefix + 'familyNameList']; + }, + // currentAddressAndPostion + currentAddressAndPostion: state => { + if (isNotNull(state.currentAddressAndPostion)) return state.currentAddressAndPostion; + else + return window.localStorage[prefix + 'currentAddressAndPostion'] == null + ? '' + : window.localStorage[prefix + 'currentAddressAndPostion']; + }, + wxRecAuth: state => { + if (isNotNull(state.wxRecAuth)) return state.wxRecAuth; + else return window.localStorage[prefix + 'wxRecAuth'] == null ? '' : window.localStorage[prefix + 'wxRecAuth']; + }, + familyShortKeyList: state => { + if (state.familyShortKeyList != '') return state.familyShortKeyList; + return window.localStorage[prefix + 'familyShortKeyList'] == null + ? '' + : window.localStorage[prefix + 'familyShortKeyList']; + }, + isRegister: state => { + if (state.isRegister != '') return state.isRegister; + return window.localStorage[prefix + 'isRegister'] == null ? '' : window.localStorage[prefix + 'isRegister']; + }, + isLogin: state => { + if (state.isLogin != '') return state.isLogin; + return window.localStorage[prefix + 'isLogin'] == null ? '' : window.localStorage[prefix + 'isLogin']; + }, + gatewayToken: state => { + if (state.gatewayToken != '') return state.gatewayToken; + return window.localStorage[prefix + 'gatewayToken'] == null ? '' : window.localStorage[prefix + 'gatewayToken']; + }, + isFromWx: state => { + if (state.isFromWx != '') return state.isFromWx; + return window.localStorage[prefix + 'isFromWx'] == null ? '' : window.localStorage[prefix + 'isFromWx']; + }, + uniPhone: state => { + if (state.uniPhone != '') return state.uniPhone; + return window.localStorage[prefix + 'uniPhone'] == null ? '' : window.localStorage[prefix + 'uniPhone']; + }, + roleUser: state => { + if (state.roleUser != '') return state.roleUser; + return window.localStorage[prefix + 'roleUser'] == null ? '' : window.localStorage[prefix + 'roleUser']; + }, + deviceType: state => { + if (state.deviceType != '') return state.deviceType; + return window.localStorage[prefix + 'deviceType'] == null ? '' : window.localStorage[prefix + 'deviceType']; + }, + uploadinteval: state => { + if (state.uploadinteval != '') return state.uploadinteval; + return window.localStorage[prefix + 'uploadinteval'] == null ? '' : window.localStorage[prefix + 'uploadinteval']; + }, + notJump: state => { + if (state.notJump != '') return state.notJump; + return window.localStorage[prefix + 'notJump'] == null ? '' : window.localStorage[prefix + 'notJump']; + }, + showLogin: state => { + if (state.showLogin != '') return state.showLogin; + return window.localStorage[prefix + 'showLogin'] == null ? '' : window.localStorage[prefix + 'showLogin']; + }, + watchRole: state => { + if (state.watchRole != '') return state.watchRole; + return window.localStorage[prefix + 'watchRole'] == null ? '' : window.localStorage[prefix + 'watchRole']; + }, + iotCardTitle: state => { + if (state.iotCardTitle != '') return state.iotCardTitle; + return window.localStorage[prefix + 'iotCardTitle'] == null ? '' : window.localStorage[prefix + 'iotCardTitle']; + }, + + fromRuoter: state => { + if (state.fromRuoter != '') return state.fromRuoter; + return window.localStorage[prefix + 'fromRuoter'] == null ? '' : window.localStorage[prefix + 'fromRuoter']; + }, + deviceVersion: state => { + if (state.deviceVersion != '') return state.deviceVersion; + return window.localStorage[prefix + 'deviceVersion'] == null ? '' : window.localStorage[prefix + 'deviceVersion']; + } + }, + actions: {}, + modules: {} +}); diff --git a/src/store/prefix.js b/src/store/prefix.js new file mode 100644 index 0000000..a42e0fb --- /dev/null +++ b/src/store/prefix.js @@ -0,0 +1,2 @@ +const prefix = 'card_parent_'; +export default prefix; diff --git a/src/utils/request.js b/src/utils/request.js deleted file mode 100644 index 31fd7f2..0000000 --- a/src/utils/request.js +++ /dev/null @@ -1,58 +0,0 @@ -import axios from 'axios'; -import store from '@/store'; -import { Toast } from 'vant'; -// 根据环境不同引入不同api地址 -import { baseApi } from '@/config'; -// create an axios instance -const service = axios.create({ - baseURL: baseApi, // url = base api url + request url - withCredentials: true, // send cookies when cross-domain requests - timeout: 5000 // request timeout -}); - -// request拦截器 request interceptor -service.interceptors.request.use( - config => { - // 不传递默认开启loading - if (!config.hideloading) { - // loading - Toast.loading({ - forbidClick: true - }); - } - if (store.getters.token) { - config.headers['X-Token'] = ''; - } - return config; - }, - error => { - // do something with request error - console.log(error); // for debug - return Promise.reject(error); - } -); -// respone拦截器 -service.interceptors.response.use( - response => { - Toast.clear(); - const res = response.data; - if (res.status && res.status !== 200) { - // 登录超时,重新登录 - if (res.status === 401) { - store.dispatch('FedLogOut').then(() => { - location.reload(); - }); - } - return Promise.reject(res || 'error'); - } else { - return Promise.resolve(res); - } - }, - error => { - Toast.clear(); - console.log('err' + error); // for debug - return Promise.reject(error); - } -); - -export default service; diff --git a/src/views/myself/index.scss b/src/views/myself/index.scss index 920efa5..177c930 100644 --- a/src/views/myself/index.scss +++ b/src/views/myself/index.scss @@ -4,14 +4,97 @@ width: 100%; overflow: hidden; .container { - height: calc(100vh - 200px); - padding-top: 100px; + position: relative; + height: calc(100vh - 160px); + padding: 30px; overflow: scroll; - .box-scor { - position: relative; - .item { - font-size: 32px; - height: 200px; + .banner { + height: 420px; + width: 100%; + background-color: greenyellow; + border-radius: 60px; + .top { + height: 320px; + @include flexbox(center, center, column, nowrap); + .avatar { + height: 200px; + width: 200px; + @include flexbox(flex-end, center, column, nowrap); + img { + position: relative; + height: 130px; + width: 130px; + padding: 10px; + object-fit: cover; + border-radius: 50%; + border: 2px solid #333; + } + } + .nick-name { + padding: 20px 0; + span { + font-size: 42px; + font-weight: bold; + } + } + } + .bottom { + height: 80px; + padding: 5px 0; + @include flexbox(flex-end, center, column, nowrap); + span { + font-size: 24px; + color: #fff; + } + } + } + .submenu { + flex: 1; + margin-top: 20px; + padding-top: 20px; + &.device-manage { + .add-device { + position: relative; + height: 160px; + max-width: 90px; + min-width: 90px; + border-radius: 10px; + background-color: green; + @include flexbox(center, center, column, nowrap); + } + } + &.safe-helper { + .title { + font-size: 42px; + font-weight: bold; + padding: 20px; + } + .safe-helper-container { + font-size: 32px; + padding: 60px 0px 0 30px; + border: 1px solid green; + border-radius: 30px; + .top { + @include flexbox(flex-start, flex-start, column, wrap); + p { + font-weight: bold; + } + span { + padding: 10px 0; + font-size: 24px; + } + } + .bottom { + @include flexbox(flex-end, center, column, nowrap); + padding: 30px 0 15px 0; + p { + color: red; + span { + color: #000; + } + } + } + } } } } diff --git a/src/views/myself/index.vue b/src/views/myself/index.vue index 5c78228..ca6c9d1 100644 --- a/src/views/myself/index.vue +++ b/src/views/myself/index.vue @@ -1,27 +1,200 @@ - + - - - {{ index }} + + + + + + + {{ userInfos.username }} + + + 已绑定{{ userInfos.deviceNumber }}台设备 + + + + + + + + + + + + + + + + 安全助手 + + + + 桂城街道深海路105号平洲桂城广东天波教育科技有限公司 + 纬度:23.0263313634643 经度:113.175114274988 + + + 进入地图 > + + + + + + + + + + + + + +
{{ title }}
安全助手
桂城街道深海路105号平洲桂城广东天波教育科技有限公司
进入地图 >