| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
- <title>学校信息管理</title>
- <link href="https://kylx365-1253256735.file.myqcloud.com/js/jquery.tagit.css" rel="stylesheet" type="text/css">
- <link href="https://kylx365-1253256735.file.myqcloud.com/js/tagit.ui-zendesk.css" rel="stylesheet" type="text/css">
- <script src="https://kylx365-1253256735.file.myqcloud.com/js/jquery-1.10.2.min.js"></script>
- <script src="https://kylx365-1253256735.file.myqcloud.com/js/jquery-ui.min.js"></script>
- <script src="https://kylx365-1253256735.file.myqcloud.com/js/vue.min.js"></script>
- <link rel="stylesheet" href="./mg/common.css">
- <style>
- .main00 {
- width: 100%;
- height: 100vh;
- min-height: 600px;
- background: white;
- display: flex;
- flex-direction: column;
- overflow: hidden; /* 防止出现滚动条 */
- }
- .ListTop {
- width: 100%;
- height: 60px;
- background: white;
- border-bottom: 1px solid #EEEEEE;
- justify-content: flex-start;
- flex-shrink: 0; /* 防止头部被压缩 */
- }
- .ListTop3 {
- margin-left: 40px;
- height: 50px;
- align-items: center;
- }
- .ListTop4 {
- margin-left: 40px;
- height: 100%;
- }
- .title {
- font-size: 24px;
- color: #333333;
- font-weight: bold;
- }
- .btnNavigation {
- padding: 0 15px;
- height: 100%;
- font-size: 14px;
- color: #666666;
- border-bottom: 2px solid transparent;
- }
- .btnNavigation:hover {
- color: #4A90E2;
- }
- .btnSaveSelect {
- color: #4A90E2;
- border-bottom: 2px solid #4A90E2;
- }
- .main0 {
- width: 100%;
- background: white;
- flex: 1; /* 使用flex: 1代替固定高度 */
- min-height: 0; /* 确保flex子项可以收缩 */
- overflow: hidden;
- display: flex;
- position: relative;
- align-items: flex-start;
- }
- .school-list {
- width: 400px;
- border-right: 1px solid #EEEEEE;
- background: #F9F9F9;
- display: flex;
- flex-direction: column;
- height: 100%;
- position: relative;
- flex-shrink: 0;
- }
- .school-list-scrollable {
- flex: 1;
- overflow-y: auto;
- width: 100%;
- min-height: 0; /* 确保flex子项可以收缩 */
- display: flex;
- flex-direction: column;
- }
- .search-box {
- flex-shrink: 0; /* 防止搜索框被压缩 */
- }
- .school-detail {
- width: calc(100% - 400px);
- padding: 20px;
- overflow-y: auto;
- margin-top: 50px;
- }
- .search-box {
- padding: 15px;
- border-bottom: 1px solid #EEEEEE;
- background: white;
- width: 100%;
- justify-content: center;
- }
- .search-input {
- width: 200px;
- height: 32px;
- padding: 0 32px 0 12px;
- border: 1px solid #DDDDDD;
- border-radius: 4px;
- font-size: 14px;
- color: #333333;
- }
- .search-input:focus {
- border-color: #4A90E2;
- outline: none;
- }
- .btn33 {
- width: 32px;
- height: 32px;
- margin-left: 8px;
- border-radius: 4px;
- background: #F5F5F5;
- }
- .btn33:hover {
- background: #EEEEEE;
- }
- .district-list {
- padding: 0;
- width: 100%;
- align-self: flex-start;
- }
- .district-item {
- margin: 0;
- border-bottom: 1px solid #EEEEEE;
- }
- .district-name {
- font-weight: 500;
- cursor: pointer;
- padding: 12px 15px;
- font-size: 14px;
- color: #333333;
- background: white;
- }
- .district-name:hover {
- background: #F5F5F5;
- }
- .school-item {
- padding: 10px 15px 10px 30px;
- cursor: pointer;
- font-size: 14px;
- color: #666666;
- background: #F9F9F9;
- width: 100%;
- box-sizing: border-box;
- }
- .school-id {
- display: inline-block;
- font-size: 12px;
- color: #666;
- background-color: #f8f8f8;
- padding: 2px 6px;
- border-radius: 3px;
- margin-right: 8px;
- font-family: "Consolas", monospace;
- min-width: 40px;
- text-align: center;
- }
- .school-items {
- width: 100%;
- }
- .school-category {
- width: 100%;
- }
- .category-title {
- padding: 10px 15px 10px 30px;
- font-size: 14px;
- color: #333333;
- background: #F5F5F5;
- border-bottom: 1px solid #EEEEEE;
- border-left: 3px solid #4A90E2;
- font-weight: 600;
- margin-top: 4px;
- }
- .category-schools:empty::before {
- content: '暂无数据';
- display: block;
- padding: 10px 15px 10px 30px;
- color: #999;
- font-size: 14px;
- text-align: left;
- width: 100%;
- box-sizing: border-box;
- background: #F9F9F9;
- }
- .school-items:empty::before {
- content: '暂无数据';
- display: block;
- padding: 15px;
- color: #999;
- font-size: 14px;
- text-align: left;
- width: 100%;
- box-sizing: border-box;
- background: #F9F9F9;
- }
- .school-item:hover {
- background: #F5F5F5;
- color: #333333;
- }
- .school-item.active {
- background: #E6F3FF;
- color: #4A90E2;
- }
- .form-group {
- margin-bottom: 20px;
- }
- .form-label {
- display: block;
- margin-bottom: 8px;
- font-weight: 500;
- font-size: 14px;
- color: #333333;
- }
- .form-input {
- width: 100%;
- height: 36px;
- padding: 0 12px;
- border: 1px solid #DDDDDD;
- border-radius: 4px;
- font-size: 14px;
- color: #333333;
- transition: all 0.3s;
- }
- .form-input:focus {
- border-color: #4A90E2;
- outline: none;
- box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);
- }
- .form-select {
- width: 100%;
- height: 36px;
- padding: 0 12px;
- border: 1px solid #DDDDDD;
- border-radius: 4px;
- font-size: 14px;
- color: #333333;
- background: white;
- cursor: pointer;
- transition: all 0.3s;
- }
- .form-select:focus {
- border-color: #4A90E2;
- outline: none;
- box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);
- }
- .form-textarea {
- width: 100%;
- padding: 12px;
- border: 1px solid #DDDDDD;
- border-radius: 4px;
- min-height: 120px;
- resize: vertical;
- font-size: 14px;
- color: #333333;
- transition: all 0.3s;
- }
- .form-textarea:focus {
- border-color: #4A90E2;
- outline: none;
- box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);
- }
- .btn-group {
- margin-top: 24px;
- text-align: right;
- padding: 0 20px 20px;
- }
- .btn {
- min-width: 30px;
- height: 36px;
- padding: 0 16px;
- margin-left: 12px;
- border: none;
- border-radius: 4px;
- cursor: pointer;
- font-size: 14px;
- transition: all 0.3s;
- }
- .btn-primary {
- background: #4A90E2;
- color: white;
- }
- .btn-primary:hover {
- background: #357ABD;
- }
- .btn-default {
- background: white;
- border: 1px solid #DDDDDD;
- color: #666666;
- }
- .btn-default:hover {
- background: #F5F5F5;
- border-color: #CCCCCC;
- }
- .form-sections {
- display: flex;
- flex-direction: row;
- width: 100%;
- align-items: flex-start;
- }
- .form-column {
- min-width: 0;
- /* 防止flex子项溢出 */
- }
- .form-section {
- border: 1px solid #EEEEEE;
- border-radius: 4px;
- padding: 20px;
- margin-bottom: 24px;
- background: white;
- }
- .form-section-title {
- font-size: 16px;
- font-weight: 500;
- margin-bottom: 20px;
- padding-bottom: 12px;
- border-bottom: 1px solid #EEEEEE;
- color: #333333;
- }
- .form-row {
- display: flex;
- margin: 0 -8px;
- flex-wrap: wrap;
- }
- .form-col {
- flex: 0 0 32%;
- padding: 0 8px;
- box-sizing: border-box;
- }
- .form-col-2 {
- flex: 0 0 63%;
- padding: 0 8px;
- box-sizing: border-box;
- }
- .form-col-3 {
- flex: 0 0 94%;
- padding: 0 8px;
- box-sizing: border-box;
- }
- .form-col-4 {
- flex: 0 0 48%;
- padding: 0 8px;
- box-sizing: border-box;
- }
- .toast {
- position: fixed;
- top: 20px;
- left: 50%;
- transform: translateX(-50%);
- padding: 12px 24px;
- background: rgba(0, 0, 0, 0.7);
- color: white;
- border-radius: 4px;
- z-index: 9999;
- opacity: 0;
- transition: opacity 0.3s;
- }
- .toast.show {
- opacity: 1;
- }
- .toast.success {
- background: #4CAF50;
- }
- .toast.error {
- background: #F44336;
- }
- .toast.info {
- background: #2196F3;
- }
-
- /* 清空按钮样式 */
- .clear-btn {
- position: absolute;
- right: 12px;
- top: 50%;
- transform: translateY(-50%);
- width: 16px;
- height: 16px;
- background-color: #999;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- cursor: pointer;
- transition: background-color 0.2s;
- }
-
- .clear-btn:hover {
- background-color: #666;
- }
-
- .clear-x {
- position: relative;
- width: 8px;
- height: 8px;
- }
-
- .clear-x:before, .clear-x:after {
- content: '';
- position: absolute;
- width: 8px;
- height: 2px;
- background-color: white;
- top: 3px;
- left: 0;
- }
-
- .clear-x:before {
- transform: rotate(45deg);
- }
-
- .clear-x:after {
- transform: rotate(-45deg);
- }
- </style>
- </head>
- <body class="container FlexRow">
- <div id="app" class="main00 FlexColumn">
- <div class="ListTop FlexRow">
- <div class="ListTop3 FlexRow">
- <div class="title CursorPointer">学校信息管理</div>
- </div>
- </div>
- <div class="main0 FlexRow" style="height: calc(100% - 60px);">
- <!-- 左侧学校列表 -->
- <div class="school-list FlexColumn">
- <div class="search-box FlexRow">
- <div style="position: relative;">
- <input type="text" class="search-input" v-model="searchText" @input="debounceSearch"
- @keyup.enter="searchSchools" placeholder="输入学校名称搜索...">
- <div class="clear-btn" v-show="searchText" @click="clearSearch">
- <span class="clear-x"></span>
- </div>
- </div>
- <div class="btn33 btn31 btn FlexRow" @click="searchSchools">
- <img title="搜索" alt="搜索"
- src="https://kylx365-1253256735.file.myqcloud.com/web/universalpic_search_gray_30x30.png"
- style="width: 20px; height: 20px;" />
- </div>
- </div>
- <div class="school-list-scrollable">
- <div class="district-list">
- <div class="district-item" v-for="district in districts">
- <div class="district-name FlexRow" @click="toggleDistrict(district)">
- <div class="flex-1">{{ district.id }} {{ district.name }} <template v-if="district.count">({{
- district.count
- }})</template></div>
- <div class="district-icon">
- </div>
- </div>
- <transition name="slide">
- <div v-show="district.isOpen" class="school-items">
- <!-- 高中部分 -->
- <div class="school-category"
- v-if="district.highSchools && district.highSchools.length > 0">
- <div class="category-title">高中</div>
- <div class="category-schools">
- <div class="school-item" v-for="school in district.highSchools"
- :class="{ active: selectedSchool && selectedSchool.ID === school.ID }"
- @click="selectSchool(school)">
- <span class="school-id">{{ school.ID }}</span>
- {{ school.SchoolFullName }}
- </div>
- </div>
- </div>
- <!-- 初中部分 -->
- <div class="school-category"
- v-if="district.middleSchools && district.middleSchools.length > 0">
- <div class="category-title">初中</div>
- <div class="category-schools">
- <div class="school-item" v-for="school in district.middleSchools"
- :class="{ active: selectedSchool && selectedSchool.ID === school.ID }"
- @click="selectSchool(school)">
- <span class="school-id">{{ school.ID }}</span>
- {{ school.SchoolFullName }}
- </div>
- </div>
- </div>
- </div>
- </transition>
- </div>
- </div>
- </div>
- </div>
- <!-- 右侧学校详情 -->
- <div class="school-detail FlexColumn" v-if="!selectedSchool">
- <div style="font-size:36px;margin-top: 340px;">欢迎使用学校信息管理平台</div>
- </div>
- <div class="school-detail FlexColumn" v-if="selectedSchool">
- <form @submit.prevent="saveSchool">
- <!-- 基本信息 -->
- <div class="form-sections FlexRow" style="margin: 0 -12px;">
- <!-- 第一列 -->
- <div class="form-column" style="flex: 1; padding: 0 12px;">
- <div class="form-section">
- <div class="form-section-title">基本信息</div>
- <div class="form-row">
- <div class="form-col">
- <div class="form-group">
- <label class="form-label">学校ID</label>
- <input type="text" class="form-input" v-model="selectedSchool.ID" readonly>
- </div>
- </div>
- <div class="form-col-2">
- <div class="form-group">
- <label class="form-label">学校全称</label>
- <input type="text" class="form-input"
- v-model="selectedSchool.SchoolFullName">
- </div>
- </div>
- </div>
- <div class="form-row">
- <div class="form-col">
- <div class="form-group">
- <label class="form-label">学校简称</label>
- <input type="text" class="form-input"
- v-model="selectedSchool.SchoolShortName">
- </div>
- </div>
- <div class="form-col">
- <div class="form-group">
- <label class="form-label">其他名称</label>
- <input type="text" class="form-input"
- v-model="selectedSchool.SchoolOtherName">
- </div>
- </div>
- <div class="form-col">
- <div class="form-group">
- <label class="form-label">招生代码</label>
- <input type="text" class="form-input" v-model="selectedSchool.SchoolNumber">
- </div>
- </div>
- </div>
- <div class="form-row">
- <div class="form-col">
- <div class="form-group">
- <label class="form-label">拼音首字母</label>
- <input type="text" class="form-input" v-model="selectedSchool.Pinyin">
- </div>
- </div>
- <div class="form-col-2">
- <div class="form-group">
- <label class="form-label">有初高中同名(对应ID)</label>
- <input type="text" class="form-input" v-model="selectedSchool.HasSameName">
- </div>
- </div>
- </div>
- <div class="form-row">
- <div class="form-col">
- <div class="form-group">
- <label class="form-label">住宿情况</label>
- <select class="form-select" v-model="selectedSchool.Accommodation">
- <option value="">未知</option>
- <option value="全部寄宿">全部寄宿</option>
- <option value="部分寄宿">部分寄宿</option>
- <option value="无寄宿">无寄宿</option>
- </select>
- </div>
- </div>
- <div class="form-col-2">
- <div class="form-group">
- <label class="form-label">住宿情况说明</label>
- <input type="text" class="form-input"
- v-model="selectedSchool.AccommodationRemark">
- </div>
- </div>
- </div>
- <div class="form-row">
- <div class="form-col-3">
- <div class="form-group">
- <label class="form-label">收费标准</label>
- <textarea class="form-textarea" v-model="selectedSchool.Fees"></textarea>
- </div>
- </div>
- </div>
- <div class="form-row">
- <div class="form-col">
- <div class="form-group">
- <label class="form-label">学校类型</label>
- <input type="text" class="form-input" v-model="selectedSchool.SchoolType1"
- readonly>
- </div>
- </div>
- <div class="form-col">
- <div class="form-group">
- <label class="form-label">学校性质</label>
- <select class="form-select" v-model="selectedSchool.PublicOrPrivate">
- <option value="">未知</option>
- <option value="公办">公办</option>
- <option value="民办">民办</option>
- <option value="中外合作">中外合作</option>
- </select>
- </div>
- </div>
- <div class="form-col">
- <div class="form-group">
- <label class="form-label">详细类型</label>
- <input type="text" class="form-input" v-model="selectedSchool.SchoolType2"
- readonly>
- </div>
- </div>
- </div>
- </div>
- </div>
- <!-- 第二列 -->
- <div class="form-column" style="flex: 1; padding: 0 12px;">
- <!-- 地理信息 -->
- <div class="form-section">
- <div class="form-section-title">地理信息</div>
- <div class="form-row">
- <div class="form-col">
- <div class="form-group">
- <label class="form-label">所属区</label>
- <input type="text" class="form-input" v-model="selectedSchool.District"
- readonly>
- </div>
- </div>
- <div class="form-col-2">
- <div class="form-group">
- <label class="form-label">经纬度坐标</label>
- <input type="text" class="form-input" v-model="selectedSchool.Coordinates">
- </div>
- </div>
- </div>
- <div class="form-row">
- <div class="form-col-3">
- <div class="form-group">
- <label class="form-label">详细地址</label>
- <input type="text" class="form-input" v-model="selectedSchool.Address">
- </div>
- </div>
- </div>
- </div>
- <!-- 联系信息 -->
- <div class="form-section">
- <div class="form-section-title">联系信息</div>
- <div class="form-row">
- <div class="form-col-4">
- <div class="form-group">
- <label class="form-label">招生电话(逗号分隔)</label>
- <input type="text" class="form-input" v-model="selectedSchool.Phone1">
- </div>
- </div>
- <div class="form-col-4">
- <div class="form-group">
- <label class="form-label">招生电话(国际课程班)</label>
- <input type="text" class="form-input" v-model="selectedSchool.Phone2">
- </div>
- </div>
- </div>
- <div class="form-row">
- <div class="form-col-3">
- <div class="form-group">
- <label class="form-label">学校网址</label>
- <input type="text" class="form-input" v-model="selectedSchool.Website">
- </div>
- </div>
- </div>
- <div class="form-row">
- <div class="form-col-3">
- <div class="form-group">
- <label class="form-label">联系时间</label>
- <input type="text" class="form-input" v-model="selectedSchool.ContactTime">
- </div>
- </div>
- </div>
- </div>
- </div>
- <!-- 第三列 -->
- <div class="form-column" style="flex: 1; padding: 0 12px;">
- <!-- 其他信息 -->
- <div class="form-section">
- <div class="form-section-title">其他信息</div>
- <div class="form-row">
- <div class="form-col-3">
- <div class="form-group">
- <label class="form-label">学校简介</label>
- <textarea class="form-textarea"
- v-model="selectedSchool.Introduction"></textarea>
- </div>
- </div>
- </div>
- <div class="form-row">
- <div class="form-col-3">
- <div class="form-group">
- <label class="form-label">美育特色介绍</label>
- <textarea class="form-textarea"
- v-model="selectedSchool.Introduction2"></textarea>
- </div>
- </div>
- </div>
- <div class="form-row">
- <div class="form-col-3">
- <div class="form-group">
- <label class="form-label">备注</label>
- <textarea class="form-textarea" v-model="selectedSchool.Remark"></textarea>
- </div>
- </div>
- </div>
- </div>
- <div class="btn-group">
- <button type="button" class="btn btn-default" @click="resetForm">重置表单</button>
- <button type="submit" class="btn btn-primary">保存</button>
- </div>
- </form>
- </div>
- </div>
- <div class="toast" :class="{ show: showToastFlag, [toastType]: showToastFlag }">{{ toastMessage }}</div>
- <script>
- // 区域数据
- const arrDistrict = [{
- ID: "01",
- Name: "黄浦区",
- Count: ""
- },
- {
- ID: "02",
- Name: "徐汇区",
- Count: ""
- },
- {
- ID: "03",
- Name: "长宁区",
- Count: ""
- },
- {
- ID: "04",
- Name: "静安区",
- Count: ""
- },
- {
- ID: "05",
- Name: "普陀区",
- Count: ""
- },
- {
- ID: "06",
- Name: "虹口区",
- Count: ""
- },
- {
- ID: "07",
- Name: "杨浦区",
- Count: ""
- },
- {
- ID: "08",
- Name: "闵行区",
- Count: ""
- },
- {
- ID: "09",
- Name: "宝山区",
- Count: ""
- },
- {
- ID: "10",
- Name: "嘉定区",
- Count: ""
- },
- {
- ID: "11",
- Name: "浦东新区",
- Count: ""
- },
- {
- ID: "12",
- Name: "金山区",
- Count: ""
- },
- {
- ID: "13",
- Name: "松江区",
- Count: ""
- },
- {
- ID: "14",
- Name: "青浦区",
- Count: ""
- },
- {
- ID: "15",
- Name: "奉贤区",
- Count: ""
- },
- {
- ID: "16",
- Name: "崇明区",
- Count: ""
- }];
- new Vue({
- el: '#app',
- data: {
- searchText: '',
- districts: [],
- selectedSchool: null,
- originalSchool: null,
- searchTimeout: null,
- districtID: '',
- arrDistrict: arrDistrict,
- toastMessage: '',
- toastType: 'info',
- showToastFlag: false
- },
- methods: {
- // 清空搜索
- clearSearch() {
- this.searchText = '';
- this.loadDistricts();
- },
- // 搜索学校
- searchSchools() {
- // 如果搜索框为空,恢复所有学校显示
- if (!this.searchText.trim()) {
- this.loadDistricts();
- return;
- }
- const keyword = this.searchText.trim();
- // 使用提供的接口搜索学校
- fetch(`/api/GetMPSSchool?RowCount=20&Key=${keyword}`)
- .then(response => response.json())
- .then(data => {
- data = data.result;
- if (data && data.length > 0) {
- // 将搜索结果按区域分组
- const districtMap = {};
- data.forEach(school => {
- if (!districtMap[school.District]) {
- districtMap[school.District] = {
- id: school.DistrictID,
- name: school.District,
- count: 0,
- schools: [],
- highSchools: [],
- middleSchools: [],
- isOpen: true
- };
- }
- districtMap[school.District].schools.push(school);
- // 按学校类型分类
- if (school.SchoolType1 === '高中' || school.SchoolType2?.includes('高中')) {
- districtMap[school.District].highSchools.push(school);
- } else if (school.SchoolType1 === '初中' ||
- (school.SchoolType2 === '初中' && !school.SchoolType2?.includes('高中'))) {
- districtMap[school.District].middleSchools.push(school);
- }
- districtMap[school.District].count = districtMap[school.District].schools.length;
- });
- this.districts = Object.values(districtMap);
- } else {
- this.showToast('未找到匹配的学校', 'info');
- }
- })
- .catch(error => {
- console.error('搜索学校时出错:', error);
- alert('搜索失败,请稍后重试');
- });
- },
- // 防抖搜索
- debounceSearch() {
- if (this.searchTimeout) {
- clearTimeout(this.searchTimeout);
- }
- this.searchTimeout = setTimeout(() => {
- this.searchSchools();
- }, 500);
- },
- // 切换区域展开/折叠状态
- toggleDistrict(district) {
- // 如果展开且该区域下还没有加载学校数据,则加载
- if (!district.schools || district.schools.length === 0) {
- this.loadSchoolsByDistrict(district);
- }
- else {
- district.isOpen = !district.isOpen;
- }
- },
- // 加载特定区域下的学校
- loadSchoolsByDistrict(district) {
- fetch(`/api/GetMPSSchool?Usage=web&DistrictID=${district.id}`)
- .then(response => response.json())
- .then(data => {
- data = data.result;
- if (data && data.length > 0) {
- // 将学校按类型分类
- district.highSchools = data.filter(school =>
- school.SchoolType1 === '高中' ||
- school.SchoolType2?.includes('高中')
- );
- district.middleSchools = data.filter(school =>
- school.SchoolType1 === '初中' ||
- (school.SchoolType2 === '初中' && !school.SchoolType2?.includes('高中'))
- );
- // 保持原有的schools数组,以保持兼容性
- district.schools = data;
- } else {
- district.highSchools = [];
- district.middleSchools = [];
- district.schools = [];
- }
- district.isOpen = !district.isOpen;
- district.count = data.length
- })
- .catch(error => {
- console.error(`加载${district.name}区域学校数据时出错:`, error);
- district.highSchools = [];
- district.middleSchools = [];
- district.schools = [];
- });
- },
- // 选择学校
- selectSchool(school) {
- // 如果已经选择了该学校,不需要重新加载
- if (this.selectedSchool && this.selectedSchool.ID === school.ID) {
- return;
- }
- // 显示加载状态
- this.selectedSchool = { ...school, loading: true };
- // 调用API获取详细的学校信息
- fetch(`/api/GetMPSSchoolInfo?Usage=web&SchoolID=${school.ID}`)
- .then(response => response.json())
- .then(data => {
- if (data && data.result) {
- // 处理API返回的数据
- const schoolData = { ...data.result };
- // 处理详细类型(SchoolType2)
- const validSchoolTypes = [
- "",
- "市实验性示范性高中",
- "享受市实验性示范性高中招生政策高中",
- "区实验性示范性高中 (市特色普通高中)",
- "区实验性示范性高中",
- "一般高中"
- ];
- // 如果SchoolType2不在有效选项中,设置为未知
- if (!validSchoolTypes.includes(schoolData.SchoolType2)) {
- schoolData.SchoolType2 = ""; // 设置为未知
- }
- // 处理学校性质(PublicOrPrivate)
- const validPublicOrPrivate = ["", "公办", "民办", "中外合作"];
- if (!validPublicOrPrivate.includes(schoolData.PublicOrPrivate)) {
- schoolData.PublicOrPrivate = ""; // 如果值无效,设置为"未知"
- }
- // 处理住宿情况(Accommodation)
- const validAccommodations = ["", "全部寄宿", "部分寄宿", "无寄宿"];
- if (!validAccommodations.includes(schoolData.Accommodation)) {
- schoolData.Accommodation = ""; // 如果值无效,设置为"未知"
- }
- this.selectedSchool = schoolData;
- this.originalSchool = { ...schoolData };
- } else {
- // 如果API没有返回有效数据,则使用列表中的基本信息,并设置默认值
- const schoolData = { ...school };
- // 处理详细类型,如果不是有效值则设为"未知"
- const validSchoolTypes = [
- "",
- "市实验性示范性高中",
- "享受市实验性示范性高中招生政策高中",
- "区实验性示范性高中 (市特色普通高中)",
- "区实验性示范性高中",
- "一般高中"
- ];
- schoolData.SchoolType2 = validSchoolTypes.includes(schoolData.SchoolType2) ?
- schoolData.SchoolType2 : "";
- // 处理住宿情况,如果不是有效值则设为"未知"
- const validAccommodations = ["", "全部寄宿", "部分寄宿", "无寄宿"];
- schoolData.Accommodation = validAccommodations.includes(schoolData.Accommodation) ?
- schoolData.Accommodation : "";
- this.selectedSchool = schoolData;
- this.originalSchool = { ...schoolData };
- console.warn('未能获取到学校详细信息,使用基本信息显示');
- }
- })
- .catch(error => {
- console.error('获取学校详细信息时出错:', error);
- // 出错时使用列表中的基本信息
- this.selectedSchool = { ...school };
- this.originalSchool = { ...school };
- this.showToast('获取学校详细信息失败,请稍后重试', 'error');
- });
- },
- // 显示Toast通知
- showToast(message, type = 'info') {
- this.toastMessage = message;
- this.toastType = type;
- this.showToastFlag = true;
- // 自动隐藏
- setTimeout(() => {
- this.showToastFlag = false;
- }, 3000);
- },
- // 保存学校信息
- saveSchool() {
- if (!this.selectedSchool || !this.originalSchool) return;
- // 只收集修改过的字段
- const changedFields = {};
- const fieldsToCheck = [
- 'SchoolFullName', 'SchoolShortName', 'SchoolOtherName', 'SchoolNumber',
- 'Pinyin', 'HasSameName', 'Accommodation', 'AccommodationRemark',
- 'Fees', 'SchoolType1', 'PublicOrPrivate', 'SchoolType2',
- 'Coordinates', 'Address', 'Phone1', 'Phone2',
- 'Website', 'ContactTime', 'Introduction', 'Introduction2', 'Remark'
- ];
- fieldsToCheck.forEach(field => {
- if (this.selectedSchool[field] !== this.originalSchool[field]) {
- changedFields[field] = this.selectedSchool[field];
- }
- });
- // 确保ID字段始终包含
- changedFields.ID = this.selectedSchool.ID;
- // 如果没有字段被修改,不提交
- if (Object.keys(changedFields).length <= 1) {
- this.showToast('没有修改任何内容', 'info');
- return;
- }
- // 提交修改过的字段
- fetch('/api/SaveMPSSchool', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify(changedFields)
- })
- .then(response => response.json())
- .then(data => {
- if (data && data.errcode == 10000) {
- this.showToast('保存成功', 'success');
- this.originalSchool = { ...this.selectedSchool };
- // 更新列表中的学校名称
- this.districts.forEach(district => {
- // 更新schools数组中的学校名称
- if (district.schools) {
- district.schools.forEach(school => {
- if (school.ID === this.selectedSchool.ID) {
- school.SchoolFullName = this.selectedSchool.SchoolFullName;
- }
- });
- }
- // 更新highSchools数组中的学校名称
- if (district.highSchools) {
- district.highSchools.forEach(school => {
- if (school.ID === this.selectedSchool.ID) {
- school.SchoolFullName = this.selectedSchool.SchoolFullName;
- }
- });
- }
- // 更新middleSchools数组中的学校名称
- if (district.middleSchools) {
- district.middleSchools.forEach(school => {
- if (school.ID === this.selectedSchool.ID) {
- school.SchoolFullName = this.selectedSchool.SchoolFullName;
- }
- });
- }
- });
- console.log('学校信息更新完成');
- } else {
- alert('保存失败,请稍后重试');
- }
- })
- .catch(error => {
- console.error('保存学校信息时出错:', error);
- alert('保存失败,请稍后重试');
- });
- },
- // 重置表单
- resetForm() {
- if (this.originalSchool) {
- this.selectedSchool = { ...this.originalSchool };
- }
- },
- // 加载所有区域
- loadDistricts() {
- // 直接使用arrDistrict数据
- this.districts = arrDistrict.map(district => ({
- id: district.ID,
- name: district.Name,
- count: district.Count,
- isOpen: false,
- schools: [] // 初始为空,点击展开时加载
- }));
- }
- },
- mounted() {
- // 初始化加载区域数据
- this.loadDistricts();
- }
- });
- </script>
- </body>
- </html>
|