根据后端返回下拉请求地址,前端动态请求拿到下拉数据渲染

完整代码如下:

<template>

  <!-- 资源列表页 -->

  <div>

    <div>

      <i

        @click="$router.go(-1)"

        style="

          color: #409eff;

          cursor: pointer;

          margin-right: 5px;

          font-size: 18px;

        "

        class="el-icon-back"

      ></i

      >{{ getCurrentPageTitle }}

    </div>

    <br />

    <el-row class="contentTop">

      <el-col :span="12">

        <el-button type="primary" size="mini" @click="doAdd">新建</el-button>

        <el-button

          size="mini"

          @click="

            drawerImportant = true;

            active = 0;

            currentFile = null;

          "

          >导入</el-button

        >

        <!-- <el-button size="mini">批量更新</el-button>

        <el-button size="mini">删除</el-button> -->

        <el-button size="mini" @click="doExport">导出</el-button>

        <el-button size="mini" @click="doExportTemplate">导出模板</el-button>

      </el-col>

      <el-col :span="10">

        <el-input

          placeholder="请输入内容"

          v-model="inputValue"

          class="input-with-select"

          size="mini"

          clearable

        >

          <el-select

            v-model="selectValue"

            slot="prepend"

            style="width: 120px"

            placeholder="请选择"

            clearable

            @change="changeSelect"

          >

            <el-option

              :label="item.label"

              :value="item.value"

              v-for="item in searchList"

              :key="item.value"

            ></el-option>

          </el-select>

          <el-button

            slot="append"

            icon="el-icon-search"

            @click="doSearch"

          ></el-button>

        </el-input>

      </el-col>

      <el-col :span="0.5">

        <el-button

          icon="el-icon-setting"

          size="mini"

          @click="doSetting"

        ></el-button>

      </el-col>

    </el-row>

    <br />

    <el-row>

      <!-- @cell-click="doClickCell" -->

      <el-table

        :data="tableInfo.list"

        size="mini"

        @selection-change="handleSelectionChange"

        fit

        :stripe="true"

        :row-key="rowKey"

        ref="multipleTable"

        max-height="500"

        border

        id="tableId"

        @sort-change="sortChange"

      >

        <!-- <el-table-column

          type="selection"

          :reserve-selection="true"

          width="55"

        ></el-table-column> -->

        <el-table-column

          v-for="(item, index) in tableInfo.columns"

          v-if="!item.hide"

          :prop="item.name"

          :label="item.label"

          :key="index"

          :show-overflow-tooltip="true"

          sortable="custom"

        >

          <!-- <template slot-scope="scope">

            <el-button

              v-if="item.name == 'example'"

              type="text"

              @click="doClickCell(scope.row)"

              >{{ scope.row[item.name] }}</el-button

            >

            <span v-else>{{ scope.row[item.name] }}</span>

          </template> -->

        </el-table-column>

        <el-table-column fixed="right" label="操作" width="180">

          <template slot-scope="scope">

            <el-button @click="doClickCell(scope.row)" type="text" size="small"

              >详情</el-button

            >

            <el-button

              @click.stop="deleteRow(scope.row.id)"

              type="text"

              size="small"

              >删除</el-button

            >

          </template>

        </el-table-column>

      </el-table>

      <div style="text-align: center">

        <el-pagination

          @size-change="handleSizeChange"

          @current-change="handleCurrentChange"

          :current-page="paramsPage.pageNum"

          :page-sizes="[10, 20, 30, 50, 100]"

          :page-size="paramsPage.pageSize"

          layout="total, sizes, prev, pager, next, jumper"

          :total="tableInfo.total"

        ></el-pagination>

      </div>

    </el-row>

    <el-drawer

      title="列表显示属性配置"

      :visible.sync="drawer"

      direction="rtl"

      size="45%"

    >

      <el-transfer

        style="text-align: left; display: inline-block"

        v-model="transferValue"

        filterable

        :left-default-checked="[]"

        :right-default-checked="[]"

        :render-content="renderFunc"

        :titles="['未选属性', '已选属性']"

        :format="{

          noChecked: '${total}',

          hasChecked: '${checked}/${total}',

        }"

        :props="{

          key: 'name',

          label: 'label',

        }"

        @change="handleChange"

        :data="dataList"

      >

      </el-transfer>

      <br />

      <br />

      <div style="padding: 0 20px">

        <el-button type="primary" size="small" @click="doSettingConfirm"

          >应用</el-button

        >

        <el-button size="small" @click="drawer = false">取消</el-button>

        <el-button style="float: right" size="small" @click="doRest"

          >还原默认</el-button

        >

      </div>

    </el-drawer>

    <el-drawer

      title="创建"

      :visible.sync="drawerAdd"

      direction="rtl"

      size="30%"

    >

      <div style="padding-left: 20px">

        <el-form

          label-position="top"

          label-width="80px"

          :model="formLabelAlign"

        >

          <el-collapse

            v-model="activeNames"

            v-for="(item, index) in modelList"

            :key="index"

          >

            <el-collapse-item :title="item.name" :name="index">

              <el-row :gutter="40" v-for="(v, i) in item.infoList" :key="i">

                <el-col :span="20">

                  <el-form-item :label="v.label">

                    <el-input

                      v-if="v.typeValue == 'input'"

                      v-model="formLabelAlign[v.name]"

                      placeholder="请输入"

                      style="width: 570px"

                    ></el-input>

                    <el-input

                      v-else-if="v.typeValue == 'number'"

                      type="number"

                      v-model="formLabelAlign[v.name]"

                      placeholder="请输入"

                      style="width: 570px"

                    ></el-input>

                    <el-date-picker

                      v-else-if="v.typeValue == 'date'"

                      value-format="yyyy-MM-dd"

                      type="date"

                      v-model="formLabelAlign[v.name]"

                      placeholder="请输入"

                      style="width: 570px"

                    ></el-date-picker>

                    <el-date-picker

                      v-else-if="v.typeValue == 'time'"

                      value-format="yyyy-MM-dd HH:mm:ss"

                      type="datetime"

                      v-model="formLabelAlign[v.name]"

                      placeholder="请输入"

                      style="width: 570px"

                    ></el-date-picker>

                    <el-select

                      v-else-if="

                        v.typeValue == 'select' &&

                        v[`valueAttribute${i}`] &&

                        v[`valueAttribute${i}`].length > 0

                      "

                      v-model="formLabelAlign[v.name]"

                      clearable

                      style="width: 570px"

                    >

                      <el-option

                        v-for="w in v[`valueAttribute${i}`]"

                        :key="w.key"

                        :label="w.value"

                        :value="w.key"

                      >

                      </el-option>

                    </el-select>

                    <el-cascader

                      v-else-if="

                        v.typeValue == 'isCascade' &&

                        v[`valueAttribute${i}`] &&

                        v[`valueAttribute${i}`].length > 0

                      "

                      v-model="formLabelAlign[v.name]"

                      :options="v[`valueAttribute${i}`]"

                      :props="propsCascader"

                      @change="handleChangeCas"

                    ></el-cascader>

                  </el-form-item>

                </el-col>

              </el-row>

            </el-collapse-item>

          </el-collapse>

          <div class="bottomButton">

            <el-button type="primary" @click="doConfirm">提交</el-button>

            <el-button @click="drawerAdd = false">取消</el-button>

          </div>

        </el-form>

      </div>

    </el-drawer>

    <el-drawer

      title="批量导入"

      :visible.sync="drawerImportant"

      direction="rtl"

      size="45%"

    >

      <div style="padding-left: 20px">

        <el-steps :active="active" finish-status="success" align-center>

          <el-step title="上传文件"></el-step>

          <el-step title="选择关联模型"></el-step>

        </el-steps>

        <div style="padding-left: 20px">

          <div v-if="active == 0">

            <div

              style="

                margin: 20px 0;

                background: rgb(255, 244, 226);

                border: 1px solid rgb(255, 223, 172);

              "

            >

              <i style="color: rgb(255, 156, 1)" class="el-icon-info"></i>

              说明:导入编辑需要先导出需要修改的实例,并完成编辑修改后才能进行导入编辑操作

            </div>

            <el-upload

              class="upload-demo"

              drag

              action

              multiple

              :http-request="uploadFiles"

            >

              <i class="el-icon-upload"></i>

              <div class="el-upload__text">

                将文件拖到此处,或<em>点击上传</em>

              </div>

              <div class="el-upload__tip" slot="tip">

                只能上传jpg/png文件,且不超过500kb

                <el-button

                  type="primary"

                  icon="el-icon-download"

                  size="mini"

                  @click="downloadTemplate"

                  >下载模板</el-button

                >

              </div>

            </el-upload>

          </div>

          <div style="margin: 20px 0" v-if="active == 1">

            <el-checkbox v-model="checked">是否导入关联的模型实例</el-checkbox>

          </div>

          <div style="margin-top: 20px">

            <el-button

              v-if="active == 0"

              type="primary"

              :disabled="!currentFile"

              @click="active = 1"

              >下一步</el-button

            >

            <el-button v-if="active == 1" @click="active = 0">上一步</el-button>

            <el-button v-if="active == 1" type="primary" @click="doImportant"

              >开始导入</el-button

            >

            <el-button @click="drawerImportant = false">取消</el-button>

          </div>

        </div>

      </div>

    </el-drawer>

  </div>

