Ver Fonte

vue 20241210更改

贾小兵 há 5 meses atrás
pai
commit
7ac096a92e

+ 2 - 2
ruoyi-ui/src/views/login.vue

@@ -73,8 +73,8 @@ export default {
     return {
       codeUrl: "",
       loginForm: {
-        username: "admin",
-        password: "admin123",
+        username: "",
+        password: "",
         rememberMe: false,
         code: "",
         uuid: ""

+ 7 - 16
ruoyi-ui/src/views/people/practice/index.vue

@@ -3,8 +3,12 @@
     <el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
       <el-form-item label="模拟器类型" prop="field101">
         <el-select v-model="formData.field101" placeholder="请选择模拟器类型" clearable :style="{width: '95%'}">
-          <el-option v-for="(item, index) in field101Options" :key="index" :label="item.label"
-            :value="item.value" :disabled="item.disabled"></el-option>
+          <el-option
+              v-for="dict in dict.type.sim_equip_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
         </el-select>
       </el-form-item>
       <el-form-item size="large">
@@ -17,6 +21,7 @@
 export default {
   components: {},
   props: [],
+  dicts: ['sim_equip_type'],
   data() {
     return {
       formData: {
@@ -29,16 +34,6 @@ export default {
           trigger: 'change'
         }],
       },
-      field101Options: [{
-        "label": "选项一",
-        "value": 1
-      }, {
-        "label": "选项二",
-        "value": 2
-      }, {
-        "label": "选项三",
-        "value": 3
-      }],
     }
   },
   computed: {},
@@ -47,10 +42,6 @@ export default {
   mounted() {},
   methods: {
     submitForm() {
-      // this.$refs['elForm'].validate(valid => {
-      //   if (!valid) return
-      //   // TODO 提交表单
-      // })
       const userId = 1;//当前用户
       this.$router.push("/people/practice-practice2/practiceid/" + userId);
     },

+ 65 - 64
ruoyi-ui/src/views/peoples/exams/index.vue

@@ -2,7 +2,7 @@
   <div class="app-container">
     <el-row>
       <!--用户数据1-->
-        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
           <el-form-item label="考试名称" prop="userName">
             <el-input
               v-model="queryParams.userName"
@@ -12,12 +12,12 @@
               @keyup.enter.native="handleQuery"
             />
           </el-form-item>
-          <el-form-item label="考试状态" prop="status">
+          <el-form-item label="状态" prop="status">
             <el-select
               v-model="queryParams.status"
-              placeholder="考试状态"
+              placeholder="用户状态"
               clearable
-              style="width: 150px"
+              style="width: 240px"
             >
               <el-option
                 v-for="dict in dict.type.sys_normal_disable"
@@ -39,13 +39,19 @@
             ></el-date-picker>
           </el-form-item>
           <el-form-item label="模拟器类型" prop="userName">
-            <el-input
+            <el-select
               v-model="queryParams.userName"
-              placeholder="请输入模拟器类型"
+              placeholder="模拟器类型"
               clearable
               style="width: 240px"
-              @keyup.enter.native="handleQuery"
-            />
+            >
+              <el-option
+                v-for="dict in dict.type.sim_equip_type"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
           </el-form-item>
           <el-form-item label="创建时间">
             <el-date-picker
@@ -166,12 +172,12 @@
     </el-row>
 
     <!-- 添加或修改用户配置对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="70%" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+    <el-dialog :title="title" :visible.sync="open" width="75%" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px" style="display: flex;">
         <el-row>
-          <el-col :span="12">
+          <el-col :span="6" style="width: 20%;">
             <el-form-item label="型号">
-              <el-select v-model="selectedEquip"  placeholder="请选择模拟器类型" style="width: 100%;">
+              <el-select v-model="selectedEquip"  placeholder="请选择模拟器类型">
                 <el-option
                   value="请选择"
                 >请选择</el-option>
@@ -184,43 +190,40 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="6">
+            <el-form-item label="考试名称" prop="userName">
+              <el-input  placeholder="请输入考试名称" maxlength="30" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="考试时长" prop="userName">
+              <el-input  placeholder="请输入考试时长" maxlength="30" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="日期范围" prop="field101">
+              <el-date-picker type="daterange" format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd" :style="{width: '100%'}" start-placeholder="开始日期" end-placeholder="结束日期"
+                range-separator="至" clearable></el-date-picker>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="6">
             <el-form-item label="出题方式" prop="userName">
-              <el-select v-model="selectedEquip"  placeholder="请选择出题方式" style="width: 70%;">
+              <el-select v-model="selectmethod"  placeholder="请选择出题方式">
                 <el-option
                   value="请选择"
                 >请选择</el-option>
                 <el-option
-                  v-for="dict in dict.type.sim_equip_type"
+                  v-for="dict in dict.type.sys_topic_way"
                   :key="dict.value"
                   :label="dict.label"
                   :value="dict.value"
                 ></el-option>
               </el-select>
-              <el-button type="primary" round style="margin-left: 5%;" @click="handleSelectType">自选考题编辑</el-button>
-            </el-form-item>
-          </el-col>
-          
-          <el-col :span="12">
-            <el-form-item label="日期范围" prop="field101">
-              <el-date-picker type="daterange" v-model="form.field101" format="yyyy-MM-dd"
-                value-format="yyyy-MM-dd" :style="{width: '100%'}" start-placeholder="开始日期" end-placeholder="结束日期"
-                range-separator="至" clearable></el-date-picker>
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="12">
-            <el-form-item label="考试名称" prop="userName">
-              <el-input  placeholder="请输入考试名称" maxlength="30" />
-            </el-form-item>
-          </el-col>
-
-
-          <el-col :span="12">
-            <el-form-item label="考试时长" prop="userName">
-              <el-input  placeholder="请输入考试时长" maxlength="30" />
             </el-form-item>
           </el-col>
+          <el-button type="primary" round @click="handleSelectType" v-show="isShow">自选考题编辑</el-button>
         </el-row>
       </el-form>
 
@@ -228,7 +231,7 @@
       <el-row :gutter="20">
         <el-col :xs="24">
           <el-row :gutter="10" class="mb8">
-            <el-col :span="1.5">
+            <!-- <el-col :span="1.5">
               <el-button
                 type="primary"
                 plain
@@ -259,10 +262,7 @@
                 @click="handleDelete"
                 v-hasPermi="['system:user:remove']"
               >删除</el-button>
-            </el-col>
-            
-
-
+            </el-col> -->
             <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
           </el-row>
           <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
@@ -270,7 +270,7 @@
             <el-table-column label="区队/班级" align="center" key="className" prop="className" v-if="columns[0].visible" :show-overflow-tooltip="true" />
             <el-table-column label="专业名称" align="center" key="majorName" prop="majorName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
             <el-table-column label="全部学员数量" align="center" key="remark" prop="remark" v-if="columns[2].visible" :show-overflow-tooltip="true" />
-            <el-table-column
+            <!-- <el-table-column
               label="操作"
               align="center"
               width="160"
@@ -292,9 +292,8 @@
                   v-hasPermi="['system:user:remove']"
                 >删除</el-button>
               </template>
-            </el-table-column>
+            </el-table-column> -->
           </el-table>
-
           <pagination
             v-show="total>0"
             :total="total"
@@ -302,11 +301,8 @@
             :limit.sync="queryParams.pageSize"
             @pagination="getList"
           /> 
-          
         </el-col>
       </el-row>
-
-
       <h4 class="h4" style="font-size: 16px;font-weight: bold;margin-left: 2%;">统计情况</h4>
       <div class="shixiang">
           <div>本次考试班级数量:2</div>
@@ -326,13 +322,10 @@
     <el-dialog :title="title" :visible.sync="selectopen" width="70%" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
-          <el-col :span="12">
+          <el-col :span="6">
             <el-form-item label="型号">
               <el-select v-model="selectedEquip"  placeholder="请选择模拟器型号">
                 <el-option
-                  value="请选择"
-                >请选择</el-option>
-                <el-option
                   v-for="dict in dict.type.sim_equip_type"
                   :key="dict.value"
                   :label="dict.label"
@@ -341,6 +334,16 @@
               </el-select>
             </el-form-item>
           </el-col>
+          <el-col :span="6">
+            <el-form-item label="训练任务">
+              <el-select v-model="selectedEquip"  placeholder="请选择训练任务">
+                <el-option
+                  value="请选择"
+                >请选择</el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+
           <div style="text-align: right;">
             <el-button @click="toggleSelection(tableData_tm)">选择全部</el-button>
             <el-button @click="toggleSelection()">取消选择</el-button>
@@ -375,10 +378,6 @@
       </div>
     </el-dialog>
 
-
-
-
-    
     
   </div>
 </template>
@@ -404,12 +403,14 @@ import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 
 export default {
   name: "Task",
-  dicts: ['sim_equip_type'],
+  dicts: ['sim_equip_type','sys_topic_way','sys_normal_disable'],
   components: { Treeselect },
   data() {
     return {
       multipleSelection: [],
       selectedEquip: '',
+      selectmethod:'',
+      isShow:false,
       selectedZjEquip: '',
       tableData_tm: [
         {
@@ -594,8 +595,6 @@ export default {
       zijianopen:false,
       // 自选题目编辑
       selectopen:false,
-      // 部门名称
-      deptName: undefined,
       // 默认密码
       initPassword: undefined,
       // 日期范围
@@ -652,9 +651,13 @@ export default {
     };
   },
   watch: {
-    // 根据名称筛选部门树
-    deptName(val) {
-      this.$refs.tree.filter(val);
+    selectmethod(Value){
+      console.log('出题方式:'+Value)
+      if(Value==2){
+        this.isShow = true;
+      }else{
+        this.isShow = false;
+      }
     },
     selectedEquip(newValue) {
       // console.log(newValue);
@@ -822,8 +825,6 @@ export default {
       }
 
     },
-
-
   },
   created() {
     this.getList();

+ 3 - 6
ruoyi-ui/src/views/peoples/score/index.vue

@@ -5,7 +5,7 @@
     <el-row :gutter="20">
       <!--用户数据1-->
       <el-col :xs="24">
-        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
+        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
           <el-form-item label="学员学号" prop="className">
             <el-input
               v-model="queryParams.className"
@@ -203,7 +203,7 @@
     <!-- 修改对话框 -->
     <el-dialog :title="title" :visible.sync="dialogVisible1" width="40%" append-to-body style="margin-top: -1%;" >
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-col :span="howWidth" v-for="(item, index) in tableArr" :key="index">
+        <el-col v-for="(item, index) in tableArr" :key="index">
           <div class="box">
             <div class="content1">{{ item.key }}</div>
             <div class="content2">{{ item.value1}}</div>
@@ -243,7 +243,7 @@
     </el-dialog>
 
     <!---成绩详情-->
-    <el-dialog :title="title" :visible.sync="dialogVisible2" style="margin-top: -3%;" width="55%" append-to-body>
+    <el-dialog :title="title" :visible.sync="dialogVisible2" style="margin-top: -2%;" width="55%" append-to-body>
       <div style="font-size:22px;text-align: center;display:flex;margin-left: 20%;">
         <template>
           <div style="text-align:left;"> 20
@@ -310,9 +310,6 @@
   color: #606266;
   margin: 5px;
 }
-.el-form-item__label{
-  width: 80px !important;
-}
 .box {
   width: 100%;
   height: 40px;

+ 50 - 67
ruoyi-ui/src/views/peoples/trains/index.vue

@@ -2,7 +2,7 @@
   <div class="app-container">
     <el-row>
       <!--用户数据1-->
-        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
           <el-form-item label="练习名称" prop="userName">
             <el-input
               v-model="queryParams.userName"
@@ -171,9 +171,9 @@
     <el-dialog :title="title" :visible.sync="open" width="70%" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
-          <el-col :span="12">
+          <el-col :span="6"  style="width: 20%;">
             <el-form-item label="型号">
-              <el-select v-model="selectedEquip"  placeholder="请选择模拟器类型" style="width: 100%;">
+              <el-select v-model="selectedEquip"  placeholder="请选择模拟器类型">
                 <el-option
                   value="请选择"
                 >请选择</el-option>
@@ -186,43 +186,37 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="出题方式" prop="userName">
-              <el-select v-model="selectedEquip"  placeholder="请选择出题方式" style="width: 70%;">
-                <el-option
-                  value="请选择"
-                >请选择</el-option>
-                <el-option
-                  v-for="dict in dict.type.sim_equip_type"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                ></el-option>
-              </el-select>
-              <el-button type="primary" round style="margin-left: 5%;" @click="handleSelectType">自选考题编辑</el-button>
+          <el-col :span="6">
+            <el-form-item label="练习名称" prop="userName">
+              <el-input  placeholder="请输入练习名称" maxlength="30" />
             </el-form-item>
           </el-col>
-          
-          <el-col :span="12">
+          <el-col :span="6">
+            <el-form-item label="练习时长" prop="userName">
+              <el-input  placeholder="请输入练习时长" maxlength="30" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
             <el-form-item label="日期范围" prop="field101">
-              <el-date-picker type="daterange" v-model="form.field101" format="yyyy-MM-dd"
+              <el-date-picker type="daterange" format="yyyy-MM-dd"
                 value-format="yyyy-MM-dd" :style="{width: '100%'}" start-placeholder="开始日期" end-placeholder="结束日期"
                 range-separator="至" clearable></el-date-picker>
             </el-form-item>
           </el-col>
-
-          <el-col :span="12">
-            <el-form-item label="练习名称" prop="userName">
-              <el-input  placeholder="请输入练习名称" maxlength="30" />
-            </el-form-item>
-          </el-col>
-
-
-          <el-col :span="12">
-            <el-form-item label="练习时长" prop="userName">
-              <el-input  placeholder="请输入练习时长" maxlength="30" />
+          <el-col :span="6">
+            <el-form-item label="出题方式" prop="userName">
+              <el-select v-model="selectmethod"  placeholder="请选择出题方式">
+                <el-option
+                  v-for="dict in dict.type.sys_topic_way"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+              
             </el-form-item>
           </el-col>
+          <el-button type="primary" round @click="handleSelectType"  v-show="isShow">自选考题编辑</el-button>
         </el-row>
       </el-form>
 
@@ -230,7 +224,7 @@
       <el-row :gutter="20">
         <el-col :xs="24">
           <el-row :gutter="10" class="mb8">
-            <el-col :span="1.5">
+            <!-- <el-col :span="1.5">
               <el-button
                 type="primary"
                 plain
@@ -261,10 +255,7 @@
                 @click="handleDelete"
                 v-hasPermi="['system:user:remove']"
               >删除</el-button>
-            </el-col>
-            
-
-
+            </el-col> -->
             <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
           </el-row>
           <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
@@ -327,7 +318,7 @@
     <el-dialog :title="title" :visible.sync="selectopen" width="70%" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
-          <el-col :span="12">
+          <el-col :span="6">
             <el-form-item label="型号">
               <el-select v-model="selectedEquip"  placeholder="请选择模拟器型号">
                 <el-option
@@ -342,6 +333,15 @@
               </el-select>
             </el-form-item>
           </el-col>
+          <el-col :span="6">
+            <el-form-item label="训练任务">
+              <el-select v-model="selectedEquip"  placeholder="请选择训练任务">
+                <el-option
+                  value="请选择"
+                >请选择</el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
           <div style="text-align: right;">
             <el-button @click="toggleSelection(tableData_tm)">选择全部</el-button>
             <el-button @click="toggleSelection()">取消选择</el-button>
@@ -375,12 +375,6 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
-
-
-
-
-    
-    
   </div>
 </template>
 <style>
@@ -404,10 +398,12 @@ import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 
 export default {
   name: "Task",
-  dicts: ['sim_equip_type'],
+  dicts: ['sim_equip_type','sys_topic_way','sys_normal_disable'],
   components: { Treeselect },
   data() {
     return {
+      selectmethod:'',
+      isShow:false,
       multipleSelection: [],
       selectedEquip: '',
       selectedZjEquip: '',
@@ -612,21 +608,6 @@ export default {
         children: "children",
         label: "label"
       },
-      // 用户导入参数
-      upload: {
-        // 是否显示弹出层(用户导入)
-        open: false,
-        // 弹出层标题(用户导入)
-        title: "",
-        // 是否禁用上传
-        isUploading: false,
-        // 是否更新已经存在的用户数据
-        updateSupport: 0,
-        // 设置上传的请求头部
-        headers: { Authorization: "Bearer " + getToken() },
-        // 上传的地址
-        url: process.env.VUE_APP_BASE_API + "/simulator/user/importData"
-      },
       // 查询参数
       queryParams: {
         pageNum: 1,
@@ -639,10 +620,10 @@ export default {
       // 列信息
       columns: [
         { key: 0, label: `编号`, visible: true },
-        { key: 1, label: `考试名称`, visible: true },
-        { key: 2, label: `考试时间`, visible: true },
+        { key: 1, label: `练习名称`, visible: true },
+        { key: 2, label: `练习时间`, visible: true },
         { key: 3, label: `模拟器类型`, visible: true },
-        { key: 4, label: `考试状态`, visible: true },
+        { key: 4, label: `练习状态`, visible: true },
         { key: 5, label: `创建老师`, visible: true },
         { key: 6, label: `创建时间`, visible: true }
       ],
@@ -652,9 +633,13 @@ export default {
     };
   },
   watch: {
-    // 根据名称筛选部门树
-    deptName(val) {
-      this.$refs.tree.filter(val);
+    selectmethod(Value){
+      console.log('出题方式:'+Value)
+      if(Value==2){
+        this.isShow = true;
+      }else{
+        this.isShow = false;
+      }
     },
     selectedEquip(newValue) {
       // console.log(newValue);
@@ -822,8 +807,6 @@ export default {
       }
 
     },
-
-
   },
   created() {
     this.getList();

+ 33 - 33
ruoyi-ui/src/views/system/dept/index.vue

@@ -1,16 +1,16 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
-      <el-form-item label="部门名称" prop="deptName">
+      <el-form-item label="班级" prop="deptName">
         <el-input
           v-model="queryParams.deptName"
-          placeholder="请输入部门名称"
+          placeholder="请输入班级"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
       <el-form-item label="状态" prop="status">
-        <el-select v-model="queryParams.status" placeholder="部门状态" clearable>
+        <el-select v-model="queryParams.status" placeholder="状态" clearable>
           <el-option
             v-for="dict in dict.type.sys_normal_disable"
             :key="dict.value"
@@ -56,7 +56,7 @@
       :default-expand-all="isExpandAll"
       :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
     >
-      <el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
+      <el-table-column prop="deptName" label="班级名称" width="260"></el-table-column>
       <el-table-column prop="orderNum" label="排序" width="200"></el-table-column>
       <el-table-column prop="status" label="状态" width="100">
         <template slot-scope="scope">
@@ -77,13 +77,13 @@
             @click="handleUpdate(scope.row)"
             v-hasPermi="['system:dept:edit']"
           >修改</el-button>
-          <el-button
+          <!-- <el-button
             size="mini"
             type="text"
             icon="el-icon-plus"
             @click="handleAdd(scope.row)"
             v-hasPermi="['system:dept:add']"
-          >新增</el-button>
+          >新增</el-button> -->
           <el-button
             v-if="scope.row.parentId != 0"
             size="mini"
@@ -101,15 +101,15 @@
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="24" v-if="form.parentId !== 0">
-            <el-form-item label="上级部门" prop="parentId">
-              <treeselect v-model="form.parentId" :options="deptOptions" :normalizer="normalizer" placeholder="选择上级部门" />
+            <el-form-item label="上级" prop="parentId">
+              <treeselect v-model="form.parentId" :options="deptOptions" :normalizer="normalizer" placeholder="选择上级" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="部门名称" prop="deptName">
-              <el-input v-model="form.deptName" placeholder="请输入部门名称" />
+            <el-form-item label="班级名称" prop="deptName">
+              <el-input v-model="form.deptName" placeholder="请输入班级名称" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -118,7 +118,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row>
+        <!-- <el-row>
           <el-col :span="12">
             <el-form-item label="负责人" prop="leader">
               <el-input v-model="form.leader" placeholder="请输入负责人" maxlength="20" />
@@ -129,15 +129,15 @@
               <el-input v-model="form.phone" placeholder="请输入联系电话" maxlength="11" />
             </el-form-item>
           </el-col>
-        </el-row>
+        </el-row> -->
         <el-row>
-          <el-col :span="12">
+          <!-- <el-col :span="12">
             <el-form-item label="邮箱" prop="email">
               <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
             </el-form-item>
-          </el-col>
+          </el-col> -->
           <el-col :span="12">
-            <el-form-item label="部门状态">
+            <el-form-item label="状态">
               <el-radio-group v-model="form.status">
                 <el-radio
                   v-for="dict in dict.type.sys_normal_disable"
@@ -194,28 +194,28 @@ export default {
       // 表单校验
       rules: {
         parentId: [
-          { required: true, message: "上级部门不能为空", trigger: "blur" }
+          { required: true, message: "上级不能为空", trigger: "blur" }
         ],
         deptName: [
-          { required: true, message: "部门名称不能为空", trigger: "blur" }
+          { required: true, message: "班级名称不能为空", trigger: "blur" }
         ],
         orderNum: [
           { required: true, message: "显示排序不能为空", trigger: "blur" }
         ],
-        email: [
-          {
-            type: "email",
-            message: "请输入正确的邮箱地址",
-            trigger: ["blur", "change"]
-          }
-        ],
-        phone: [
-          {
-            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
-            message: "请输入正确的手机号码",
-            trigger: "blur"
-          }
-        ]
+        // email: [
+        //   {
+        //     type: "email",
+        //     message: "请输入正确的邮箱地址",
+        //     trigger: ["blur", "change"]
+        //   }
+        // ],
+        // phone: [
+        //   {
+        //     pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+        //     message: "请输入正确的手机号码",
+        //     trigger: "blur"
+        //   }
+        // ]
       }
     };
   },
@@ -277,7 +277,7 @@ export default {
         this.form.parentId = row.deptId;
       }
       this.open = true;
-      this.title = "添加部门";
+      this.title = "添加班级";
       listDept().then(response => {
         this.deptOptions = this.handleTree(response.data, "deptId");
       });
@@ -296,7 +296,7 @@ export default {
       getDept(row.deptId).then(response => {
         this.form = response.data;
         this.open = true;
-        this.title = "修改部门";
+        this.title = "修改班级";
         listDeptExcludeChild(row.deptId).then(response => {
           this.deptOptions = this.handleTree(response.data, "deptId");
           if (this.deptOptions.length == 0) {

+ 2 - 2
ruoyi-ui/src/views/system/user/profile/index.vue

@@ -27,10 +27,10 @@
                 <svg-icon icon-class="tree" />所属部门
                 <div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div>
               </li> -->
-              <!-- <li class="list-group-item">
+              <li class="list-group-item">
                 <svg-icon icon-class="peoples" />所属角色
                 <div class="pull-right">{{ roleGroup }}</div>
-              </li> -->
+              </li>
               <li class="list-group-item">
                 <svg-icon icon-class="date" />创建日期
                 <div class="pull-right">{{ user.createTime }}</div>

+ 117 - 0
ruoyi-ui/src/views/teacher/authRole.vue

@@ -0,0 +1,117 @@
+<template>
+  <div class="app-container">
+    <h4 class="form-header h4">基本信息</h4>
+    <el-form ref="form" :model="form" label-width="80px">
+      <el-row>
+        <el-col :span="8" :offset="2">
+          <el-form-item label="用户昵称" prop="nickName">
+            <el-input v-model="form.nickName" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8" :offset="2">
+          <el-form-item label="登录账号" prop="userName">
+            <el-input  v-model="form.userName" disabled />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <h4 class="form-header h4">角色信息</h4>
+    <el-table v-loading="loading" :row-key="getRowKey" @row-click="clickRow" ref="table" @selection-change="handleSelectionChange" :data="roles.slice((pageNum-1)*pageSize,pageNum*pageSize)">
+      <el-table-column label="序号" type="index" align="center">
+        <template slot-scope="scope">
+          <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column type="selection" :reserve-selection="true" width="55"></el-table-column>
+      <el-table-column label="角色编号" align="center" prop="roleId" />
+      <el-table-column label="角色名称" align="center" prop="roleName" />
+      <el-table-column label="权限字符" align="center" prop="roleKey" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination v-show="total>0" :total="total" :page.sync="pageNum" :limit.sync="pageSize" />
+
+    <el-form label-width="100px">
+      <el-form-item style="text-align: center;margin-left:-120px;margin-top:30px;">
+        <el-button type="primary" @click="submitForm()">提交</el-button>
+        <el-button @click="close()">返回</el-button>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { getAuthRole, updateAuthRole } from "@/api/system/user";
+
+export default {
+  name: "AuthRole",
+  data() {
+    return {
+       // 遮罩层
+      loading: true,
+      // 分页信息
+      total: 0,
+      pageNum: 1,
+      pageSize: 10,
+      // 选中角色编号
+      roleIds:[],
+      // 角色信息
+      roles: [],
+      // 用户信息
+      form: {}
+    };
+  },
+  created() {
+    const userId = this.$route.params && this.$route.params.userId;
+    if (userId) {
+      this.loading = true;
+      getAuthRole(userId).then((response) => {
+        this.form = response.user;
+        this.roles = response.roles;
+        this.total = this.roles.length;
+        this.$nextTick(() => {
+          this.roles.forEach((row) => {
+            if (row.flag) {
+              this.$refs.table.toggleRowSelection(row);
+            }
+          });
+        });
+        this.loading = false;
+      });
+    }
+  },
+  methods: {
+    /** 单击选中行数据 */
+    clickRow(row) {
+      this.$refs.table.toggleRowSelection(row);
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.roleIds = selection.map((item) => item.roleId);
+    },
+    // 保存选中的数据编号
+    getRowKey(row) {
+      return row.roleId;
+    },
+    /** 提交按钮 */
+    submitForm() {
+      const userId = this.form.userId;
+      const roleIds = this.roleIds.join(",");
+      updateAuthRole({ userId: userId, roleIds: roleIds }).then((response) => {
+        this.$modal.msgSuccess("授权成功");
+        this.close();
+      });
+    },
+    /** 关闭按钮 */
+    close() {
+      const obj = { path: "/system/user" };
+      this.$tab.closeOpenPage(obj);
+    },
+  },
+};
+</script>

+ 513 - 0
ruoyi-ui/src/views/teacher/index.vue

@@ -0,0 +1,513 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--教师数据-->
+      <el-col :span="24" :xs="24">
+        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+          <el-form-item label="教工号" prop="userName">
+            <el-input
+              v-model="queryParams.userName"
+              placeholder="请输入教工号"
+              clearable
+              style="width: 240px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="教师名称" prop="nickName">
+            <el-input
+              v-model="queryParams.nickName"
+              placeholder="请输入教师名称"
+              clearable
+              style="width: 240px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="手机号码" prop="phonenumber">
+            <el-input
+              v-model="queryParams.phonenumber"
+              placeholder="请输入手机号码"
+              clearable
+              style="width: 240px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="状态" prop="status">
+            <el-select
+              v-model="queryParams.status"
+              placeholder="用户状态"
+              clearable
+              style="width: 240px"
+            >
+              <el-option
+                v-for="dict in dict.type.sys_normal_disable"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="创建时间">
+            <el-date-picker
+              v-model="dateRange"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['system:user:add']"
+            >新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:user:edit']"
+            >修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
+            >删除</el-button>
+          </el-col>
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+        </el-row>
+
+        <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column label="ID" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
+          <el-table-column label="教工号" align="center" key="userName" prop="userName" v-if="columns[1].visible" />
+          <el-table-column label="教师名称" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
+          <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[3].visible" width="120" />
+          <el-table-column label="状态" align="center" key="status" v-if="columns[4].visible">
+            <template slot-scope="scope">
+              <el-switch
+                v-model="scope.row.status"
+                active-value="0"
+                inactive-value="1"
+                @change="handleStatusChange(scope.row)"
+              ></el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[5].visible" width="160">
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="操作"
+            align="center"
+            width="160"
+            class-name="small-padding fixed-width"
+          >
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:user:edit']"
+              >修改</el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['system:user:remove']"
+              >删除</el-button>
+
+              <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:user:resetPwd', 'system:user:edit']">
+                <el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
+                <el-dropdown-menu slot="dropdown">
+                  <el-dropdown-item command="handleResetPwd" icon="el-icon-key"
+                    v-hasPermi="['system:user:resetPwd']">重置密码</el-dropdown-item>
+                  <!-- <el-dropdown-item command="handleAuthRole" icon="el-icon-circle-check"
+                    v-hasPermi="['system:user:edit']">分配角色</el-dropdown-item> -->
+                </el-dropdown-menu>
+              </el-dropdown>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total>0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+
+    <!-- 添加或修改用户配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item v-if="form.userId == undefined" label="教工号" prop="userName">
+              <el-input v-model="form.userName" placeholder="请输入教工号" maxlength="30" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item v-if="form.userId == undefined" label="登录密码" prop="password">
+              <el-input v-model="form.password" placeholder="请输入登录密码" type="password" maxlength="20" show-password/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="教师名称" prop="nickName">
+              <el-input v-model="form.nickName" placeholder="请输入教师名称" maxlength="30" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="手机号码" prop="phonenumber">
+              <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="状态">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                  v-for="dict in dict.type.sys_normal_disable"
+                  :key="dict.value"
+                  :label="dict.value"
+                >{{dict.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <!-- <el-row>
+          <el-col :span="12">
+            <el-form-item label="角色">
+              <el-select v-model="form.roleIds" multiple placeholder="请选择角色">
+                <el-option
+                  v-for="item in roleOptions"
+                  :key="item.roleId"
+                  :label="item.roleName"
+                  :value="item.roleId"
+                  :disabled="item.status == 1"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row> -->
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="备注">
+              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    
+  </div>
+</template>
+
+<script>
+import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus, deptTreeSelect } from "@/api/system/user";
+import { getToken } from "@/utils/auth";
+// import Treeselect from "@riophae/vue-treeselect";
+// import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ['sys_normal_disable', 'sys_user_sex'],
+  // components: { Treeselect },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 用户表格数据
+      userList: null,
+      // 弹出层标题
+      title: "",
+      // 部门树选项
+      deptOptions: undefined,
+      // 是否显示弹出层
+      open: false,
+      // 部门名称
+      deptName: undefined,
+      // 默认密码
+      initPassword: undefined,
+      // 日期范围
+      dateRange: [],
+      // 岗位选项
+      postOptions: [],
+      // 角色选项
+      roleOptions: [],
+      // 表单参数
+      form: {},
+      defaultProps: {
+        children: "children",
+        label: "label"
+      },
+      // 用户导入参数
+      upload: {
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/system/user/importData"
+      },
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        phonenumber: undefined,
+        status: undefined,
+      },
+      // 列信息
+      columns: [
+        { key: 0, label: `ID`, visible: false },
+        { key: 1, label: `教工号`, visible: true },
+        { key: 2, label: `教师名称`, visible: true },
+        { key: 3, label: `手机号码`, visible: true },
+        { key: 4, label: `状态`, visible: true },
+        { key: 5, label: `创建时间`, visible: true }
+      ],
+      // 表单校验
+      rules: {
+        userName: [
+          { required: true, message: "教工号不能为空", trigger: "blur" },
+          { min: 2, max: 20, message: '教工号称长度必须介于 2 和 20 之间', trigger: 'blur' }
+        ],
+        nickName: [
+          { required: true, message: "教师昵称不能为空", trigger: "blur" }
+        ],
+        password: [
+          { required: true, message: "登录密码不能为空", trigger: "blur" },
+          { min: 5, max: 20, message: '登录密码长度必须介于 5 和 20 之间', trigger: 'blur' },
+          { pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "请输入正确的手机号码",
+            trigger: "blur"
+          }
+        ]
+      }
+    };
+  },
+  watch: {
+    // 根据名称筛选部门树
+    // deptName(val) {
+    //   this.$refs.tree.filter(val);
+    // }
+  },
+  created() {
+    this.getList();
+    // this.getDeptTree();
+    this.getConfigKey("sys.user.initPassword").then(response => {
+      this.initPassword = response.msg;
+    });
+  },
+  methods: {
+    /** 查询用户列表 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 用户状态修改
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "启用" : "停用";
+      this.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function() {
+        return changeUserStatus(row.userId, row.status);
+      }).then(() => {
+        this.$modal.msgSuccess(text + "成功");
+      }).catch(function() {
+        row.status = row.status === "0" ? "1" : "0";
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        userId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: []
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    // 更多操作触发
+    handleCommand(command, row) {
+      switch (command) {
+        case "handleResetPwd":
+          this.handleResetPwd(row);
+          break;
+        case "handleAuthRole":
+          this.handleAuthRole(row);
+          break;
+        default:
+          break;
+      }
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      getUser().then(response => {
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.open = true;
+        this.title = "添加教师";
+        this.form.password = this.initPassword;
+      });
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then(response => {
+        this.form = response.data;
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.open = true;
+        this.title = "修改";
+        this.form.password = "";
+      });
+    },
+    /** 重置密码按钮操作 */
+    handleResetPwd(row) {
+      this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "用户密码长度必须介于 5 和 20 之间",
+        inputValidator: (value) => {
+          if (/<|>|"|'|\||\\/.test(value)) {
+            return "不能包含非法字符:< > \" ' \\\ |"
+          }
+        },
+      }).then(({ value }) => {
+          resetUserPwd(row.userId, value).then(response => {
+            this.$modal.msgSuccess("修改成功,新密码是:" + value);
+          });
+        }).catch(() => {});
+    },
+    /** 分配角色操作 */
+    handleAuthRole: function(row) {
+      const userId = row.userId;
+      this.$router.push("/system/user-auth/role/" + userId);
+    },
+    /** 提交按钮 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function() {
+        return delUser(userIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+  }
+};
+</script>

+ 91 - 0
ruoyi-ui/src/views/teacher/profile/index.vue

@@ -0,0 +1,91 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <el-col :span="6" :xs="24">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix">
+            <span>个人信息</span>
+          </div>
+          <div>
+            <div class="text-center">
+              <userAvatar />
+            </div>
+            <ul class="list-group list-group-striped">
+              <li class="list-group-item">
+                <svg-icon icon-class="user" />用户名称
+                <div class="pull-right">{{ user.userName }}</div>
+              </li>
+              <li class="list-group-item">
+                <svg-icon icon-class="phone" />手机号码
+                <div class="pull-right">{{ user.phonenumber }}</div>
+              </li>
+              <li class="list-group-item">
+                <svg-icon icon-class="email" />用户邮箱
+                <div class="pull-right">{{ user.email }}</div>
+              </li>
+              <li class="list-group-item">
+                <svg-icon icon-class="tree" />所属部门
+                <div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div>
+              </li>
+              <li class="list-group-item">
+                <svg-icon icon-class="peoples" />所属角色
+                <div class="pull-right">{{ roleGroup }}</div>
+              </li>
+              <li class="list-group-item">
+                <svg-icon icon-class="date" />创建日期
+                <div class="pull-right">{{ user.createTime }}</div>
+              </li>
+            </ul>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :span="18" :xs="24">
+        <el-card>
+          <div slot="header" class="clearfix">
+            <span>基本资料</span>
+          </div>
+          <el-tabs v-model="activeTab">
+            <el-tab-pane label="基本资料" name="userinfo">
+              <userInfo :user="user" />
+            </el-tab-pane>
+            <el-tab-pane label="修改密码" name="resetPwd">
+              <resetPwd />
+            </el-tab-pane>
+          </el-tabs>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import userAvatar from "./userAvatar";
+import userInfo from "./userInfo";
+import resetPwd from "./resetPwd";
+import { getUserProfile } from "@/api/system/user";
+
+export default {
+  name: "Profile",
+  components: { userAvatar, userInfo, resetPwd },
+  data() {
+    return {
+      user: {},
+      roleGroup: {},
+      postGroup: {},
+      activeTab: "userinfo"
+    };
+  },
+  created() {
+    this.getUser();
+  },
+  methods: {
+    getUser() {
+      getUserProfile().then(response => {
+        this.user = response.data;
+        this.roleGroup = response.roleGroup;
+        this.postGroup = response.postGroup;
+      });
+    }
+  }
+};
+</script>

+ 69 - 0
ruoyi-ui/src/views/teacher/profile/resetPwd.vue

@@ -0,0 +1,69 @@
+<template>
+  <el-form ref="form" :model="user" :rules="rules" label-width="80px">
+    <el-form-item label="旧密码" prop="oldPassword">
+      <el-input v-model="user.oldPassword" placeholder="请输入旧密码" type="password" show-password/>
+    </el-form-item>
+    <el-form-item label="新密码" prop="newPassword">
+      <el-input v-model="user.newPassword" placeholder="请输入新密码" type="password" show-password/>
+    </el-form-item>
+    <el-form-item label="确认密码" prop="confirmPassword">
+      <el-input v-model="user.confirmPassword" placeholder="请确认新密码" type="password" show-password/>
+    </el-form-item>
+    <el-form-item>
+      <el-button type="primary" size="mini" @click="submit">保存</el-button>
+      <el-button type="danger" size="mini" @click="close">关闭</el-button>
+    </el-form-item>
+  </el-form>
+</template>
+
+<script>
+import { updateUserPwd } from "@/api/system/user";
+
+export default {
+  data() {
+    const equalToPassword = (rule, value, callback) => {
+      if (this.user.newPassword !== value) {
+        callback(new Error("两次输入的密码不一致"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      user: {
+        oldPassword: undefined,
+        newPassword: undefined,
+        confirmPassword: undefined
+      },
+      // 表单校验
+      rules: {
+        oldPassword: [
+          { required: true, message: "旧密码不能为空", trigger: "blur" }
+        ],
+        newPassword: [
+          { required: true, message: "新密码不能为空", trigger: "blur" },
+          { min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" },
+          { pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }
+        ],
+        confirmPassword: [
+          { required: true, message: "确认密码不能为空", trigger: "blur" },
+          { required: true, validator: equalToPassword, trigger: "blur" }
+        ]
+      }
+    };
+  },
+  methods: {
+    submit() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
+            this.$modal.msgSuccess("修改成功");
+          });
+        }
+      });
+    },
+    close() {
+      this.$tab.closePage();
+    }
+  }
+};
+</script>

+ 184 - 0
ruoyi-ui/src/views/teacher/profile/userAvatar.vue

@@ -0,0 +1,184 @@
+<template>
+  <div>
+    <div class="user-info-head" @click="editCropper()"><img v-bind:src="options.img" title="点击上传头像" class="img-circle img-lg" /></div>
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body @opened="modalOpened"  @close="closeDialog">
+      <el-row>
+        <el-col :xs="24" :md="12" :style="{height: '350px'}">
+          <vue-cropper
+            ref="cropper"
+            :img="options.img"
+            :info="true"
+            :autoCrop="options.autoCrop"
+            :autoCropWidth="options.autoCropWidth"
+            :autoCropHeight="options.autoCropHeight"
+            :fixedBox="options.fixedBox"
+            :outputType="options.outputType"
+            @realTime="realTime"
+            v-if="visible"
+          />
+        </el-col>
+        <el-col :xs="24" :md="12" :style="{height: '350px'}">
+          <div class="avatar-upload-preview">
+            <img :src="previews.url" :style="previews.img" />
+          </div>
+        </el-col>
+      </el-row>
+      <br />
+      <el-row>
+        <el-col :lg="2" :sm="3" :xs="3">
+          <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload">
+            <el-button size="small">
+              选择
+              <i class="el-icon-upload el-icon--right"></i>
+            </el-button>
+          </el-upload>
+        </el-col>
+        <el-col :lg="{span: 1, offset: 2}" :sm="2" :xs="2">
+          <el-button icon="el-icon-plus" size="small" @click="changeScale(1)"></el-button>
+        </el-col>
+        <el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2">
+          <el-button icon="el-icon-minus" size="small" @click="changeScale(-1)"></el-button>
+        </el-col>
+        <el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2">
+          <el-button icon="el-icon-refresh-left" size="small" @click="rotateLeft()"></el-button>
+        </el-col>
+        <el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2">
+          <el-button icon="el-icon-refresh-right" size="small" @click="rotateRight()"></el-button>
+        </el-col>
+        <el-col :lg="{span: 2, offset: 6}" :sm="2" :xs="2">
+          <el-button type="primary" size="small" @click="uploadImg()">提 交</el-button>
+        </el-col>
+      </el-row>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import store from "@/store";
+import { VueCropper } from "vue-cropper";
+import { uploadAvatar } from "@/api/system/user";
+import { debounce } from '@/utils'
+
+export default {
+  components: { VueCropper },
+  data() {
+    return {
+      // 是否显示弹出层
+      open: false,
+      // 是否显示cropper
+      visible: false,
+      // 弹出层标题
+      title: "修改头像",
+      options: {
+        img: store.getters.avatar,  //裁剪图片的地址
+        autoCrop: true,             // 是否默认生成截图框
+        autoCropWidth: 200,         // 默认生成截图框宽度
+        autoCropHeight: 200,        // 默认生成截图框高度
+        fixedBox: true,             // 固定截图框大小 不允许改变
+        outputType:"png",           // 默认生成截图为PNG格式
+        filename: 'avatar'          // 文件名称
+      },
+      previews: {},
+      resizeHandler: null
+    };
+  },
+  methods: {
+    // 编辑头像
+    editCropper() {
+      this.open = true;
+    },
+    // 打开弹出层结束时的回调
+    modalOpened() {
+      this.visible = true;
+      if (!this.resizeHandler) {
+        this.resizeHandler = debounce(() => {
+          this.refresh()
+        }, 100)
+      }
+      window.addEventListener("resize", this.resizeHandler)
+    },
+    // 刷新组件
+    refresh() {
+      this.$refs.cropper.refresh();
+    },
+    // 覆盖默认的上传行为
+    requestUpload() {
+    },
+    // 向左旋转
+    rotateLeft() {
+      this.$refs.cropper.rotateLeft();
+    },
+    // 向右旋转
+    rotateRight() {
+      this.$refs.cropper.rotateRight();
+    },
+    // 图片缩放
+    changeScale(num) {
+      num = num || 1;
+      this.$refs.cropper.changeScale(num);
+    },
+    // 上传预处理
+    beforeUpload(file) {
+      if (file.type.indexOf("image/") == -1) {
+        this.$modal.msgError("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
+      } else {
+        const reader = new FileReader();
+        reader.readAsDataURL(file);
+        reader.onload = () => {
+          this.options.img = reader.result;
+          this.options.filename = file.name;
+        };
+      }
+    },
+    // 上传图片
+    uploadImg() {
+      this.$refs.cropper.getCropBlob(data => {
+        let formData = new FormData();
+        formData.append("avatarfile", data, this.options.filename);
+        uploadAvatar(formData).then(response => {
+          this.open = false;
+          this.options.img = process.env.VUE_APP_BASE_API + response.imgUrl;
+          store.commit('SET_AVATAR', this.options.img);
+          this.$modal.msgSuccess("修改成功");
+          this.visible = false;
+        });
+      });
+    },
+    // 实时预览
+    realTime(data) {
+      this.previews = data;
+    },
+    // 关闭窗口
+    closeDialog() {
+      this.options.img = store.getters.avatar
+      this.visible = false;
+      window.removeEventListener("resize", this.resizeHandler)
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.user-info-head {
+  position: relative;
+  display: inline-block;
+  height: 120px;
+}
+
+.user-info-head:hover:after {
+  content: '+';
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  color: #eee;
+  background: rgba(0, 0, 0, 0.5);
+  font-size: 24px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  cursor: pointer;
+  line-height: 110px;
+  border-radius: 50%;
+}
+</style>

+ 88 - 0
ruoyi-ui/src/views/teacher/profile/userInfo.vue

@@ -0,0 +1,88 @@
+<template>
+  <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+    <el-form-item label="用户昵称" prop="nickName">
+      <el-input v-model="form.nickName" maxlength="30" />
+    </el-form-item> 
+    <el-form-item label="手机号码" prop="phonenumber">
+      <el-input v-model="form.phonenumber" maxlength="11" />
+    </el-form-item>
+    <el-form-item label="邮箱" prop="email">
+      <el-input v-model="form.email" maxlength="50" />
+    </el-form-item>
+    <el-form-item label="性别">
+      <el-radio-group v-model="form.sex">
+        <el-radio label="0">男</el-radio>
+        <el-radio label="1">女</el-radio>
+      </el-radio-group>
+    </el-form-item>
+    <el-form-item>
+      <el-button type="primary" size="mini" @click="submit">保存</el-button>
+      <el-button type="danger" size="mini" @click="close">关闭</el-button>
+    </el-form-item>
+  </el-form>
+</template>
+
+<script>
+import { updateUserProfile } from "@/api/system/user";
+
+export default {
+  props: {
+    user: {
+      type: Object
+    }
+  },
+  data() {
+    return {
+      form: {},
+      // 表单校验
+      rules: {
+        nickName: [
+          { required: true, message: "用户昵称不能为空", trigger: "blur" }
+        ],
+        email: [
+          { required: true, message: "邮箱地址不能为空", trigger: "blur" },
+          {
+            type: "email",
+            message: "请输入正确的邮箱地址",
+            trigger: ["blur", "change"]
+          }
+        ],
+        phonenumber: [
+          { required: true, message: "手机号码不能为空", trigger: "blur" },
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "请输入正确的手机号码",
+            trigger: "blur"
+          }
+        ]
+      }
+    };
+  },
+  watch: {
+    user: {
+      handler(user) {
+        if (user) {
+          this.form = { nickName: user.nickName, phonenumber: user.phonenumber, email: user.email, sex: user.sex };
+        }
+      },
+      immediate: true
+    }
+  },
+  methods: {
+    submit() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          updateUserProfile(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.user.phonenumber = this.form.phonenumber;
+            this.user.email = this.form.email;
+          });
+        }
+      });
+    },
+    close() {
+      this.$tab.closePage();
+    }
+  }
+};
+</script>