Просмотр исходного кода

学生管理添加语言包与埋点

11wqe1 5 дней назад
Родитель
Сommit
9ec9163e8d

+ 47 - 58
src/components/pages/studentManageNew/component/addstu.vue

@@ -4,9 +4,9 @@
       <template #title>
         <div class="title_box">
           <div class="title_box_item">
-            <span>添加学生</span>
+            <span>{{ lang.ssAddStuTitle }}</span>
             <span v-if="boxType == 1" style="font-size: 13px"
-              >(从已有学生中添加)</span
+              >({{ lang.ssFromExistL }})</span
             >
           </div>
         </div>
@@ -25,15 +25,15 @@
         <!-- 手动添加学生 -->
         <div class="addcla_box" v-if="addStuType == 1">
           <div class="addcla_box_item" v-if="boxType != 2">
-            <span class="addcla_box_item_span">所属班级:</span>
+            <span class="addcla_box_item_span">{{ lang.ssBelongClass }}</span>
             <el-input
               v-model.trim="classInfo.name"
               disabled
-              placeholder="请输入所属班级"
+              :placeholder="lang.Enterclass"
             ></el-input>
           </div>
           <div class="addcla_box_item" v-if="boxType == 2">
-            <span class="addcla_box_item_span">所属班级:</span>
+            <span class="addcla_box_item_span">{{ lang.ssBelongClass }}</span>
             <el-cascader
           :options="cascaderData"
           v-model="cascaderDataPath"
@@ -59,10 +59,10 @@
           </div>
 
           <div class="addcla_box_item" style="position: relative">
-            <span class="addcla_box_item_span">学生姓名:</span>
+            <span class="addcla_box_item_span">{{ lang.StudentName }}:</span>
             <el-input
               v-model.trim="searchStuName"
-              placeholder="请输入学生姓名,多个姓名请用中文逗号(,)分隔"
+              :placeholder="lang.ssEnterStuNameMul"
               slot="reference"
               @change="searchStu"
               @focus="popoverVisible = true"
@@ -83,7 +83,7 @@
                   <div class="tagtit" v-if="stuname2(item) == 'danger'">
                     <div class="poptag">
                       <img src="../../../../assets/stuImg/tishi.svg" alt=""/>
-                      <div>您添加的学生“{{ item }}”存在重复姓名。 是否继续添加?</div>
+                      <div>{{ lang.ssStuNameDup.replace(/\*/g, item) }}</div>
                     </div>
                     <div style="display: flex;justify-content: flex-end;gap: 10px;">
                       <!-- <span>添加</span> -->
@@ -97,13 +97,13 @@
 
               </div>
               <div class="search_stu_box_footer">
-                <div>输入学生共{{ searchStuData.length }}</div>
+              <div>{{ lang.ssInputStuCnt.replace(/\*/g, searchStuData.length) }}</div>
                 <div class="dialog-footer">
                   <!-- <el-button size="small" @click="selectNoneStu"
                     >取消</el-button
                   > -->
-                  <div  @click="selectNoneStu" class="kbtn">取消</div>
-                  <div @click="selectStu" class="kbtn" style="background: #3681FC; color: #E6FFFFFF;">确认</div>
+                  <div  @click="selectNoneStu" class="kbtn">{{ lang.Cancel }}</div>
+                  <div @click="selectStu" class="kbtn" style="background: #3681FC; color: #E6FFFFFF;">{{ lang.Confirm }}</div>
                   
                   <!-- <el-button size="small" type="primary" @click="selectStu"
                     >确定</el-button
@@ -113,7 +113,7 @@
             </div>
           </div>
           <div class="addcla_box_item">
-            <span class="addcla_box_item_span">已输入:</span>
+            <span class="addcla_box_item_span">{{ lang.ssEntered }}</span>
             <div class="selected_stu_box">
               <!-- <el-tag
                 v-for="(item, index) in selectedStuData"
@@ -128,7 +128,7 @@
                   <div class="tagtit" v-if="stuname(item) == 'danger'">
                     <div class="poptag">
                       <img src="../../../../assets/stuImg/tishi.svg" alt=""/>
-                      <div>您添加的学生“{{ item }}”存在重复姓名。 是否继续添加?</div>
+                      <div>{{ lang.ssStuNameDup.replace(/\*/g, item) }}</div>
                     </div>
                     <div style="display: flex;justify-content: flex-end;gap: 10px;">
                       <!-- <span>添加</span> -->
@@ -154,17 +154,17 @@
               v-loading="uploadfileLoading"
             >
               <img src="@/assets/stuImg/uploadfile.svg" alt="upload" />
-              <div style="color: #000">点击或拖拽文件到此处上传</div>
-              <div class="upload-demo-tip">支持格式:xlsx、xls,最多添加70人</div>
+              <div style="color: #000">{{ lang.ssUploadClickDrag }}</div>
+              <div class="upload-demo-tip">{{ lang.ssUploadTip }}</div>
             </el-upload>
             <div style="margin-top: 10px">
-              上传模板:
+              {{ lang.ssUploadTempLbl }}
               <span class="download-template" @click="downloadTemplate"
-                >下载模板</span
+                >{{ lang.ssDownloadTemp }}</span
               >
             </div>
             <div style="margin-top: 10px">
-              注意:请按照模板格式填写学生信息,避免导入失败
+              {{ lang.ssUploadNote }}
             </div>
             <!-- <div style="margin-top: 10px">
               学生列表批量上传需表格需添加“班级”列
@@ -184,9 +184,9 @@
       <div slot="footer" class="dialog-footer">
         <template v-if="addStuType == 1">
           <!-- <el-button size="small" @click="closeAllClaAddStu">取消</el-button> -->
-          <div @click="closeAllClaAddStu" class="kbtn">取消</div>
+          <div @click="closeAllClaAddStu" class="kbtn">{{ lang.Cancel }}</div>
 
-          <div @click="addStu" class="kbtn" style="background: #3681FC; color: #E6FFFFFF;">确认</div>
+          <div @click="addStu" class="kbtn" style="background: #3681FC; color: #E6FFFFFF;">{{ lang.Confirm }}</div>
 
           <!-- <el-button size="small" type="primary" @click="addStu"
             >确认</el-button
@@ -205,17 +205,16 @@
             <img v-if="deltypy == 1" style="width: 20px;" src="../../../../assets/stuImg/tishi.svg" alt="">
 
             <div class="msgContxt">
-              <div v-if="deltypy == 0">{{impbox.length ? impbox[0].name : ''}}等{{impbox.length}} 名同学已添加成功</div>
-              <div v-if="deltypy == 1">是否确认上传?</div>
+              <div v-if="deltypy == 0">
+                {{ (impbox.length ? impbox[0].name : '') + lang.ssAddStuSucc.replace(/\*/g, impbox.length) }}
+              </div>
+              <div v-if="deltypy == 1">{{ lang.ssConfirmUpload }}?</div>
 
             </div>
         </div>
         <span slot="footer" class="dialog-footer">
