该json生成器可搭配Nezha v1使用
在cloudflare中创建workers,填入以下代码
worker.js

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const html = `<!DOCTYPE html>
  <html lang="zh_cn">
  <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>JSON 生成器</title>
      <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
      <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
      <script src="https://unpkg.com/element-ui/lib/index.js"></script>
      <style>
          #app {
              width: 50vw;
              min-width: 1000px;
              margin: auto;
              margin-top: 30px;
              padding: 20px;
              box-shadow: 0 0 10px rgba(0, 0, 0, .5);
              border-radius: 30px;
          }
          .el-select .el-input {
              width: 130px;
          }
          .input-with-select .el-input-group__prepend {
              background-color: #fff;
          }
      </style>
  </head>
  <body>
    ${originalHtml}
  </body>
  </html>`

  return new Response(html, {
    headers: {
      'Content-Type': 'text/html;charset=UTF-8',
      'Access-Control-Allow-Origin': '*',
      'Cache-Control': 'public, max-age=3600'
    }
  })
}

const originalHtml = `<div id="app">
    <el-row :gutter="20">
        <el-col :xs="24" :sm="12">
            <el-form :model="form" label-width="100px">
                <!-- Billing Data Form -->
                <el-divider content-position="left">Billing Data Form</el-divider>
                <el-form-item label="开始日期" prop="startDate">
                    <el-date-picker v-model="form.billingDataMod.startDate" type="datetime" placeholder="选择开始日期"
                        format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss+08:00">
                    </el-date-picker>
                </el-form-item>

                <el-form-item label="结束日期" prop="endDate">
                    <el-date-picker v-model="form.billingDataMod.endDate" type="datetime" placeholder="选择结束日期"
                        format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss+08:00"
                        :disabled="form.billingDataMod.isIndefinite">
                    </el-date-picker>
                    <el-checkbox v-model="form.billingDataMod.isIndefinite">无期限</el-checkbox>
                </el-form-item>

                <el-form-item label="自动续期" prop="autoRenewal">
                    <el-switch v-model="form.billingDataMod.autoRenewal" active-text="是" inactive-text="否"
                        active-value="1" inactive-value="0" :disabled="isUnofficial">
                    </el-switch>
                </el-form-item>

                <el-form-item label="计费周期" prop="cycle">
                    <el-select v-model="form.billingDataMod.cycle" placeholder="选择计费周期">
                        <el-option label="月" value="月"></el-option>
                        <el-option label="季" value="季"></el-option>
                        <el-option label="半年" value="半年"></el-option>
                        <el-option label="年" value="年"></el-option>
                    </el-select>
                </el-form-item>

                <el-form-item label="金额" prop="amount">
                    <el-checkbox v-model="isAmountUnitBefore">前单位<span> 例如:¥9.99</span></el-checkbox>
                    <el-checkbox v-model="isAmountUnitAffter">后单位<span> 例如:9.99CNY</span></el-checkbox>
                    <el-input v-model="form.billingDataMod.amount" placeholder="输入金额"
                        :disabled="form.billingDataMod.isAmountFree || form.billingDataMod.isAmountPAYG">
                        <!-- 前单位组件 -->
                        <el-select v-model="amountBeforeUnit" slot="prepend" placeholder="请选择" filterable
                            :disabled="form.billingDataMod.isAmountFree || form.billingDataMod.isAmountPAYG"
                            v-if="isAmountUnitBefore" allow-create>
                            <el-option label="人民币 ¥" value="¥"></el-option>
                            <el-option label="美元 $" value="$"></el-option>
                            <el-option label="欧元 €" value="€"></el-option>
                            <el-option label="港币 HK$" value="HK$"></el-option>
                            <el-option label="加币 C$" value="C$"></el-option>
                            <el-option label="英镑 £" value="£"></el-option>
                        </el-select>
                        <!-- 后单位组件 -->
                        <el-select v-model="amountAffterUnit" slot="append" placeholder="请选择" filterable
                            :disabled="form.billingDataMod.isAmountFree || form.billingDataMod.isAmountPAYG"
                            v-if="isAmountUnitAffter" allow-create>
                            <el-option label="人民币 CNY" value="CNY"></el-option>
                            <el-option label="美元 USD" value="USD"></el-option>
                            <el-option label="欧元 EUR" value="EUR"></el-option>
                            <el-option label="港币 HKD" value="HKD"></el-option>
                            <el-option label="加币 CAD" value="CAD"></el-option>
                            <el-option label="英镑 GBP" value="GBP"></el-option>
                        </el-select>
                    </el-input>
                    <el-checkbox v-model="form.billingDataMod.isAmountFree"
                        :disabled="form.billingDataMod.isAmountPAYG">免费</el-checkbox>
                    <el-checkbox v-model="form.billingDataMod.isAmountPAYG"
                        :disabled="form.billingDataMod.isAmountFree">按量收费</el-checkbox>
                </el-form-item>

                <!-- Plan Data Form -->
                <el-divider content-position="left">Plan Data Form
                    <el-checkbox v-model="isNoPlanDataForm">不开启</el-checkbox>
                </el-divider>
                <el-form-item label="带宽" prop="bandwidth">
                    <el-input placeholder="输入带宽" v-model="form.planDataMod.bandwidth" class="input-with-select"
                        :disabled="isNoPlanDataForm">
                        <el-select v-model="form.planDataMod.bandwidthUnit" slot="append" placeholder="请选择"
                            :disabled="isNoPlanDataForm">
                            <el-option label="Mbps" value="Mbps"></el-option>
                            <el-option label="Gbps" value="Gbps"></el-option>
                            <el-option label="无限制" value="Unlimited"></el-option>
                        </el-select>
                    </el-input>
                </el-form-item>

                <el-form-item label="流量" prop="trafficVol">
                    <el-input placeholder="输入流量限制" v-model="form.planDataMod.trafficVol" class="input-with-select"
                        :disabled="isNoPlanDataForm">
                        <el-select v-model="form.planDataMod.trafficUnit" slot="append" placeholder="请选择"
                            :disabled="isNoPlanDataForm">
                            <el-option label="MB/月" value="MB/月"></el-option>
                            <el-option label="TB/月" value="TB/月"></el-option>
                            <el-option label="GB/月" value="GB/月"></el-option>
                            <el-option label="PB/月" value="PB/月"></el-option>
                        </el-select>
                    </el-input>
                </el-form-item>

                <el-form-item label="流量类型" prop="trafficType">
                    <el-select v-model="form.planDataMod.trafficType" placeholder="选择流量类型" :disabled="isNoPlanDataForm">
                        <el-option label="只单向上行流量计费" value="1"></el-option>
                        <el-option label="双向上下行流量同时计费" value="2"></el-option>
                        <el-option label="取入栈和出栈最大的计费 [ Max(In, Out) ]" value="3"></el-option>
                    </el-select>
                </el-form-item>

                <el-form-item label="IPv4" prop="IPv4">
                    <el-switch v-model="form.planDataMod.IPv4" active-text="有" inactive-text="无" active-value="1"
                        inactive-value="0" :disabled="isNoPlanDataForm">
                    </el-switch>
                </el-form-item>

                <el-form-item label="IPv6" prop="IPv6">
                    <el-switch v-model="form.planDataMod.IPv6" active-text="有" inactive-text="无" active-value="1"
                        inactive-value="0" :disabled="isNoPlanDataForm">
                    </el-switch>
                </el-form-item>

                <el-form-item label="网络路由" prop="networkRoute">
                    <el-input v-model="form.planDataMod.networkRoute" placeholder="输入网络路由,使用','分割" :disabled="isNoPlanDataForm">
                    </el-input>
                </el-form-item>

                <el-form-item label="额外信息" prop="extra">
                    <el-input v-model="form.planDataMod.extra" placeholder="输入额外信息,使用','分割" :disabled="isNoPlanDataForm">
                    </el-input>
                </el-form-item>
            </el-form>
        </el-col>
        <el-col :xs="24" :sm="12">
            <!-- JSON Output -->
            <el-input type="textarea" :rows="20" :value="jsonOutput" readonly></el-input>
            <div style="height: 10px;"></div>
            <el-button type="primary" @click="generateJson">生成 JSON</el-button>
        </el-col>
    </el-row>
</div>

<script>
new Vue({
    el: '#app',
    watch: {
        isAmountUnitBefore(n) {
            if (n) {
                this.isAmountUnitAffter = false;
            }
        },
        isAmountUnitAffter(n) {
            if (n) {
                this.isAmountUnitBefore = false;
            }
        },
        'form.billingDataMod.cycle'(n) {
            if (/\d年|天/.test(n)) {
                this.$alert(\`您使用的<strong>\${n}</strong>的计费周期,并不是官方支持的参数,<br /><strong>无法自动刷新及计算规划中的账单统计报表,<br />并禁用autoRenewal及cycle字段</strong>\`, '温馨提示', {
                    confirmButtonText: '确定',
                    dangerouslyUseHTMLString: true,
                });
                this.form.billingDataMod.autoRenewal = 0;
                this.isUnofficial = true;
            } else {
                this.isUnofficial = false;
            }
        },
    },
    data() {
        return {
            isNoPlanDataForm: false,
            isUnofficial: false,
            amountUnitOrder: 2,
            isAmountUnitBefore: true,
            isAmountUnitAffter: false,
            amountBeforeUnit: "¥",
            amountAffterUnit: "CNY",
            form: {
                billingDataMod: {
                    startDate: new Date(),
                    endDate: new Date(),
                    isIndefinite: false,
                    autoRenewal: '1',
                    cycle: '月',
                    amount: '1',
                    isAmountFree: false,
                    isAmountPAYG: false
                },
                planDataMod: {
                    bandwidth: '30',
                    bandwidthUnit: 'Mbps',
                    trafficVol: '1',
                    trafficUnit: 'TB/月',
                    trafficType: '1',
                    IPv4: '1',
                    IPv6: '1',
                    networkRoute: '4837',
                    extra: ''
                }
            },
            jsonOutput: ''
        };
    },
    methods: {
        generateJson() {
            // 复制对象
            let jo = JSON.parse(JSON.stringify(this.form));

            // 处理无期限的情况
            if (jo.billingDataMod.isIndefinite) {
                jo.billingDataMod.endDate = '0000-00-00T23:59:59+08:00';
            }

            // 宽带单位
            if (jo.planDataMod.bandwidthUnit == "Unlimited") {
                jo.planDataMod.bandwidth = "Unlimited";
            } else {
                jo.planDataMod.bandwidth += jo.planDataMod.bandwidthUnit;
            }

            // 流量单位
            jo.planDataMod.trafficVol += jo.planDataMod.trafficUnit;

            // 金额单位
            if (this.isAmountUnitBefore) {
                jo.billingDataMod.amount = this.amountBeforeUnit + jo.billingDataMod.amount;
            }
            if (this.isAmountUnitAffter) {
                jo.billingDataMod.amount += this.amountAffterUnit;
            }

            // 处理使用非官方计费周期
            if (this.isUnofficial) {
                jo.billingDataMod.amount += "/" + jo.billingDataMod.cycle;
                jo.billingDataMod.cycle = "";
            }

            // 处理amount
            if (jo.billingDataMod.isAmountFree) {
                jo.billingDataMod.amount = '0';
            }
            if (jo.billingDataMod.isAmountPAYG) {
                jo.billingDataMod.amount = '-1';
            }

            // 删除辅助参数
            delete jo.billingDataMod.isIndefinite;
            delete jo.billingDataMod.isAmountFree;
            delete jo.billingDataMod.isAmountPAYG;
            delete jo.planDataMod.bandwidthUnit;
            delete jo.planDataMod.trafficUnit;

            // 处理不要Plan Data Form
            if(this.isNoPlanDataForm){
                delete jo.planDataMod;
            }

            // 返回结果
            this.jsonOutput = JSON.stringify(jo, null, 4);
        }
    }
});
</script>`

最后修改:2025 年 02 月 21 日
如果觉得我的文章对你有用,请随意赞赏