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>