-          <!-- <el-button type="primary" @click="confirmDelStu"
-            >确 认</el-button
-          > -->
-          <div @click="closePop" class="kbtn" v-if="deltypy == 1">取消</div>
-          <div @click="confirmDelStu" class="kbtn" style="background: #3681FC; color: #E3EDFF;">确认</div>
+          <div @click="closePop" class="kbtn" v-if="deltypy == 1">{{ lang.Cancel }}</div>
+          <div @click="confirmDelStu" class="kbtn" style="background: #3681FC; color: #E3EDFF;">{{ lang.Confirm }}</div>
         </span>
       </el-dialog>
     </div>
@@ -225,7 +224,9 @@
 import { v4 as uuidv4 } from "uuid";
 import pinyin from "../../../../../node_modules/js-pinyin/index";
 import allClaAddStu from "./allClaAddStu.vue";
+import { myMixin } from "@/mixins/mixin.js"
 export default {
+  mixins: [ myMixin ],
   name: "addStu",
   props: {
     boxType: {
@@ -282,25 +283,25 @@ export default {
       stuListTypeList: [],
       tab1: [
         {
-          label: "手动输入",
+          label: this.lang.ssManualInput,
           value: 1,
         },
         {
-          label: "批量上传",
+          label: this.lang.ssBatchUp,
           value: 2,
         },
         {
-          label: "从已有学生中添加",
+          label: this.lang.ssFromExistL,
           value: 3,
         },
       ],
       tab2: [
         {
-          label: "手动输入",
+          label: this.lang.ssManualInput,
           value: 1,
         },
         {
-          label: "批量上传",
+          label: this.lang.ssBatchUp,
           value: 2,
         },
       ],
@@ -408,7 +409,7 @@ export default {
     // 上传Excel添加学生
     handleChange(file) {
       if (this.userSuffix == "") {
-        this.$message.error("正在获取后缀,请重新上传");
+        this.$message.error(this.lang.ssGetSuffixReUp);
         this.getUser();
         return;
       }
@@ -467,7 +468,7 @@ export default {
               obj.class = _this.boxType == 2 ? v[_this.lang.Class] : _this.classInfo.name;
               arr.push(obj);
             }else{
-              _this.$message.error('请检查上传文件学生姓名列是否填写正确');
+              _this.$message.error(_this.lang.ssCheckStuNameCol);
               return;
             }
           });
@@ -478,33 +479,19 @@ export default {
           }
 
           if (this.boxType == 2 && arr.filter(e => e.class) != arr.length) {
-            _this.$message.error('请检查上传文件班级列是否填写正确');
+            _this.$message.error(_this.lang.ssCheckClassCol);
             return;
           }
 
           if (!arr.length) {
             _this.$message.error(
-              "未能提取上传学生信息,请检查数据格式,使用模板文件格式上传"
+              _this.lang.ssParseStuFail
             );
             return;
           }
           _this.deltypy = 1;
           _this.popBoxdia= true;
           _this.stuexcel = arr;
-          // _this.$confirm('是否确认上传?', '提示', {
-          //   confirmButtonText: '确定',
-          //   cancelButtonText: '取消',
-          //   type: 'warning',
-          // }).then(() => {
-
-            // _this.uploadfileLoading = true;
-            // _this.accUpdate(arr);
-
-
-        //   }).catch(() => {
-        //     _this.uploadfileLoading = false;
-        //     _this.$message.info('已取消');
-        //   });
         };
 
         reader.readAsArrayBuffer(f);
@@ -520,21 +507,21 @@ export default {
     addStu() {
       this.selectedStuData = this.selectedStuData.filter((item) => item != "");
       if (this.selectedStuData.length == 0) {
-        this.$message.error("请输入学生");
+        this.$message.error(this.lang.ssEnterStu);
         return;
       }
       if (this.selectedStuData.length > 70) {
-        this.$message.error("一次最多添加70人");
+        this.$message.error(this.lang.ssAddStuMax70);
         return;
       }
 
       if ((this.boxType == 2 && this.cascaderDataPath.length == 0) || this.classInfo.name == "") {
-        this.$message.error("请选择所属班级");
+        this.$message.error(this.lang.ssSelectBelCla);
         return;
       }
 
       if (this.userSuffix == "") {
-        this.$message.error("正在获取后缀,请重新添加");
+        this.$message.error(this.lang.ssGetSuffixReAdd);
         this.getUser();
         return;
       }
@@ -586,21 +573,21 @@ export default {
         .then((res) => {
           console.log(res, "res");
           if (res.data.type == 1) {
-            this.$message.error("有学生手机号码已被注册");
+            this.$message.error(this.lang.stunumberregistered);
             z = 1;
           }
           if (res.data.type == 2) {
-            this.$message.error("有学生账号已被注册");
+            this.$message.error(this.lang.stuaccregistered);
             z = 1;
           }
           if (res.data.type == 3) {
-            this.$message.error("有学生学号重复");
+            this.$message.error(this.lang.studuplicateIDs);
             z = 1;
           }
           if (z == 2) {
             console.log("添加成功");
             this.$message({
-              message: "添加成功",
+              message: this.lang.ssAddOk,
               type: "success",
             });
             this.deltypy = 0;
@@ -610,11 +597,13 @@ export default {
             
             // this.selectedStuData = [];
             this.$emit("getCascaderData");
+            this.addOp3('1', "", { type: "student_add" }, "success")
           }
           this.uploadfileLoading = false;
         })
         .catch((err) => {
           console.error(err);
+          this.addOp3('1', "", { type: "student_add" }, err)
         });
     },
     confirmDelStu(){

+ 29 - 28
src/components/pages/studentManageNew/component/allClaAddStu.vue

@@ -2,7 +2,7 @@
   <div class="dia_box" v-loading="boxLoading">
     <div class="dia_box_item">
       <div class="addcla_box_item">
-        <span class="addcla_box_item_span">目标班级:</span>
+        <span class="addcla_box_item_span">{{ lang.ssTargetClass }}</span>
         <el-cascader
           :options="cascaderData"
           v-model="cascaderDataPath"
@@ -27,10 +27,10 @@
         </el-cascader>
       </div>
       <div class="addcla_box_item" style="position: relative">
-        <span class="addcla_box_item_span">搜索学生:</span>
+        <span class="addcla_box_item_span">{{ lang.ssSearchStuLbl }}</span>
         <el-input
           v-model.trim="searchStuName"
-          placeholder="请输入学生姓名,多个姓名请用中文逗号(,)分隔"
+          :placeholder="lang.ssEnterStuNameMul"
           slot="reference"
           @change="searchStu"
           @focus="popoverVisible = true"
@@ -60,11 +60,11 @@
             </el-tag>
           </div>
           <div class="search_stu_box_footer">
-            <div>输入学生共{{ searchStuData.length }}</div>
+            <div>{{ lang.ssInputStuCnt.replace(/\*/g, searchStuData.length) }}</div>
             <div class="dialog-footer">
               <!-- <el-button size="small" @click="selectNoneStu">取消</el-button> -->
-              <div @click="selectNoneStu" class="kbtn">取消</div>
-              <div @click="selectStu" class="kbtn" style="background: #3681FC; color: #E3EDFF;">确认</div>
+              <div @click="selectNoneStu" class="kbtn">{{ lang.Cancel }}</div>
+              <div @click="selectStu" class="kbtn" style="background: #3681FC; color: #E3EDFF;">{{ lang.Confirm }}</div>
 
               <!-- <el-button size="small" type="primary" @click="selectStu"
                 >确认</el-button
@@ -74,7 +74,7 @@
         </div>
       </div>
       <div class="addcla_box_item">
-        <span class="addcla_box_item_span">已选择:</span>
+        <span class="addcla_box_item_span">{{ lang.Selected }}:</span>
         <div class="selected_stu_box">
           <el-tag
             v-for="(item, index) in selectedStuData"
@@ -94,7 +94,7 @@
           </el-tag>
         </div>
       </div>
-      <div style="width: 100%">选择学生(可以多选)</div>
+      <div style="width: 100%">{{ lang.ssSelectStuTip }}</div>
       <el-table
         :data="allClaAllStuData"
         ref="tableData"
@@ -119,10 +119,10 @@
           :min-width="item.width"
         >
           <template slot-scope="scope">
-            <div v-if="item.label == '账号'">
+            <div v-if="item.label == lang.Account">
               <span>{{ scope.row.acc.split("@")[0] }}</span>
             </div>
-            <div class="cla_box" v-else-if="item.label == '班级'">
+            <div class="cla_box" v-else-if="item.label == lang.Class">
               <span
                 class="cla_span"
                 v-for="(cla, ind) in scope.row.classname.split('/')"
@@ -139,9 +139,11 @@
       </el-table>
       <div class="page_box">
         <div>
-          第{{ (page - 1) * pageSize + 1 }}条~第{{ page * pageSize }}条,共{{
-            total
-          }}条
+          {{ lang.ssPageInfoL
+            .replace(/\*/g, (page - 1) * pageSize + 1)
+            .replace(/\#/g, page * pageSize)
+            .replace(/\$/g, total)
+          }}
         </div>
         <el-pagination
           background
@@ -155,13 +157,8 @@
       </div>
     </div>
     <div class="dialog-footer">
-      <!-- <el-button size="small" @click="closeAllClaAddStu">取消</el-button> -->
-      <div class="kbtn" @click="closeAllClaAddStu">取消</div>
-      <div @click="confirmAllClaAddStu" class="kbtn" style="background: #3681FC; color: #E3EDFF;">确认</div>
-
-      <!-- <el-button size="small" type="primary" @click="confirmAllClaAddStu"
-        >确认</el-button
-      > -->
+      <div class="kbtn" @click="closeAllClaAddStu">{{ lang.Cancel }}</div>
+      <div @click="confirmAllClaAddStu" class="kbtn" style="background: #3681FC; color: #E3EDFF;">{{ lang.Confirm }}</div>
     </div>
 
     <div class="pop-upBox">
@@ -175,7 +172,7 @@
         <div class="msgCon">
             <img style="width: 20px;" src="../../../../assets/stuImg/duil.svg" alt="">
             <div class="msgContxt" v-if="selectedStuData.length">
-                {{selectedStuData[0].username}}等{{selectedStuData.length}}名同学已添加成功
+                {{ selectedStuData[0].username + lang.ssAddStuSucc.replace(/\*/g, selectedStuData.length) }}
             </div>
         </div>
         <span slot="footer" class="dialog-footer">
@@ -183,7 +180,7 @@
           <el-button type="primary"
             class="btnpop"
           @click="confirmDelStu"
-            >确 认</el-button
+            >{{ lang.Confirm }}</el-button
           >
         </span>
       </el-dialog>
@@ -191,7 +188,9 @@
   </div>
 </template>
 <script>
+import { myMixin } from "@/mixins/mixin.js"
 export default {
+  mixins: [ myMixin ],
   name: "allClaAddStu",
   props: {
     classInfo: {
@@ -221,17 +220,17 @@ export default {
       pageSize: 10,
       allClaColumns: [
         {
-          label: "姓名",
+          label: this.lang.StudentName,
           prop: "username",
           width: "30%",
         },
         {
-          label: "账号",
+          label: this.lang.Account,
           prop: "acc",
           width: "30%",
         },
         {
-          label: "班级",
+          label: this.lang.Class,
           prop: "classname",
           width: "40%",
         },
@@ -278,7 +277,7 @@ export default {
     confirmAllClaAddStu() {
       if (this.selectedStuData.length === 0) {
         this.$message({
-          message: "请选择学生",
+          message: this.lang.ssSelectStu,
           type: "error",
         });
         return;
@@ -296,13 +295,15 @@ export default {
           if (this.cascaderDataPath.length > 0) {
             this.getdata(this.cascaderDataPath[1]);
           }
+          this.addOp3('1', "", { type: "student_move" }, "success")
         })
         .catch((err) => {
           console.error(err);
           this.$message({
-            message: "移动失败",
+            message: this.lang.ssMoveStuFail,
             type: "error",
           });
+          this.addOp3('1', "", { type: "student_move" }, err)
         });
     },
     moveClassStudentPromise(item, cid) {
@@ -342,7 +343,7 @@ export default {
     searchStu() {
       if (!this.searchStuName) {
         this.$message({
-          message: "请输入学生姓名",
+          message: this.lang.enterstuname,
           type: "error",
         });
         return;

+ 23 - 365
src/components/pages/studentManageNew/component/editInterstcla.vue

@@ -4,139 +4,32 @@
     <el-dialog :visible.sync="InterestClaEditvisible" width="442px">
       <template slot="title">
         <div class="dia_title_box">
-          <span>编辑兴趣班</span>
+          <span>{{ lang.ssInterestClass }}</span>
         </div>
       </template>
 
       <div class="dia_box_item" v-loading="isLoading">
         <div class="addcla_box_item">
-          <span class="addcla_box_item_span">兴趣班名称:</span>
+          <span class="addcla_box_item_span">{{ lang.ssInterClaNameColon }}</span>
           <el-input
             v-model.trim="clainfo.name"
-            placeholder="请输入兴趣班名称"
+            :placeholder="lang.ssEnterInterClaNm"
           ></el-input>
         </div>
-        <!-- <div class="addcla_box_item" style="position: relative">
-          <span class="addcla_box_item_span">搜索学生:</span>
-          <el-input
-            v-model.trim="searchStuName"
-            placeholder="请输入学生姓名,多个姓名请用中文逗号(,)分隔"
-            slot="reference"
-            @change="searchStu"
-            @focus="popoverVisible = true"
-          ></el-input>
-
-          <div class="search_stu_box" v-if="popoverVisible" v-loading="editTabloading">
-            <div class="search_stu_box_content">
-              <el-tag
-                v-for="item in searchStuData"
-                :key="item.userid"
-                closable
-                :type="item.acc"
-                @close="handleClose(item)"
-              >
-                <el-tooltip
-                  class="item"
-                  effect="dark"
-                  :content="item.acc"
-                  placement="top-start"
-                >
-                  <span>{{ item.username }}</span>
-                </el-tooltip>
-              </el-tag>
-            </div>
-            <div class="search_stu_box_footer">
-              <div>输入学生共{{ searchStuData.length }}人</div>
-              <div>
-                <el-button size="small" @click="selectNoneStu">取消</el-button>
-                <el-button size="small" type="primary" @click="selectStu"
-                  >确定</el-button
-                >
-              </div>
-            </div>
-          </div>
-        </div>
-        <div class="addcla_box_item">
-          <span class="addcla_box_item_span">已选择:</span>
-          <div class="selected_stu_box">
-            <el-tag
-              v-for="(item, index) in selectedStuData"
-              :key="index"
-              closable
-              :type="item.acc"
-              @close="handleSelectedStuClose(item)"
-            >
-              <span>{{ item.username }}</span>
-            </el-tag>
-          </div>
-        </div>
-        <div>
-          选择学生(可以多选)
-        </div>
-        <el-table
-          :data="interestClaAllStuData"
-          ref="tableData"
-          style="width: 100%"
-          :header-cell-style="{ background: '#E7EAF0' }"
-          height="300px"
-          :show-header="false"
-          class="tableList"
-          @selection-change="handleInterestClaSelectionChange"
-        >
-          <el-table-column
-            type="selection"
-            :selectable="checkSelectable"
-            width="55px"
-          >
-          </el-table-column>
-          <el-table-column
-            v-for="(item, index) in studentColumns"
-            :key="index"
-            :label="item.label"
-          >
-            <template slot-scope="scope">
-              <div v-if="item.label == '账号'">
-                <span>{{ scope.row.acc.split("@")[0] }}</span>
-              </div>
-              <div class="cla_box" v-else-if="item.label == '班级'">
-                <span
-                  class="cla_span"
-                  v-for="(cla, ind) in scope.row.classname.split('/')"
-                  :key="ind + 'cla'"
-                >
-                  {{ cla }}
-                </span>
-              </div>
-              <div v-else>
-                <span>{{ scope.row[item.prop] }}</span>
-              </div>
-            </template>
-          </el-table-column>
-        </el-table>
-        <div class="page_box">
-          <div>第{{ (page - 1) * pageSize + 1 }}~{{ page * pageSize }}条,共{{ total }}条</div>
-          <el-pagination
-            background
-            @current-change="handlePageChange"
-            :current-page.sync="page"
-            :page-size="pageSize"
-            layout="prev, pager, next"
-            :total="total"
-          >
-          </el-pagination>
-        </div> -->
       </div>
       <div slot="footer" class="dialog-footer">
-        <el-button @click="cancelAllSelection">取消</el-button>
+        <el-button @click="cancelAllSelection">{{ lang.Cancel }}</el-button>
         <el-button type="primary" @click="confirmInterestClaEdit"
-          >确定</el-button
+          >{{ lang.Confirm }}</el-button
         >
       </div>
     </el-dialog>
   </div>
 </template>
 <script>
+import { myMixin } from "@/mixins/mixin.js"
 export default {
+  mixins: [ myMixin ],
   name: "editInterstcla",
   props: {
     interestClaEditInfo: {
@@ -164,139 +57,29 @@ export default {
       role: this.$route.query.role,
       clainfo: {}, // 班级信息
       studentColumns: [
-        { label: "姓名", prop: "username" },
-        { label: "账号", prop: "acc" },
-        { label: "班级", prop: "classname" },
+        { label: this.lang.StudentName, prop: "username" },
+        { label: this.lang.Account, prop: "acc" },
+        { label: this.lang.Class, prop: "classname" },
       ],
-      editTabloading: false, // 编辑表格加载中
-      searchStuName: "", // 兴趣班编辑搜索学生姓名
-      selectedStuData: [], // 兴趣班编辑已选择学生数据
-      popoverVisible: false, // 兴趣班编辑搜索学生弹框显示
-      searchStuData: [], // 兴趣班编辑搜索学生数据
       InterestClaEditvisible: false, // 兴趣班编辑信息
-      interestClaAllStuData: [], // 兴趣班编辑所有学生数据
       isLoading: false, // 是否加载中
-      page: 1,
-      total: 0,
-      pageSize: 10,
     };
   },
   methods: {
-    // 判断行是否可选
-    checkSelectable(row) {
-      return row.classid.indexOf(this.clainfo.id) == -1; // 状态为disabled的行禁用选择
-    },
-    // 删除搜索学生标签
-    handleClose(item) {
-      this.searchStuData = this.searchStuData.filter(
-        (e) => e.userid !== item.userid
-      );
-    },
-    // 删除已选择学生
-    handleSelectedStuClose(item) {
-      // 从已选择数据中移除
-      this.selectedStuData = this.selectedStuData.filter(
-        (e) => e.userid !== item.userid
-      );
-      // 如果该学生在当前页的表格中,取消其选中状态
-      this.$nextTick(() => {
-        if (this.$refs.tableData) {
-          const row = this.interestClaAllStuData.find(
-            (row) => row.userid === item.userid
-          );
-          if (row) {
-            this.$refs.tableData.toggleRowSelection(row, false);
-          }
-        }
-      });
-    },
-    // 关闭搜索学生弹框
-    selectNoneStu() {
-      this.popoverVisible = false;
-      this.searchStuData = [];
-      this.searchStuName = "";
-    },
-    // 确定添加搜索学生
-    selectStu() {
-      this.popoverVisible = false;
-      // 获取已存在的 userid 集合,避免重复添加
-      const existingIds = new Set(this.selectedStuData.map(item => item.userid));
-      // 过滤掉重复的,只添加新的学生
-      const newStuData = this.searchStuData.filter(item => !existingIds.has(item.userid));
-      this.selectedStuData.push(...newStuData);
-      this.handleSelectedStuData(this.selectedStuData);
-
-      this.searchStuData = [];
-      this.searchStuName = "";
+    // 取消编辑兴趣班
+    cancelAllSelection() {
+      this.InterestClaEditvisible = false;
     },
-    // 兴趣班搜索学生
-    searchStu() {
-      if (!this.searchStuName) {
+    // 编辑兴趣班确定
+    confirmInterestClaEdit() {
+      if (this.clainfo.name == "") {
         this.$message({
-          message: "请输入学生姓名",
+          message: this.lang.ssEnterInterClaNm,
           type: "error",
         });
         return;
       }
-      this.editTabloading = true;
-      // 处理输入:去除多余空格,确保逗号分隔格式正确
-      let inpValue = this.searchStuName
-        .split(",")
-        .map((name) => name.trim())
-        .filter((name) => name)
-        .join(",");
-        console.log('inpValue',inpValue);
-        
-      let params = {
-        oid: this.oid,
-        inp: inpValue,
-      };
-      this.ajax
-        .get(this.$store.state.api + "selectchStu", params)
-        .then((res) => {
-          console.log(res.data[0], "res");
-          let box = res.data[0].filter((item) => item.classid.indexOf(this.clainfo.id) == -1);
-          this.searchStuData = box;
-          this.editTabloading = false;
-        })
-        .catch((err) => {
-          this.editTabloading = false;
-          console.error(err);
-        });
-      // this.selectedStuData = console.log(this.searchStuName);
-    },
-    handleInterestClaSelectionChange(val) {
-      // console.log("handleInterestClaSelectionChange", val);
-      // 关键:selection-change 的 val 只包含“当前页”勾选项
-      // 为了支持“跨页保留 + 当前页可取消”,需要:
-      // 1) 先把 selectedStuData 中属于当前页的数据全部移除
-      // 2) 再把 val(当前页实际选中的)合并回去
-      const currentPageIds = new Set(
-        (this.interestClaAllStuData || []).map((row) => row.userid)
-      );
-      const otherPageSelected = (this.selectedStuData || []).filter(
-        (item) => !currentPageIds.has(item.userid)
-      );
-      this.selectedStuData = [...otherPageSelected, ...val];
-    },
-    handlePageChange(val) {
-      // console.log("handlePageChange", val);
-      this.page = val;
-      this.getdata();
-    },
-    cancelAllSelection() {
-      // this.$refs.tableData.clearSelection();
-      // this.selectedStuData = [];
-      // this.searchStuData = [];
-      // this.searchStuName = "";
-      // this.clainfo = {};
-      this.InterestClaEditvisible = false;
-    },
-    handleSizeChange(val) {
-      console.log("val", val);
-      this.pageSize = val;
-      this.page = 1;
-      this.getdata();
+      this.confirmClaEdit();
     },
     // 修改班级名称确定
     confirmClaEdit() {
@@ -310,23 +93,16 @@ export default {
         .then((res) => {
           if (res.data[0] && res.data[0][0].classname == 1) {
             this.$message({
-              message: "班级名称不能相同",
+              message: this.lang.Cannotsameothercla,
               type: "error",
             });
-            if (this.selectedStuData.length > 0) {
-              this.moveInterestClaStudent();
-            } 
+            this.addOp3('1', "", { type: "interest_class_edit" }, err)
           } else {
             this.$message({
-              message: "修改成功",
+              message: this.lang.Editsuccessful,
               type: "success",
             });
-            // if (this.selectedStuData.length > 0) {
-            //   this.moveInterestClaStudent();
-            // } else {
-              this.cancelAllSelection();
-              this.$emit("getCascaderData");
-            // }
+            this.addOp3('1', "", { type: "interest_class_edit" }, "success")
           }
         })
         .catch((err) => {
@@ -335,127 +111,9 @@ export default {
             type: "error",
           });
           console.error(err);
+          this.addOp3('1', "", { type: "interest_class_edit" }, err)
         });
     },
-    // 编辑兴趣班确定
-    confirmInterestClaEdit() {
-      if (this.clainfo.name == "") {
-        this.$message({
-          message: "请输入兴趣班名称",
-          type: "error",
-        });
-        return;
-      }
-      this.confirmClaEdit();
-    },
-    // 移动学生到兴趣班
-    moveInterestClaStudent() {
-      const promises = this.selectedStuData.map((item) => {
-        let box = [...item.classid.split(","), this.clainfo.id];
-        box = box.filter((item) => item != "");
-        return this.moveClassStudentPromise(item, box.join(","));
-      });
-      Promise.all(promises)
-        .then(() => {
-          this.$message({
-            message: "添加成功",
-            type: "success",
-          });
-          this.cancelAllSelection();
-          this.$emit("getCascaderData");
-        })
-        .catch((err) => {
-          console.error(err);
-          this.$message({
-            message: "添加失败",
-            type: "error",
-          });
-        });
-    },
-    moveClassStudentPromise(item, cid) {
-      return new Promise((resolve, reject) => {
-        let params = [
-          {
-            userid: item.userid,
-            username: item.acc,
-            alias: item.username,
-            ph: item.phonenumber,
-            sid: item.studentid,
-            cid: cid,
-          },
-        ];
-        console.log(params);
-
-        this.ajax
-          .post(this.$store.state.api + "updateStudentInfo", params)
-          .then((res) => {
-            resolve(res);
-          })
-          .catch((err) => {
-            console.error(err);
-            reject(err);
-          });
-      });
-    },
-    // 学生管理全部学生
-    getdata() {
-      this.isLoading = true;
-      let params = {
-        oid: this.oid,
-        cid: "",
-        inp: "",
-        page: this.page,
-        num: this.pageSize,
-      };
-      this.ajax
-        .get(this.$store.state.api + "selectStudentManage", params)
-        .then((res) => {
-          this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
-          let box1 = res.data[0];
-          box1.forEach((e) => {
-            // let list = e.classname.split(",");
-            let kk = [];
-            this.cascaderData.forEach(item => {
-              item.children.forEach(item2 => {  
-                if (e.classid && e.classid.indexOf(item2.id) != -1) {
-                  kk.push(item.name + item2.name);
-                }else{
-                }
-              });
-            });
-            e.classname = kk.join("/");
-            // if (e.classname && e.classname != "null") {
-            //   e.classname =
-            //     (e.gname !== null && e.gname !== undefined ? e.gname : "") +
-            //     e.classname;
-            // } else {
-            //   e.classname = "-";
-            // }
-          });
-          this.interestClaAllStuData = res.data[0];
-          this.isLoading = false;
-          // 恢复表格选中状态
-          this.handleSelectedStuData(this.selectedStuData);
-        })
-        .catch((err) => {
-          this.isLoading = false;
-          console.error(err);
-        });
-    },
-    // 恢复表格选中状态
-    handleSelectedStuData(val) {
-      console.log("handleSelectedStuData", val);
-      this.$nextTick(() => {
-        if (this.$refs.tableData && val.length > 0) {
-          const selectedIds = new Set(val.map((item) => item.userid));
-          this.interestClaAllStuData.forEach((row) => {
-            if (selectedIds.has(row.userid)) {
-              this.$refs.tableData.toggleRowSelection(row, true);
-            }
-          });
-        }
-      });
-    },
   },
 };
 </script>

Разница между файлами не показана из-за своего большого размера
+ 354 - 258
src/components/pages/studentManageNew/component/table.vue


+ 31 - 23
src/components/pages/studentManageNew/index.vue

@@ -3,7 +3,7 @@
     <div class="rigbox">
       <div class="centerCss">
         <img src="../../../assets/stuImg/riqi.svg" alt="" />
-        <span style="color: #86909c; font-size: 12px">年级管理</span>
+        <span style="color: #86909c; font-size: 12px">{{ lang.GradeManagement }}</span>
       </div>
       <!-- v-if="orglist.includes(org)" -->
 
@@ -11,11 +11,11 @@
       <div style="display: flex; gap: 10px;">
         <div v-if="orglist.includes(org)" class="Clabtn" @click="openaddClass(1)">
           <img src="../../../assets/stuImg/jia.svg" alt="" />
-          <span>新年级</span>
+          <span>{{ lang.ssNewGrade }}</span>
         </div>
         <div class="Clabtn" @click="openaddClass(0)">
           <img src="../../../assets/stuImg/jia.svg" alt="" />
-          <span>新班级</span>
+          <span>{{ lang.ssNewClass }}</span>
         </div>
       </div>
         
@@ -39,7 +39,7 @@
             >
               <el-menu-item :index="k.id" style="font-weight: normal;" @click="handleClick(k.id, 0,k)">
                 <div class="tabcla_box">{{ k.name }}</div>
-                <span>{{ k.pnum }}人)</span>
+                <span>{{ lang.ssStuCount.replace(/\*/g, k.pnum) }}</span>
               </el-menu-item>
             </el-menu-item-group>
           </el-submenu>
@@ -49,26 +49,26 @@
       <div class="line"></div>
       <div class="centerCss">
         <img src="../../../assets/stuImg/inf.svg" alt="" />
-        <span style="color: #86909c; font-size: 12px">兴趣班管理</span>
+        <span style="color: #86909c; font-size: 12px">{{ lang.ssInterClassMng }}</span>
       </div>
       <div
         class="por"
         :class="{ active: boxType == 1 }"
         @click="handleClick('1', 1)"
       >
-        兴趣班列表
+        {{ lang.ssInterClassList }}
       </div>
       <div class="line"></div>
       <div class="centerCss">
         <img src="../../../assets/stuImg/per.svg" alt="" />
-        <span style="color: #86909c; font-size: 12px">学生管理</span>
+        <span style="color: #86909c; font-size: 12px">{{ lang.StudentManagement }}</span>
       </div>
       <div
         class="por"
         :class="{ active: boxType == 2 }"
         @click="handleClick('2', 2)"
       >
-        学生列表
+        {{ lang.ssStuList }}
       </div>
     </div>
 
@@ -86,7 +86,7 @@
 
     <!-- 新增班级  -->
     <el-dialog
-      title="添加班级"
+      :title="lang.AddClass"
       :visible.sync="addClassVisible"
       width="427px"
       :show-close="false"
@@ -94,8 +94,8 @@
     >
       <div class="addcla_box">
         <div class="addcla_box_item">
-          <span>所属年级:</span>
-          <el-select v-model="addclaGrade" placeholder="请选择年级">
+          <span>{{ lang.Grade }}{{ lang.ssColon }}</span>
+          <el-select v-model="addclaGrade" :placeholder="lang.ssSelectGrade">
             <el-option
               v-for="item in tableData"
               :key="item.id"
@@ -105,21 +105,21 @@
           </el-select>
         </div>
         <div class="addcla_box_item">
-          <span>班级名称:</span>
+          <span>{{ lang.ClassName }}{{ lang.ssColon }}</span>
           <el-input
             v-model="addclaName"
-            placeholder="请输入班级名称"
+            :placeholder="lang.EnterClassName"
           ></el-input>
         </div>
       </div>
       <div slot="footer" class="dialog-footer">
-        <div @click="addClassVisible = false">取消</div>
-        <div @click="addClass" style="background: #3681FC; color: #E3EDFF;">确认</div>
+        <div @click="addClassVisible = false">{{ lang.Cancel }}</div>
+        <div @click="addClass" style="background: #3681FC; color: #E3EDFF;">{{ lang.Confirm }}</div>
       </div>
     </el-dialog>
 
     <el-dialog
-      title="添加年级"
+      :title="lang.AddGrade"
       :visible.sync="addgraVisible"
       width="500px"
       :show-close="false"
@@ -127,13 +127,13 @@
     >
       <div class="addcla_box">
         <div class="addcla_box_item">
-          <span>年级:</span>
-          <el-input v-model.trim="addgraName" placeholder="请输入年级"></el-input>
+          <span>{{ lang.ssGradeType }}{{ lang.ssColon }}</span>
+          <el-input v-model.trim="addgraName" :placeholder="lang.EnterGrade"></el-input>
         </div>
       </div>
       <div slot="footer" class="dialog-footer">
-        <div @click="addgraVisible = false" style="color: #363636;">取消</div>
-        <div @click="addgra" style="background: #3681FC; color: #E6FFFFFF;">确认</div>
+        <div @click="addgraVisible = false" style="color: #363636;">{{ lang.Cancel }}</div>
+        <div @click="addgra" style="background: #3681FC; color: #E6FFFFFF;">{{ lang.Confirm }}</div>
       </div>
     </el-dialog>
   </div>
@@ -141,7 +141,9 @@
 
 <script>
 import tableL from "./component/table.vue";
+import { myMixin } from "@/mixins/mixin.js"
 export default {
+  mixins: [ myMixin ],
   components: {
     tableL,
   },
@@ -179,7 +181,7 @@ export default {
     // 添加年级
     addgra(){
       if (!this.addgraName) {
-        this.$message.error('请输入年级名称')
+        this.$message.error(this.lang.EnterGradeName)
       }
       this.boxLoading = true;
       let params = {
@@ -205,9 +207,12 @@ export default {
             this.addgraVisible = false;
             this.addgraName = "";
             this.getGrade()
+            this.addOp3('1', "", { type: "grade_add" }, "success")
+
           }
         })
         .catch((err) => {
+          this.addOp3('1', "", { type: "grade_add" }, err)
           this.$message({
             message: this.lang.Additionfailed,
             type: "error",
@@ -249,7 +254,7 @@ export default {
             }
           }
 
-          box3.push({id:0,name:"兴趣班",children:[]});
+          box3.push({id:0,name:this.lang.ssInterestClass,children:[]});
           // 获取所有年级的id列表(不包括兴趣班id:0)
           const gradeIds = box3.filter(e => e.id !== 0).map(e => e.id);
           box3.forEach((e) => {
@@ -280,7 +285,7 @@ export default {
     addClass() {
       if (!this.addclaName) {
         this.$message({
-          message: "请输入班级名称",
+          message: this.lang.EnterClassName,
           type: "error",
         });
         return;
@@ -304,6 +309,7 @@ export default {
               message: this.lang.Cannotsameothercla,
               type: "error",
             });
+            this.addOp3('1', "", { type: "class_add" }, err)
           } else {
             this.$message({
               message: this.lang.AddSuccessful,
@@ -313,9 +319,11 @@ export default {
             this.addclaName = "";
             this.addclaGrade = "";
             this.getGrade();
+            this.addOp3('1', "", { type: "class_add" }, "success")
           }
         })
         .catch((err) => {
+          this.addOp3('1', "", { type: "class_add" }, err)
           this.$message({
             message: this.lang.Additionfailed,
             type: "error",

+ 75 - 2
src/lang/cn.json

@@ -1,4 +1,4 @@
- {
+{
   "lang": "cn",
   "DepartmentManagement":"教研室管理",
   "DepartmentTypeManagement":"教研室类型管理",
@@ -1927,7 +1927,80 @@
   "ssAddSuccessVideo":"成功添加*个视频",
   "ssSelectVideoSource":"选择一种视频来源",
   "ssLocalUpload":"从本地文件上传",
-  "ssBiliSearch":"从Bilibili检索"
+  "ssBiliSearch":"从Bilibili检索",
+  "ssNewGrade":"新年级",
+  "ssNewClass":"新班级",
+  "ssInterClassMng":"兴趣班管理",
+  "ssInterClassList":"兴趣班列表",
+  "ssStuList":"学生列表",
+  "ssStuCount":"(*人)",
+  "ssInterestClass":"兴趣班",
+  "ssEnterClassNamePlc":"请输入班级名称...",
+  "ssSortEarliest":"按最早创建排序",
+  "ssSortLatest":"按最晚创建排序",
+  "ssRefresh":"刷新",
+  "ssResetPwd":"重置密码",
+  "ssMove":"移动",
+  "ssAddInterCla":"添加兴趣班",
+  "ssCancelSelAll":"取消全选",
+  "ssInterClaNameColon":"兴趣班名称:",
+  "ssEnterInterClaNm":"请输入兴趣班名称",
+  "ssMoveStudent":"移动学生",
+  "ssEditInfo":"编辑信息",
+  "ssEnterUserName":"请输入姓名",
+  "ssSearchInterCla":"搜索兴趣班...",
+  "ssSearchStudent":"搜索学生...",
+  "ssConfirmDelStuOne":"确认删除\"*\"学生?",
+  "ssConfirmDelStuNum":"确认删除这 * 位学生?",
+  "ssConfirmDelClass":"此操作将删除该班级,及班级所有已产生的授课数据, 是否继续?",
+  "ssConfirmRemoveNum":"确定从当前班级移除*名学生吗?",
+  "ssConfirmResetPwdN":"确定要重置 * 个学生的密码吗?",
+  "ssConfirmResetOne":"确定要重置 * 的密码吗?",
+  "ssConfirmMoveCla":"确定要移动到该班级吗?",
+  "ssConfirmEditStu":"确定要修改 * 的学生信息吗?",
+  "ssResetPwdSuccNum":"对*个账户重置密码成功!",
+  "ssResetPwdSucc":"重置密码成功!",
+  "ssDefaultPwdCoco":"默认密码为:Coco1234",
+  "ssCopySucc":"已复制到剪贴板",
+  "ssCopyFail":"复制失败",
+  "ssOnlyCreatorDel":"仅限创建者删除",
+  "ssSelectStuExp":"请先选中要导出的学生",
+  "ssMoveStuSame":"不能移动到同一班级",
+  "ssMoveStuSucc":"移动成功",
+  "ssMoveStuFail":"移动失败",
+  "ssRemoveStuSucc":"移除成功",
+  "ssRemoveStuFail":"移除失败",
+  "ssStuListXlsx":"学生列表.xlsx",
+  "ssResetPwdPartErr":"部分密码重置失败,请重试",
+  "ssResetPwdFail":"密码重置失败",
+  "ssPartDelFail":"部分删除失败,请重试",
+  "ssOnlyCreatorEdit":"仅限创建者编辑",
+  "ssTargetClass":"目标班级:",
+  "ssSearchStuLbl":"搜索学生:",
+  "ssEnterStuNameMul":"请输入学生姓名,多个姓名请用中文逗号(,)分隔",
+  "ssInputStuCnt":"输入学生共*人",
+  "ssSelectStuTip":"选择学生(可以多选)",
+  "ssAddStuSucc":"等*名同学已添加成功",
+  "ssPageInfoL":"第*条~第#条,共$条",
+  "ssAddStuTitle":"添加学生",
+  "ssFromExistL":"从已有学生中添加",
+  "ssManualInput":"手动输入",
+  "ssBelongClass":"所属班级:",
+  "ssEntered":"已输入:",
+  "ssStuNameDup":"您添加的学生“*”存在重复姓名。 是否继续添加?",
+  "ssUploadClickDrag":"点击或拖拽文件到此处上传",
+  "ssUploadTip":"支持格式:xlsx、xls,最多添加70人",
+  "ssUploadTempLbl":"上传模板:",
+  "ssDownloadTemp":"下载模板",
+  "ssUploadNote":"注意:请按照模板格式填写学生信息,避免导入失败",
+  "ssGetSuffixReUp":"正在获取后缀,请重新上传",
+  "ssGetSuffixReAdd":"正在获取后缀,请重新添加",
+  "ssCheckStuNameCol":"请检查上传文件学生姓名列是否填写正确",
+  "ssCheckClassCol":"请检查上传文件班级列是否填写正确",
+  "ssParseStuFail":"未能提取上传学生信息,请检查数据格式,使用模板文件格式上传",
+  "ssEnterStu":"请输入学生",
+  "ssAddStuMax70":"一次最多添加70人",
+  "ssSelectBelCla":"请选择所属班级"
 
 
 

+ 74 - 1
src/lang/en.json

@@ -1926,5 +1926,78 @@
   "ssAddSuccessVideo":"Successfully added * videos",
   "ssSelectVideoSource":"Select a video source",
   "ssLocalUpload":"Upload from local file",
-  "ssBiliSearch":"Search from Bilibili"
+  "ssBiliSearch":"Search from Bilibili",
+  "ssNewGrade":"New Grade",
+  "ssNewClass":"New Class",
+  "ssInterClassMng":"Interest Class Management",
+  "ssInterClassList":"Interest Class List",
+  "ssStuList":"Student List",
+  "ssStuCount":"(* people)",
+  "ssInterestClass":"Interest Class",
+  "ssEnterClassNamePlc":"Enter class name...",
+  "ssSortEarliest":"Sort by earliest created",
+  "ssSortLatest":"Sort by latest created",
+  "ssRefresh":"Refresh",
+  "ssResetPwd":"Reset Password",
+  "ssMove":"Move",
+  "ssAddInterCla":"Add Interest Class",
+  "ssCancelSelAll":"Cancel Select All",
+  "ssInterClaNameColon":"Interest Class Name:",
+  "ssEnterInterClaNm":"Enter interest class name",
+  "ssMoveStudent":"Move Student",
+  "ssEditInfo":"Edit Info",
+  "ssEnterUserName":"Enter name",
+  "ssSearchInterCla":"Search interest class...",
+  "ssSearchStudent":"Search student...",
+  "ssConfirmDelStuOne":"Confirm delete \"*\" student?",
+  "ssConfirmDelStuNum":"Confirm delete * student(s)?",
+  "ssConfirmDelClass":"This will delete the class and all teaching data. Continue?",
+  "ssConfirmRemoveNum":"Remove * student(s) from this class?",
+  "ssConfirmResetPwdN":"Reset password for * student(s)?",
+  "ssConfirmResetOne":"Reset password for *?",
+  "ssConfirmMoveCla":"Move to this class?",
+  "ssConfirmEditStu":"Edit *'s student info?",
+  "ssResetPwdSuccNum":"Password reset for * account(s)!",
+  "ssResetPwdSucc":"Password reset successful!",
+  "ssDefaultPwdCoco":"Default password: Coco1234",
+  "ssCopySucc":"Copied to clipboard",
+  "ssCopyFail":"Copy failed",
+  "ssOnlyCreatorDel":"Only the creator can delete",
+  "ssSelectStuExp":"Please select students to export first",
+  "ssMoveStuSame":"Cannot move to the same class",
+  "ssMoveStuSucc":"Move successful",
+  "ssMoveStuFail":"Move failed",
+  "ssRemoveStuSucc":"Remove successful",
+  "ssRemoveStuFail":"Remove failed",
+  "ssStuListXlsx":"Student List.xlsx",
+  "ssResetPwdPartErr":"Some passwords failed to reset, please try again",
+  "ssResetPwdFail":"Password reset failed",
+  "ssPartDelFail":"Some deletions failed, please try again",
+  "ssOnlyCreatorEdit":"Only the creator can edit",
+  "ssTargetClass":"Target class:",
+  "ssSearchStuLbl":"Search student:",
+  "ssEnterStuNameMul":"Enter student name(s), multiple names separated by Chinese comma (,)",
+  "ssInputStuCnt":"Entered * student(s)",
+  "ssSelectStuTip":"Select students (multiple allowed)",
+  "ssAddStuSucc":" and * student(s) have been added successfully",
+  "ssPageInfoL":"No.*-No.# , total $",
+  "ssAddStuTitle":"Add Student",
+  "ssFromExistL":"Add from existing students",
+  "ssManualInput":"Manual input",
+  "ssBelongClass":"Class:",
+  "ssEntered":"Entered:",
+  "ssStuNameDup":"The student you added \"*\" has duplicate names. Continue?",
+  "ssUploadClickDrag":"Click or drag file here to upload",
+  "ssUploadTip":"Supported: xlsx, xls; up to 70 students",
+  "ssUploadTempLbl":"Upload template:",
+  "ssDownloadTemp":"Download template",
+  "ssUploadNote":"Note: Please fill in student information according to the template format to avoid import failure",
+  "ssGetSuffixReUp":"Getting suffix, please re-upload",
+  "ssGetSuffixReAdd":"Getting suffix, please re-add",
+  "ssCheckStuNameCol":"Please check whether the student name column in the uploaded file is correct",
+  "ssCheckClassCol":"Please check whether the class column in the uploaded file is correct",
+  "ssParseStuFail":"Failed to parse student information. Please check the data format and use the template file format",
+  "ssEnterStu":"Please enter student",
+  "ssAddStuMax70":"You can add up to 70 students at a time",
+  "ssSelectBelCla":"Please select class"
 }

+ 74 - 1
src/lang/hk.json

@@ -1926,7 +1926,80 @@
   "ssAddSuccessVideo":"成功添加*個視頻",
   "ssSelectVideoSource":"選擇一種視頻來源",
   "ssLocalUpload":"從本地文件上傳",
-  "ssBiliSearch":"從Bilibili檢索"
+  "ssBiliSearch":"從Bilibili檢索",
+  "ssNewGrade":"新年級",
+  "ssNewClass":"新班級",
+  "ssInterClassMng":"興趣班管理",
+  "ssInterClassList":"興趣班列表",
+  "ssStuList":"學生列表",
+  "ssStuCount":"(*人)",
+  "ssInterestClass":"興趣班",
+  "ssEnterClassNamePlc":"請輸入班級名稱...",
+  "ssSortEarliest":"按最早創建排序",
+  "ssSortLatest":"按最晚創建排序",
+  "ssRefresh":"刷新",
+  "ssResetPwd":"重置密碼",
+  "ssMove":"移動",
+  "ssAddInterCla":"添加興趣班",
+  "ssCancelSelAll":"取消全選",
+  "ssInterClaNameColon":"興趣班名稱:",
+  "ssEnterInterClaNm":"請輸入興趣班名稱",
+  "ssMoveStudent":"移動學生",
+  "ssEditInfo":"編輯信息",
+  "ssEnterUserName":"請輸入姓名",
+  "ssSearchInterCla":"搜索興趣班...",
+  "ssSearchStudent":"搜索學生...",
+  "ssConfirmDelStuOne":"確認刪除\"*\"學生?",
+  "ssConfirmDelStuNum":"確認刪除這 * 位學生?",
+  "ssConfirmDelClass":"此操作將刪除該班級,及班級所有已產生的授課數據, 是否繼續?",
+  "ssConfirmRemoveNum":"確定從當前班級移除*名學生嗎?",
+  "ssConfirmResetPwdN":"確定要重置 * 個學生的密碼嗎?",
+  "ssConfirmResetOne":"確定要重置 * 的密碼嗎?",
+  "ssConfirmMoveCla":"確定要移動到該班級嗎?",
+  "ssConfirmEditStu":"確定要修改 * 的學生信息嗎?",
+  "ssResetPwdSuccNum":"對*個賬戶重置密碼成功!",
+  "ssResetPwdSucc":"重置密碼成功!",
+  "ssDefaultPwdCoco":"默認密碼為:Coco1234",
+  "ssCopySucc":"已複製到剪貼簿",
+  "ssCopyFail":"複製失敗",
+  "ssOnlyCreatorDel":"僅限創建者刪除",
+  "ssSelectStuExp":"請先選中要導出的學生",
+  "ssMoveStuSame":"不能移動到同一班級",
+  "ssMoveStuSucc":"移動成功",
+  "ssMoveStuFail":"移動失敗",
+  "ssRemoveStuSucc":"移除成功",
+  "ssRemoveStuFail":"移除失敗",
+  "ssStuListXlsx":"學生列表.xlsx",
+  "ssResetPwdPartErr":"部分密碼重置失敗,請重試",
+  "ssResetPwdFail":"密碼重置失敗",
+  "ssPartDelFail":"部分刪除失敗,請重試",
+  "ssOnlyCreatorEdit":"僅限創建者編輯",
+  "ssTargetClass":"目標班級:",
+  "ssSearchStuLbl":"搜索學生:",
+  "ssEnterStuNameMul":"請輸入學生姓名,多個姓名請用中文逗號(,)分隔",
+  "ssInputStuCnt":"輸入學生共*人",
+  "ssSelectStuTip":"選擇學生(可以多選)",
+  "ssAddStuSucc":"等*名同學已添加成功",
+  "ssPageInfoL":"第*條~第#條,共$條",
+  "ssAddStuTitle":"添加學生",
+  "ssFromExistL":"從已有學生中添加",
+  "ssManualInput":"手動輸入",
+  "ssBelongClass":"所屬班級:",
+  "ssEntered":"已輸入:",
+  "ssStuNameDup":"您添加的學生“*”存在重複姓名。 是否繼續添加?",
+  "ssUploadClickDrag":"點擊或拖拽文件到此處上傳",
+  "ssUploadTip":"支持格式:xlsx、xls,最多添加70人",
+  "ssUploadTempLbl":"上傳模板:",
+  "ssDownloadTemp":"下載模板",
+  "ssUploadNote":"注意:請按照模板格式填寫學生信息,避免導入失敗",
+  "ssGetSuffixReUp":"正在獲取後綴,請重新上傳",
+  "ssGetSuffixReAdd":"正在獲取後綴,請重新添加",
+  "ssCheckStuNameCol":"請檢查上傳文件學生姓名列是否填寫正確",
+  "ssCheckClassCol":"請檢查上傳文件班級列是否填寫正確",
+  "ssParseStuFail":"未能提取上傳學生信息,請檢查數據格式,使用模板文件格式上傳",
+  "ssEnterStu":"請輸入學生",
+  "ssAddStuMax70":"一次最多添加70人",
+  "ssSelectBelCla":"請選擇所屬班級"
 
 
 

Некоторые файлы не были показаны из-за большого количества измененных файлов