开发者配置项、开发者选项自定义

news2024/11/16 23:38:09

devOptions.vue源码

<!-- 开发者选项 (Ctrl+Alt+Shift+D)-->
<template>
  <div :class="$options.name" v-if="visible">
    <el-dialog
      :custom-class="`sg-el-dialog`"
      :append-to-body="true"
      :close-on-click-modal="false"
      :close-on-press-escape="true"
      :destroy-on-close="true"
      :fullscreen="false"
      :show-close="true"
      :title="`开发者配置项`"
      :width="`520px`"
      :visible.sync="visible"
      style="animation: none"
    >
      <template v-if="showDevOptions">
        <div style="margin: -20px 0">
          <!-- 这里添加弹窗内容 -->
          <el-select
            style="width: 100%"
            v-model="selectGroupValue_sgAPI"
            @change="changeGroupSelect_sgAPI"
            :placeholder="`请选择`"
          >
            <el-option-group
              v-for="group in selectGroupOptions_sgAPI"
              :key="group.label"
              :label="group.label"
            >
              <el-option
                v-for="item in group.options"
                :key="item.value"
                :label="`${item.label}${
                  item.value === `custom` ? `` : `[${item.value}]`
                }`"
                :value="item.value"
                :disabled="item.disabled"
              />
            </el-option-group>
          </el-select>
          <el-input
            v-if="showCustomSgAPI"
            style="width: 100%; margin-top: 10px"
            ref="input"
            v-model.trim="inputValue_sgAPI"
            maxlength="20"
            :show-word-limit="false"
            :placeholder="`请输入接口路径(带http或https协议)`"
            @focus="$refs.input.select()"
            clearable
          />

          <el-divider />

          <el-button type="danger" @click="oneClickRestore" style="width: 100%"
            >一键还原所有数据</el-button
          >
          <el-alert
            style="margin-top: 10px"
            :closable="true"
            :close-text="``"
            :description="``"
            :effect="'light'"
            :show-icon="true"
            :title="`警告!该操作将丢失所有上传资源数据和配置信息!请谨慎操作!`"
            :type="'error'"
          >
          </el-alert>

          <el-dialog
            :custom-class="'sg-el-dialog'"
            :append-to-body="true"
            :close-on-click-modal="true"
            :close-on-press-escape="true"
            :destroy-on-close="true"
            :fullscreen="false"
            :show-close="true"
            :title="`输入登录密码执行一键还原`"
            :width="'300px'"
            :visible.sync="dialogVisible_oneClickRestore"
          >
            <div>
              <!-- 这里添加弹窗内容 -->
              <el-input
                style="width: 100%"
                ref="psw"
                type="password"
                v-model="psw"
                show-password
                maxlength="20"
                :show-word-limit="false"
                :placeholder="`请输入6位以上的密码`"
                @focus="$refs.psw.select()"
                clearable
              />
            </div>
            <div slot="footer">
              <el-button type="info" @click="dialogVisible_oneClickRestore = false" plain
                >取消</el-button
              >
              <el-button type="primary" @click="confirmRestore">确定</el-button>
            </div>
          </el-dialog>
        </div>
        <div slot="footer" style="display: flex">
          <el-button type="info" @click="visible = false" plain style="flex-grow: 1"
            >取消</el-button
          >
          <el-button type="danger" @click="reset">重置配置项</el-button>
          <el-button type="primary" @click="save">确定并刷新页面</el-button>
          <el-button type="success" @click="change2Local">模拟本地环境</el-button>
        </div>
      </template>

      <template v-else>
        <div style="margin: -20px 0 -10px; display: flex; flex-wrap: nowrap">
          <el-input
            style="width: 100%; margin-right: 10px"
            ref="psw"
            type="password"
            v-model="psw"
            show-password
            maxlength="20"
            :show-word-limit="false"
            :placeholder="`请输入开发者密码`"
            @focus="$refs.psw.select()"
            clearable
            @keyup.enter.native="enterSet"
          />
          <el-button type="primary" @click="enterSet">进入设置</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script>
export default {
  name: "api",
  components: {},
  data() {
    return {
      visible: false,
      showDevOptions: false,
      showCustomSgAPI: false,
      inputValue_sgAPI: ``,
      psw: ``, //开发者密码
      dialogVisible_oneClickRestore: false,

      selectGroupOptions_sgAPI: this.$global.devConfig.sgAPI,
      selectGroupValue_sgAPI: "",
    };
  },
  props: [
    "value", //是否显示
    "disabled", //是否禁用
    "data",
  ],
  computed: {},
  watch: {
    value: {
      handler(d) {
        this.visible = d;
        if (d) {
          this.psw = ``;
          this.showDevOptions = false;
          this.init();
        }
      },
      deep: true,
      immediate: true,
    },
    visible(d) {
      this.$emit("input", d);
    }, //是否显示(双向绑定)
    selectGroupValue_sgAPI(d) {
      this.showCustomSgAPI = d === `custom`;
    },
  },
  created() {},
  mounted() {},
  destroyed() {},
  methods: {
    change2Local(d) {
      let query = this.$route.query;
      query.isLocal = true;

      let href = `${this.$g.getWebURLBeforeHash()}/${
        this.$router.resolve({
          path: this.$route.path,
          query,
        }).href
      }`;
      window.open(href, "_target");
      this.$g.screen.closeWebPage();
    },
    enterSet(d) {
      if (!this.psw)
        return this.$message.error(this.$refs.psw.$el.querySelector("input").placeholder);

      if (this.psw == this.$global.devConfig.devPassword) {
        this.showDevOptions = true;
      } else {
        this.showDevOptions = false;
        this.$message.error(`密码不正确`);
      }
    },
    //初始化
    init({ d } = {}) {
      let sgAPI = localStorage.sgAPI || this.$d.API_ROOT_URL;
      this.selectGroupValue_sgAPI = this.getGroup_sgAPI(sgAPI).value;
      if (this.selectGroupValue_sgAPI === `custom`) {
        this.inputValue_sgAPI = sgAPI;
      }
    },
    getGroup_sgAPI(value) {
      let aa = this.selectGroupOptions_sgAPI;
      for (let i = 0, len = aa.length; i < len; i++) {
        let options = aa[i].options;
        let option = options.find((v) => v.value == value);
        if (option) return option;
      }
      return { value: `custom`, label: `其他` };
    },
    changeGroupSelect_sgAPI(d) {},
    valid(d) {
      if (this.selectGroupValue_sgAPI === `custom`) {
        if (!this.$g.checkEverything(`httpurl`, this.inputValue_sgAPI))
          return this.$message.error(`请输入正确的网址URL`);
      }
    },
    reload(d) {
      this.visible = false;
      location.reload(true);
    },
    reset(d) {
      delete localStorage.sgAPI;

      this.reload();
    },
    save(d) {
      if (this.valid()) return;
      if (this.selectGroupOptions_sgAPI === `custom`) {
        localStorage.sgAPI = this.inputValue_sgAPI;
      } else {
        localStorage.sgAPI = this.selectGroupValue_sgAPI;
      }
      this.reload();
    },
    oneClickRestore(d) {
      this.$confirm(
        `<b  style="color: #F56C6C;font-weight: bold;font-size: 24px;" >此操作将永久删除所有数据和配置信息,是否继续?</b>`,
        `提示`,
        {
          dangerouslyUseHTMLString: true,
          confirmButtonText: `确定`,
          cancelButtonText: `取消`,
          type: "error",
        }
      )
        .then(() => {
          //this.$message.success(`删除成功`);
          this.$confirm(
            `<b  style="color: #F56C6C;font-weight: bold;font-size: 24px;" >请最后一次确认是否要删除所数据和配置信息?</b>`,
            `提示`,
            {
              dangerouslyUseHTMLString: true,
              confirmButtonText: `确定`,
              cancelButtonText: `取消`,
              type: "error",
            }
          )
            .then(() => {
              this.dialogVisible_oneClickRestore = true;
              //this.$message.success(`删除成功`);
            })
            .catch(() => {
              //this.$message(`已取消删除`);
            });
        })
        .catch(() => {
          //this.$message(`已取消删除`);
        });
    },
    valid_oneClickRestore(d) {
      if (!this.psw) return this.$message.error("请输入密码");
      if (this.psw.length < 6) return this.$message.error("请输入正确的密码");
    },
    confirmRestore(d) {
      if (this.valid_oneClickRestore()) return;

      let data = {
        PSW: this.psw,
        sgLog: `前端请求来源:${this.$options.name}一键还原`,
      };
      this.$d.system_restore_doRestore({
        data,
        r: {
          l: { show: () => (this.loading = true), close: () => (this.loading = false) },
          s: (d) => {
            this.dialogVisible = false;
            this.$message.success(`一键还原成功`);
            setTimeout(() => {
              this.$global.exit({ clearCookie: true });
            }, 1000);
            // console.log("【成功】", d);
          },
        },
      });
    },
  },
};
</script>
<style lang="scss" scoped>
.api {
}
</style>

配置项

// 开发者配置项----------------------------------------
devConfig: {
    devPassword: `******`,//开发者密码
    sgAPI: [
        {
            label: '测试环境',
            options: [
                { value: `//shuzhiqiang.com:8088/rp`, label: '***环境名称' },
                { value: `//shuzhiqiang.com:8088/rp`, label: '***环境名称' },
            ],

        },
        {
            label: '生产环境',
            options: [
                { value: `//shuzhiqiang.com/api`, label: '***环境名称' },
                { value: `//shuzhiqiang.com:30107/api`, label: '***环境名称' },
            ]
        },
        {
            label: '其他',
            options: [
                { value: `custom`, label: '自定义' },
            ]
        },
    ]
},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1839392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装pytorch环境

