diff --git a/src/api/ss/access.js b/src/api/ss/access.js new file mode 100644 index 0000000..24fc3c2 --- /dev/null +++ b/src/api/ss/access.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询第三方API秘钥对列表 +export function listAccess(query) { + return request({ + url: '/ss/access/list', + method: 'get', + params: query + }) +} + +// 查询第三方API秘钥对详细 +export function getAccess(accessId) { + return request({ + url: '/ss/access/' + accessId, + method: 'get' + }) +} + +// 新增第三方API秘钥对 +export function addAccess(data) { + return request({ + url: '/ss/access', + method: 'post', + data: data + }) +} + +// 修改第三方API秘钥对 +export function updateAccess(data) { + return request({ + url: '/ss/access', + method: 'put', + data: data + }) +} + +// 删除第三方API秘钥对 +export function delAccess(accessId) { + return request({ + url: '/ss/access/' + accessId, + method: 'delete' + }) +} diff --git a/src/components/Business/SmUser/UserLink.vue b/src/components/Business/SmUser/UserLink.vue index ddafebd..760036c 100644 --- a/src/components/Business/SmUser/UserLink.vue +++ b/src/components/Business/SmUser/UserLink.vue @@ -1,5 +1,5 @@ <template> - <el-link type="primary" @click="handleClick">{{name}}</el-link> + <el-link type="primary" @click="handleClick" :disabled="id == null">{{name}}</el-link> </template> <script> @@ -17,7 +17,7 @@ export default { }, methods: { handleClick() { - this.$router.push({path: '/smUser/detail', query: {userId: this.id}}) + this.$router.push({path: '/mch/detail', query: {userId: this.id}}) } } } diff --git a/src/components/Business/Store/StoreLink.vue b/src/components/Business/Store/StoreLink.vue new file mode 100644 index 0000000..264d28d --- /dev/null +++ b/src/components/Business/Store/StoreLink.vue @@ -0,0 +1,24 @@ +<template> + <el-link type="primary" @click="handleClick" :disabled="id == null">{{name | defaultValue}}</el-link> +</template> + +<script> +export default { + name: 'StoreLink', + props: { + id: { + type: String, + default: null + }, + name: { + type: String, + default: null, + } + }, + methods: { + handleClick() { + this.$router.push({path: '/mch/storeDetail', query: {storeId: this.id}}) + } + } +} +</script> diff --git a/src/components/FormCol/index.vue b/src/components/FormCol/index.vue index 9cac131..2543509 100644 --- a/src/components/FormCol/index.vue +++ b/src/components/FormCol/index.vue @@ -1,6 +1,6 @@ <template> <el-col :span="span"> - <el-form-item :label="label" :prop="prop"> + <el-form-item :label="label" :prop="prop" :label-width="labelWidth"> <slot></slot> </el-form-item> </el-col> @@ -21,6 +21,10 @@ export default { prop: { type: String, default: null + }, + labelWidth: { + type: String, + default: null } } } diff --git a/src/utils/constants.js b/src/utils/constants.js new file mode 100644 index 0000000..d5f9c04 --- /dev/null +++ b/src/utils/constants.js @@ -0,0 +1,4 @@ +// 视图 +export const views = { + user: 'user', +} diff --git a/src/utils/mixins.js b/src/utils/mixins.js index 1bdae5f..5070394 100644 --- a/src/utils/mixins.js +++ b/src/utils/mixins.js @@ -1,3 +1,5 @@ +import { views } from '@/utils/constants' + export const $view = { props: { view: { @@ -5,17 +7,25 @@ export const $view = { default: null } }, + data() { + return { + views + } + }, computed: { hasView() { return (views) => { - if (views == null || views.length === 0) { + if (views == null || views.length === 0 || this.view == null) { return false; } let list = views; if (views instanceof String) { list = views.split(','); } - return list != null && list.includes(this.view); + if (!(list instanceof Array)) { + list = [list] + } + return list.includes(this.view); } }, notHasView() { diff --git a/src/views/dashboard/Brief.vue b/src/views/dashboard/Brief.vue index 51f8169..441eaf0 100644 --- a/src/views/dashboard/Brief.vue +++ b/src/views/dashboard/Brief.vue @@ -24,7 +24,7 @@ <div class="card-panel panel-model" @click="handleSetLineChartData('messages')"> <div class="card-panel-description"> <div class="card-panel-text"> - 各型号数量 + 型号数量 </div> <count-to :start-val="0" :end-val="briefData.modelCount" :duration="3000" class="card-panel-num" /> <div class="card-panel-compare"> @@ -44,7 +44,7 @@ <div class="card-panel panel-online" @click="handleSetLineChartData('purchases')"> <div class="card-panel-description"> <div class="card-panel-text"> - 在线率 + 在线数量 </div> <count-to :start-val="0" :end-val="briefData.onlineCount" :duration="3200" class="card-panel-num" /> <div class="card-panel-compare"> diff --git a/src/views/dashboard/component/ModelBarChart.vue b/src/views/dashboard/component/ModelBarChart.vue index 4450ecf..a6c88f8 100644 --- a/src/views/dashboard/component/ModelBarChart.vue +++ b/src/views/dashboard/component/ModelBarChart.vue @@ -88,7 +88,7 @@ export default { }, series: [{ colorBy: 'data', - name: "设备数量", + name: "型号数量", color: [ '#2CAB40', '#86DF6C', diff --git a/src/views/dashboard/component/UserRoundPieChart.vue b/src/views/dashboard/component/UserRoundPieChart.vue index 8daadab..f635134 100644 --- a/src/views/dashboard/component/UserRoundPieChart.vue +++ b/src/views/dashboard/component/UserRoundPieChart.vue @@ -77,7 +77,7 @@ export default { '#8D4EDA', '#00B2FF' ], - radius: ['60%', '90%'], + radius: ['50%', '80%'], avoidLabelOverlap: false, itemStyle: { borderRadius: 0, diff --git a/src/views/ss/access/index.vue b/src/views/ss/access/index.vue new file mode 100644 index 0000000..ea17800 --- /dev/null +++ b/src/views/ss/access/index.vue @@ -0,0 +1,294 @@ +<template> + <div class="app-container"> + <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> + <el-form-item label="申请用户" prop="userName" v-if="notHasView(views.user)"> + <el-input + v-model="queryParams.userName" + placeholder="请输入申请用户名称" + clearable + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="秘钥键" prop="accessKey"> + <el-input + v-model="queryParams.accessKey" + placeholder="请输入秘钥键" + clearable + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> + </el-form-item> + </el-form> + + <el-row :gutter="10" class="mb8"> +<!-- <el-col :span="1.5">--> +<!-- <el-button--> +<!-- type="primary"--> +<!-- plain--> +<!-- icon="el-icon-plus"--> +<!-- size="mini"--> +<!-- @click="handleAdd"--> +<!-- v-hasPermi="['ss:access:add']"--> +<!-- >新增</el-button>--> +<!-- </el-col>--> +<!-- <el-col :span="1.5">--> +<!-- <el-button--> +<!-- type="success"--> +<!-- plain--> +<!-- icon="el-icon-edit"--> +<!-- size="mini"--> +<!-- :disabled="single"--> +<!-- @click="handleUpdate"--> +<!-- v-hasPermi="['ss:access:edit']"--> +<!-- >修改</el-button>--> +<!-- </el-col>--> + <el-col :span="1.5"> + <el-button + type="danger" + plain + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['ss:access:remove']" + >删除</el-button> + </el-col> +<!-- <el-col :span="1.5">--> +<!-- <el-button--> +<!-- type="warning"--> +<!-- plain--> +<!-- icon="el-icon-download"--> +<!-- size="mini"--> +<!-- @click="handleExport"--> +<!-- v-hasPermi="['ss:access:export']"--> +<!-- >导出</el-button>--> +<!-- </el-col>--> + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> + </el-row> + + <el-table v-loading="loading" :data="accessList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> + <el-table-column label="秘钥对ID" align="center" prop="accessId" width="80"/> + <el-table-column label="申请用户" align="center" prop="userName" v-if="notHasView(views.user)"/> + <el-table-column label="秘钥键" align="center" prop="accessKey" /> + <el-table-column label="秘钥" align="center" prop="accessSecret" > + <template slot-scope="d">******</template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200"> + <template slot-scope="scope"> +<!-- <el-button--> +<!-- size="mini"--> +<!-- type="text"--> +<!-- icon="el-icon-edit"--> +<!-- @click="handleUpdate(scope.row)"--> +<!-- v-hasPermi="['ss:access:edit']"--> +<!-- >修改</el-button>--> + <el-button + size="mini" + type="text" + icon="el-icon-delete" + @click="handleDelete(scope.row)" + v-hasPermi="['ss:access:remove']" + >删除</el-button> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total>0" + :total="total" + :page.sync="queryParams.pageNum" + :limit.sync="queryParams.pageSize" + @pagination="getList" + /> + + <!-- 添加或修改第三方API秘钥对对话框 --> + <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> + <el-form ref="form" :model="form" :rules="rules" label-width="80px"> + <el-form-item label="申请用户ID" prop="userId"> + <el-input v-model="form.userId" placeholder="请输入申请用户ID" /> + </el-form-item> + <el-form-item label="秘钥键" prop="accessKey"> + <el-input v-model="form.accessKey" placeholder="请输入秘钥键" /> + </el-form-item> + <el-form-item label="秘钥" prop="accessSecret"> + <el-input v-model="form.accessSecret" placeholder="请输入秘钥" /> + </el-form-item> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" @click="submitForm">确 定</el-button> + <el-button @click="cancel">取 消</el-button> + </div> + </el-dialog> + </div> +</template> + +<script> +import { listAccess, getAccess, delAccess, addAccess, updateAccess } from "@/api/ss/access"; +import { $view } from '@/utils/mixins' + +export default { + name: "Access", + mixins: [$view], + props: { + query: { + type: Object, + default: () => { + return {} + } + } + }, + data() { + return { + // 遮罩层 + loading: true, + // 选中数组 + ids: [], + // 非单个禁用 + single: true, + // 非多个禁用 + multiple: true, + // 显示搜索条件 + showSearch: true, + // 总条数 + total: 0, + // 第三方API秘钥对表格数据 + accessList: [], + // 弹出层标题 + title: "", + // 是否显示弹出层 + open: false, + // 查询参数 + queryParams: { + pageNum: 1, + pageSize: 10, + accessId: null, + userName: null, + accessKey: null, + }, + // 表单参数 + form: {}, + // 表单校验 + rules: { + userId: [ + { required: true, message: "申请用户ID不能为空", trigger: "blur" } + ], + accessKey: [ + { required: true, message: "秘钥键不能为空", trigger: "blur" } + ], + accessSecret: [ + { required: true, message: "秘钥不能为空", trigger: "blur" } + ], + createTime: [ + { required: true, message: "创建时间不能为空", trigger: "blur" } + ] + } + }; + }, + created() { + this.queryParams = { + ...this.queryParams, + ...this.query + } + this.getList(); + }, + methods: { + /** 查询第三方API秘钥对列表 */ + getList() { + this.loading = true; + listAccess(this.queryParams).then(response => { + this.accessList = response.rows; + this.total = response.total; + this.loading = false; + }); + }, + // 取消按钮 + cancel() { + this.open = false; + this.reset(); + }, + // 表单重置 + reset() { + this.form = { + accessId: null, + userId: null, + accessKey: null, + accessSecret: null, + createTime: null + }; + this.resetForm("form"); + }, + /** 搜索按钮操作 */ + handleQuery() { + this.queryParams.pageNum = 1; + this.getList(); + }, + /** 重置按钮操作 */ + resetQuery() { + this.resetForm("queryForm"); + this.handleQuery(); + }, + // 多选框选中数据 + handleSelectionChange(selection) { + this.ids = selection.map(item => item.accessId) + this.single = selection.length!==1 + this.multiple = !selection.length + }, + /** 新增按钮操作 */ + handleAdd() { + this.reset(); + this.open = true; + this.title = "添加第三方API秘钥对"; + }, + /** 修改按钮操作 */ + handleUpdate(row) { + this.reset(); + const accessId = row.accessId || this.ids + getAccess(accessId).then(response => { + this.form = response.data; + this.open = true; + this.title = "修改第三方API秘钥对"; + }); + }, + /** 提交按钮 */ + submitForm() { + this.$refs["form"].validate(valid => { + if (valid) { + if (this.form.accessId != null) { + updateAccess(this.form).then(response => { + this.$modal.msgSuccess("修改成功"); + this.open = false; + this.getList(); + }); + } else { + addAccess(this.form).then(response => { + this.$modal.msgSuccess("新增成功"); + this.open = false; + this.getList(); + }); + } + } + }); + }, + /** 删除按钮操作 */ + handleDelete(row) { + const accessIds = row.accessId || this.ids; + this.$modal.confirm('是否确认删除第三方API秘钥对编号为"' + accessIds + '"的数据项?').then(function() { + return delAccess(accessIds); + }).then(() => { + this.getList(); + this.$modal.msgSuccess("删除成功"); + }).catch(() => {}); + }, + /** 导出按钮操作 */ + handleExport() { + this.download('ss/access/export', { + ...this.queryParams + }, `access_${new Date().getTime()}.xlsx`) + } + } +}; +</script> diff --git a/src/views/ss/store/index.vue b/src/views/ss/store/index.vue index 7354ea9..0ef49ea 100644 --- a/src/views/ss/store/index.vue +++ b/src/views/ss/store/index.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> - <el-form-item label="用户名称" prop="userId"> + <el-form-item label="用户名称" prop="userId" v-if="notHasView(views.user)"> <el-input v-model="queryParams.userName" placeholder="请输入用户名称" @@ -138,9 +138,9 @@ <image-upload v-model="form.picture" :limit="9"/> </form-col> <form-col label="所属用户" prop="userId" :span="span"> - <user-input v-model="form.userId" :query="userQuery"/> + <user-input v-model="form.userId" :query="userQuery" :disabled="hasView(views.user)"/> </form-col> - <form-col label="是否显示" prop="show" :span="span"> + <form-col label="是否在地图展示" prop="show" :span="span" label-width="9em"> <el-switch v-model="form.show"/> </form-col> <form-col label="店铺名称" prop="name" :span="span * 2"> @@ -213,11 +213,21 @@ import UserInput from '@/components/Business/SmUser/UserInput.vue' import PlaceSearchDialog from '@/components/Map/PlaceSearch/PlaceSearchDialog.vue' import AreaTextSelect from '@/components/AreaTextSelect/index.vue' import { parseTime } from '../../../utils/ruoyi' +import { $view } from '@/utils/mixins' export default { name: "Store", + mixins: [$view], dicts: ['ss_store_type'], components: { AreaTextSelect, PlaceSearchDialog, UserInput, SmUserSelect }, + props: { + query: { + type: Object, + default: () => { + return {} + } + } + }, data() { return { // 遮罩层 @@ -298,6 +308,10 @@ export default { } }, created() { + this.queryParams = { + ...this.queryParams, + ...this.query + } this.getList(); }, methods: { @@ -329,7 +343,7 @@ export default { reset() { this.form = { storeId: null, - userId: null, + userId: this.query.userId, picture: null, name: null, address: null, diff --git a/src/views/system/device/detail.vue b/src/views/system/device/detail.vue index a26e894..1ca99be 100644 --- a/src/views/system/device/detail.vue +++ b/src/views/system/device/detail.vue @@ -15,10 +15,10 @@ <el-link :underline="false" icon="el-icon-refresh" @click="handleReset">时长归零</el-link> </el-dropdown-item> <el-dropdown-item> - <el-link :underline="false" icon="el-icon-switch-button" @click="handleSwitch(true)">强制开启</el-link> + <el-link :underline="false" icon="el-icon-switch-button" v-if="!isOpen" @click="handleSwitch(true)">强制开启</el-link> </el-dropdown-item> <el-dropdown-item> - <el-link :underline="false" icon="el-icon-switch-button" @click="handleSwitch(false)">强制关闭</el-link> + <el-link :underline="false" icon="el-icon-switch-button" v-if="isOpen" @click="handleSwitch(false)">强制关闭</el-link> </el-dropdown-item> <el-dropdown-item> <el-link :underline="false" icon="el-icon-link" type="danger" @click="handleUnbnd" :disabled="deviceData.userId == null">强制解绑</el-link> @@ -49,21 +49,58 @@ <el-descriptions-item label="型号功能"> <dict-tag :options="dict.type.sm_model_tag" :value="deviceData.modelTags" size="mini"/> </el-descriptions-item> - <el-descriptions-item label="所属用户">{{deviceData.userName | defaultValue}}</el-descriptions-item> - <el-descriptions-item label="店铺名称">{{deviceData.storeName | defaultValue}}</el-descriptions-item> + <el-descriptions-item label="开关状态"> + <el-tag :type="isOpen ? 'success' : 'danger'" size="mini">{{isOpen ? '已开启' : '已关闭'}}</el-tag> + </el-descriptions-item> <el-descriptions-item label="WIFI">{{deviceData.wifi | defaultValue}}</el-descriptions-item> <el-descriptions-item label="剩余时长">{{surplusTimeDesc(surplusTime).text}}</el-descriptions-item> <el-descriptions-item label="设备剩余时长"> {{surplusTimeDesc(deviceData.remainTime).text}} <span class="remark-text">最近更新时间:{{deviceData.lastPullTime}}</span> </el-descriptions-item> -<!-- <el-descriptions-item label="实时功率">{{deviceData.realTimePower | defaultValue}} KWH</el-descriptions-item>--> + </el-descriptions> + </el-card> + + <el-card class="box-card"> + <el-descriptions title="所属人信息"> + <el-descriptions-item label="所属用户"> + <user-link :name="deviceData.userName" :id="deviceData.userId"/> + </el-descriptions-item> + <el-descriptions-item label="设备名称">{{deviceData.deviceName | defaultValue}}</el-descriptions-item> + <el-descriptions-item label="店铺名称"> + <store-link :name="deviceData.storeName" :id="deviceData.storeId"/> + </el-descriptions-item> <el-descriptions-item label="备注">{{deviceData.remark | defaultValue}}</el-descriptions-item> </el-descriptions> </el-card> <!-- <el-card class="box-card">--> -<!-- <meter-record-report :device-id="deviceData.deviceId"/>--> +<!-- <el-row type="flex">--> +<!-- <el-statistic class="statistic" group-separator=",">--> +<!-- <template #title>--> +<!-- <svg-icon icon-class="time" />剩余时长--> +<!-- </template>--> +<!-- <template #formatter>--> +<!-- {{surplusTimeDesc(surplusTime).text}}--> +<!-- </template>--> +<!-- </el-statistic>--> +<!-- <el-statistic class="statistic" group-separator=",">--> +<!-- <template #title>--> +<!-- <svg-icon icon-class="time" />在线状态--> +<!-- </template>--> +<!-- <template #formatter>--> +<!-- {{findLabel(dict.type.sm_device_online_status, deviceData.onlineStatus)}}--> +<!-- </template>--> +<!-- </el-statistic>--> +<!-- <el-statistic class="statistic" group-separator=",">--> +<!-- <template #title>--> +<!-- <svg-icon icon-class="time" />开关状态--> +<!-- </template>--> +<!-- <template #formatter>--> +<!-- <el-tag :type="isOpen ? 'success' : 'danger'" size="mini">{{isOpen ? '已开启' : '已关闭'}}</el-tag>--> +<!-- </template>--> +<!-- </el-statistic>--> +<!-- </el-row>--> <!-- </el-card>--> <el-card class="box-card"> @@ -106,7 +143,7 @@ import { addTime, getDevice, refreshIot, resetDevice, switchDevice, unbind } from '@/api/system/device' import LineChart from "@/views/dashboard/LineChart.vue"; import RechargeRecord from "@/views/system/device/components/rechargeRecord.vue"; -import {formatDate} from "@/utils"; +import { findLabel, formatDate } from '@/utils' import QrCode from "@/components/QrCode/index.vue"; import MeterRecordReport from "@/views/system/device/components/meterRecordReport.vue"; import ReadingRecord from "@/views/system/device/components/readingRecord.vue"; @@ -118,10 +155,14 @@ import SuitList from '@/views/system/device/components/suitList.vue' import Suit from '@/views/ss/suit/index.vue' import RecordTime from '@/views/ss/time/index.vue' import { toDescriptionFromSecond } from '@/utils/date' +import StoreLink from '@/components/Business/Store/StoreLink.vue' +import UserLink from '@/components/Business/SmUser/UserLink.vue' export default { name: 'deviceDetail', components: { + UserLink, + StoreLink, RecordTime, Suit, SuitList, @@ -154,6 +195,9 @@ export default { return (second) => { return toDescriptionFromSecond(second); } + }, + isOpen() { + return this.deviceData != null && this.deviceData.powerStatus === '1'; } }, created() { @@ -163,6 +207,7 @@ export default { clearInterval(this.timer); }, methods: { + findLabel, handleUnbnd() { this.$confirm('是否强制解绑该设备?', '警告', { confirmButtonText: '确定', @@ -189,6 +234,7 @@ export default { switchDevice(this.deviceData.deviceId, open).then(res => { if (res.code === 200) { this.$message.success("操作成功"); + this.deviceData.powerStatus = open ? '1' : '0'; } }).finally(() => { this.loading = false; diff --git a/src/views/system/smUser/components/userRechargeReport.vue b/src/views/system/smUser/components/userRechargeReport.vue index d097157..38c50c3 100644 --- a/src/views/system/smUser/components/userRechargeReport.vue +++ b/src/views/system/smUser/components/userRechargeReport.vue @@ -7,7 +7,7 @@ </el-tab-pane> </el-tabs> </el-row> - <single-line-chart v-loading="loading" :labels="labels" :chart-data="chartData" name="收入" /> + <single-line-chart v-loading="loading" :labels="labels" :chart-data="chartData" name="收入(元)" /> </div> </template> diff --git a/src/views/system/smUser/detail.vue b/src/views/system/smUser/detail.vue index 86db6b9..3e82156 100644 --- a/src/views/system/smUser/detail.vue +++ b/src/views/system/smUser/detail.vue @@ -13,12 +13,12 @@ <div class="user-description"> <el-descriptions> - <el-descriptions-item label="微信">{{userData.wxOpenId}}</el-descriptions-item> - <el-descriptions-item label="店铺数">{{userData.storeCount}} 家</el-descriptions-item> - <el-descriptions-item label="设备数">{{userData.deviceCount}} 台</el-descriptions-item> - <el-descriptions-item label="账户余额">{{userData.balance | money}} 元</el-descriptions-item> - <el-descriptions-item label="总收入">{{userData.totalIncome | money}} 元</el-descriptions-item> - <el-descriptions-item label="总提现">{{userData.withDrawlAmount | money}} 元</el-descriptions-item> + <el-descriptions-item label="微信">{{userData.wxOpenId | defaultValue}}</el-descriptions-item> + <el-descriptions-item label="店铺数">{{userData.storeCount | defaultValue}} 家</el-descriptions-item> + <el-descriptions-item label="设备数">{{userData.deviceCount | defaultValue}} 台</el-descriptions-item> + <el-descriptions-item label="账户余额">{{userData.balance | money | defaultValue}} 元</el-descriptions-item> + <el-descriptions-item label="总收入">{{userData.totalIncome | money | defaultValue}} 元</el-descriptions-item> + <el-descriptions-item label="总提现">{{userData.withDrawlAmount | money | defaultValue}} 元</el-descriptions-item> <el-descriptions-item label="服务费费率"> {{userData.serviceRate == null ? '未设置' : userData.serviceRate + '%' }} </el-descriptions-item> @@ -36,9 +36,15 @@ <el-tab-pane label="设备列表" lazy> <user-device :user-id="userData.userId"/> </el-tab-pane> + <el-tab-pane label="店铺列表" lazy> + <store :query="{userId: userData.userId}" :view="views.user"/> + </el-tab-pane> <el-tab-pane label="充值提现记录" lazy> <user-account :landlord-id="userData.userId"/> </el-tab-pane> + <el-tab-pane label="用户秘钥" lazy> + <access :query="{userId: userData.userId}" :view="views.user"/> + </el-tab-pane> </el-tabs> </el-card> </div> @@ -50,10 +56,14 @@ import {getSmUser} from "@/api/system/smUser"; import UserDevice from "@/views/system/smUser/components/userDevice.vue"; import UserAccount from "@/views/system/smUser/components/userAccount.vue"; import UserRechargeReport from "@/views/system/smUser/components/userRechargeReport.vue"; +import Access from '@/views/ss/access/index.vue' +import { $view } from '@/utils/mixins' +import Store from '@/views/ss/store/index.vue' export default { name: 'deviceDetail', - components: {UserRechargeReport, UserAccount, UserDevice, LineChart}, + mixins: [$view], + components: { Store, Access, UserRechargeReport, UserAccount, UserDevice, LineChart}, dicts: ['sm_user_type'], data() { return { @@ -103,6 +113,6 @@ export default { } .user-detail .user-description { flex: 1; - margin-top: 64px; + margin-top: 32px; } </style>