@@ -38,3 +38,9 @@ npm run lint | |||
- 增加 navbar 组件 | |||
- 增加 样式初始化 css | |||
- 增加 day.js,echarts 和高德地图 | |||
`2023年12月16日` FETURE | |||
- 增加 接口文件 | |||
- 增加 store 文件 | |||
- 增加 封装的 toast 和 dialog 文件 |
@@ -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; |
@@ -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; |
@@ -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; |
@@ -1,5 +1,5 @@ | |||
// axios | |||
import request from '@/utils/request'; | |||
import request from '@/config/request'; | |||
export const APIUser = { | |||
getUser, | |||
@@ -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 | |||
}); | |||
} |
@@ -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 } | |||
}); | |||
} |
@@ -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 | |||
}); | |||
} |
@@ -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 | |||
}); | |||
} |
@@ -0,0 +1,116 @@ | |||
<!-- --> | |||
<template> | |||
<div class="submenu-list"> | |||
<div class="header"> | |||
<div class="left"> | |||
<p>{{ title }}</p> | |||
</div> | |||
<div class="right"></div> | |||
</div> | |||
<div class="main"> | |||
<div class="list"> | |||
<div class="item" v-for="(item, index) in list" :key="index" @click="onItemClick(item)"> | |||
<div class="img-icon-con" :style="{ borderRadius: rounded ? '50%' : '8px', backgroundColor: item.bgColor }"> | |||
<img :src="item.imgPath" alt="" /> | |||
</div> | |||
<div class="text"> | |||
<span>{{ item.text }}</span> | |||
</div> | |||
</div> | |||
<slot name="addDevice"></slot> | |||
</div> | |||
</div> | |||
<!-- <div class="footer"></div> --> | |||
</div> | |||
</template> | |||
<script> | |||
export default { | |||
name: 'SubmenuList', | |||
props: { | |||
title: { | |||
type: String, | |||
default: '' | |||
}, | |||
list: { | |||
type: Array, | |||
default: '' || [] | |||
}, | |||
rounded: { | |||
type: Boolean, | |||
default: null || false | |||
} | |||
}, | |||
data() { | |||
return {}; | |||
}, | |||
created() {}, | |||
mounted() {}, | |||
methods: { | |||
onItemClick(item) { | |||
console.log('点击的item', item); | |||
if (item.showType) { | |||
if (item.showType === 'newPage') { | |||
this.$router.push({ | |||
name: `${item.routerName}` | |||
}); | |||
} | |||
} | |||
} | |||
} | |||
}; | |||
</script> | |||
<style scoped lang="scss"> | |||
.submenu-list { | |||
height: 100%; | |||
width: 100%; | |||
position: relative; | |||
.header { | |||
position: relative; | |||
font-weight: bold; | |||
padding: 10px 20px; | |||
@include flexbox(flex-start, center, row, wrap); | |||
.left { | |||
p { | |||
font-size: 42px; | |||
} | |||
} | |||
} | |||
.main { | |||
position: relative; | |||
@include flexbox(flex-start, center, row, wrap); | |||
width: 100%; | |||
.list { | |||
position: relative; | |||
padding-left: 20px; | |||
/* @include flexbox(flex-start, flex-start, row, wrap); */ | |||
display: grid; | |||
grid-template-columns: repeat(4, auto); | |||
grid-gap: 40px; | |||
/* grid-template-rows: auto auto; */ | |||
.item { | |||
position: relative; | |||
/* height: 140px; */ | |||
/* max-width: 180px; */ | |||
/* padding: 0 20px; */ | |||
@include flexbox(center, center, column, nowrap); | |||
.img-icon-con { | |||
padding: 20px; | |||
@include flexbox(space-around, center, column, wrap); | |||
img { | |||
height: 80px; | |||
widows: 80px; | |||
} | |||
} | |||
.text { | |||
@include flexbox(flex-start, center, column, wrap); | |||
padding: 5px; | |||
font-size: 28px; | |||
font-weight: 400; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
/* @import url(); 引入css类 */ | |||
</style> |
@@ -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' | |||
}; |
@@ -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; |
@@ -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'; | |||
@@ -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; |
@@ -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; |
@@ -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; | |||
} |
@@ -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; |
@@ -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: {} | |||
}); |
@@ -0,0 +1,2 @@ | |||
const prefix = 'card_parent_'; | |||
export default prefix; |
@@ -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; |
@@ -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; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
} | |||
} |
@@ -1,27 +1,200 @@ | |||
<!-- --> | |||
<template> | |||
<div class="myself"> | |||
<NavBar></NavBar> | |||
<!-- <NavBar></NavBar> --> | |||
<div class="container"> | |||
<div class="box-scor"> | |||
<div v-for="(item, index) in 20" :key="index" class="item"> | |||
{{ index }} | |||
<div class="banner"> | |||
<div class="top"> | |||
<div class="avatar"> | |||
<img :src="userInfos.imagePath" alt="" /> | |||
</div> | |||
<div class="nick-name"> | |||
<span>{{ userInfos.username }}</span> | |||
</div> | |||
</div> | |||
<div class="bottom"> | |||
<span>已绑定{{ userInfos.deviceNumber }}台设备</span> | |||
</div> | |||
</div> | |||
<div class="submenu device-manage"> | |||
<SubmenuList :title="device.title" :list="device.list" rounded> | |||
<template #addDevice> | |||
<div class="add-device"><span>+</span></div> | |||
</template> | |||
</SubmenuList> | |||
</div> | |||
<div class="submenu family"> | |||
<SubmenuList :title="family.title" :list="family.list"> </SubmenuList> | |||
</div> | |||
<div class="submenu safe-helper"> | |||
<div class="title"> | |||
<p>安全助手</p> | |||
</div> | |||
<div class="safe-helper-container"> | |||
<div class="top"> | |||
<p>桂城街道深海路105号平洲桂城广东天波教育科技有限公司</p> | |||
<span>纬度:23.0263313634643 经度:113.175114274988</span> | |||
</div> | |||
<div class="bottom"> | |||
<p>进入地图 <span>></span></p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="submenu study-helper"> | |||
<SubmenuList :title="studyHelper.title" :list="studyHelper.list"> </SubmenuList> | |||
</div> | |||
<div class="submenu life-helper"> | |||
<SubmenuList :title="lifeHelper.title" :list="lifeHelper.list"> </SubmenuList> | |||
</div> | |||
<div class="submenu param-setting"> | |||
<SubmenuList :title="paramSetting.title" :list="paramSetting.list"> </SubmenuList> | |||
</div> | |||
<div class="submenu others-setting"> | |||
<SubmenuList :title="othersSetting.title" :list="othersSetting.list"> </SubmenuList> | |||
</div> | |||
</div> | |||
</div> | |||
</template> | |||
<script> | |||
import NavBar from '@/components/NavBar.vue'; | |||
/* import NavBar from '@/components/NavBar.vue'; */ | |||
import SubmenuList from '@/components/SubmenuList.vue'; | |||
import APIUser from '@/api/user'; | |||
import APIDevice from '@/api/device'; | |||
import ToastService from '@/services/toast-service'; | |||
import { isNotNull } from '@/services/utils-service'; | |||
export default { | |||
components: { NavBar }, | |||
components: { /* NavBar, */ SubmenuList }, | |||
data() { | |||
return {}; | |||
return { | |||
userInfos: {}, | |||
listData: [], | |||
family: { | |||
title: '亲情沟通', | |||
list: [ | |||
{ imgPath: require('../../assets/logo.png'), text: '亲情号码', bgColor: 'red' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '留言', bgColor: 'green' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '通话记录', bgColor: 'red' } | |||
] | |||
}, | |||
device: { | |||
title: '孩子管理', | |||
list: [ | |||
/* { imgPath: require('../../assets/logo.png'), text: '测试设置', bgColor: 'green' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '测试设置', bgColor: 'red' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '测试设置', bgColor: 'red' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '留言', bgColor: 'green' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '留言', bgColor: 'green' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '测试设置', bgColor: 'red' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '留言', bgColor: 'green' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '留言', bgColor: 'green' } */ | |||
] | |||
}, | |||
studyHelper: { | |||
title: '学习助手', | |||
list: [ | |||
{ imgPath: require('../../assets/logo.png'), text: '课堂禁用', bgColor: 'green' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '课程表', bgColor: 'red' } | |||
] | |||
}, | |||
lifeHelper: { | |||
title: '生活助手', | |||
list: [ | |||
{ imgPath: require('../../assets/logo.png'), text: '闹钟', bgColor: 'green' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '支付密码修改', bgColor: 'red' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '短信修改', bgColor: 'red' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '亲友关注', bgColor: 'red' } | |||
] | |||
}, | |||
paramSetting: { | |||
title: '参数设置', | |||
list: [ | |||
{ imgPath: require('../../assets/logo.png'), text: '参数设置', bgColor: 'green' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '远程设置', bgColor: 'red' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '休眠设置', bgColor: 'red' } | |||
] | |||
}, | |||
othersSetting: { | |||
title: '其他设置', | |||
list: [ | |||
{ imgPath: require('../../assets/logo.png'), text: '账号安全', bgColor: 'green' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '常见问题', bgColor: 'red' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '版本信息', bgColor: 'red' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '关于我们', bgColor: 'red' }, | |||
{ imgPath: require('../../assets/logo.png'), text: '退出登录', bgColor: 'red' } | |||
] | |||
}, | |||
userImg: require('../../assets/logo.png') //用户头像 | |||
}; | |||
}, | |||
created() {}, | |||
mounted() {}, | |||
methods: {} | |||
mounted() { | |||
this.getUserInfos(); | |||
this.getDeviceList(); | |||
}, | |||
methods: { | |||
getUserInfos() { | |||
APIUser.getUserInfos({ | |||
userId: this.$store.getters.userId | |||
}) | |||
.then(res => { | |||
console.log('res', res); | |||
if (res.data.stateCode === 1) { | |||
if (res.data) { | |||
this.userInfos = { ...res.data }; | |||
} | |||
} | |||
}) | |||
.catch(err => { | |||
console.log(err); | |||
}) | |||
.finally(() => { | |||
ToastService.clear(); | |||
}); | |||
}, | |||
getDeviceList() { | |||
ToastService.loading({ message: '正在加载', forbidClick: false }); | |||
let that = this; | |||
APIDevice.deviceList({ | |||
userId: this.$store.getters.userId, | |||
mapType: 'gaode', | |||
timeOffset: -new Date().getTimezoneOffset() / 60 | |||
}) | |||
.then(res => { | |||
let item = res.data; | |||
this.longName = item.longName; | |||
this.device.list = | |||
item.devicesList == null | |||
? [] | |||
: item.devicesList.map(device => { | |||
return { | |||
imgPath: device.imagePath, | |||
text: device.nickName ? device.nickName : device.serialNo.slice(-3), | |||
bgColor: 'green' | |||
}; | |||
}); | |||
if (isNotNull(item.devicesList)) { | |||
item.devicesList.forEach(val => { | |||
if (val.deviceId == that.$store.getters.deviceId) { | |||
this.$store.commit('roleUser', val.roleUser); | |||
this.$store.commit('deviceType', val.deviceType); | |||
} | |||
}); | |||
} else { | |||
this.$store.commit('deviceId', ''); | |||
this.$store.commit('serialNo', ''); | |||
} | |||
}) | |||
.catch(err => { | |||
console.log(err); | |||
}) | |||
.finally(() => { | |||
ToastService.clear(); | |||
}); | |||
} | |||
} | |||
}; | |||
</script> | |||
<style scoped lang="scss"> | |||