47 hai 7 meses
pai
achega
aff0ae34ff

+ 3 - 8
src/api/system/user/index.ts

@@ -16,9 +16,11 @@ export interface UserVO {
   loginDate: Date
   createTime: Date
   userType: string
-  importStatus: string// 导入状态
+  supervisor: string
+  // importStatus: string// 导入状态
   photoUrl: string// 学生照片
   userNumber: string// 学号
+  photoExist: number// 照片是否存在
 }
 
 // 查询用户管理列表
@@ -44,13 +46,6 @@ export const getDeptTeacherPage = (params: PageParam) => {
 export const getDeptStudentPage = (params: PageParam) => {
   return request.get({ url: '/system/user/DeptStudentPage', params })
 }
-const params = {
-  // 这里填写你的参数,例如:
-  pageNo: 1,
-  pageSize: 10,
-}
-const response = await getDeptStudentPage(params);
-console.log(response);
 
 // 查询当前工作间下用户
 export const getDeptUser = () => {

+ 31 - 0
src/router/modules/remaining.ts

@@ -1,4 +1,5 @@
 import { Layout } from '@/utils/routerHelper'
+import UserAchievement from '@/views/system/workroomTeacher/userAchievement/index.vue'
 
 const { t } = useI18n()
 /**
@@ -33,6 +34,36 @@ const { t } = useI18n()
  }
  **/
 const remainingRouter: AppRouteRecordRaw[] = [
+  {
+    path: '/system',
+    component: Layout,
+    name: 'System',
+    meta: {
+      // title: t('router.system'),
+      icon: 'ep:setting',
+      noCache: false,
+      affix: false,
+      breadcrumb: false,
+      noTagsView: false,
+      hidden: true
+    },
+    children: [
+      {
+        path: 'user-achievement',
+        component: UserAchievement,
+        name: 'UserAchievement',
+        meta: {
+          title: '成果信息',
+          icon: 'ep:user-filled',
+          noCache: false,
+          affix: false,
+          breadcrumb: false,
+          noTagsView: false,
+          hidden: true
+        }
+      }
+    ]
+  },
   {
     path: '/redirect',
     component: Layout,

+ 4 - 1
src/views/Profile/Index.vue

@@ -22,6 +22,9 @@
           <el-tab-pane :label="t('profile.info.resetPwd')" name="resetPwd">
             <ResetPwd />
           </el-tab-pane>
+          <el-tab-pane label='人脸信息' name="faceInfo">
+            <FaceInfo />
+          </el-tab-pane>
           <el-tab-pane :label="t('profile.info.userSocial')" name="userSocial">
             <UserSocial v-model:activeName="activeName" />
           </el-tab-pane>
@@ -31,7 +34,7 @@
   </div>
 </template>
 <script lang="ts" setup>
-import { BasicInfo, ProfileUser, ResetPwd, UserSocial } from './components'
+import { BasicInfo, ProfileUser, ResetPwd, UserSocial, FaceInfo } from './components'
 
 const { t } = useI18n()
 defineOptions({ name: 'Profile' })

+ 34 - 0
src/views/Profile/components/FaceInfo.vue

@@ -0,0 +1,34 @@
+<template>
+  <ContentWrap>
+    <el-image
+      v-if="photourl"
+      class="h-80px w-80px"
+      :src="photourl"
+      fit="cover"
+    />
+    <p v-else>加载中...</p>
+  </ContentWrap>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from 'vue'
+import { getUserProfile } from '@/api/system/user/profile'
+
+const photourl = ref('')
+
+// 获取图片的函数
+const fetchImage = async () => {
+  try {
+    const response = await getUserProfile() // 替换为实际获取图片的API方法
+    console.log(response,'12');
+    photourl.value = response.photoUrl // 根据实际API的返回结构调整
+  } catch (error) {
+    console.error('获取图片失败:', error)
+  }
+}
+
+// 组件挂载后获取图片
+onMounted(() => {
+  fetchImage()
+})
+</script>

+ 2 - 1
src/views/Profile/components/index.ts

@@ -3,5 +3,6 @@ import ProfileUser from './ProfileUser.vue'
 import ResetPwd from './ResetPwd.vue'
 import UserAvatarVue from './UserAvatar.vue'
 import UserSocial from './UserSocial.vue'
+import FaceInfo from './FaceInfo.vue'
 
-export { BasicInfo, ProfileUser, ResetPwd, UserAvatarVue, UserSocial }
+export { BasicInfo, ProfileUser, ResetPwd, UserAvatarVue, UserSocial, FaceInfo }

+ 1 - 0
src/views/system/graduateStudent/UserForm.vue

@@ -207,6 +207,7 @@ const userTypes = ref([
   { label: '本校生', value: "1" },
   { label: '毕业生', value: "2" },
   { label: '导师', value: "3" },
+  { label: '学院', value: "4" }
 ]);
 
 //获取所有导师

+ 53 - 4
src/views/system/graduateStudent/index.vue

@@ -103,7 +103,7 @@
             label="用户名称"
             align="center"
             prop="username"
-            :show-overflow-tooltip="true"
+            :show-overflow-tooltip="true"   
           /> -->
           <el-table-column
             label="用户昵称"
@@ -111,7 +111,18 @@
             prop="nickname"
             :show-overflow-tooltip="true"
           />
+
           <el-table-column label="年级" align="center" prop="grade" width="120" />
+          <el-table-column label="学号" align="center" prop="userNumber" width="150" />
+          <el-table-column label="邮箱" align="center" prop="email" width="120" />
+
+          <el-table-column 
+            v-if="userInfo.userType === '4'" 
+            label="工作间名称" 
+            align="center" 
+            prop="deptName" 
+            width="120"
+          />
 
           <el-table-column
             label="工作地点"
@@ -121,8 +132,22 @@
             :show-overflow-tooltip="true"
           />
           <el-table-column label="手机号码" align="center" prop="mobile" width="120" />
-          <el-table-column label="导师" align="center" prop="supervisor" width="120" />
-          <el-table-column label="导师电话" align="center" prop="supervisorMobile" width="120" />
+          <el-table-column 
+            v-if="userInfo.userType !== '3'"
+            label="导师" 
+            align="center" 
+            prop="supervisor" 
+            width="120" 
+          />
+
+          <el-table-column
+            v-if="userInfo.userType !== '3'" 
+            label="导师电话" 
+            align="center" 
+            prop="supervisorMobile" 
+            width="120" 
+          />
+
           <el-table-column label="状态" key="status">
             <template #default="scope">
               <el-switch
@@ -200,6 +225,7 @@ import { CommonStatusEnum } from '@/utils/constants'
 import * as UserApi from '@/api/system/user'
 import UserForm from './UserForm.vue'
 import UserImportForm from './UserImportForm.vue'
+import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
 
 
 defineOptions({ name: 'SystemUser' })
@@ -207,6 +233,13 @@ defineOptions({ name: 'SystemUser' })
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
 
+const userInfo = ref({} as ProfileVO)
+const getUserInfo = async () => {
+  const users = await getUserProfile()
+  console.log(users)
+  userInfo.value = users
+}
+
 const loading = ref(true) // 列表的加载中
 const total = ref(0) // 列表的总页数
 const list = ref([]) // 列表的数
@@ -223,6 +256,7 @@ const queryParams = reactive({
   supervisorMobile: undefined,
   workPlace: undefined,
   grade: undefined,
+
 })
 const queryFormRef = ref() // 搜索的表单
 
@@ -235,6 +269,10 @@ const getList = async () => {
   loading.value = true
   try {
     const data = await UserApi.getGraduateStudentPage(queryParams)
+    console.log(data,'data');
+    // const filteredList = NewList(data.list);
+    // list.value = filteredList;
+    // total.value = filteredList.length; 
     list.value = data.list
     total.value = data.total
   } finally {
@@ -242,6 +280,16 @@ const getList = async () => {
   }
 }
 
+// const NewList = (inputList) => {
+//   if (userInfo.value.userType === '4') {
+//     return inputList; // 直接返回所有项目
+//   } else if (userInfo.value.userType === '3') {
+//     return inputList.filter(item => item.supervisor === userInfo.value.nickname);
+//   }
+//   return inputList;
+// }
+
+
 /** 搜索按钮操作 */
 const handleQuery = () => {
   queryParams.pageNo = 1
@@ -326,7 +374,8 @@ const handleDelete = async (id: number) => {
 
 
 /** 初始化 */
-onMounted(() => {
+onMounted(async () => {
+  await getUserInfo()
   getList()
 })
 </script>

+ 1 - 0
src/views/system/graduateStudentT/UserForm.vue

@@ -173,6 +173,7 @@ const userTypes = ref([
   { label: '本校生', value: "1" },
   { label: '毕业生', value: "2" },
   { label: '导师', value: "3" },
+  { label: '学院', value: "4" }
 ]);
 /** 打开弹窗 */
 const open = async (type: string, id?: number) => {

+ 16 - 5
src/views/system/studentAttendanceManage/studentAttendance/index.vue

@@ -37,10 +37,10 @@
           class="!w-240px"
         >
           <el-option :label="'正常'" :value="0" />
-          <el-option :label="'迟到'" :value="1" />
-          <el-option :label="'早退'" :value="2" />
-          <el-option :label="'缺勤'" :value="3" />
-          <el-option :label="'请假'" :value="4" />
+          <el-option :label="'未打卡'" :value="1" />
+          <el-option :label="'警告'" :value="2" />
+          <el-option :label="'恢复正常'" :value="3" />
+          <el-option :label="'未知类型'" :value="4" />
         </el-select>
       </el-form-item>
 
@@ -153,6 +153,7 @@ import download from '@/utils/download'
 import { StudentAttendanceApi, StudentAttendanceVO } from '@/api/system/studentAttendance'
 import StudentAttendanceForm from './StudentAttendanceForm.vue'
 import { DICT_TYPE } from '@/utils/dict'
+import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
 
 /** 学生考勤记录 列表 */
 defineOptions({ name: 'StudentAttendance' })
@@ -160,6 +161,13 @@ defineOptions({ name: 'StudentAttendance' })
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
 
+const userInfo = ref({} as ProfileVO)
+const getUserInfo = async () => {
+  const users = await getUserProfile()
+  console.log(users)
+  userInfo.value = users
+}
+
 const loading = ref(true) // 列表的加载中
 const list = ref<StudentAttendanceVO[]>([]) // 列表的数据
 const total = ref(0) // 列表的总页数
@@ -184,6 +192,8 @@ const getList = async () => {
   loading.value = true
   try {
     const data = await StudentAttendanceApi.getStudentAttendancePage(queryParams)
+    console.log(data, 'data');
+    
     list.value = data.list
     total.value = data.total
   } finally {
@@ -256,7 +266,8 @@ const getStatusClass = (status) => {
 };
 
 /** 初始化 **/
-onMounted(() => {
+onMounted(async () => {
+  await getUserInfo()
   getList()
 })
 </script>

+ 14 - 5
src/views/system/studentAttendanceManage/studentAttendanceError/index.vue

@@ -37,10 +37,10 @@
           class="!w-240px"
         >
           <el-option :label="'正常'" :value="0" />
-          <el-option :label="'迟到'" :value="1" />
-          <el-option :label="'早退'" :value="2" />
-          <el-option :label="'缺勤'" :value="3" />
-          <el-option :label="'请假'" :value="4" />
+          <el-option :label="'未打卡'" :value="1" />
+          <el-option :label="'警告'" :value="2" />
+          <el-option :label="'恢复正常'" :value="3" />
+          <el-option :label="'未知类型'" :value="4" />
         </el-select>
       </el-form-item>
       
@@ -147,6 +147,7 @@ import download from '@/utils/download'
 import { StudentAttendanceApi, StudentAttendanceVO } from '@/api/system/studentAttendance'
 import StudentAttendanceForm from './StudentAttendanceForm.vue'
 import { DICT_TYPE } from '@/utils/dict'
+import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
 
 /** 学生考勤记录 列表 */
 defineOptions({ name: 'StudentAttendance' })
@@ -154,6 +155,13 @@ defineOptions({ name: 'StudentAttendance' })
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
 
+const userInfo = ref({} as ProfileVO)
+const getUserInfo = async () => {
+  const users = await getUserProfile()
+  console.log(users)
+  userInfo.value = users
+}
+
 const loading = ref(true) // 列表的加载中
 const list = ref<StudentAttendanceVO[]>([]) // 列表的数据
 const total = ref(0) // 列表的总页数
@@ -250,7 +258,8 @@ const getStatusClass = (status) => {
 };
 
 /** 初始化 **/
-onMounted(() => {
+onMounted(async () => {
+  await getUserInfo()
   getList()
 })
 </script>

+ 28 - 19
src/views/system/studentAttendanceManage/studentFaceManage/index.vue

@@ -8,10 +8,10 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="用户昵称" prop="nickName">
+      <el-form-item label="用户昵称" prop="nickname">
             <el-input
               placeholder="请输入用户昵称 "
-              v-model="queryParams.nickName"
+              v-model="queryParams.nickname"
               clearable
                @keyup.enter="handleQuery"
               class="!w-240px"
@@ -27,9 +27,9 @@
             />
       </el-form-item>
 
-      <el-form-item label="导入状态" prop="status">
+      <el-form-item label="导入状态" prop="photoIsExist">
         <el-select
-          v-model="queryParams.status"
+          v-model="queryParams.photoIsExist"
           placeholder="请选择导入状态"
           clearable
           class="!w-240px"
@@ -83,9 +83,9 @@
         :formatter="dateFormatter"
         width="180px"
       />
-      <el-table-column label="导入状态" align="center" prop="status">
+      <el-table-column label="导入状态" align="center" prop="photoIsExist">
         <template #default="scope">
-          <dict-tag :type="DICT_TYPE.SYSTEM_STUDENT_FACE_TYPE" :value="scope.row.status" />  
+          <dict-tag :type="DICT_TYPE.SYSTEM_STUDENT_FACE_TYPE" :value="scope.row.photoIsExist" />  
         </template>
       </el-table-column>
       <!-- <el-table-column label="导入状态" align="center" prop="status" width="180px">
@@ -166,6 +166,7 @@ import StudentFaceImport from './StudentFaceImport.vue'
 import { useI18n } from 'vue-i18n'
 import { ref, reactive, onMounted } from 'vue'
 import { DICT_TYPE } from '@/utils/dict'
+import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
 
 
 /** 学生考勤记录 列表 */
@@ -174,6 +175,13 @@ defineOptions({ name: 'StudentFaceManage' })
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
 
+const userInfo = ref({} as ProfileVO)
+const getUserInfo = async () => {
+  const users = await getUserProfile()
+  console.log(users)
+  userInfo.value = users
+}
+
 const loading = ref(true) // 列表的加载中
 const list = ref<UserVO[]>([]) // 列表的数据
 const total = ref(0) // 列表的总页数
@@ -183,7 +191,7 @@ const queryParams = reactive({
   id: undefined,
   nickname: undefined,
   createTime: [],
-  status: undefined,
+  photoIsExist: undefined,
   remark: undefined,
 })
 const queryFormRef = ref() // 搜索的表单
@@ -193,7 +201,7 @@ const exportLoading = ref(false) // 导出的加载中
 const getList = async () => {
   loading.value = true
   try {
-    const data = await UserApi.getDeptStudentPage(queryParams)
+    const data = await UserApi.getStudentPage(queryParams)
     list.value = data.list
     total.value = data.total
     console.log(data,'查询列表');
@@ -258,16 +266,16 @@ const handleImportzip = () => {
 }
 
 // 状态颜色显示
-const getStatusClass = (status) => {
-  switch (status) {
-    case "0":
-      return 'status-Imported';
-    case "1":
-      return 'status-Notimported';
-    default:
-      return 'status-unknown';
-  }
-};
+// const getStatusClass = (status) => {
+//   switch (status) {
+//     case "0":
+//       return 'status-Imported';
+//     case "1":
+//       return 'status-Notimported';
+//     default:
+//       return 'status-unknown';
+//   }
+// };
 
 // 获取学生列表并处理 photoUrl
 // const loadStudentData = async (params) => {
@@ -290,7 +298,8 @@ const getStatusClass = (status) => {
 // };
 
 /** 初始化 **/
-onMounted(() => {
+onMounted(async () => {
+  await getUserInfo()
   getList()
 })
 </script>

+ 50 - 5
src/views/system/user/UserForm.vue

@@ -80,9 +80,6 @@
             </el-select>
           </el-form-item>
         </el-col>
-      </el-row>
-
-      <el-row v-if="formType === 'update'">
         <el-col :span="12">
           <el-form-item label="用户类型" prop="userType">
             <el-select v-model="formData.userType" placeholder="请选择用户类型">
@@ -96,6 +93,29 @@
           </el-form-item>
         </el-col>
       </el-row>
+
+      <el-row v-if="formType === 'update'">
+        
+        <el-col :span="12">
+          <el-form-item label="导师名称" prop="supervisorId">
+            <el-select
+              v-model="formData.supervisor"
+              @change="handleSupervisorChange"
+              placeholder="请选择导师名称"
+              clearable
+              filterable
+              class="!w-240px"
+            >
+              <el-option
+                v-for="user in users"
+                :key="user.id"
+                :label="user.nickname"
+                :value="user.id"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
       
       <el-row>
         <el-col :span="24">
@@ -142,7 +162,9 @@ const formData = ref({
   remark: '',
   status: CommonStatusEnum.ENABLE,
   roleIds: [],
-  userType: ''
+  userType: '',
+  supervisor:'',
+  supervisorId:'',
 })
 const formRules = reactive<FormRules>({
   username: [{ required: true, message: '用户名称不能为空', trigger: 'blur' }],
@@ -175,6 +197,24 @@ const userTypes = ref([
   { label: '导师', value: "3" },
   { label: '学院', value: "4" },
 ]);
+//获取所有导师
+const users = ref()
+const getSupervisor= async () => {
+  try {
+    const response = await UserApi.getSupervisor()
+    users.value = response
+  } catch (error) {
+    console.error('Error fetching user data:', error)
+  }
+}
+//传supervisorId给formData.supervisorId
+const handleSupervisorChange = (value: number) => {
+  const selectedUser = users.value.find(user => user.id === value);
+  if (selectedUser) {
+    formData.value.supervisorId = selectedUser.id;
+    formData.value.supervisor = selectedUser.nickname;
+  }
+}
 /** 打开弹窗 */
 const open = async (type: string, id?: number) => {
   dialogVisible.value = true
@@ -238,8 +278,13 @@ const resetForm = () => {
     remark: '',
     status: CommonStatusEnum.ENABLE,
     roleIds: [],
-    userType: ''
+    userType: '',
+    supervisor:'',
+    supervisorId:'',
   }
   formRef.value?.resetFields()
 }
+onMounted(() => {
+  getSupervisor()
+})
 </script>

+ 17 - 2
src/views/system/workroomCollege/dept/DeptForm.vue

@@ -25,14 +25,29 @@
         <el-input-number v-model="formData.sort" :min="0" controls-position="right" />
       </el-form-item>
       <el-form-item label="负责人" prop="leaderUserId">
-        <el-select v-model="formData.leaderUserId" clearable placeholder="请输入负责人">
+        <el-select
+          v-model="queryParams.leaderUserId"
+          @change="handleSupervisorChange"
+          placeholder="请选择负责人"
+          clearable
+          filterable
+          class="!w-240px"
+        >
+          <el-option
+            v-for="user in users"
+            :key="user.id"
+            :label="user.nickname"
+            :value="user.id"
+          />
+        </el-select>
+        <!-- <el-select v-model="formData.leaderUserId" clearable placeholder="请输入负责人">
           <el-option
             v-for="item in userList"
             :key="item.id"
             :label="item.nickname"
             :value="item.id"
           />
-        </el-select>
+        </el-select> -->
       </el-form-item>
       <el-form-item label="联系电话" prop="phone">
         <el-input v-model="formData.phone" maxlength="11" placeholder="请输入联系电话" />

+ 40 - 4
src/views/system/workroomCollege/dept/index.vue

@@ -18,6 +18,23 @@
         />
       </el-form-item>
       <el-form-item label="负责人" prop="leaderUserId">
+        <el-select
+          v-model="queryParams.leaderUserId"
+          @change="handleSupervisorChange"
+          placeholder="请选择负责人"
+          clearable
+          filterable
+          class="!w-240px"
+        >
+          <el-option
+            v-for="user in users"
+            :key="user.id"
+            :label="user.nickname"
+            :value="user.id"
+          />
+        </el-select>
+      </el-form-item>
+      <!-- <el-form-item label="负责人" prop="leaderUserId">
         <el-select
           v-model="queryParams.leaderUserId"
           @change="handleQuery"
@@ -32,7 +49,7 @@
             :value="user.id"
           />
         </el-select>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="状态" prop="status">
         <el-select
           v-model="queryParams.status"
@@ -150,6 +167,26 @@ const getList = async () => {
   }
 }
 
+//获取所有导师
+const users = ref()
+const getSupervisor= async () => {
+  try {
+    const response = await UserApi.getSupervisor()
+    users.value = response
+  } catch (error) {
+    console.error('Error fetching user data:', error)
+  }
+}
+//传supervisorId给queryParams.leaderUserId
+const handleSupervisorChange = (value: number) => {
+  const selectedUser = users.value.find(user => user.id === value);
+  if (selectedUser) {
+    queryParams.leaderUserId = selectedUser.id;
+    handleQuery();
+    // queryParams.supervisor = selectedUser.nickname;
+  }
+}
+
 /** 展开/折叠操作 */
 const toggleExpandAll = () => {
   refreshTable.value = false
@@ -162,8 +199,7 @@ const toggleExpandAll = () => {
 /** 搜索按钮操作 */
 const handleQuery = () => {
   console.log("当前查询参数:", queryParams);
-  getList()
-  
+  getList();
 }
 
 /** 重置按钮操作 */
@@ -186,6 +222,6 @@ onMounted(async () => {
   // 获取用户列表
   userList.value = await UserApi.getSimpleUserList()
   console.log(userList.value,'000');
-  
+  getSupervisor()
 })
 </script>

+ 54 - 2
src/views/system/workroomCollege/user/UserForm.vue

@@ -95,6 +95,27 @@
             </el-select>
           </el-form-item>
         </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="导师名称" prop="supervisorId">
+            <el-select
+               v-model="formData.supervisor"
+               @change="handleSupervisorChange"
+               placeholder="请选择导师名称"
+               clearable
+               filterable
+               class="!w-240px"
+            >
+              <el-option
+                 v-for="user in users"
+                 :key="user.id"
+                 :label="user.nickname"
+                 :value="user.id"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
       </el-row>
 
       <el-row>
@@ -142,7 +163,9 @@ const formData = ref({
   remark: '',
   status: CommonStatusEnum.ENABLE,
   roleIds: [],
-  userType: undefined
+  userType: undefined,
+  supervisor:'',
+  supervisorId:'',
 })
 const formRules = reactive<FormRules>({
   username: [{ required: true, message: '用户名称不能为空', trigger: 'blur' }],
@@ -172,7 +195,29 @@ const userTypes = ref([
   { label: '在校生', value: "1" },
   { label: '毕业生', value: "2" },
   { label: '导师', value: "3" },
+  { label: '学院', value: "4" }
 ]);
+
+//获取所有导师
+const users = ref()
+const getSupervisor= async () => {
+  try {
+    const response = await UserApi.getSupervisor()
+    users.value = response
+  } catch (error) {
+    console.error('Error fetching user data:', error)
+  }
+}
+
+//传supervisorId给formData.supervisorId
+const handleSupervisorChange = (value: number) => {
+  const selectedUser = users.value.find(user => user.id === value);
+  if (selectedUser) {
+    formData.value.supervisorId = selectedUser.id;
+    formData.value.supervisor = selectedUser.nickname;
+  }
+}
+
 /** 打开弹窗 */
 const open = async (type: string, id?: number) => {
   dialogVisible.value = true
@@ -236,8 +281,15 @@ const resetForm = () => {
     remark: '',
     status: CommonStatusEnum.ENABLE,
     roleIds: [],
-    userType: undefined
+    userType: undefined,
+    supervisor:'',
+    supervisorId:'',
   }
   formRef.value?.resetFields()
 }
+
+onMounted(() => {
+  getSupervisor()
+})
+
 </script>

+ 50 - 2
src/views/system/workroomTeacher/user/UserForm.vue

@@ -95,6 +95,25 @@
             </el-select>
           </el-form-item>
         </el-col>
+        <el-col :span="12">
+          <el-form-item label="导师名称" prop="supervisorId">
+              <el-select
+                v-model="formData.supervisor"
+                @change="handleSupervisorChange"
+                placeholder="请选择导师名称"
+                clearable
+                filterable
+                class="!w-240px"
+              >
+                <el-option
+                  v-for="user in users"
+                  :key="user.id"
+                  :label="user.nickname"
+                  :value="user.id"
+                />
+              </el-select>
+          </el-form-item>
+        </el-col>
       </el-row>
       
 
@@ -144,7 +163,9 @@ const formData = ref({
   remark: '',
   status: CommonStatusEnum.ENABLE,
   roleIds: [],
-  userType: undefined
+  userType: undefined,
+  supervisor:'',
+  supervisorId:'',
 })
 const formRules = reactive<FormRules>({
   username: [{ required: true, message: '用户名称不能为空', trigger: 'blur' }],
@@ -174,6 +195,27 @@ const userTypes = ref([
   { label: '毕业生', value: "2" },
   { label: '导师', value: "3" },
 ]);
+
+//获取所有导师
+const users = ref()
+const getSupervisor= async () => {
+  try {
+    const response = await UserApi.getSupervisor()
+    users.value = response
+  } catch (error) {
+    console.error('Error fetching user data:', error)
+  }
+}
+//传supervisorId给formData.supervisorId
+const handleSupervisorChange = (value: number) => {
+  const selectedUser = users.value.find(user => user.id === value);
+  if (selectedUser) {
+    formData.value.supervisorId = selectedUser.id;
+    formData.value.supervisor = selectedUser.nickname;
+  }
+}
+
+
 /** 打开弹窗 */
 const open = async (type: string, id?: number) => {
   dialogVisible.value = true
@@ -237,8 +279,14 @@ const resetForm = () => {
     remark: '',
     status: CommonStatusEnum.ENABLE,
     roleIds: [],
-    userType: undefined
+    userType: undefined,
+    supervisor:'',
+    supervisorId:'',
   }
   formRef.value?.resetFields()
 }
+
+onMounted(() => {
+  getSupervisor()
+})
 </script>

+ 17 - 2
src/views/system/workroomTeacher/user/student.vue

@@ -110,7 +110,7 @@
             :show-overflow-tooltip="true"
           />
           <el-table-column label="手机号码" align="center" prop="mobile" width="120" />
-          <el-table-column label="状态" key="status">
+          <el-table-column label="状态" key="status"  align="center" width="90">
             <template #default="scope">
               <el-switch
                 v-model="scope.row.status"
@@ -120,6 +120,15 @@
               />
             </template>
           </el-table-column>
+
+          <el-table-column label="成果信息" align="center" width="100">
+            <template #default="scope">
+              <el-button type="text" @click="openUserAchievement(scope.row.id)">
+                详情
+              </el-button>
+            </template>
+          </el-table-column>
+
           <el-table-column
             label="创建时间"
             align="center"
@@ -201,7 +210,8 @@ import * as UserApi from '@/api/system/user'
 import UserForm from './UserForm.vue'
 import UserImportForm from './UserImportForm.vue'
 import UserAssignRoleForm from './UserAssignRoleForm.vue'
-import DeptTree from './DeptTree.vue'
+import { useRouter } from 'vue-router'
+
 
 defineOptions({ name: 'SystemUser' })
 
@@ -234,6 +244,11 @@ const getList = async () => {
   }
 }
 
+const router = useRouter()
+const openUserAchievement = (userId) => {
+  router.push({ name: 'UserAchievement', query: { id: userId } });
+}
+
 /** 搜索按钮操作 */
 const handleQuery = () => {
   queryParams.pageNo = 1

+ 25 - 2
src/views/system/workroomTeacher/userAchievement/index.vue

@@ -8,7 +8,7 @@
       :inline="true"
       label-width="68px"
     >
-          <el-form-item label="用户名称" prop="userName">
+      <el-form-item label="用户名称" prop="userName">
         <el-select
           v-model="queryParams.userName"
           placeholder="请选择用户名称"
@@ -156,6 +156,8 @@ import download from '@/utils/download'
 import { UserAchievementApi, UserAchievementVO } from '@/api/system/userAchievement'
 import UserAchievementForm from './UserAchievementForm.vue'
 import * as UserApi from '@/api/system/user'
+import { useRoute } from 'vue-router'
+import { getUserProfile } from '@/api/system/user/profile'
 
 /** 成果 列表 */
 defineOptions({ name: 'UserAchievement' })
@@ -163,6 +165,24 @@ defineOptions({ name: 'UserAchievement' })
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
 
+const route = useRoute()
+const userId = ref() // 用于存储用户 ID
+const userDetail = ref({}) // 用于存储用户详情
+
+// 根据 ID 获取用户详情
+const fetchUserDetail = async () => {
+  if (userId) {
+    const data = await getUserProfile() // 假设你有这个 API 方法
+    userDetail.value = data
+  }
+}
+// const userInfo = ref({} as ProfileVO)
+// const getUserInfo = async () => {
+//   const users = await getUserProfile()
+//   console.log(users)
+//   userInfo.value = users
+// }
+
 const loading = ref(true) // 列表的加载中
 const list = ref<UserAchievementVO[]>([]) // 列表的数据
 const total = ref(0) // 列表的总页数
@@ -239,8 +259,11 @@ const handleExport = async () => {
   }
 }
 
-onMounted(() => {
+
+onMounted( () => {
   getList()
   getDeptUser()
+  userId.value = route.query.userId // 从路由查询参数中获取 ID
+  fetchUserDetail() // 获取用户详情
 })
 </script>