</template>

<script>

import { mapGetters, mapMutations } from "vuex";

import tableCell from "./tableCell";

import { unique } from "@/utils/index";

import {

  resourceList,

  deleteResource,

  queryResource,

  findAllModel,

  getAddress,

  exportTemplate,

  uploadResource,

  exportResource,

  exportResourceTemplate,

  addResource,

  batchUpdateField,

  findAll,

  querySelect,

} from "@/api/cmdb/model";

export default {

  data() {

    return {

      inputValue: "",

      select: "",

      valueCade: [],

      selectValue: "",

      drawer: false,

      drawerAdd: false,

      drawerImportant: false,

      checked: false,

      active: 0,

      activeNames: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],

      multipleSelection: [],

      searchList: [],

      modelList: [],

      currentArgs: [],

      formInline: {},

      formLabelAlign: {},

      currentFile: null,

      tableInfo: {

        columns: [],

        list: [],

        total: 0,

      },

      paramsPage: {

        pageNum: 1,

        pageSize: 10,

      },

      dataList: [], // 所有字段数据

      selectFieldList: [],

      transferValue: [], // 右侧数据

      renderFunc(h, option) {

        return (

          <span>

            {/* {option.key} - {option.label} */}

            {option.label}

          </span>

        );

      },

      propsCascader: {

        value: "key",

        label: "value",

        children: "child",

      },

    };

  },

  computed: {

    ...mapGetters(["getCurrentPageTitle", "getActiveModel"]),

  },

  // watch: {

  //   $route: {

  //     handler(to, from) {

  //       this.$set(this.tableInfo, "columns", tableCell[to.params.id]);

  //       this.paramsPage.pageSize = 10;

  //       this.paramsPage.pageNum = 1; //重置页面

  //     },

  //     immediate: true,

  //   },

  // },

  mounted() {

    this.getList();

    this.getSearchList();

    this.getFields();

  },

  methods: {

    ...mapMutations(["setDetailTitle", "setResourceId"]),

    // 当前模型详情查询(新建字段)

    getFields() {

      let params = {

        args: this.getActiveModel.uniqueId,

      };

      findAllModel(params)

        .then((res) => {

          if (res.code == 0) {

            this.modelList = res.data; // 当前模型下包含的分组

            this.modelList.forEach(v1 => {

              v1.infoList.forEach((v2,i2)=> {

                if(v2.typeValue == 'isCascade' || v2.typeValue == 'select') {

                  getAddress(v2.dateTypeValue,{}).then(res2 => {

                    v2[`valueAttribute${i2}`] = res2

                  })

                }

              })

            })

            // 列表字段显示隐藏

            let arr = [];

            res.data.forEach((v) => {

              arr.push(v.infoList);

            });

            this.dataList = arr.flat(); // 二维数组转一维

            // 右侧数据

            this.transferValue = this.dataList.map((v) => {

              if (v.show) {

                return v.name;

              }

            });

          } else {

            res.desc && this.$message.error(res.desc);

          }

        })

        .catch((err) => {

          err.desc && this.$message.error(err.desc);

        });

    },

    getList(id = "id", order = "", args) {

      let params = {

        currPage: this.paramsPage.pageNum,

        pageSize: this.paramsPage.pageSize,

        uniqueId: this.getActiveModel.uniqueId,

        args: args || [],

        sortName: id,

        sortValue: order == "descending" ? false : true, // true = ASC,false = DESC

      };

      resourceList(params)

        .then((res) => {

          if (res.code == 0) {

            this.tableInfo.columns = res.data.headers;

            this.tableInfo.list = res.data.bodyData.list;

            this.tableInfo.total = res.data.bodyData.total;

          } else {

            res.desc && this.$message.error(res.desc);

          }

        })

        .catch((err) => {

          err.desc && this.$message.error(err.desc);

        });

    },

    // 排序

    sortChange({ column, prop, order }) {

      // console.log(column, prop, order );

      this.getList(prop, order, []);

    },

    changeSelect(key) {

      this.currentKey = key;

    },

    // 按条件搜索

    doSearch() {

      // if (!this.currentKey) {

      //   return this.$message.warning("请选择需要查询的字段名称");

      // }

      let args = [

        {

          key: this.currentKey,

          value: this.inputValue,

          select: false, // true为下拉搜索,一般默认都是输入框

        },

      ];

      this.currentArgs = args;

      this.getList("id", "", this.inputValue ? args : []);

    },

    // 查询下拉

    getSearchList() {

      let params = {

        args: this.getActiveModel.uniqueId,

      };

      queryResource(params).then((res) => {

        if (res.code == 0) {

          this.searchList = res.data;

        }

      });

    },

    rowKey(row) {

      return row.id;

    },

    handleSizeChange(val) {

      this.paramsPage.pageSize = val;

      this.getList();

    },

    handleCurrentChange(val) {

      this.paramsPage.pageNum = val;

      this.getList();

    },

    //多选

    handleSelectionChange(val) {

      // console.log(val);

      this.multipleSelection = val;

    },

    doSetting() {

      this.drawer = true;

    },

    // 还原默认

    doRest() {

      this.dataList.forEach((v) => {

        v.createTime && delete v.createTime;

        v.updateTime && delete v.updateTime;

        // 第一次保存的设置true,其他都隐藏false

        if (v.showDefault) {

          v.show = true;

        } else {

          v.show = false;

        }

      });

      batchUpdateField(this.dataList)

        .then((res) => {

          if (res.code == 0) {

            this.drawer = false;

            this.getList();

            this.getFields();

            this.$message.success(res.desc);

          } else {

            this.drawer = false;

            res.desc && this.$message.error(res.desc);

          }

        })

        .catch((err) => {

          this.drawer = false;

          err.desc && this.$message.error(err.desc);

        });

    },

    // 字段显示配置--应用

    doSettingConfirm() {

      let arr = [];

      arr = this.selectFieldList.map((v) => {

        return v.showDefault;

      });

      // 如果包含true,说明保存过一次,如果不包含true,说明第一次保存,为还原默认设置数据

      if (arr.includes(true)) {

        // console.log('保存过一次');

      } else {

        // console.log('第一次保存');

        // 第一次保存-应用,右侧showDefault设为true

        this.selectFieldList.forEach((v1) => {

          this.transferValue.forEach((v2) => {

            if (v2 == v1.name) {

              v1.showDefault = true;

            }

          });

        });

      }

      batchUpdateField(this.selectFieldList)

        .then((res) => {

          if (res.code == 0) {

            this.drawer = false;

            this.getList();

            this.getFields();

            this.$message.success(res.desc);

          } else {

            this.drawer = false;

            res.desc && this.$message.error(res.desc);

          }

        })

        .catch((err) => {

          this.drawer = false;

          err.desc && this.$message.error(err.desc);

        });

    },

    handleChangeCas(val) {},

    handleChange(value, direction, movedKeys) {

      // console.log(value, direction, movedKeys);

      let arr = [];

      // value为右侧数据;左侧dataList为所有数据

      // 默认全部show设为false,右侧是选中的需要show设为true,否则就为false

      this.dataList.forEach((v1) => {

        v1.show = false;

        v1.createTime && delete v1.createTime;

        v1.updateTime && delete v1.updateTime;

      });

      this.dataList.forEach((v1) => {

        value.forEach((v2) => {

          if (v2 == v1.name) {

            v1.show = true;

            arr.push(v1);

          } else {

            arr.push(v1);

          }

        });

      });

      this.selectFieldList = unique(arr, "id"); // 根据id去重

    },

    doClickCell(row) {

      this.setDetailTitle(row.example);

      this.setResourceId(row.id);

      this.$router.push({ path: `/resource/detail` });

    },

    next() {

      this.active = 2;

    },

    deleteRow(id) {

      let that = this;

      let params = {

        uniqueId: this.getActiveModel.uniqueId,

        id: id,

      };

      that

        .$confirm("确认要删除这条数据?", "提示", {

          confirmButtonText: "确定",

          cancelButtonText: "取消",

          type: "warning",

        })

        .then(() => {

          deleteResource(params)

            .then((res) => {

              if (res.code == 0) {

                that.$message.success(res.desc);

                that.getList();

              } else {

                if (res.desc) {

                  that.$message.error(res.desc);

                }

              }

            })

            .catch((err) => {

              err.desc && that.$message.error(err.desc);

            });

        })

        .catch(() => {

          that.$message({

            type: "info",

            message: "已取消删除",

          });

        });

    },

    doAdd() {

      this.drawerAdd = true;

      this.formLabelAlign = {};

    },

    // 新建--提交

    doConfirm() {

      if (

        this.formLabelAlign.example_department &&

        this.formLabelAlign.example_department.length > 0

      ) {

        this.formLabelAlign.example_department =

          this.formLabelAlign.example_department.join();

      }

      let params = {

        uniqueId: this.getActiveModel.uniqueId,

        args: this.formLabelAlign,

      };

      addResource(params)

        .then((res) => {

          if (res.code == 0) {

            this.getList();

            this.drawerAdd = false;

            this.$message.success(res.desc);

          } else {

            res.desc && this.$message.error(res.desc);

          }

        })

        .catch((err) => {

          err.desc && this.$message.error(err.desc);

        });

    },

    getDownload(res) {

      const blob = new Blob([res]);

      // const fileName = res.headers["content-disposition"].split("=")[1];

      const fileName = this.getActiveModel.uniqueId;

      const elink = document.createElement("a");

      elink.download = window.decodeURIComponent(fileName);

      elink.style.display = "none";

      elink.href = URL.createObjectURL(blob);

      elink.setAttribute("download", `${fileName}.xlsx`); // 下载文件的名称及文件类型后缀

      document.body.appendChild(elink);

      elink.click();

      URL.revokeObjectURL(elink.href); // 释放URL 对象

      document.body.removeChild(elink);

    },

    // 下载模板

    downloadTemplate() {

      let params = {

        uniqueId: this.getActiveModel.uniqueId,

      };

      exportTemplate(params).then((res) => {

        this.getDownload(res);

      });

    },

    // 导出

    doExport() {

      let params = {

        uniqueId: this.getActiveModel.uniqueId,

        currPage: this.paramsPage.pageNum,

        pageSize: this.paramsPage.pageSize,

        args: this.currentArgs,

        titleList: this.multipleSelection.map((v) => v.id),

      };

      exportResource(params).then((res) => {

        this.getDownload(res);

      });

    },

    // 导出模板

    doExportTemplate() {

      let params = {

        uniqueId: this.getActiveModel.uniqueId,

      };

      exportResourceTemplate(params).then((res) => {

        this.getDownload(res);

      });

    },

    // 导入--上传

    uploadFiles(files) {

      const _file = files.file;

      this.currentFile = _file;

      // var formData = new FormData();

      // formData.append("file", _file);

      // formData.append("uniqueId", this.getActiveModel.uniqueId);

      // uploadResource(formData)

      //   .then((res) => {

      //     if (res.code == 0) {

      //       this.getList();

      //       this.drawerImportant = false;

      //       this.$message.success(res.desc);

      //     } else {

      //       res.desc && this.$message.error(res.desc);

      //     }

      //   })

      //   .catch((err) => {

      //     err.desc && this.$message.error(err.desc);

      //   });

    },

    // 开始导入

    doImportant() {

      var formData = new FormData();

      formData.append("file", this.currentFile);

      formData.append("uniqueId", this.getActiveModel.uniqueId);

      uploadResource(formData)

        .then((res) => {

          if (res.type == "application/json") {

            this.$message.success("导入成功");

            this.drawerImportant = false;

            this.getList();

          } else {

            this.drawerImportant = false;

            this.$message.error("导入失败");

          }

        })

        .catch((err) => {

          this.drawerImportant = false;

          this.$message.error("导入失败");

        });

    },

  },

};

