省市级联

145 阅读2分钟

image.png

结构

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="./assets/lib/bootstrap/bootstrap.min.css" />
    <link rel="stylesheet" href="./assets/lib/toastr/toastr.min.css" />
    <link
      rel="stylesheet"
      href="./assets/lib/validator/bootstrapValidator.min.css"
    />
    <link rel="stylesheet" href="./assets/css/student.css" />
  </head>

  <body>
    <!-- 添加学员 弹窗内容部分 start -->
    <div
      class="modal fade"
      id="addModal"
      tabindex="-1"
      aria-labelledby="addModalLabel"
      aria-hidden="true"
    >
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title" id="addModalLabel">录入新学员</h5>
            <button
              type="button"
              class="btn-close"
              data-bs-dismiss="modal"
              aria-label="Close"
            ></button>
          </div>
          <div class="modal-body">
            <form action="" class="container add-form">
              <div class="row mb-3">
                <label class="col-sm-2 col-form-label-sm">姓名</label>
                <div class="col-sm-10">
                  <input
                    type="text"
                    class="form-control form-control-sm"
                    name="name"
                    placeholder="学员姓名"
                  />
                </div>
              </div>

              <div class="row mb-3">
                <label class="col-sm-2 col-form-label-sm">年龄</label>
                <div class="col-sm-10">
                  <input
                    type="text"
                    class="form-control form-control-sm"
                    name="age"
                    placeholder="学员年龄"
                  />
                </div>
              </div>
              <div class="row mb-3">
                <label class="col-sm-2 col-form-label-sm">组号</label>
                <div class="col-sm-10">
                  <select class="form-select form-select-sm" name="group">
                    <option selected value="">请选择一个组号</option>
                    <option value="1">1组</option>
                    <option value="2">2组</option>
                    <option value="3">3组</option>
                    <option value="4">4组</option>
                    <option value="5">5组</option>
                    <option value="6">6组</option>
                    <option value="7">7组</option>
                    <option value="8">8组</option>
                    <option value="9">9组</option>
                    <option value="10">10组</option>
                    <option value="11">11组</option>
                    <option value="12">12组</option>
                    <option value="13">13组</option>
                    <option value="14">14组</option>
                    <option value="15">15组</option>
                  </select>
                </div>
              </div>

              <div class="row mb-3">
                <label class="col-sm-2 col-form-label-sm">性别</label>
                <div class="col-sm-10 self-valign">
                  <div class="col-sm-1 form-check form-check-inline">
                    <input
                      class="form-check-input"
                      type="radio"
                      name="sex"
                      value="男"
                      checked
                    />
                    <label class="form-check-label"></label>
                  </div>
                  <div class="col-sm-1 form-check form-check-inline">
                    <input
                      class="form-check-input"
                      type="radio"
                      name="sex"
                      value="女"
                    />
                    <label class="form-check-label"></label>
                  </div>
                </div>
              </div>

              <div class="row mb-3">
                <label class="col-sm-2 col-form-label-sm">手机</label>
                <div class="col-sm-10">
                  <input
                    type="text"
                    class="form-control form-control-sm"
                    name="phone"
                    placeholder="手机号"
                  />
                </div>
              </div>

              <div class="row mb-3">
                <label class="col-sm-2 col-form-label-sm">薪资</label>
                <div class="col-sm-5">
                  <input
                    type="text"
                    class="form-control form-control-sm"
                    name="salary"
                    placeholder="期望薪资"
                  />
                </div>
                <div class="col-sm-5">
                  <input
                    type="text"
                    class="form-control form-control-sm"
                    name="truesalary"
                    placeholder="实际薪资"
                  />
                </div>
              </div>

              <div class="row mb-3">
                <label class="col-sm-2 col-form-label-sm">籍贯</label>
                <div class="col-sm-3">
                  <select class="form-select form-select-sm" name="province">
                    <!-- <option selected value="">--省--</option> -->
                  </select>
                </div>
                <div class="col-sm-3">
                  <select class="form-select form-select-sm" name="city">
                    <!-- <option selected value="">--市--</option> -->
                  </select>
                </div>
                <div class="col-sm-3">
                  <select class="form-select form-select-sm" name="county">
                    <!-- <option selected value="">--县--</option> -->
                  </select>
                </div>
              </div>

              <div class="row mb-3">
                <div class="col-sm-2"></div>
                <div class="col-sm-10">
                  <button
                    type="submit"
                    class="btn btn-primary btn-sm btnAddStudent"
                  >
                    确认添加
                  </button>
                  <button type="reset" class="btn btn-secondary btn-sm">
                    重置
                  </button>
                </div>
              </div>
            </form>
          </div>
        </div>
      </div>
    </div>
    <!-- 添加学员 弹窗内容部分 end -->

    <nav class="navbar navbar-expand-lg navbar-light bg-light">
      <div class="container-fluid header">
        <h1>学员管理</h1>
        <!-- 添加学生信息按钮 -->
        <button
          type="button"
          class="btn btn-primary btn-sm modal-dialog-centered btnAddStu"
        >
          添加学员
        </button>
      </div>
    </nav>

    <!-- table-striped隔行换色 -->
    <table class="table table-striped">
      <colgroup>
        <col width="7%" />
        <col width="8%" />
        <col width="7%" />
        <col width="7%" />
        <col width="7%" />
        <col width="10%" />
        <col width="10%" />
        <col width="10%" />
        <col width="24%" />
        <col width="10%" />
      </colgroup>
      <thead>
        <tr>
          <th scope="col">ID</th>
          <th scope="col">姓名</th>
          <th scope="col">年龄</th>
          <th scope="col">性别</th>
          <th scope="col">组号</th>
          <th scope="col">联系电话</th>
          <th scope="col">期望薪资</th>
          <th scope="col">实际薪资</th>
          <th scope="col">籍贯</th>
          <th scope="col">操作</th>
        </tr>
      </thead>
      <tbody>
        <!-- <tr>
        <th scope="row">10</th>
        <td>张三</td>
        <td>20</td>
        <td>女</td>
        <td>1</td>
        <td>13261266666</td>
        <td>120000</td>
        <td>14000</td>
        <td>河北省承德市围场县</td>
        <td>
          <button type="button" class="btn btn-primary btn-sm">修改</button>
          <button type="button" class="btn btn-danger btn-sm">删除</button>
        </td>
      </tr> -->
      </tbody>
    </table>

    <script src="./assets/lib/jquery-3.6.0.min.js"></script>
    <script src="./assets/lib/bootstrap/bootstrap.min.js"></script>
    <script src="./assets/lib/toastr/toastr.min.js"></script>
    <script src="./assets/lib/validator/bootstrapValidator.min.js"></script>
    <script src="./assets/lib/axios.js"></script>
    <script src="./assets/utils/toastr.js"></script>

    <script src="./assets/utils/request.js"></script>

    <script src="./assets/js/student.js"></script>
  </body>