安装&#xff1a;Anaconda3 通过命令行查显卡nvidia-smi 打开Anacanda prompt 新建 conda create -n pytorch python3.6 在Previous PyTorch Versions | PyTorch选择1.70&#xff0c;安装成功&#xff0c;但torch.cuda.is_available 返回false conda install pytorch1.7.0…

银行数仓项目实战(四)--了解银行业务(存款)

文章目录 项目准备存款活期定期整存整取零存整取存本取息教育储蓄定活两便通知存款 对公存款对公账户协议存款 利率 项目准备 &#xff08;贴源层不必写到项目文档&#xff0c;因为没啥操作没啥技术&#xff0c;只是数据。&#xff09; 可以看到&#xff0c;银行的贴源层并不紧…

keil MDK自动生成带版本bin文件

作为嵌入式单片机开发&#xff0c;在Keil MDK&#xff08;Microcontroller Development Kit&#xff09;中开发完编译完后&#xff0c;经常需要手动进行版本号添加用于发版&#xff0c;非常麻烦&#xff0c;如果是对外发行的话&#xff0c;更容易搞错&#xff0c;特此码哥提供一…

基于若依的ruoyi-nbcio流程管理系统增加所有任务功能(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

最好用的智能猫砂盆存在吗?自用分享智能猫砂盆测评!

在现代都市的忙碌生活中&#xff0c;作为一名上班族&#xff0c;经常因为需要加班或频繁出差而忙碌得不可开交。急匆匆地出门&#xff0c;却忘了给猫咪及时铲屎。但是大家要知道&#xff0c;不及时清理猫砂盆会让猫咪感到不适&#xff0c;还会引发各种健康问题&#xff0c;如泌…

无问芯穹Qllm-Eval:制作多模型、多参数、多维度的量化方案

前言 近年来&#xff0c;大语言模型&#xff08;Large Models, LLMs&#xff09;受到学术界和工业界的广泛关注&#xff0c;得益于其在各种语言生成任务上的出色表现&#xff0c;大语言模型推动了各种人工智能应用&#xff08;例如ChatGPT、Copilot等&#xff09;的发展。然而…

2021 hnust 湖科大 C语言课程设计报告+代码+流程图源文件+指导书

2021 hnust 湖科大 C语言课程设计报告代码流程图源文件指导书 目录 报告 下载链接 https://pan.baidu.com/s/14NFsDbT3iS-a-_7l0N5Ulg?pwd1111

D111FCE01LC2NB70带流量调节派克比例阀

D111FCE01LC2NB70带流量调节派克比例阀 派克比例阀&#xff1a;由于采用&#xff08;秉圣135陈工6653询3053&#xff09;电液混合控制技术&#xff0c;响应速度更快、精度更高、控制更平稳。同时&#xff0c;由于采用高质量的材料制造&#xff0c;具有较高的承压能力和抗磨损性…

生活实用口语柯桥成人外语培训机构“客服”用英文怎么说?

● 01. “客服”英语怎么说&#xff1f; ● 我们都知道“客服”就是“客户服务”&#xff0c; 所以Customer Service就是#15857575376客服的意思。 但是这里的“客服”指代的不是客服人员&#xff0c; 而是一种Service服务。 如果你想要表达客服人员可以加上具体的职位&a…

面向对象前置(java)

文章目录 环境配置相关如何在 cmd 任何路径下中 使用 javac(编译) 和 java(运行) 指令path变量的含义javac(编译&#xff09;使用java(运行&#xff09;的使用public class 和 class 的区别 标识符命名规则命名规范 字面量字符串拼接变量的作用域转移字符类型转换接收用户键盘输…

Adobe XD是否收费?试试这几款超值的免费软件吧!

Adobe XD是一站式的 UX/UI 设计平台&#xff0c;设计师可以使用Adobe XD完成移动应用app界面设计、网页设计、原型设计等。Adobe XD也是一款结合原型和设计&#xff0c;提供工业性能的跨平台设计产品。而Adobebe。 XD跨平台的特点得到了很好的弥补 Sketch 没有 Windows 版本的缺…

【Java基础】 线程状态转化

Java 中的线程状态转换是指线程在其生命周期中可以经历的不同状态以及这些状态之间的转换。了解线程的状态转换对于有效地管理和调试多线程应用程序非常重要。Java 提供了 Thread.State 枚举来描述线程的状态。 状态 NEW&#xff08;新建&#xff09;&#xff1a; 线程被创建&…

STemWin在Windows上仿真运行环境配置

文章目录 一、STemWin介绍二、emWin必用的2个工具2.1 PC仿真器2.2 GUIBuilder图形化设计工具三、安装VS2022四、打开emwin仿真工程五、常见的配置修改5.1 运行内存修改5.2 LCD显示屏尺寸的修改一、STemWin介绍 emWin(Embedded Wizard Graphics Library)是Segger公司开发的嵌…

深入二进制安全:全面解析Protobuf

前言 近两年&#xff0c;Protobuf结构体与Pwn结合的题目越来越多。 23年和24年Ciscn都出现了Protobuf题目&#xff0c;24年甚至还出现了2道。 与常规的Pwn题利用相比&#xff0c;只是多套了一层Protobuf的Unpack操作。 本文包含Protobuf环境安装、相关语法、编译运行以及pb…

软件工程考试题备考

文章目录 前言一、二、1.2 总结 前言 一、 B D C 类图、对象图、包图 其他系统及用户 功能需求 用例 人、硬件或其他系统可以扮演的角色7. D C 数据 原型/系统原型;瀑布 A 功能;功能需求 D 数据存储;圆形/圆角矩形;矩形 C T;T;F C C B C D C …

2024年应用科学、航天航空与核科学国际学术会议(ICASANS 2024)

2024年应用科学、航天航空与核科学国际学术会议&#xff08;ICASANS 2024&#xff09; 2024 International Academic Conference on Applied Science, Aerospace and Nuclear Science&#xff08;ICASANS 2024&#xff09; 会议简介&#xff1a; 在科技日新月异的今天&#xf…

xcode报错合集,你都遇到过哪些跳不过的坑

1.报错Consecutive declarations on a line must be separated by ; 其实我这里是用因为创建了一个结构体&#xff0c;然后在没有使用State的情况下&#xff0c;修改它的属性了 当然加上State依然报错&#xff1a; 应该在UI事件中修改&#xff1a;

Go 1.19.4 字符串-Day 06

1. 编码表 计算机中只有数字&#xff08;0和1&#xff09;&#xff0c;如果有一个字符串&#xff08;字符串由字符组成&#xff09;要存储&#xff0c;在内存中该如何表达这个字符串&#xff1f; 那么所有的字符都必须数字化&#xff0c;也就是一个字符对应一个特定的数字&…

龙虎斗(2018)c++

题目描述 输入 输出 样例输入&#xff0c;输出 输入 #1 输出 #1 6 2 2 3 2 3 2 3 4 6 5 2 输入 #2 输出 #2 6 …

Shopee菲律宾本土店允许中途无理由退货,如何应对退货后库存混乱问题?

Shopee菲律宾本土店最近实施了一项新政策&#xff0c;自2024年6月10日起&#xff0c;允许买家在商品仍在运输途中申请退货与退款&#xff0c;此即“在途退货/退款”功能&#xff0c;主要的目的是为了提升买家的购物体验&#xff0c;增强市场竞争力。 图源&#xff1a;Shopee菲律…