</script>

<style scoped lang="scss">

.contentTop {

  display: flex;

  justify-content: space-between;

  align-items: center;

}

::v-deep .el-drawer__open .el-drawer.rtl {

  -webkit-animation: rtl-drawer-in 0.3s 1ms;

  animation: rtl-drawer-in 0.3s 1ms;

  width: 38% !important;

}

::v-deep .el-transfer-panel {

  height: 660px !important;

}

::v-deep .el-transfer-panel__list.is-filterable {

  height: 660px !important;

}

::v-deep .el-upload-dragger {

  width: 530px !important;

}

.bottomButton {

  position: sticky;

  bottom: 0;

  left: 0;

  margin-top: 10px;

}

</style>

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读人工智能时代与人类未来笔记03_演变

1. 演变 1.1. 每个社会都找到了属于自己的一套适应世界的方法 1.1.1. 适应的核心&#xff0c;是有关人类心智与现实之间关系的概念 1.1.2. 人类认识周围环境的能力 1.1.2.1. 这种能力通过知识获得&#xff0c;同时也受到知识…

快速上手并行执行——《OceanBase 并行执行》 系列 7

并行执确实是一个涵盖多个层面的复杂主题&#xff0c;它需要投入一定的时间和精力来深入理解&#xff0c;才能充分掌握其功能。为了帮助初学者更快地掌握并行执行的技巧&#xff0c;我们提供了这份Quick Start&#xff0c;它适用于 OceanBase 3.1版本及以上的版本。虽然这里所…