</html>

省市级

  // 实现数据的验证
  function test() {
    return {
      fields: {
        name: {
          validators: {
            // 指定自定义的验证规则
            notEmpty: {
              message: '姓名不能为空'
            },
            stringLength: {
              min: 2,
              max: 10,
              message: '姓名长度2~10位'
            }
          }
        },
        age: {
          validators: {
            notEmpty: {
              message: '年龄不能为空'
            },
            greaterThan: {
              // 大于指定的值
              value: 18,
              message: '年龄不能小于18岁'
            },
            lessThan: {
              // 小于指定的值
              value: 60,
              message: '年龄不能超过60岁'
            }
          }
        },
        sex: {
          validators: {
            choice: {
              min: 1,
              max: 1,
              message: '请选择性别'
            }
          }
        },
        group: {
          validators: {
            notEmpty: {
              message: '组号不能为空'
            },
            regexp: {
              regexp: /^\d{1,2}$/,
              message: '请选择有效的组号'
            }
          }
        },
        phone: {
          validators: {
            notEmpty: {
              message: '手机号不能为空'
            },
            regexp: {
              regexp: /^1\d{10}$/,
              message: '请填写有效的手机号'
            }
          }
        },
        salary: {
          validators: {
            notEmpty: {
              message: '实际薪资不能为空'
            },
            greaterThan: {
              value: 800,
              message: '期望薪资不能低于800'
            },
            lessThan: {
              value: 100000,
              message: '期望薪资不能高于100000'
            }
          }
        },
        truesalary: {
          validators: {
            notEmpty: {
              message: '实际薪资不能为空'
            },
            greaterThan: {
              value: 800,
              message: '实际薪资不能低于800'
            },
            lessThan: {
              value: 100000,
              message: '实际薪资不能高于100000'
            }
          }
        },
        province: {
          validators: {
            notEmpty: {
              message: '省份必填'
            }
          }
        },
        city: {
          validators: {
            notEmpty: {
              message: '市必填'
            }
          }
        },
        county: {
          validators: {
            notEmpty: {
              message: '县必填'
            }
          }
        }
      }
    }
  }

  // 默认加载所有省的数据
  axios.get('/geo/province').then(res => {
    addCitySelect.innerHTML = `<option selected value="">--市--</option>`
    addCountySelect.innerHTML = '<option selected value="">--县--</option>'
    let str = `<option selected value="">--省--</option>`
    res.data.map((value) => {
      str += `<option value="${value}">--${value}--</option>`
    })
    addProvinceSelect.innerHTML = str
  })
  // 实现省市区级联
  // 选择省,加载这个省的市
  // 监听用户是否选择的一个省:change
  addProvinceSelect.addEventListener('change', function () {
    let pname = this.value
    // 如果用户没有选择具体的省则不去发起axios请求,同时重置市的选项值
    addCitySelect.innerHTML = `<option selected value="">--市--</option>`
    addCountySelect.innerHTML = '<option selected value="">--县--</option>'
    if (pname == '') {
      return
    }
    // 根据用户所选择省加载它对应的所有市
    axios({
      url: '/geo/city',
      params: { pname }
    }).then(res => {
      let str = '<option selected value="">--市--</option>'
      res.data.map((value) => {
        str += `<option value="${value}">--${value}--</option>`
      })
      addCitySelect.innerHTML = str
    })
  })

  // 选择市,加载这个市的区县
  addCitySelect.addEventListener('change', function () {
    let pname = addProvinceSelect.value
    let cname = addCitySelect.value
    addCountySelect.innerHTML = '<option selected value="">--县--</option>'
    if (cname == '') {
      return
    }
    axios({
      url: '/geo/county',
      params: { pname, cname }
    }).then(res => {
      let str = '<option selected value="">--县--</option>'
      res.data.map((value) => {
        str += `<option selected value="${value}">--${value}--</option>`
      })
      addCountySelect.innerHTML = str
    })
  })