1839 lines
53 KiB
Vue
1839 lines
53 KiB
Vue
<template>
|
||
<view class="devTools">
|
||
<!-- #ifndef APP-PLUS -->
|
||
<view class="navbar">
|
||
<view
|
||
class="navbarBody"
|
||
:style="{
|
||
marginTop: navbarStyle.statusBarHeightPx,
|
||
height: navbarStyle.navbarHeightPx,
|
||
}"
|
||
>
|
||
<view
|
||
class="left"
|
||
@click="back"
|
||
>
|
||
<image src="@/devTools/page/static/fold.png" />
|
||
<text class="margin-left-sm">返回</text>
|
||
</view>
|
||
<view
|
||
class="right"
|
||
:style="{ 'margin-right': windowInfo.navbar.capsuleRightPx + 'px' }"
|
||
v-if="tabList[tabIndex].canRefreshing"
|
||
@click="getPage(true)"
|
||
>
|
||
<text :class="tabList[tabIndex].isRefreshing ? 'refreshing' : ''">
|
||
{{ tabList[tabIndex].isRefreshing ? "刷新中" : "刷新" }}
|
||
</text>
|
||
<image src="@/devTools/page/static/refresh.png" />
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<!-- #endif -->
|
||
|
||
<view
|
||
ref="mask"
|
||
class="mask"
|
||
@click="$devTools.hide()"
|
||
></view>
|
||
|
||
<view
|
||
@click.stop
|
||
ref="panel"
|
||
class="panel"
|
||
:style="{
|
||
height: panelHeight + 'px',
|
||
}"
|
||
>
|
||
<view class="head">
|
||
<scroll-view
|
||
:scroll-x="true"
|
||
class="tabList showScrollbars"
|
||
:class="isDialog ? '' : 'tab-h5'"
|
||
:show-scrollbar="false"
|
||
>
|
||
<view style="display: flex; flex-direction: row">
|
||
<view
|
||
v-for="(item, index) in tabList"
|
||
:key="index"
|
||
class="tabItem"
|
||
@click="tabIndex = index"
|
||
>
|
||
<text
|
||
class="tabText"
|
||
:class="index == tabIndex ? 'active' : ''"
|
||
>
|
||
{{ item.title }}
|
||
</text>
|
||
<view
|
||
class="tabLine"
|
||
v-if="index == tabIndex"
|
||
></view>
|
||
</view>
|
||
</view>
|
||
</scroll-view>
|
||
<view
|
||
v-if="isDialog"
|
||
class="close"
|
||
@click="$devTools.hide()"
|
||
>
|
||
<view class="line"></view>
|
||
<text class="icon">×</text>
|
||
</view>
|
||
</view>
|
||
|
||
<mobileSwiperScroll
|
||
:scrollHeight="listHeight"
|
||
:tabIndex="tabIndex"
|
||
:tabList="tabList"
|
||
@refresh="onrefresh"
|
||
@pullingdown="onpullingdown"
|
||
@tabIndexChange="tabIndex = $event"
|
||
ref="mobileSwiperScroll"
|
||
>
|
||
<template #default="{ item, index }">
|
||
<template v-if="item.title == 'Tools'">
|
||
<cell>
|
||
<tools
|
||
ref="tools"
|
||
@goOpenRequest="$refs.sendRequest.show()"
|
||
/>
|
||
</cell>
|
||
</template>
|
||
<template v-if="item.title == 'Error'">
|
||
<cell
|
||
v-for="(_item, _index) in item.data"
|
||
:key="_index"
|
||
>
|
||
<errorItem
|
||
:item="_item"
|
||
:key="_index"
|
||
/>
|
||
</cell>
|
||
</template>
|
||
<template v-if="item.title == 'Console'">
|
||
<cell
|
||
v-for="(_item, _index) in item.data"
|
||
:key="_index"
|
||
>
|
||
<consoleItem
|
||
:item="_item"
|
||
:key="_index"
|
||
/>
|
||
</cell>
|
||
</template>
|
||
<template v-if="item.title == 'Network'">
|
||
<cell
|
||
v-for="(_item, _index) in item.data"
|
||
:key="_index"
|
||
>
|
||
<networkItem
|
||
:item="_item"
|
||
:key="_index"
|
||
@goSendRequest="$refs.sendRequest.show($event, true)"
|
||
@goOpenRequest="$refs.sendRequest.show($event)"
|
||
/>
|
||
</cell>
|
||
</template>
|
||
<template v-if="item.title == 'Storage'">
|
||
<cell>
|
||
<storageList ref="storageList" />
|
||
</cell>
|
||
</template>
|
||
<template v-if="item.title == 'Pages'">
|
||
<cell>
|
||
<subTitleBar
|
||
:isOpen="item.isShowPages"
|
||
title="当前页面栈"
|
||
@click="pagesShowChange('isShowPages')"
|
||
/>
|
||
</cell>
|
||
<cell>
|
||
<pages
|
||
ref="pages"
|
||
:isShow="item.isShowPages"
|
||
/>
|
||
</cell>
|
||
<cell>
|
||
<view class="cellDivisionLine"></view>
|
||
</cell>
|
||
<cell>
|
||
<subTitleBar
|
||
:isOpen="item.isShowRouteList"
|
||
title="全部路由"
|
||
@click="pagesShowChange('isShowRouteList')"
|
||
/>
|
||
</cell>
|
||
<template v-if="item.isShowRouteList">
|
||
<cell
|
||
v-for="_item in item.routeList"
|
||
:key="_item.path"
|
||
>
|
||
<routeItem :item="_item" />
|
||
</cell>
|
||
</template>
|
||
<cell>
|
||
<view class="cellDivisionLine"></view>
|
||
</cell>
|
||
<cell>
|
||
<subTitleBar
|
||
:isOpen="item.isShowData"
|
||
title="页面停留统计"
|
||
@click="pagesShowChange('isShowData')"
|
||
/>
|
||
</cell>
|
||
<template v-if="item.isShowData">
|
||
<cell
|
||
v-for="(_item, _index) in item.data"
|
||
:key="_item.route"
|
||
>
|
||
<pageItem
|
||
:item="_item"
|
||
:key="_index"
|
||
/>
|
||
</cell>
|
||
</template>
|
||
<cell>
|
||
<view class="cellDivisionLine"></view>
|
||
</cell>
|
||
<cell>
|
||
<subTitleBar
|
||
:isOpen="item.dayOnlineShow"
|
||
title="日活跃时间统计"
|
||
@click="pagesShowChange('dayOnlineShow')"
|
||
/>
|
||
</cell>
|
||
<template v-if="item.dayOnlineShow">
|
||
<cell
|
||
v-for="(_item, _index) in item.dayOnlineList"
|
||
:key="_index"
|
||
>
|
||
<dayOnlineItem
|
||
@click="showOnlineDetailsDialog(_item)"
|
||
:item="_item"
|
||
:key="_index"
|
||
/>
|
||
</cell>
|
||
</template>
|
||
<cell>
|
||
<view class="cellDivisionLine"></view>
|
||
</cell>
|
||
</template>
|
||
<template v-if="item.title == 'Vuex'">
|
||
<cell>
|
||
<vuexList
|
||
ref="vuexList"
|
||
:stateType="tabList[tabList.findIndex((x) => x.title == 'Vuex')].stateType"
|
||
/>
|
||
</cell>
|
||
</template>
|
||
<template v-if="item.title == 'Logs'">
|
||
<cell
|
||
v-for="(_item, _index) in item.data"
|
||
:key="_index"
|
||
>
|
||
<logItem
|
||
:item="_item"
|
||
:key="_index"
|
||
/>
|
||
</cell>
|
||
</template>
|
||
<template v-if="item.title == 'Info'">
|
||
<cell>
|
||
<infoList ref="infoList" />
|
||
</cell>
|
||
</template>
|
||
<template v-if="item.title == 'UniBus'">
|
||
<cell>
|
||
<subTitleBar
|
||
:isOpen="item.isShowCount"
|
||
title="事件统计"
|
||
@click="pagesShowChange('isShowCount')"
|
||
/>
|
||
</cell>
|
||
<template v-if="item.isShowCount">
|
||
<cell
|
||
v-for="_item in item.countList"
|
||
:key="_item.e"
|
||
>
|
||
<view
|
||
class="eventItem"
|
||
@longpress.stop="busCountMenu(_item)"
|
||
>
|
||
<text class="eventName">name: {{ _item.e }}</text>
|
||
<view class="eventCount">
|
||
<text
|
||
v-if="item.filterType == '' || item.filterType == 'on'"
|
||
class="eventCountItem"
|
||
>
|
||
on: {{ _item.on }}
|
||
</text>
|
||
<text
|
||
v-if="item.filterType == '' || item.filterType == 'emit'"
|
||
class="eventCountItem"
|
||
>
|
||
emit: {{ _item.emit }}
|
||
</text>
|
||
<text
|
||
v-if="item.filterType == '' || item.filterType == 'once'"
|
||
class="eventCountItem"
|
||
>
|
||
once: {{ _item.once }}
|
||
</text>
|
||
<text
|
||
v-if="item.filterType == '' || item.filterType == 'off'"
|
||
class="eventCountItem"
|
||
>
|
||
off: {{ _item.off }}
|
||
</text>
|
||
</view>
|
||
</view>
|
||
</cell>
|
||
</template>
|
||
<cell>
|
||
<view class="cellDivisionLine"></view>
|
||
</cell>
|
||
<cell>
|
||
<subTitleBar
|
||
:isOpen="item.isShowLog"
|
||
title="执行记录"
|
||
@click="pagesShowChange('isShowLog')"
|
||
/>
|
||
</cell>
|
||
<template v-if="item.isShowLog">
|
||
<cell
|
||
v-for="(_item, _index) in item.logList"
|
||
:key="_index"
|
||
>
|
||
<view
|
||
class="eventLogItem"
|
||
@longpress.stop="busLogMenu(_item)"
|
||
>
|
||
<text class="logText">{{ _item.e }}</text>
|
||
<text class="logTime">{{ _item.date }}</text>
|
||
</view>
|
||
</cell>
|
||
</template>
|
||
<cell>
|
||
<view class="cellDivisionLine"></view>
|
||
</cell>
|
||
</template>
|
||
<template v-if="item.title == 'FileSys'">
|
||
<!-- #ifdef APP-PLUS || MP-WEIXIN -->
|
||
<cell
|
||
v-for="(_item, _index) in item.data"
|
||
:key="_index"
|
||
>
|
||
<fileSysItem
|
||
:item="_item"
|
||
:key="_index"
|
||
:dirType="item.dirType"
|
||
:dirList="item.dirList"
|
||
@goChildDir="goChildDir"
|
||
@getPage="getPage"
|
||
@editDirName="editDirName"
|
||
@openEditFileDialog="($event) => $refs.textFileEditDialog.show($event)"
|
||
/>
|
||
</cell>
|
||
<cell v-if="item.data.length == 0 || (item.data.length == 1 && item.data[0].type == 'back')">
|
||
<view class="devEmpty">
|
||
<text class="devEmptyText">空空如也</text>
|
||
</view>
|
||
</cell>
|
||
<!-- #endif -->
|
||
<!-- #ifndef APP-PLUS || MP-WEIXIN -->
|
||
<cell>
|
||
<view class="listCenterView">
|
||
<text class="listCenterText">该平台无FileSys文件管理</text>
|
||
</view>
|
||
</cell>
|
||
<!-- #endif -->
|
||
</template>
|
||
<template v-if="item.title == 'Setting'">
|
||
<cell>
|
||
<settingView ref="settingView" />
|
||
</cell>
|
||
</template>
|
||
|
||
<template v-if="item.title == 'JsRunner'">
|
||
<!-- #ifdef APP-PLUS || H5 -->
|
||
<cell
|
||
v-for="(_item, _index) in item.data"
|
||
:key="_index"
|
||
>
|
||
<jsRunnerItem
|
||
:item="_item"
|
||
:key="_index"
|
||
/>
|
||
</cell>
|
||
<cell v-if="item.data.length == 0">
|
||
<view class="devEmpty">
|
||
<text class="devEmptyText">动态执行JS代码</text>
|
||
</view>
|
||
</cell>
|
||
<!-- #endif -->
|
||
<!-- #ifndef APP-PLUS || H5 -->
|
||
<cell>
|
||
<view class="listCenterView">
|
||
<text class="listCenterText">该平台不支持该功能</text>
|
||
</view>
|
||
</cell>
|
||
<!-- #endif -->
|
||
</template>
|
||
|
||
<template v-if="item.isLongList">
|
||
<cell v-if="!item.isLoadAll && item.data.length == 30">
|
||
<view
|
||
class="loadAll"
|
||
@click="showListAll"
|
||
>
|
||
<image
|
||
class="loadAllFold"
|
||
src="@/devTools/page/static/unfold.png"
|
||
/>
|
||
<text class="loadAllText">展示全部数据</text>
|
||
<image
|
||
class="loadAllFold"
|
||
src="@/devTools/page/static/unfold.png"
|
||
/>
|
||
</view>
|
||
</cell>
|
||
|
||
<cell v-if="item.type == 'success' && item.data.length == 0">
|
||
<view class="devEmpty">
|
||
<text class="devEmptyText">空空如也</text>
|
||
</view>
|
||
</cell>
|
||
|
||
<cell v-if="(item.type == 'loading' || item.type == 'loading') && item.data.length == 0">
|
||
<view class="devEmpty">
|
||
<text class="devEmptyText">加载中</text>
|
||
</view>
|
||
</cell>
|
||
</template>
|
||
|
||
<cell>
|
||
<view style="height: 300rpx"></view>
|
||
</cell>
|
||
</template>
|
||
</mobileSwiperScroll>
|
||
</view>
|
||
|
||
<bottomTools
|
||
:tabIndex="tabIndex"
|
||
:tabTitle="tabTitle"
|
||
:options="bottomToolsOptions"
|
||
:isShow="isShowBottomTools"
|
||
:stateType="tabList[tabList.findIndex((x) => x.title == 'Vuex')].stateType"
|
||
@filterTypeChange="onFilterTypeChange"
|
||
@goChildDir="goChildDir"
|
||
@changeFileDirType="changeFileDirType"
|
||
@changeStorageType="changeStorageType"
|
||
@editDirName="editDirName"
|
||
@getPage="getPage"
|
||
@runJs="runJs"
|
||
@emptyCodeHis="emptyCodeHis"
|
||
@changeStateType="changeStateType"
|
||
/>
|
||
|
||
<editDialog ref="editDialog" />
|
||
|
||
<dayOnlinePageList ref="dayOnlinePageList" />
|
||
|
||
<sendRequest ref="sendRequest" />
|
||
|
||
<textFileEditDialog
|
||
ref="textFileEditDialog"
|
||
@getPage="getPage"
|
||
/>
|
||
|
||
<createDir
|
||
ref="createDir"
|
||
:dirList="tabList[11].dirList"
|
||
:dirType="tabList[11].dirType"
|
||
@getPage="getPage"
|
||
/>
|
||
|
||
<addStorage
|
||
:storageType="tabList[5].storageType"
|
||
@getPage="getPage"
|
||
/>
|
||
|
||
<routeDialog />
|
||
</view>
|
||
</template>
|
||
<script>
|
||
import init from "../../index";
|
||
import consoleItem from "./listItem/consoleItem.vue";
|
||
import infoList from "./listItem/infoList.vue";
|
||
import storageList from "./listItem/storageList.vue";
|
||
import tools from "./listItem/tools.vue";
|
||
import vuexList from "./listItem/vuexList.vue";
|
||
import animationControl from "./mixins/animationControl";
|
||
import { timeFormat, timeFromNow } from "../../core/libs/timeFormat";
|
||
import devCache from "../../core/libs/devCache";
|
||
import networkItem from "./listItem/networkItem.vue";
|
||
import pages from "./listItem/pages.vue";
|
||
import logItem from "./listItem/logItem.vue";
|
||
import pageItem from "./listItem/pageItem.vue";
|
||
import errorItem from "./listItem/errorItem.vue";
|
||
import mobileSwiperScroll from "./ui/mobileSwiperScroll.vue";
|
||
import subTitleBar from "./ui/subTitleBar.vue";
|
||
import dayOnlineItem from "./listItem/dayOnlineItem.vue";
|
||
import dayOnlinePageList from "./dialog/dayOnlinePageList.vue";
|
||
import sendRequest from "./dialog/sendRequest.vue";
|
||
import bottomTools from "./bottomTools.vue";
|
||
import dirReader from "./libs/dirReader";
|
||
import fileSysItem from "./listItem/fileSysItem.vue";
|
||
import fileSize from "./libs/fileSize";
|
||
import textFileEditDialog from "./dialog/textFileEditDialog.vue";
|
||
import createDir from "./dialog/createDir.vue";
|
||
import editDialog from "./dialog/editDialog.vue";
|
||
import addStorage from "./dialog/addStorage.vue";
|
||
import settingView from "./listItem/setting.vue";
|
||
import mp from "./mixins/mp";
|
||
import jsRunnerItem from "./listItem/jsRunnerItem.vue";
|
||
import routeItem from "./listItem/routeItem.vue";
|
||
import routeDialog from "./dialog/routeDialog.vue";
|
||
|
||
// #ifndef APP-PLUS
|
||
import h5Cell from "./ui/h5Cell.vue";
|
||
// #endif
|
||
|
||
/**
|
||
* 时间戳转时间文字
|
||
*/
|
||
function getTime(t) {
|
||
let c = "0s";
|
||
if (t < 60) {
|
||
c = t + "秒";
|
||
} else if (t < 60 * 60) {
|
||
c = Math.ceil(t / 60) + "分钟";
|
||
} else {
|
||
c = Math.ceil(t / 60 / 60) + "小时" + Math.ceil((t % (60 * 60)) / 60) + "分钟";
|
||
}
|
||
return c;
|
||
}
|
||
|
||
export default {
|
||
mixins: [animationControl, mp],
|
||
components: {
|
||
mobileSwiperScroll,
|
||
consoleItem,
|
||
storageList,
|
||
vuexList,
|
||
tools,
|
||
infoList,
|
||
networkItem,
|
||
pages,
|
||
logItem,
|
||
pageItem,
|
||
errorItem,
|
||
subTitleBar,
|
||
dayOnlinePageList,
|
||
dayOnlineItem,
|
||
sendRequest,
|
||
bottomTools,
|
||
fileSysItem,
|
||
textFileEditDialog,
|
||
createDir,
|
||
editDialog,
|
||
addStorage,
|
||
settingView,
|
||
jsRunnerItem,
|
||
routeItem,
|
||
routeDialog,
|
||
// #ifndef APP-PLUS
|
||
cell: h5Cell,
|
||
// #endif
|
||
},
|
||
data() {
|
||
return {
|
||
/**
|
||
* 是否处于弹窗状态
|
||
*/
|
||
isDialog: true,
|
||
|
||
tabLoading: true,
|
||
tabIndex: 0,
|
||
tabList: [
|
||
{
|
||
title: "Tools", //标题
|
||
hasLoad: false,
|
||
},
|
||
{
|
||
title: "Error", //标题
|
||
canRefreshing: true, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
type: "init", //列表状态
|
||
data: [], //数据条数
|
||
hasLoad: false,
|
||
isLongList: true, // 是否长列表
|
||
isLoadAll: false, //是否加载全部
|
||
filterType: "", //过滤类型
|
||
isShowBottomTools: true, //显示底部工具栏
|
||
},
|
||
{
|
||
title: "Console", //标题
|
||
canRefreshing: true, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
type: "init", //列表状态
|
||
data: [], //数据条数
|
||
hasLoad: false,
|
||
isLongList: true, // 是否长列表
|
||
isLoadAll: false, //是否加载全部
|
||
filterType: "", //过滤类型
|
||
isShowBottomTools: true, //显示底部工具栏
|
||
},
|
||
{
|
||
title: "Network", //标题
|
||
canRefreshing: true, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
type: "init", //列表状态
|
||
data: [], //数据条数
|
||
hasLoad: false,
|
||
isLongList: true, // 是否长列表
|
||
isLoadAll: false, //是否加载全部
|
||
filterType: "", //过滤类型
|
||
isShowBottomTools: true, //显示底部工具栏
|
||
},
|
||
{
|
||
title: "JsRunner", //标题
|
||
canRefreshing: false, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
type: "init", //列表状态
|
||
data: [], //数据条数
|
||
hasLoad: false,
|
||
// #ifdef APP-PLUS || H5
|
||
isShowBottomTools: true, //显示底部工具栏
|
||
// #endif
|
||
},
|
||
{
|
||
title: "Storage", //标题
|
||
canRefreshing: true, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
hasLoad: false,
|
||
storageType: "localStorage", //缓存类型默认为localStorage
|
||
isShowBottomTools: true, //显示底部工具栏
|
||
},
|
||
{
|
||
title: "Pages", //标题
|
||
canRefreshing: true, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
hasLoad: false,
|
||
isShowPages: true, //是否展示页面堆栈列表
|
||
data: [],
|
||
isShowData: false, //是否展示页面全部统计数据
|
||
dayOnlineList: [], //日浏览量日志
|
||
dayOnlineShow: false,
|
||
isShowBottomTools: true, //显示底部工具栏
|
||
isShowRouteList: false, // 是否显示路由列表
|
||
routeList: [], //全部路由列表
|
||
},
|
||
{
|
||
title: "Vuex", //标题
|
||
canRefreshing: true, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
hasLoad: false,
|
||
stateType: "vuex", //全局变量类型 vuex pinia globalData
|
||
isShowBottomTools: true, //显示底部工具栏
|
||
},
|
||
{
|
||
title: "Logs", //标题
|
||
canRefreshing: true, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
type: "init", //列表状态
|
||
data: [], //数据条数
|
||
page: 0, //当前页码
|
||
hasLoad: false,
|
||
isLoadAll: false, //是否加载全部
|
||
isLongList: true, // 是否长列表
|
||
isShowBottomTools: true, //显示底部工具栏
|
||
},
|
||
{
|
||
title: "Info", //标题
|
||
canRefreshing: true, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
hasLoad: false,
|
||
},
|
||
{
|
||
title: "UniBus", //标题
|
||
canRefreshing: true, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
type: "init", //列表状态
|
||
isShowCount: true,
|
||
countList: [],
|
||
isShowLog: false,
|
||
logList: [],
|
||
filterType: "", //过滤类型
|
||
hasLoad: false,
|
||
isShowBottomTools: true, //显示底部工具栏
|
||
},
|
||
{
|
||
title: "FileSys", //标题
|
||
canRefreshing: true, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
type: "init", //列表状态
|
||
// #ifdef APP-PLUS
|
||
dirType: "PRIVATE_DOC", //文件类型 wx, PRIVATE_WWW, PRIVATE_DOC PUBLIC_DOCUMENTS PUBLIC_DOWNLOADS
|
||
// #endif
|
||
// #ifdef MP
|
||
dirType: "wx", //文件类型 wx, PRIVATE_WWW, PRIVATE_DOC
|
||
// #endif
|
||
data: [], //文件列表
|
||
dirList: [], //目录列表
|
||
hasLoad: false,
|
||
isShowBottomTools: true, //显示底部工具栏
|
||
},
|
||
{
|
||
title: "Setting", //标题
|
||
canRefreshing: true, //是否允许下拉刷新
|
||
isRefreshing: false, //下拉刷新状态
|
||
refreshType: "waitPullUp", //刷新状态 'waitPullUp','waitRelease','refreshing'
|
||
type: "init", //列表状态
|
||
data: [], //数据条数
|
||
page: 0, //当前页码
|
||
hasLoad: false,
|
||
},
|
||
],
|
||
};
|
||
},
|
||
watch: {
|
||
/**
|
||
* 监听tab改变事件
|
||
*/
|
||
tabIndex(index) {
|
||
if (!this.tabList[index].hasLoad) {
|
||
this.getPage();
|
||
}
|
||
},
|
||
},
|
||
computed: {
|
||
/**
|
||
* 挂载dev对象
|
||
*/
|
||
$devTools() {
|
||
return init;
|
||
},
|
||
/**
|
||
* 面板高度
|
||
*/
|
||
panelHeight() {
|
||
// #ifndef APP-PLUS
|
||
if (1) return this.windowInfo.system.windowHeight - this.windowInfo.navbar.heightPx;
|
||
// #endif
|
||
return Math.ceil(this.windowInfo.system.windowHeight * 0.8);
|
||
},
|
||
/**
|
||
* 滚动列表的高度
|
||
*/
|
||
listHeight() {
|
||
let sys = uni.getSystemInfoSync();
|
||
// #ifdef H5
|
||
if (1) return sys.windowHeight - 50 - uni.upx2px(80) - 1;
|
||
// #endif
|
||
// #ifdef MP-WEIXIN
|
||
if (1) return sys.windowHeight - this.windowInfo.navbar.heightPx - uni.upx2px(80) - 1;
|
||
// #endif
|
||
return this.panelHeight - uni.upx2px(80) - 1;
|
||
},
|
||
/**
|
||
* 当前tab栏的标题
|
||
*/
|
||
tabTitle() {
|
||
return this.tabList[this.tabIndex].title;
|
||
},
|
||
/**
|
||
* 获取底部栏需要的参数
|
||
*/
|
||
bottomToolsOptions() {
|
||
let that = this;
|
||
const getTabItemByTitle = (title) => {
|
||
let i = that.tabList.findIndex((x) => x.title == title);
|
||
return that.tabList[i];
|
||
};
|
||
return {
|
||
errorFilterType: getTabItemByTitle("Error").filterType,
|
||
consoleFilterType: getTabItemByTitle("Console").filterType,
|
||
networkFilterType: getTabItemByTitle("Network").filterType,
|
||
busFilterType: getTabItemByTitle("UniBus").filterType,
|
||
fileSysDirList: getTabItemByTitle("FileSys").dirList,
|
||
fileSysDirType: getTabItemByTitle("FileSys").dirType,
|
||
storageType: getTabItemByTitle("Storage").storageType,
|
||
codeHisLength: getTabItemByTitle("JsRunner").data.length,
|
||
};
|
||
},
|
||
/**
|
||
* 是否显示底部工具栏
|
||
*/
|
||
isShowBottomTools() {
|
||
// [1, 2, 3, 4, 5, 7, 9, 10].indexOf(tabIndex) != -1
|
||
let item = this.tabList[this.tabIndex];
|
||
return item.isShowBottomTools === true;
|
||
},
|
||
},
|
||
mounted() {
|
||
let that = this;
|
||
this.getPage();
|
||
// #ifndef APP-PLUS
|
||
this.isDialog = false;
|
||
// #endif
|
||
|
||
// ! 刷新当前列表
|
||
uni.$on("devTools_listGetPage", () => {
|
||
that.getPage();
|
||
});
|
||
|
||
// ! 删除指定请求记录
|
||
uni.$on("devTools_delNetworkItemById", (id) => {
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Network");
|
||
let i = that.tabList[tabIndex].data.findIndex((x) => x.id == id);
|
||
if (i != -1) {
|
||
that.tabList[tabIndex].data.splice(i, 1);
|
||
}
|
||
});
|
||
|
||
// ! 删除日志
|
||
uni.$on("devTools_delLog", (item) => {
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Logs");
|
||
let i = that.tabList[tabIndex].data.findIndex((x) => x.date == item.date && x.t == item.t);
|
||
if (i != -1) {
|
||
that.tabList[tabIndex].data.splice(i, 1);
|
||
}
|
||
});
|
||
|
||
// ! 删除错误记录
|
||
uni.$on("devTools_delError", (item) => {
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Error");
|
||
let i = that.tabList[tabIndex].data.findIndex(
|
||
(x) => x.type == item.type && x.t == item.t && x.m == item.m && x.tr == item.tr && x.p == item.p
|
||
);
|
||
if (i != -1) {
|
||
that.tabList[tabIndex].data.splice(i, 1);
|
||
}
|
||
});
|
||
|
||
// ! 删除打印日志
|
||
uni.$on("devTools_delConsoleItem", (item) => {
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Console");
|
||
let i = that.tabList[tabIndex].data.findIndex((x) => {
|
||
let t = JSON.stringify(x.list);
|
||
return t == JSON.stringify(item.list) && x.time == item.time && x.page == item.page && x.type == item.type;
|
||
});
|
||
if (i != -1) {
|
||
that.tabList[tabIndex].data.splice(i, 1);
|
||
}
|
||
});
|
||
|
||
// !初始化Vuex,自动推断全局变量类型
|
||
let vIndex = that.tabList.findIndex((x) => x.title == "Vuex");
|
||
let vType = "globalData";
|
||
if (that.$store) {
|
||
vType = "vuex";
|
||
} else if (uni.Pinia || that.$pinia) {
|
||
vType = "pinia";
|
||
}
|
||
// console.log("vType", vType);
|
||
that.tabList[vIndex].stateType = vType;
|
||
},
|
||
methods: {
|
||
/**
|
||
* 页面加载事件
|
||
*/
|
||
pageOnLoad(options) {
|
||
let that = this;
|
||
that.$nextTick(() => {
|
||
// #ifdef APP-PLUS
|
||
that.panelShow();
|
||
// #endif
|
||
});
|
||
uni.$once("devTools_closeDevToolsPanel", () => {
|
||
that.panelHide();
|
||
});
|
||
},
|
||
/**
|
||
* 加载列表
|
||
*/
|
||
async getPage() {
|
||
let that = this;
|
||
const index = Number(that.tabIndex);
|
||
let item = that.tabList[index];
|
||
if (item.isRefreshing) return;
|
||
|
||
await that.awaitNextTick();
|
||
|
||
if (item.title == "Storage") {
|
||
that.refreshStorage();
|
||
} else if (item.title == "Vuex") {
|
||
that.refreshVuex();
|
||
} else if (item.title == "Info") {
|
||
that.refreshInfo();
|
||
} else if (item.title == "Pages") {
|
||
that.getPages();
|
||
} else if (item.title == "Console") {
|
||
that.getConsole();
|
||
} else if (item.title == "Network") {
|
||
that.getNetwork();
|
||
} else if (item.title == "Logs") {
|
||
that.getLogs();
|
||
} else if (item.title == "Error") {
|
||
that.getError();
|
||
} else if (item.title == "UniBus") {
|
||
that.getUniBus();
|
||
} else if (item.title == "FileSys") {
|
||
that.getDirList();
|
||
} else if (item.title == "Setting") {
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Setting");
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].type = "loading";
|
||
that.$refs.settingView.getPage();
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].isRefreshing = false;
|
||
that.tabList[tabIndex].refreshType = "success";
|
||
that.tabList[tabIndex].type = "success";
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "waitRelease";
|
||
}, 1000);
|
||
}, 500);
|
||
}
|
||
that.tabList[index].hasLoad = true;
|
||
},
|
||
/**
|
||
* 等待渲染完成
|
||
*/
|
||
awaitNextTick() {
|
||
let that = this;
|
||
return new Promise((yes) => {
|
||
// #ifdef APP-PLUS
|
||
setTimeout(() => {
|
||
yes();
|
||
}, 200);
|
||
// #endif
|
||
// #ifndef APP-PLUS
|
||
that.$nextTick(() => {
|
||
setTimeout(() => {
|
||
yes();
|
||
}, 200);
|
||
});
|
||
// #endif
|
||
});
|
||
},
|
||
/**
|
||
* 隐藏弹窗
|
||
*/
|
||
hide() {
|
||
init.hide();
|
||
},
|
||
/**
|
||
* 下拉刷新事件
|
||
*/
|
||
onrefresh() {
|
||
if (!this.tabList[this.tabIndex].canRefreshing || this.tabList[this.tabIndex].type == "loading") return false;
|
||
this.getPage(true);
|
||
},
|
||
/**
|
||
* 下拉过程触发
|
||
*/
|
||
onpullingdown(args) {
|
||
let e = args.event;
|
||
if (this.tabList[this.tabIndex].refreshType == "refreshing") return false;
|
||
if (e.pullingDistance > e.viewHeight) {
|
||
this.tabList[this.tabIndex].refreshType = "waitRelease";
|
||
} else {
|
||
this.tabList[this.tabIndex].refreshType = "waitPullUp";
|
||
}
|
||
},
|
||
/**
|
||
* 刷新缓存数据
|
||
*/
|
||
refreshStorage() {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Storage");
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].refreshType = "refreshing";
|
||
that.$refs.storageList.getData(that.tabList[tabIndex].storageType);
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].isRefreshing = false;
|
||
that.tabList[tabIndex].refreshType = "success";
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "waitRelease";
|
||
}, 1000);
|
||
}, 500);
|
||
},
|
||
/**
|
||
* 刷新vuex数据
|
||
*/
|
||
refreshVuex() {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Vuex");
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].refreshType = "refreshing";
|
||
that.$refs.vuexList.getData();
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].isRefreshing = false;
|
||
that.tabList[tabIndex].refreshType = "success";
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "waitRelease";
|
||
}, 1000);
|
||
}, 500);
|
||
},
|
||
/**
|
||
* 刷新pages
|
||
*/
|
||
getPages() {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Pages");
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].refreshType = "refreshing";
|
||
that.tabList[tabIndex].data = [];
|
||
|
||
that.$refs.pages.getData();
|
||
|
||
let data = devCache.get("pageCount");
|
||
if (!data) data = [];
|
||
|
||
data = data.map((x) => {
|
||
x.timeCount = getTime(x.activeTimeCount);
|
||
return x;
|
||
});
|
||
|
||
let onlineList = devCache.get("dayOnline");
|
||
if (!onlineList) onlineList = [];
|
||
onlineList = onlineList.map((x) => {
|
||
x.timeCount = getTime(x.activeTimeCount);
|
||
x.page = x.page.map((v) => {
|
||
v.timeCount = getTime(v.t);
|
||
return v;
|
||
});
|
||
return x;
|
||
});
|
||
|
||
let pages = [];
|
||
// #ifdef H5 || APP-PLUS
|
||
try {
|
||
pages = __uniRoutes.map((item) => {
|
||
if (item.alias) {
|
||
item.path = item.alias;
|
||
}
|
||
return item;
|
||
});
|
||
} catch (error) {
|
||
pages = [];
|
||
}
|
||
// #endif
|
||
// #ifdef MP-WEIXIN
|
||
try {
|
||
let wxPages = __wxConfig.pages;
|
||
pages = wxPages.map((item) => {
|
||
return {
|
||
path: "/" + item,
|
||
};
|
||
});
|
||
} catch (error) {
|
||
pages = [];
|
||
}
|
||
// #endif
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].data = data;
|
||
that.tabList[tabIndex].routeList = pages;
|
||
that.tabList[tabIndex].dayOnlineList = onlineList;
|
||
that.tabList[tabIndex].refreshType = "success";
|
||
that.tabList[tabIndex].isRefreshing = false;
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "waitRelease";
|
||
}, 1000);
|
||
}, 500);
|
||
},
|
||
/**
|
||
* 改变pages列表展示状态
|
||
*/
|
||
pagesShowChange(key) {
|
||
this.tabList[this.tabIndex][key] = !this.tabList[this.tabIndex][key];
|
||
},
|
||
/**
|
||
* 打开在线统计详情弹窗
|
||
*/
|
||
showOnlineDetailsDialog(item) {
|
||
this.$refs.dayOnlinePageList.show(item);
|
||
},
|
||
/**
|
||
* 刷新info
|
||
*/
|
||
refreshInfo() {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Info");
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].refreshType = "refreshing";
|
||
that.$refs.infoList.getData();
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].isRefreshing = false;
|
||
that.tabList[tabIndex].refreshType = "success";
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "waitRelease";
|
||
}, 1000);
|
||
}, 500);
|
||
},
|
||
/**
|
||
* 加载数据
|
||
*/
|
||
getConsole() {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Console");
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].type = "loading";
|
||
let data = devCache.get("console");
|
||
if (!data) data = [];
|
||
data = data.map((item) => {
|
||
// item.date = timeFormat(item.time);
|
||
item.date = timeFromNow(item.time);
|
||
return item;
|
||
});
|
||
let filterType = that.tabList[tabIndex].filterType;
|
||
if (filterType != "") {
|
||
data = data.filter((x) => x.type == filterType);
|
||
}
|
||
if (data.length > 30 && that.tabList[tabIndex].isLongList && !that.tabList[tabIndex].isLoadAll) {
|
||
data.splice(30, data.length - 1);
|
||
}
|
||
that.tabList[tabIndex].data = data;
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "success";
|
||
that.tabList[tabIndex].isRefreshing = false;
|
||
that.tabList[tabIndex].type = "success";
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "waitRelease";
|
||
}, 1000);
|
||
}, 500);
|
||
},
|
||
/**
|
||
* 加载请求数据
|
||
*/
|
||
getNetwork() {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Network");
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].type = "loading";
|
||
|
||
let data = devCache.get("request");
|
||
if (!data) data = [];
|
||
data = data.map((item) => {
|
||
item.date = timeFromNow(item.sendTime);
|
||
return item;
|
||
});
|
||
let filterType = that.tabList[tabIndex].filterType;
|
||
if (filterType != "") {
|
||
if (filterType == "请求失败") {
|
||
data = data.filter((x) => x.type == 2 || (x.type == 1 && x.responseStatus != 200));
|
||
} else if (filterType == "其他") {
|
||
data = data.filter((x) => x.method != "get" && x.method != "post");
|
||
} else if (filterType == "10s+") {
|
||
data = data.filter((x) => x.type != 0 && x.useTime > 10);
|
||
} else if (filterType == "500KB+") {
|
||
data = data.filter((x) => x.type == 1 && x.responseBodySize > 1024 * 500);
|
||
} else {
|
||
data = data.filter((x) => x.method == filterType);
|
||
}
|
||
}
|
||
if (data.length > 30 && that.tabList[tabIndex].isLongList && !that.tabList[tabIndex].isLoadAll) {
|
||
data.splice(30, data.length - 1);
|
||
}
|
||
that.tabList[tabIndex].data = data;
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].isRefreshing = false;
|
||
that.tabList[tabIndex].refreshType = "success";
|
||
that.tabList[tabIndex].type = "success";
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "waitRelease";
|
||
}, 1000);
|
||
}, 500);
|
||
},
|
||
/**
|
||
* 获取日志
|
||
*/
|
||
getLogs() {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Logs");
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].type = "loading";
|
||
let data = devCache.get("logReport");
|
||
if (!data) data = [];
|
||
data = data.map((x) => {
|
||
x.date = timeFromNow(x.t);
|
||
return x;
|
||
});
|
||
if (data.length > 30 && that.tabList[tabIndex].isLongList && !that.tabList[tabIndex].isLoadAll) {
|
||
data.splice(30, data.length - 1);
|
||
}
|
||
that.tabList[tabIndex].data = data;
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].isRefreshing = false;
|
||
that.tabList[tabIndex].refreshType = "success";
|
||
that.tabList[tabIndex].type = "success";
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "waitRelease";
|
||
}, 1000);
|
||
}, 500);
|
||
},
|
||
/**
|
||
* 获取错误列表
|
||
*/
|
||
getError() {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Error");
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].type = "loading";
|
||
let data = devCache.get("errorReport");
|
||
if (!data) data = [];
|
||
data = data.map((x) => {
|
||
x.date = timeFromNow(x.t);
|
||
return x;
|
||
});
|
||
let filterType = that.tabList[tabIndex].filterType;
|
||
if (filterType != "") {
|
||
data = data.filter((x) => x.type == filterType);
|
||
}
|
||
if (data.length > 30 && that.tabList[tabIndex].isLongList && !that.tabList[tabIndex].isLoadAll) {
|
||
data.splice(30, data.length - 1);
|
||
}
|
||
that.tabList[tabIndex].data = data;
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].isRefreshing = false;
|
||
that.tabList[tabIndex].refreshType = "success";
|
||
that.tabList[tabIndex].type = "success";
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "waitRelease";
|
||
}, 1000);
|
||
}, 500);
|
||
},
|
||
/**
|
||
* 加载全部列表
|
||
*/
|
||
showListAll() {
|
||
let that = this;
|
||
that.tabList[that.tabIndex].isLoadAll = true;
|
||
that.tabList[that.tabIndex].data = [];
|
||
that.tabList[that.tabIndex].type = "loading";
|
||
that.getPage();
|
||
},
|
||
/**
|
||
* 加载eventBus日志列表
|
||
*/
|
||
getUniBus() {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "UniBus");
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].refreshType = "refreshing";
|
||
|
||
let logList = devCache.get("uniBus");
|
||
if (!logList) logList = [];
|
||
|
||
let busCount = devCache.get("busCount");
|
||
if (!busCount) busCount = [];
|
||
|
||
logList = logList.map((x) => {
|
||
x.date = timeFormat(x.t);
|
||
return x;
|
||
});
|
||
|
||
let filterType = that.tabList[tabIndex].filterType;
|
||
if (filterType != "") {
|
||
logList = logList.filter((x) => x.e.indexOf(`${filterType}>`) == 0);
|
||
}
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].logList = logList;
|
||
that.tabList[tabIndex].countList = busCount;
|
||
that.tabList[tabIndex].refreshType = "success";
|
||
that.tabList[tabIndex].isRefreshing = false;
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "waitRelease";
|
||
}, 1000);
|
||
}, 500);
|
||
},
|
||
/**
|
||
* 长按BUS事件
|
||
*/
|
||
busCountMenu(item) {
|
||
let that = this;
|
||
|
||
let menu = [
|
||
{
|
||
text: `复制名称`,
|
||
click() {
|
||
uni.setClipboardData({
|
||
data: item.e,
|
||
});
|
||
},
|
||
},
|
||
{
|
||
text: `复制完整日志`,
|
||
click() {
|
||
uni.setClipboardData({
|
||
data: JSON.stringify(item),
|
||
});
|
||
},
|
||
},
|
||
];
|
||
|
||
uni.showActionSheet({
|
||
itemList: menu.map((x) => x.text),
|
||
success({ tapIndex }) {
|
||
menu[tapIndex].click();
|
||
},
|
||
});
|
||
},
|
||
/**
|
||
* 长按BUS log事件
|
||
*/
|
||
busLogMenu(item) {
|
||
let that = this;
|
||
let menu = [
|
||
{
|
||
text: `复制名称`,
|
||
click() {
|
||
uni.setClipboardData({
|
||
data: item.e,
|
||
});
|
||
},
|
||
},
|
||
{
|
||
text: `复制完整日志`,
|
||
click() {
|
||
uni.setClipboardData({
|
||
data: JSON.stringify(item),
|
||
});
|
||
},
|
||
},
|
||
];
|
||
uni.showActionSheet({
|
||
itemList: menu.map((x) => x.text),
|
||
success({ tapIndex }) {
|
||
menu[tapIndex].click();
|
||
},
|
||
});
|
||
},
|
||
/**
|
||
* 列表过滤类型改变事件
|
||
*/
|
||
onFilterTypeChange(type) {
|
||
this.tabList[this.tabIndex].filterType = type;
|
||
this.getPage();
|
||
},
|
||
/**
|
||
* 加载文件列表
|
||
*/
|
||
async getDirList() {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "FileSys");
|
||
// #ifndef APP-PLUS || MP-WEIXIN
|
||
if (1) return;
|
||
// #endif
|
||
|
||
that.tabList[tabIndex].isRefreshing = true;
|
||
that.tabList[tabIndex].type = "loading";
|
||
|
||
let path = "";
|
||
let data = [];
|
||
// #ifdef APP-PLUS
|
||
if (that.tabList[tabIndex].dirType == "PRIVATE_DOC") {
|
||
path = "_doc";
|
||
} else if (that.tabList[tabIndex].dirType == "PRIVATE_WWW") {
|
||
path = "_www";
|
||
} else if (that.tabList[tabIndex].dirType == "PUBLIC_DOCUMENTS") {
|
||
path = "_documents";
|
||
} else if (that.tabList[tabIndex].dirType == "PUBLIC_DOWNLOADS") {
|
||
path = "_downloads";
|
||
}
|
||
|
||
if (that.tabList[tabIndex].dirList) {
|
||
that.tabList[tabIndex].dirList.forEach((item) => {
|
||
path = path + "/" + item;
|
||
});
|
||
}
|
||
|
||
data = await dirReader.getDirFileList(path);
|
||
|
||
// #endif
|
||
|
||
// #ifdef MP-WEIXIN
|
||
let fs = wx.getFileSystemManager();
|
||
path = wx.env.USER_DATA_PATH;
|
||
if (that.tabList[tabIndex].dirList) {
|
||
that.tabList[tabIndex].dirList.forEach((item) => {
|
||
path = path + "/" + item;
|
||
});
|
||
}
|
||
let fileList = [];
|
||
let dirList = [];
|
||
let list = fs.readdirSync(path + "/");
|
||
for (let i = 0; i < list.length; i++) {
|
||
let name = list[i];
|
||
let stats = fs.statSync(path + "/" + name);
|
||
let row = {
|
||
type: stats.isFile() ? "file" : "dir",
|
||
size: stats.size,
|
||
time: stats.lastModifiedTime,
|
||
name,
|
||
fileType: name.split(".").pop(),
|
||
};
|
||
if (stats.isFile()) {
|
||
fileList.push(row);
|
||
} else {
|
||
dirList.push(row);
|
||
}
|
||
}
|
||
data = [...dirList, ...fileList];
|
||
// #endif
|
||
|
||
data = data.map((x) => {
|
||
x.date = timeFormat(x.time, "yyyy-mm-dd hh:MM");
|
||
x.sizeText = fileSize.getByteSize(x.size);
|
||
x.icon = x.type == "dir" ? "/devTools/page/static/fileSys/wenjianjia.png" : dirReader.getFileIcon(x.fileType);
|
||
return x;
|
||
});
|
||
|
||
if (that.tabList[tabIndex].dirList.length > 0) {
|
||
data.unshift({
|
||
type: "back",
|
||
name: "返回上一级",
|
||
});
|
||
}
|
||
|
||
that.tabList[tabIndex].data = data;
|
||
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].isRefreshing = false;
|
||
that.tabList[tabIndex].refreshType = "success";
|
||
that.tabList[tabIndex].type = "success";
|
||
setTimeout(() => {
|
||
that.tabList[tabIndex].refreshType = "waitRelease";
|
||
}, 1000);
|
||
}, 500);
|
||
},
|
||
/**
|
||
* 打开文件夹
|
||
*/
|
||
goChildDir(dirName) {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "FileSys");
|
||
if (typeof dirName == "string" && dirName.indexOf("_goIndex_") == 0) {
|
||
let i = Number(dirName.replace("_goIndex_", ""));
|
||
that.tabList[tabIndex].dirList.splice(i, 99999);
|
||
} else if (dirName == "__back__") {
|
||
if (that.tabList[tabIndex].dirList.length > 0) {
|
||
that.tabList[tabIndex].dirList.splice(that.tabList[tabIndex].dirList.length - 1, 1);
|
||
}
|
||
} else {
|
||
that.tabList[tabIndex].dirList.push(dirName);
|
||
}
|
||
that.getPage();
|
||
},
|
||
/**
|
||
* 更改文件管理器地址
|
||
*/
|
||
changeFileDirType(type) {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "FileSys");
|
||
this.tabList[tabIndex].dirType = type;
|
||
this.tabList[tabIndex].dirList = [];
|
||
this.tabList[tabIndex].data = [];
|
||
this.getPage();
|
||
},
|
||
/**
|
||
* 编辑文件夹或创建文件夹
|
||
*/
|
||
editDirName(options) {
|
||
this.$refs.createDir.show(options);
|
||
},
|
||
/**
|
||
* 更改缓存类型
|
||
*/
|
||
changeStorageType(type) {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Storage");
|
||
this.tabList[tabIndex].storageType = type;
|
||
this.getPage();
|
||
},
|
||
/**
|
||
* 运行js代码
|
||
*/
|
||
runJs({ code, type }) {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "JsRunner");
|
||
let id = new Date().getTime() + "_" + Math.random();
|
||
this.tabList[tabIndex].data.push({
|
||
id,
|
||
code,
|
||
result: "",
|
||
isEnd: false,
|
||
});
|
||
let logIndex = this.tabList[tabIndex].data.findIndex((x) => x.id == id);
|
||
let context;
|
||
try {
|
||
// #ifdef H5
|
||
context = window;
|
||
// #endif
|
||
// #ifdef APP-PLUS
|
||
context = globalThis;
|
||
// #endif
|
||
} catch (error) {}
|
||
let result = undefined;
|
||
uni.hideKeyboard();
|
||
if (type == "h5" || type == "nvue") {
|
||
try {
|
||
let fun = ("ev" + "__混淆__" + "al").replace("__混淆__", "");
|
||
if (context && context[fun]) {
|
||
result = context[fun](code);
|
||
} else {
|
||
result = "当前环境不支持运行js!";
|
||
}
|
||
} catch (error) {
|
||
if (error && error.message) {
|
||
result = error.message;
|
||
}
|
||
}
|
||
} else {
|
||
setTimeout(() => {
|
||
try {
|
||
uni.$once("devTools_jsRunnerCallback", (result) => {
|
||
console.log("result", result);
|
||
this.$set(this.tabList[this.tabIndex].data[logIndex], "result", result);
|
||
this.$set(this.tabList[this.tabIndex].data[logIndex], "isEnd", true);
|
||
this.$refs.mobileSwiperScroll.scrollToBottom();
|
||
});
|
||
uni.$emit("devTools_jsRunner", code);
|
||
} catch (error) {}
|
||
}, 1);
|
||
}
|
||
|
||
let his = devCache.get("codeRunHis");
|
||
if (!his) his = [];
|
||
let i = his.indexOf(code);
|
||
if (i > -1) {
|
||
his.splice(i, 1);
|
||
}
|
||
his.unshift(code);
|
||
if (his.length > 100) {
|
||
his.splice(100, 9999999);
|
||
}
|
||
devCache.set("codeRunHis", his);
|
||
|
||
this.$set(this.tabList[this.tabIndex].data[logIndex], "result", result);
|
||
this.$set(this.tabList[this.tabIndex].data[logIndex], "isEnd", true);
|
||
this.$refs.mobileSwiperScroll.scrollToBottom();
|
||
},
|
||
/**
|
||
* 清空js运行记录
|
||
*/
|
||
emptyCodeHis() {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "JsRunner");
|
||
uni.showToast({
|
||
title: "清空成功!",
|
||
icon: "success",
|
||
});
|
||
that.tabList[tabIndex].data = [];
|
||
},
|
||
/**
|
||
* Vuex变量类型改变事件
|
||
*/
|
||
changeStateType(type) {
|
||
let that = this;
|
||
let tabIndex = that.tabList.findIndex((x) => x.title == "Vuex");
|
||
this.tabList[tabIndex].stateType = type;
|
||
this.getPage();
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
<style lang="scss" scoped>
|
||
view,
|
||
text {
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.devTools {
|
||
/* #ifdef APP-PLUS */
|
||
flex: 1;
|
||
/* #endif */
|
||
/* #ifndef APP-PLUS */
|
||
height: 100vh;
|
||
/* #endif */
|
||
width: 750rpx;
|
||
position: relative;
|
||
|
||
.mask {
|
||
position: fixed;
|
||
z-index: 1;
|
||
width: 750rpx;
|
||
flex: 1;
|
||
/* #ifndef APP-PLUS */
|
||
height: 100vh;
|
||
/* #endif */
|
||
background-color: rgba(0, 0, 0, 0.3);
|
||
opacity: 0;
|
||
}
|
||
.panel {
|
||
position: fixed;
|
||
z-index: 2;
|
||
bottom: 0px;
|
||
left: 0px;
|
||
background-color: #ffffff;
|
||
display: flex;
|
||
flex-direction: column;
|
||
width: 750rpx;
|
||
color: #333;
|
||
/* #ifdef APP-PLUS */
|
||
border-radius: 20rpx 20rpx 0 0;
|
||
/* #endif */
|
||
.head {
|
||
width: 750rpx;
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
height: 80rpx;
|
||
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
||
.tabList {
|
||
height: 80rpx;
|
||
width: 670rpx;
|
||
display: flex;
|
||
flex-direction: row;
|
||
white-space: nowrap;
|
||
&.tab-h5 {
|
||
width: 750rpx !important;
|
||
}
|
||
.uni-scroll-view-content {
|
||
display: flex !important;
|
||
flex-direction: row !important;
|
||
}
|
||
.tabItem {
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
justify-content: center;
|
||
height: 80rpx;
|
||
padding: 0 20rpx;
|
||
min-width: 90rpx;
|
||
position: relative;
|
||
.tabText {
|
||
font-size: 28rpx;
|
||
color: #888;
|
||
line-height: 80rpx;
|
||
}
|
||
.tabText.active {
|
||
font-size: 28rpx;
|
||
color: #ff2d55;
|
||
font-weight: bold;
|
||
}
|
||
.tabLine {
|
||
position: absolute;
|
||
bottom: -1px;
|
||
height: 2px;
|
||
width: 100rpx;
|
||
background-color: #ff2d55;
|
||
}
|
||
}
|
||
}
|
||
.close {
|
||
height: 80rpx;
|
||
width: 80rpx;
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
justify-content: center;
|
||
position: relative;
|
||
.icon {
|
||
font-size: 40rpx;
|
||
line-height: 40rpx;
|
||
text-align: center;
|
||
color: #ff2d55;
|
||
}
|
||
.line {
|
||
position: absolute;
|
||
left: 0;
|
||
height: 40rpx;
|
||
width: 1px;
|
||
background-color: rgba(0, 0, 0, 0.05);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
.cellDivisionLine {
|
||
height: 1px;
|
||
width: 750rpx;
|
||
background-color: rgba(0, 0, 0, 0.1);
|
||
}
|
||
|
||
.navbar {
|
||
position: fixed;
|
||
background-color: #fff;
|
||
width: 750rpx;
|
||
z-index: 2;
|
||
border-bottom: 1px solid rgba(0, 0, 0, 0.03);
|
||
.navbarBody {
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
color: #333;
|
||
width: 710rpx;
|
||
margin-left: 20rpx;
|
||
.left {
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
font-size: 26rpx;
|
||
line-height: 26rpx;
|
||
image {
|
||
transform: rotate(-90deg);
|
||
width: 30rpx;
|
||
height: 30rpx;
|
||
}
|
||
}
|
||
.right {
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
font-size: 26rpx;
|
||
line-height: 26rpx;
|
||
color: #ff2d55;
|
||
image {
|
||
width: 30rpx;
|
||
height: 30rpx;
|
||
margin-left: 5rpx;
|
||
}
|
||
.refreshing {
|
||
color: #aaa !important;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
.navbarEmpty {
|
||
position: fixed;
|
||
}
|
||
.loadAll:active {
|
||
background-color: rgba(0, 0, 0, 0.03);
|
||
}
|
||
.loadAll {
|
||
width: 750rpx;
|
||
height: 80rpx;
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
justify-content: center;
|
||
.loadAllFold {
|
||
width: 30rpx;
|
||
height: 30rpx;
|
||
}
|
||
.loadAllText {
|
||
font-size: 26rpx;
|
||
color: #333;
|
||
margin: 0 10rpx;
|
||
}
|
||
}
|
||
.cellDivisionLine {
|
||
height: 1px;
|
||
width: 750rpx;
|
||
background-color: rgba(0, 0, 0, 0.1);
|
||
}
|
||
.cellDivisionLine {
|
||
height: 1px;
|
||
width: 750rpx;
|
||
background-color: rgba(0, 0, 0, 0.1);
|
||
}
|
||
.devEmpty {
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
justify-content: center;
|
||
height: 200rpx;
|
||
width: 750rpx;
|
||
.devEmptyText {
|
||
font-size: 26rpx;
|
||
color: #888;
|
||
line-height: 26rpx;
|
||
}
|
||
}
|
||
.eventItem {
|
||
display: flex;
|
||
flex-direction: column;
|
||
width: 750rpx;
|
||
padding: 10rpx 20rpx;
|
||
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
||
&:active {
|
||
background-color: rgba(0, 0, 0, 0.05);
|
||
}
|
||
.eventName {
|
||
font-size: 20rpx;
|
||
color: #333;
|
||
}
|
||
.eventCount {
|
||
margin-top: 4rpx;
|
||
display: flex;
|
||
flex-direction: row;
|
||
justify-content: space-between;
|
||
.eventCountItem {
|
||
width: 170rpx;
|
||
max-width: 170rpx;
|
||
font-size: 20rpx;
|
||
color: #333;
|
||
}
|
||
}
|
||
}
|
||
.eventLogItem {
|
||
display: flex;
|
||
flex-direction: column;
|
||
width: 750rpx;
|
||
padding: 10rpx 20rpx;
|
||
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
||
&:active {
|
||
background-color: rgba(0, 0, 0, 0.05);
|
||
}
|
||
.logText {
|
||
font-size: 20rpx;
|
||
color: #333;
|
||
}
|
||
.logTime {
|
||
font-size: 20rpx;
|
||
color: #999;
|
||
}
|
||
}
|
||
.listCenterView {
|
||
width: 750rpx;
|
||
min-height: 200rpx;
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
justify-content: center;
|
||
.listCenterText {
|
||
font-size: 24rpx;
|
||
color: #999;
|
||
}
|
||
}
|
||
</style>
|