专业PDF编辑软件Acrobat Pro DC 2022 for Mac中文版下载

Adobe Acrobat Pro DC 2022是一款PDF处理的软件&#xff0c;能够辅助MAC的用户进行PDF的各种文件上的操作&#xff0c;对于用户而言它以极为优秀和卓越的PDF体验来让用户使用起来更为的轻松一些&#xff0c;对于用户而言这款Adobe Acrobat Pro DC 2022绝对是Mac上面最佳的PDF工…

项目组GIT操作规范

分支规范 在开发过程中&#xff0c;一般会存在以下几种分支&#xff1a; main分支(master) master为主分支&#xff0c;也是用于部署生产环境的分支&#xff0c;一般由 dev 以及 fixbug分支合并&#xff0c;任何时间都不能直接修改代码。dev分支 develop 为开发分支&#xff…

C++ | Leetcode C++题解之第89题格雷编码

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> grayCode(int n) {vector<int> ret(1 << n);for (int i 0; i < ret.size(); i) {ret[i] (i >> 1) ^ i;}return ret;} };

嵌入式学习——Shell(流指针、文件读写函数)——day20

1. 标准IO和文件IO的区别 1. 标准IO是一种有缓存的IO形式&#xff08;接收了一部分内容后给到linux内核中&#xff09; 2. 文件IO是一种没有缓存的IO形式&#xff08;即刻交给linux内核&#xff0c;及时性&#xff09; 3. 标准IO是库函数,库函数可以在Windows和Linux系统中都能…

