const{createApp}=Vue const{createVuetify,useGoTo,useDisplay}=Vuetify var data={alert:{show:false,color:'success',text:'',timeout:0,},theme:{dark:false,},nav:{showDrawer:false,showTOC:true,tocPanel:0,tab:'account',post:{discussionId:2674,currentPage:1,targetPage:1,total:9,anchor:0,goToOptions:{container:null,duration:0,easing:'easeInOutCubic',offset:-100,},worker:null,task:[],active:[],apiLock:[],originLike:new Map([]),},related:{block:1,}},search:{width:80,text:null,loading:false,},tags:[{id:44,url:'/t/10307f3e6a045c7364772a170d01',name:'探针',color:'#66BB6A',icon:'mdi-tag-heart',},],posts:[{id:32327,num:0,uid:6743,content:'\u003Cp\u003E桌面上创建个txt文本文档复制粘贴到里面然后修改后缀为html双击打开食用\u003C/p\u003E\u003Ccode\u003E\u0026lt;!DOCTYPE html\u0026gt;\u0026lt;html lang\u003D\u0026#34;zh-CN\u0026#34;\u0026gt;\u0026lt;head\u0026gt; \u0026lt;meta charset\u003D\u0026#34;UTF-8\u0026#34;\u0026gt; \u0026lt;meta name\u003D\u0026#34;viewport\u0026#34; content\u003D\u0026#34;width\u003Ddevice-width, initial-scale\u003D1.0\u0026#34;\u0026gt; \u0026lt;title\u0026gt;哪吒监控V1自定义配置生成器\u0026lt;/title\u0026gt; \u0026lt;link rel\u003D\u0026#34;stylesheet\u0026#34; href\u003D\u0026#34;https://unpkg.com/element-ui/lib/theme-chalk/index.css\u0026#34;\u0026gt; \u0026lt;script src\u003D\u0026#34;https://cdn.jsdelivr.net/npm/vue; font-weight: normal; } \u0026lt;/style\u0026gt;\u0026lt;/head\u0026gt;\u0026lt;body\u0026gt; \u0026lt;div id\u003D\u0026#34;app\u0026#34;\u0026gt; \u0026lt;el-row :gutter\u003D\u0026#34;20\u0026#34;\u0026gt; \u0026lt;el-col :xs\u003D\u0026#34;24\u0026#34; :**\u003D\u0026#34;12\u0026#34;\u0026gt; \u0026lt;el-form :model\u003D\u0026#34;form\u0026#34; label-width\u003D\u0026#34;100px\u0026#34;\u0026gt; \u0026lt;!-- Billing Data Form --\u0026gt; \u0026lt;el-divider content-position\u003D\u0026#34;left\u0026#34;\u0026gt;Billing Data Form\u0026lt;/el-divider\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;开始日期\u0026#34; prop\u003D\u0026#34;startDate\u0026#34;\u0026gt; \u0026lt;el-date-picker v-model\u003D\u0026#34;form.billingDataMod.startDate\u0026#34; type\u003D\u0026#34;datetime\u0026#34; placeholder\u003D\u0026#34;选择开始日期\u0026#34; format\u003D\u0026#34;yyyy-MM-dd HH:mm:ss\u0026#34; value-format\u003D\u0026#34;yyyy-MM-dd HH:mm:ss+08:00\u0026#34;\u0026gt; \u0026lt;/el-date-picker\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;结束日期\u0026#34; prop\u003D\u0026#34;endDate\u0026#34;\u0026gt; \u0026lt;el-date-picker v-model\u003D\u0026#34;form.billingDataMod.endDate\u0026#34; type\u003D\u0026#34;datetime\u0026#34; placeholder\u003D\u0026#34;选择结束日期\u0026#34; format\u003D\u0026#34;yyyy-MM-dd HH:mm:ss\u0026#34; value-format\u003D\u0026#34;yyyy-MM-dd HH:mm:ss+08:00\u0026#34; :disabled\u003D\u0026#34;form.billingDataMod.isIndefinite\u0026#34;\u0026gt; \u0026lt;/el-date-picker\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;form.billingDataMod.isIndefinite\u0026#34;\u0026gt;无期限\u0026lt;/el-checkbox\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;自动续期\u0026#34; prop\u003D\u0026#34;autoRenewal\u0026#34;\u0026gt; \u0026lt;el-switch v-model\u003D\u0026#34;form.billingDataMod.autoRenewal\u0026#34; active-text\u003D\u0026#34;是\u0026#34; inactive-text\u003D\u0026#34;否\u0026#34; active-value\u003D\u0026#34;1\u0026#34; inactive-value\u003D\u0026#34;0\u0026#34; :disabled\u003D\u0026#34;isUnofficial\u0026#34;\u0026gt; \u0026lt;/el-switch\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;计费周期\u0026#34; prop\u003D\u0026#34;cycle\u0026#34;\u0026gt; \u0026lt;el-select v-model\u003D\u0026#34;form.billingDataMod.cycle\u0026#34; placeholder\u003D\u0026#34;选择计费周期\u0026#34;\u0026gt; \u0026lt;el-option label\u003D\u0026#34;天(非官方)\u0026#34; value\u003D\u0026#34;天\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;月\u0026#34; value\u003D\u0026#34;月\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;季\u0026#34; value\u003D\u0026#34;季\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;半年\u0026#34; value\u003D\u0026#34;半年\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;年\u0026#34; value\u003D\u0026#34;年\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;1年(非官方)\u0026#34; value\u003D\u0026#34;1年\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;2年(非官方)\u0026#34; value\u003D\u0026#34;2年\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;3年(非官方)\u0026#34; value\u003D\u0026#34;3年\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;4年(非官方)\u0026#34; value\u003D\u0026#34;4年\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;5年(非官方)\u0026#34; value\u003D\u0026#34;5年\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;/el-select\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;金额\u0026#34; prop\u003D\u0026#34;amount\u0026#34;\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;isAmountUnitBefore\u0026#34;\u0026gt;前单位\u0026lt;span\u0026gt; 例如:¥9.99\u0026lt;/span\u0026gt;\u0026lt;/el-checkbox\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;isAmountUnitAffter\u0026#34;\u0026gt;后单位\u0026lt;span\u0026gt; 例如:9.99CNY\u0026lt;/span\u0026gt;\u0026lt;/el-checkbox\u0026gt; \u0026lt;el-input v-model\u003D\u0026#34;form.billingDataMod.amount\u0026#34; placeholder\u003D\u0026#34;输入金额\u0026#34; :disabled\u003D\u0026#34;form.billingDataMod.isAmountFree || form.billingDataMod.isAmountPAYG\u0026#34;\u0026gt; \u0026lt;el-select v-model\u003D\u0026#34;amountBeforeUnit\u0026#34; slot\u003D\u0026#34;prepend\u0026#34; placeholder\u003D\u0026#34;请选择\u0026#34; filterable :disabled\u003D\u0026#34;form.billingDataMod.isAmountFree || form.billingDataMod.isAmountPAYG\u0026#34; v-if\u003D\u0026#34;isAmountUnitBefore\u0026#34; allow-create\u0026gt; \u0026lt;el-option label\u003D\u0026#34;人民币 ¥\u0026#34; value\u003D\u0026#34;¥\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;美元 $\u0026#34; value\u003D\u0026#34;$\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;欧元 €\u0026#34; value\u003D\u0026#34;€\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;加币 C$\u0026#34; value\u003D\u0026#34;C$\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;英镑 £\u0026#34; value\u003D\u0026#34;£\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;/el-select\u0026gt; \u0026lt;el-select v-model\u003D\u0026#34;amountAffterUnit\u0026#34; slot\u003D\u0026#34;append\u0026#34; placeholder\u003D\u0026#34;请选择\u0026#34; filterable :disabled\u003D\u0026#34;form.billingDataMod.isAmountFree || form.billingDataMod.isAmountPAYG\u0026#34; v-if\u003D\u0026#34;isAmountUnitAffter\u0026#34; allow-create\u0026gt; \u0026lt;el-option label\u003D\u0026#34;人民币 CNY\u0026#34; value\u003D\u0026#34;CNY\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;美元 USD\u0026#34; value\u003D\u0026#34;USD\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;欧元 EUR\u0026#34; value\u003D\u0026#34;EUR\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;加币 C\u0026#34; value\u003D\u0026#34;C\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;英镑 GBP\u0026#34; value\u003D\u0026#34;GBP\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;/el-select\u0026gt; \u0026lt;/el-input\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;form.billingDataMod.isAmountFree\u0026#34; :disabled\u003D\u0026#34;form.billingDataMod.isAmountPAYG\u0026#34;\u0026gt;免费\u0026lt;/el-checkbox\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;form.billingDataMod.isAmountPAYG\u0026#34; :disabled\u003D\u0026#34;form.billingDataMod.isAmountFree\u0026#34;\u0026gt;按量收费\u0026lt;/el-checkbox\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;!-- Plan Data Form --\u0026gt; \u0026lt;el-divider content-position\u003D\u0026#34;left\u0026#34;\u0026gt; Plan Data Form \u0026lt;el-checkbox v-model\u003D\u0026#34;isNoPlanDataForm\u0026#34;\u0026gt;不开启\u0026lt;/el-checkbox\u0026gt; \u0026lt;/el-divider\u0026gt; \u0026lt;!-- 每个表单项使用复选框控制显示 --\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;带宽\u0026#34; prop\u003D\u0026#34;bandwidth\u0026#34;\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;planItemVisibility.bandwidth\u0026#34; class\u003D\u0026#34;item-checkbox\u0026#34;\u0026gt;显示字段\u0026lt;/el-checkbox\u0026gt; \u0026lt;el-input placeholder\u003D\u0026#34;输入带宽\u0026#34; v-model\u003D\u0026#34;form.planDataMod.bandwidth\u0026#34; class\u003D\u0026#34;input-with-select\u0026#34; :disabled\u003D\u0026#34;!planItemVisibility.bandwidth || isNoPlanDataForm\u0026#34;\u0026gt; \u0026lt;el-select v-model\u003D\u0026#34;form.planDataMod.bandwidthUnit\u0026#34; slot\u003D\u0026#34;append\u0026#34; placeholder\u003D\u0026#34;请选择\u0026#34; :disabled\u003D\u0026#34;!planItemVisibility.bandwidth || isNoPlanDataForm\u0026#34;\u0026gt; \u0026lt;el-option label\u003D\u0026#34;Mbps\u0026#34; value\u003D\u0026#34;Mbps\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;Gbps\u0026#34; value\u003D\u0026#34;Gbps\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;无限制\u0026#34; value\u003D\u0026#34;Unlimited\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;/el-select\u0026gt; \u0026lt;/el-input\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;流量\u0026#34; prop\u003D\u0026#34;trafficVol\u0026#34;\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;planItemVisibility.trafficVol\u0026#34; class\u003D\u0026#34;item-checkbox\u0026#34;\u0026gt;显示字段\u0026lt;/el-checkbox\u0026gt; \u0026lt;el-input placeholder\u003D\u0026#34;输入流量限制\u0026#34; v-model\u003D\u0026#34;form.planDataMod.trafficVol\u0026#34; class\u003D\u0026#34;input-with-select\u0026#34; :disabled\u003D\u0026#34;!planItemVisibility.trafficVol || isNoPlanDataForm\u0026#34;\u0026gt; \u0026lt;el-select v-model\u003D\u0026#34;form.planDataMod.trafficUnit\u0026#34; slot\u003D\u0026#34;append\u0026#34; placeholder\u003D\u0026#34;请选择\u0026#34; :disabled\u003D\u0026#34;!planItemVisibility.trafficVol || isNoPlanDataForm\u0026#34;\u0026gt; \u0026lt;el-option label\u003D\u0026#34;MB/月\u0026#34; value\u003D\u0026#34;MB/月\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;TB/月\u0026#34; value\u003D\u0026#34;TB/月\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;GB/月\u0026#34; value\u003D\u0026#34;GB/月\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;PB/月\u0026#34; value\u003D\u0026#34;PB/月\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;/el-select\u0026gt; \u0026lt;/el-input\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;流量类型\u0026#34; prop\u003D\u0026#34;trafficType\u0026#34;\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;planItemVisibility.trafficType\u0026#34; class\u003D\u0026#34;item-checkbox\u0026#34;\u0026gt;显示字段\u0026lt;/el-checkbox\u0026gt; \u0026lt;el-select v-model\u003D\u0026#34;form.planDataMod.trafficType\u0026#34; placeholder\u003D\u0026#34;选择流量类型\u0026#34; :disabled\u003D\u0026#34;!planItemVisibility.trafficType || isNoPlanDataForm\u0026#34;\u0026gt; \u0026lt;el-option label\u003D\u0026#34;只单向上行流量计费\u0026#34; value\u003D\u0026#34;1\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;双向上下行流量同时计费\u0026#34; value\u003D\u0026#34;2\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;el-option label\u003D\u0026#34;取入栈和出栈最大的计费 [ Max(In, Out) ]\u0026#34; value\u003D\u0026#34;3\u0026#34;\u0026gt;\u0026lt;/el-option\u0026gt; \u0026lt;/el-select\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;IPv4\u0026#34; prop\u003D\u0026#34;IPv4\u0026#34;\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;planItemVisibility.IPv4\u0026#34; class\u003D\u0026#34;item-checkbox\u0026#34;\u0026gt;显示字段\u0026lt;/el-checkbox\u0026gt; \u0026lt;el-switch v-model\u003D\u0026#34;form.planDataMod.IPv4\u0026#34; active-text\u003D\u0026#34;有\u0026#34; inactive-text\u003D\u0026#34;无\u0026#34; active-value\u003D\u0026#34;1\u0026#34; inactive-value\u003D\u0026#34;0\u0026#34; :disabled\u003D\u0026#34;!planItemVisibility.IPv4 || isNoPlanDataForm\u0026#34;\u0026gt; \u0026lt;/el-switch\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;IPv6\u0026#34; prop\u003D\u0026#34;IPv6\u0026#34;\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;planItemVisibility.IPv6\u0026#34; class\u003D\u0026#34;item-checkbox\u0026#34;\u0026gt;显示字段\u0026lt;/el-checkbox\u0026gt; \u0026lt;el-switch v-model\u003D\u0026#34;form.planDataMod.IPv6\u0026#34; active-text\u003D\u0026#34;有\u0026#34; inactive-text\u003D\u0026#34;无\u0026#34; active-value\u003D\u0026#34;1\u0026#34; inactive-value\u003D\u0026#34;0\u0026#34; :disabled\u003D\u0026#34;!planItemVisibility.IPv6 || isNoPlanDataForm\u0026#34;\u0026gt; \u0026lt;/el-switch\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;网络路由\u0026#34; prop\u003D\u0026#34;networkRoute\u0026#34;\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;planItemVisibility.networkRoute\u0026#34; class\u003D\u0026#34;item-checkbox\u0026#34;\u0026gt;显示字段\u0026lt;/el-checkbox\u0026gt; \u0026lt;el-input v-model\u003D\u0026#34;form.planDataMod.networkRoute\u0026#34; placeholder\u003D\u0026#34;输入网络路由,使用\u0026#39;,\u0026#39;分割\u0026#34; :disabled\u003D\u0026#34;!planItemVisibility.networkRoute || isNoPlanDataForm\u0026#34;\u0026gt;\u0026lt;/el-input\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;el-form-item label\u003D\u0026#34;额外信息\u0026#34; prop\u003D\u0026#34;extra\u0026#34;\u0026gt; \u0026lt;el-checkbox v-model\u003D\u0026#34;planItemVisibility.extra\u0026#34; class\u003D\u0026#34;item-checkbox\u0026#34;\u0026gt;显示字段\u0026lt;/el-checkbox\u0026gt; \u0026lt;el-input v-model\u003D\u0026#34;form.planDataMod.extra\u0026#34; placeholder\u003D\u0026#34;输入额外信息,使用\u0026#39;,\u0026#39;分割\u0026#34; :disabled\u003D\u0026#34;!planItemVisibility.extra || isNoPlanDataForm\u0026#34;\u0026gt;\u0026lt;/el-input\u0026gt; \u0026lt;/el-form-item\u0026gt; \u0026lt;/el-form\u0026gt; \u0026lt;/el-col\u0026gt; \u0026lt;el-col :xs\u003D\u0026#34;24\u0026#34; :**\u003D\u0026#34;12\u0026#34;\u0026gt; \u0026lt;el-input type\u003D\u0026#34;textarea\u0026#34; :rows\u003D\u0026#34;20\u0026#34; :value\u003D\u0026#34;jsonOutput\u0026#34; readonly\u0026gt;\u0026lt;/el-input\u0026gt; \u0026lt;div style\u003D\u0026#34;height: 10px;\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;el-button type\u003D\u0026#34;primary\u0026#34; @click\u003D\u0026#34;generateJson\u0026#34;\u0026gt;生成 JSON\u0026lt;/el-button\u0026gt; \u0026lt;/el-col\u0026gt; \u0026lt;/el-row\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;script\u0026gt; new Vue({ el: \u0026#39;#app\u0026#39;, data() { return { // 新增每个字段的显示状态控制 planItemVisibility: { bandwidth: true, trafficVol: true, trafficType: true, IPv4: true, IPv6: true, networkRoute: true, extra: true }, isNoPlanDataForm: false, isUnofficial: false, amountUnitOrder: 2, isAmountUnitBefore: true, isAmountUnitAffter: false, amountBeforeUnit: \u0026#34;¥\u0026#34;, amountAffterUnit: \u0026#34;CNY\u0026#34;, form: { billingDataMod: { startDate: new Date(), endDate: new Date(), autoRenewal: \u0026#39;1\u0026#39;, cycle: \u0026#39;月\u0026#39;, amount: \u0026#39;1\u0026#39; }, planDataMod: { bandwidth: \u0026#39;30\u0026#39;, bandwidthUnit: \u0026#39;Mbps\u0026#39;, trafficVol: \u0026#39;1\u0026#39;, trafficUnit: \u0026#39;TB/月\u0026#39;, trafficType: \u0026#39;1\u0026#39;, IPv4: \u0026#39;1\u0026#39;, IPv6: \u0026#39;1\u0026#39;, networkRoute: \u0026#39;4837\u0026#39;, extra: \u0026#39;\u0026#39; } }, jsonOutput: \u0026#39;\u0026#39; }; }, methods: { generateJson() { let jo \u003D JSON.parse(JSON.stringify(this.form)); // 处理隐藏字段 Object.keys(this.planItemVisibility).forEach(key \u003D\u0026gt; { if (!this.planItemVisibility[key]) { switch (key) { case \u0026#39;bandwidth\u0026#39;: delete jo.planDataMod.bandwidth; delete jo.planDataMod.bandwidthUnit; break; case \u0026#39;trafficVol\u0026#39;: delete jo.planDataMod.trafficVol; delete jo.planDataMod.trafficUnit; break; default: delete jo.planDataMod[key]; } } }); // 清理空对象 if (jo.planDataMod \u0026amp;\u0026amp; Object.keys(jo.planDataMod).length \u003D\u003D\u003D 0) { delete jo.planDataMod; } // 原有其他处理逻辑保持不变 if (jo.billingDataMod.isIndefinite) { jo.billingDataMod.endDate \u003D \u0026#39;0000-00-00T23:59:59+08:00\u0026#39;; } if (jo.planDataMod?.bandwidthUnit \u003D\u003D\u003D \u0026#34;Unlimited\u0026#34;) { jo.planDataMod.bandwidth \u003D \u0026#34;Unlimited\u0026#34;; } else if (jo.planDataMod?.bandwidth) { jo.planDataMod.bandwidth +\u003D jo.planDataMod.bandwidthUnit; } if (jo.planDataMod?.trafficVol) { jo.planDataMod.trafficVol +\u003D jo.planDataMod.trafficUnit; } if (this.isAmountUnitBefore) { jo.billingDataMod.amount \u003D this.amountBeforeUnit + jo.billingDataMod.amount; } if (this.isAmountUnitAffter) { jo.billingDataMod.amount +\u003D this.amountAffterUnit; } if (this.isUnofficial) { jo.billingDataMod.amount +\u003D \u0026#34;/\u0026#34; + jo.billingDataMod.cycle; jo.billingDataMod.cycle \u003D \u0026#34;\u0026#34;; } if (jo.billingDataMod.isAmountFree) { jo.billingDataMod.amount \u003D \u0026#39;0\u0026#39;; } if (jo.billingDataMod.isAmountPAYG) { jo.billingDataMod.amount \u003D \u0026#39;-1\u0026#39;; } delete jo.billingDataMod.isIndefinite; delete jo.billingDataMod.isAmountFree; delete jo.billingDataMod.isAmountPAYG; delete jo.planDataMod?.bandwidthUnit; delete jo.planDataMod?.trafficUnit; this.jsonOutput \u003D JSON.stringify(jo, null, 4); } }, watch: { isAmountUnitBefore(n) { if (n) this.isAmountUnitAffter \u003D false; }, isAmountUnitAffter(n) { if (n) this.isAmountUnitBefore \u003D false; }, \u0026#39;form.billingDataMod.cycle\u0026#39;(n) { if (/\\d年|天/.test(n)) { this.$alert(`您使用的\u0026lt;strong\u0026gt;${n}\u0026lt;/strong\u0026gt;的计费周期,并不是官方支持的参数,\u0026lt;br /\u0026gt;\u0026lt;strong\u0026gt;无法自动刷新及计算规划中的账单统计报表,\u0026lt;br /\u0026gt;并禁用autoRenewal及cycle字段\u0026lt;/strong\u0026gt;`, \u0026#39;温馨提示\u0026#39;, { confirmButtonText: \u0026#39;确定\u0026#39;, dangerouslyUseHTMLString: true, }); this.form.billingDataMod.autoRenewal \u003D 0; this.isUnofficial \u003D true; } else { this.isUnofficial \u003D false; } } } }); \u0026lt;/script\u0026gt;\u0026lt;/body\u0026gt;\u0026lt;/html\u0026gt;\u003C/code\u003E',ipRegion:'',updatedByUid:0,createdAt:'2025-03-13 06:37:57',updatedAt:'2025-03-15 22:07:08',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},{id:32328,num:1,uid:6743,content:'\u003Cp\u003E叫ai写的 \u003Cimg src\u003D\"/z/img/xhj/016.webp\"\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src\u003D\"https://p.sda1.dev/22/ba41ebf09da27ad83e0894833ae384d8/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%AC%E5%BC%80%E5%A4%87%E6%B3%A8%E7%94%9F%E6%88%90%E5%99%A8.jpg\" alt\u003D\"image\"\u003E\u003C/p\u003E\u003Cp\u003E\u003Cimg src\u003D\"https://p.sda1.dev/22/6086bcf3f9fdf8fb4ecd8328f0c394e2/%E5%93%AA%E5%90%92%E7%9B%91%E6%8E%A7V1%E8%87%AA%E5%AE%9A%E4%B9%89%E9%85%8D%E7%BD%AE%E7%94%9F%E6%88%90%E5%99%A8.jpg\" alt\u003D\"image\"\u003E\u003C/p\u003E',ipRegion:'',updatedByUid:0,createdAt:'2025-03-13 06:39:32',updatedAt:'2025-03-15 22:07:08',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},{id:32329,num:2,uid:5212,content:'\u003Cp\u003E加个效果图 \u003Cimg src\u003D\"/z/img/xhj/016.webp\"\u003E\u003C/p\u003E',ipRegion:'',updatedByUid:0,createdAt:'2025-03-13 06:40:21',updatedAt:'2025-03-15 22:07:08',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},{id:32330,num:3,uid:1829,content:'\u003Cp\u003E加个效果图\u003C/p\u003E',ipRegion:'',updatedByUid:0,createdAt:'2025-03-13 06:44:49',updatedAt:'2025-03-15 22:07:08',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},{id:32331,num:4,uid:1404,content:'\u003Cp\u003E太牛了\u003C/p\u003E',ipRegion:'',updatedByUid:0,createdAt:'2025-03-13 06:45:14',updatedAt:'2025-03-15 22:07:08',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},{id:32332,num:5,uid:8525,content:'\u003Cp\u003E厉害 \u003Cimg src\u003D\"/z/img/xhj/003.webp\"\u003E\u003C/p\u003E',ipRegion:'',updatedByUid:0,createdAt:'2025-03-13 06:55:50',updatedAt:'2025-03-15 22:07:08',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},{id:32333,num:6,uid:6772,content:'\u003Cp\u003E有效果图就好了\u003C/p\u003E',ipRegion:'',updatedByUid:0,createdAt:'2025-03-13 07:00:33',updatedAt:'2025-03-15 22:07:08',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},{id:32334,num:7,uid:1539,content:'\u003Ccode\u003EAffter\u003C/code\u003E\u003Cp\u003E这是为了对齐有意为之吗 \u003Cimg src\u003D\"/z/img/ac/01.webp\"\u003E\u003C/p\u003E',ipRegion:'',updatedByUid:0,createdAt:'2025-03-13 07:04:57',updatedAt:'2025-03-15 22:07:08',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},{id:32335,num:8,uid:6743,content:'\u003Cp\u003E 我也不知道啊,我是一个子代码都不懂的人,让AI给我写了用 其中一个是扒了哪吒原作者的然后让ai给我添加选项框的\u003C/p\u003E',ipRegion:'',updatedByUid:0,createdAt:'2025-03-13 07:26:37',updatedAt:'2025-03-15 22:07:08',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},],usersMap:new Map([[5212,{uid:5212,url:'/u/2802633c6a045c72626b546f34082000',avatar:'/a/2802633c6a045c72626b546f34082000',username:'清风🤖',}],[1539,{uid:1539,url:'/u/697e005e6a045c7665695f6f1a02100e',avatar:'/a/697e005e6a045c7665695f6f1a02100e',username:'ps3chinamj🤖',}],[8525,{uid:8525,url:'/u/1d7c46016a045c7f6568536f222c190d',avatar:'/a/1d7c46016a045c7f6568536f222c190d',username:'imperial🤖',}],[6743,{uid:6743,url:'/u/2f2067266a045c71676e556f0227643f',avatar:'/a/2f2067266a045c71676e556f0227643f',username:'小姬霸🤖',}],[1829,{uid:1829,url:'/u/123e583e6a045c7668685f6f3f11252a',avatar:'/a/123e583e6a045c7668685f6f3f11252a',username:'flyblack🤖',}],[6772,{uid:6772,url:'/u/382e7b5b6a045c71676d546f2259103e',avatar:'/a/382e7b5b6a045c71676d546f2259103e',username:'funnymudgopeee🤖',}],[1404,{uid:1404,url:'/u/1d3e5a026a045c76646a526f1300600d',avatar:'/a/1d3e5a026a045c76646a526f1300600d',username:'sy9217🤖',}],]),related:[{title:'用claw免费容器搭建v0哪吒探针,0.05$一天',url:'/d/1820551d6a045c77606a567a475e636a14100962',},{title:'还是选择放弃nezha了',url:'/d/141d7a096a045c77606a56754e506b6a36290011',},{title:'请问怎么防止哪吒面板被搜索引擎收录?',url:'/d/2f2767046a045c77606a5675405d626a5e743e39',},{title:'nezha v0不小心更新到v1了 还能回退吗',url:'/d/153874186a045c77606a5675465c636a03193b04',},{title:'哪吒监控部署探针的时候用的是IP地址,有没有快速换成域名的办法?',url:'/d/0f7c553d6a045c77606a5675465d656a140a6a26',},{title:'哪吒探针求助',url:'/d/36087a5c6a045c77606a56774151626a39001667',},{title:'Nezha-Agent V1 Magisk模块',url:'/d/152656276a045c77606a567743596b6a3e2d3f3b',},{title:'nezha v1可以关闭游客访问吗?',url:'/d/1b7862186a045c77606a56764e50666a027b101b',},{title:'nezha v0好还是v1好',url:'/d/637e46276a045c77606a567643596a6a35161136',},{title:'nezha-agent v0和v1 客户端可以同时安装在一台机器上吗?',url:'/d/3e26513a6a045c77606a567644506b6a5a0f1135',},{title:'发现一个神奇的现象,一般的mjj差不多探针都是12个小鸡',url:'/d/370f535b6a045c77606a5676465c656a0d021838',},{title:'哪吒探针求助',url:'/d/6e055e3d6a045c77606a5676465b646a0d0a220a',},{title:'已解决,哪吒主题升级问题',url:'/d/1d7155196a045c77606a5676475e676a0600093f',},{title:'VPS橱窗:适配哪吒面板v1的简单主题',url:'/d/3621450e6a045c77606a5671455c6a6a1f1a183d',},{title:'serv0 怎么安装哪吒v0的agent?',url:'/d/151170006a045c77606a56704f5f626a1b24641c',},{title:'是不是就因为太多人买了小鸡挂探针',url:'/d/081e58596a045c77606a5670415e6a6a3b716517',},{title:'【不懂就问】哪吒面板v0和v1可以共存吗',url:'/d/003965066a045c77606a56704158636a01761439',},{title:'求哪吒v0安装地址',url:'/d/3d27415a6a045c77606a5670445a656a3a190a22',},{title:'各位的nezha v1会不会出现多出几个实例的情况',url:'/d/162a43036a045c77606a5673445c606a0f17096b',},{title:'哪吒探针需要什么配置能带起来',url:'/d/1d0e6a036a045c77606a56734550606a0917326b',},],} const App={setup(){const goTo=useGoTo() const{mdAndUp}=useDisplay() return{goTo,mdAndUp}},data(){return data;},mounted(){const themeDark=localStorage.getItem("themeDark") if(themeDark!==null){this.theme.dark=JSON.parse(themeDark)} if(this.nav.post.total>(this.nav.post.currentPage-1)*100+20){let moreLen=100 if(this.nav.post.total({id:null,num:(this.nav.post.currentPage-1)*100+v,uid:null,content:null,ipRegion:null,updatedByUid:null,createdAt:null,updatedAt:null,mentionNum:null,mentionedBy:null,mentionUsers:null,likeUsers:null,})) this.posts.push(...morePosts.slice(20))} this.workerStart() const hash=window.location.hash const match=hash.match(/#(\d+)/) if(match){const n=parseInt(match[1],10) if(n>=(this.nav.post.currentPage-1)*100&&n{this.jumpTo(n)})}} this.$nextTick(()=>{this.addHeadingIds() tocbot.init({tocSelector:'.toc',contentSelector:'#post-content-0',headingSelector:'h2, h3, h4',headingsOffset:100,scrollSmoothOffset:-100,scrollSmooth:true,collapseDepth:6,onClick:function(e){setTimeout(()=>{history.replaceState(null,'',window.location.pathname+window.location.search)},0)},}) tocbot.refresh()});},beforeUnmount(){this.workerStop() if(this.quill){this.quill.destroy() this.quill=null}},computed:{dposts(){return this.posts.slice(20);},},created(){},methods:{successAlert(msg){this.alert={show:true,color:'success',text:msg,timeout:1500,}},failureAlert(msg){this.alert={show:true,color:'error',text:msg,timeout:5000,}},flipThemeDark(){this.theme.dark=!this.theme.dark localStorage.setItem("themeDark",JSON.stringify(this.theme.dark))},toSearch(){if(!this.search.text){this.failureAlert('搜索词不能为空') return} let keywords=this.search.text.trim() if(keywords.length<1){this.failureAlert('搜索词不能为空') return} if(keywords.length>100){this.failureAlert('搜索词过长') return} this.doSearch(keywords)},toReg(){window.location.href="/reg"},toLogin(){window.location.href="/login"},toPage(){let url=window.location.href url=url.replace(/(\/\d+)?(#[0-9]+)?$/,this.nav.post.targetPage>1?`/${this.nav.post.targetPage}`:'') window.location.href=url},toLoadRelated({done}){if(this.my&&this.my.uid){this.apiLoadRelated({done})}else{done('ok')}},workerStart(){this.nav.post.worker=setInterval(()=>{this.workerLoad()},500);},workerStop(){if(this.nav.post.worker){clearInterval(this.nav.post.worker);this.nav.post.worker=null;}},async jumpTo(num){const page=Math.floor(num/100)+1 const i=num-(page-1)*100 if(page===this.nav.post.currentPage){this.goTo("#post-"+num,this.nav.post.goToOptions) if(!this.posts[i].id){const block=Math.floor(num/20)+1 this.nav.post.apiLock[block]=true await this.apiLoadPosts(block) this.$nextTick(()=>{this.goTo("#post-"+num,this.nav.post.goToOptions)})}}else{let url=window.location.href url=url.replace(/(\/\d+)?(#[0-9]+)?$/,page>1?`/${page}`:'') url=url+"#"+num window.location.href=url}},postIntersect(num){return(isIntersecting,entries,observer)=>{if(isIntersecting){this.nav.post.task.push(num) this.nav.post.active.push(num) this.nav.post.active=this.nav.post.active.filter(item=>Math.abs(item-num)<=5) this.nav.post.active.sort((a,b)=>a-b)}else{this.nav.post.active=this.nav.post.active.filter(item=>item!==num)} if(this.nav.post.active[0]){this.nav.post.anchor=this.nav.post.active[0]}else{this.nav.post.anchor=0}}},async apiLoadPosts(block){try{const response=await axios.post('/fapi/v1/post/block/'+block,{discussionId:this.nav.post.discussionId,}) if(response.data.code===0){response.data.data.posts.forEach(post=>{const i=post.num%100 Object.assign(this.posts[i],post)}) response.data.data.users.forEach(user=>{this.usersMap.set(user.uid,user)})}else{this.failureAlert('回帖数据加载失败: '+response.data.msg)}}catch(error){this.failureAlert('回帖数据加载失败: '+error)} this.nav.post.apiLock[block]=false},workerLoad(){while(this.nav.post.task.length){const num=this.nav.post.task.pop() const i=num-(this.nav.post.currentPage-1)*100 if(!this.posts[i].id){const block=Math.floor(num/20)+1 if(!this.nav.post.apiLock[block]){this.nav.post.apiLock[block]=true this.apiLoadPosts(block)}}}},getTimeInfo(t){if(!t){return ""} const now=new Date();const then=new Date(t);const diff=now-then;const minute=60*1000;const hour=minute*60;const day=hour*24;const month=day*30;const year=month*12;if(diffpost.num===num) if(!post){return "#"+num} const uid=post.uid const username=this.usersMap.get(uid)?.username if(!username){return "#"+num} return username},getUsernameByPostId(id){const post=this.posts.find(post=>post.id===id) if(!post){return "#"+this.getPostNumByPostId(id)} const uid=post.uid const username=this.usersMap.get(uid).username if(!username){return "#"+this.getPostNumByPostId(id)} return username},getPostNumByPostId(id){const post=this.posts.find(post=>post.id===id) return post.num},getPostById(id){const post=this.posts.find(post=>post.id===id) return post},getPostByNum(num){const post=this.posts.find(post=>post.num===num) return post},getAvatarByUid(uid){const avatar=this.usersMap.get(uid)?.avatar if(!avatar){return this.getRandomAvatar()} return avatar},getAvatarByPostNum(num){const post=this.posts.find(post=>post.num===num) if(!post){return this.getRandomAvatar()} const uid=post.uid return this.getAvatarByUid(uid)},getRandomAvatar(){const num=Math.floor(Math.random()*100) return "https://randomuser.me/api/portraits/men/"+num+".jpg"},getUrlByUid(uid){const url=this.usersMap.get(uid)?.url if(!url){return ""} return url},getTextByPostNum(num){const post=this.posts.find(post=>post.num===num) if(!post||!post.content){return '点击跳转到#'+num+'查看'} const parser=new DOMParser() const doc=parser.parseFromString(post.content,'text/html') const text=doc.body.textContent||'' return text.slice(0,100)},addHeadingIds(){const content=document.getElementById('post-content-0') if(!content){this.nav.showTOC=false return} const headings=content.querySelectorAll('h2, h3, h4') headings.forEach((heading,index)=>{if(!heading.id){heading.id=`toc-nav-${index}`}}) if(headings.length==0){this.nav.showTOC=false}},async doSearch(keywords){this.search.loading=true try{const response=await axios.post('/fapi/v1/search',{keywords:keywords,}) if(response.data.code===0){if(response.data.data.hash&&response.data.data.hash.length===32){window.location.href="/s/"+response.data.data.hash}else{this.failureAlert('搜索失败: 搜索服务异常')}}else{this.failureAlert('搜索失败: '+response.data.msg)}}catch(error){this.failureAlert('搜索失败: '+error)} this.search.loading=false},debounce(fn,delay){let timer=null return function(...args){if(timer)clearTimeout(timer) timer=setTimeout(()=>{fn.apply(this,args)},delay);};},},watch:{'nav.post.targetPage':{handler:async function(newV,oldV){this.toPage()},immediate:false},},} const vuetify=createVuetify({defaults:{global:{ripple:true,},},}) const app=createApp(App) app.use(vuetify).mount("#app")