Linux下Code_Aster源码编译安装及使用

目录 软件介绍 基本依赖 其它依赖 一、源码下载 二、解压缩 三、编译安装 四、算例运行 软件介绍 Code_aster为法国电力集团&#xff08;EDF&#xff09;自1989年起开始研发的通用结构和热力耦合有限元仿真软件。Code_aster可用于力学、热学和声学等物理现象的仿真分析&…

OV通配符/泛域名SSL证书怎么获取和安装

OV通配符/泛域名SSL证书的获取和安装主要可以分为以下几个步骤&#xff1a; 一、获取证书 1. 选择服务商 选择一个提供OV通配符SSL证书的服务商&#xff0c;例如JoySSL。 2. 提交申请 在服务商网站上选择OV通配符SSL证书产品&#xff0c;填入基础信息&#xff0c;如公司名…

下单制造fpc的工艺参数

FPC工艺简介 - 百度文库 (baidu.com) FPC工艺参数 - 豆丁网 (docin.com) FPC柔性线路板的主要参数.ppt (book118.com) 捷多邦&#xff1a; 华秋&#xff1a; 背胶&#xff1a; FPC板背胶是可以粘接在光滑表面的一种薄型胶带&#xff0c;可以在狭小以及光滑的表面上用来提供高…

[蓝桥杯]真题讲解:抓娃娃(思维+二分)

[蓝桥杯]真题讲解&#xff1a;抓娃娃&#xff08;思维二分&#xff09; 一、视频讲解二、正解代码1、C2、python33、Java 一、视频讲解 [蓝桥杯]真题讲解&#xff1a;抓娃娃&#xff08;思维二分&#xff09;&#xff09; 二、正解代码 1、C #include<bits/stdc.h> #d…

3月份太阳镜行业线上市场销售数据分析

在消费者行为方面&#xff0c;太阳镜不仅仅是视力保护工具&#xff0c;更逐渐成为一种时尚单品。随着人们对健康和美容重视程度的提高&#xff0c;太阳镜作为体现个人风格的单品&#xff0c;其市场需求得到了进一步的推动。此外&#xff0c;全球旅行和旅游业的恢复&#xff0c;…

【链路层和局域网】

文章目录 链路层和局域网网络节点的连接方式数据链路层和局域网链路层导论链路层&#xff1a;上下文链路层服务链路层在哪里实现&#xff1f;适配器通信错误检测奇偶校验校验和&#xff1a;CRC&#xff08;循环冗余校验&#xff09;多点访问链路和协议多路访问协议MAC&#xff…