supervisorSelectionSettingForm.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <template>
  2. <Dialog v-model="dialogVisible" :title="dialogTitle">
  3. <el-form
  4. ref="formRef"
  5. v-loading="formLoading"
  6. :model="formData"
  7. :rules="formRules"
  8. label-width="120px"
  9. class="custom-form"
  10. >
  11. <el-row>
  12. <el-col :span="12">
  13. <el-form-item label="姓名" prop="nickname" >
  14. <el-input v-model="formData.nickname" placeholder="自动链接" />
  15. </el-form-item>
  16. </el-col>
  17. <el-col :span="12">
  18. <el-form-item label="职称" prop="title">
  19. <el-input v-model="formData.title" placeholder="" />
  20. </el-form-item>
  21. </el-col>
  22. </el-row>
  23. <el-row v-if="TUsertype === '5'">
  24. <el-col :span="24" >
  25. <el-form-item label="外聘导师" style="font-weight: 550;">
  26. <p></p>
  27. </el-form-item>
  28. </el-col>
  29. <el-col :span="24" >
  30. <el-form-item label="工作单位" prop="externalSupervisorWorkPlace">
  31. <el-input v-model="formData.externalSupervisorWorkPlace" placeholder="请输入工作单位"/>
  32. </el-form-item>
  33. </el-col>
  34. </el-row>
  35. <el-row v-if="TUsertype ==='5'">
  36. <el-col :span="24">
  37. <el-form-item label="合作的校内导师" prop="workSupervisor">
  38. <!-- <el-input v-model="formData.workSupervisor" placeholder="自动链接"/> -->
  39. <el-select
  40. v-model="formData.workSupervisor"
  41. placeholder="请选择校内导师"
  42. >
  43. <el-option
  44. v-for="item in innerSupervisors"
  45. :key="item.id"
  46. :label="item.nickname"
  47. :value="item.id"
  48. />
  49. </el-select>
  50. </el-form-item>
  51. </el-col>
  52. </el-row>
  53. <el-row>
  54. <el-col :span="24">
  55. <el-form-item label="研究方向" prop="major">
  56. <el-input v-model="formData.major" placeholder="请输入研究方向" />
  57. </el-form-item>
  58. </el-col>
  59. </el-row>
  60. <el-row >
  61. <el-col :span="24">
  62. <el-form-item label="导师简历上传" prop="introduction">
  63. <el-input type="textarea" v-model="formData.introduction" placeholder="暂无简介" />
  64. </el-form-item>
  65. </el-col>
  66. </el-row>
  67. <el-col :span="24">
  68. <el-form-item label="对研究生毕业时学术成果的要求" prop="studentAchievementRequirement">
  69. <el-input type="textarea" v-model="formData.studentAchievementRequirement" placeholder="未填写时,默认为按学校及学院发表学术成果的要求执行" />
  70. </el-form-item>
  71. </el-col>
  72. </el-form>
  73. <template #footer>
  74. <div style="display: flex; justify-content: center;">
  75. <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
  76. <el-button @click="dialogVisible = false">取 消</el-button>
  77. </div>
  78. </template>
  79. </Dialog>
  80. </template>
  81. <script lang="ts" setup>
  82. import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
  83. import { CommonStatusEnum } from '@/utils/constants'
  84. import * as UserApi from '@/api/system/user'
  85. import { FormRules } from 'element-plus'
  86. import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
  87. import {selectionBookVO,selectionBookApi} from '@/api/system/studentSelectSupervisorRecord/selectionBook'
  88. import download from '@/utils/download'
  89. // import { supervisorSelectionSettingApi, supervisorSelectionSettingVO } from '@/api/system/supervisorSelectionSetting'
  90. defineOptions({ name: 'TeacherRequireForm' })
  91. const { t } = useI18n() // 国际化
  92. const message = useMessage() // 消息弹窗
  93. const dialogVisible = ref(false) // 弹窗的是否展示
  94. const dialogTitle = ref('') // 弹窗的标题
  95. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  96. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  97. const formData = ref({
  98. id: null,
  99. sex: null,
  100. supervisorId: null,
  101. nickname: '',
  102. title: '',//职称
  103. status: CommonStatusEnum.ENABLE,
  104. userNumber: '',//工号
  105. major:'',//研究方向
  106. studentAchievementRequirement:"",
  107. introduction:"",//简介
  108. externalSupervisorWorkPlace:"",
  109. workSupervisor:"",//合作校内导师
  110. })
  111. const formRules = reactive<FormRules>({
  112. })
  113. const formRef = ref() // 表单 Ref
  114. //获取登录人员信息
  115. const userInfo = ref({} as ProfileVO)
  116. const getUserInfo = async () => {
  117. const users = await getUserProfile()
  118. userInfo.value = users
  119. console.log(userInfo.value);
  120. }
  121. const TUsertype = ref<string | undefined>(undefined);
  122. const open = async (type: string, supervisorId: number, userType?: string) => {
  123. dialogVisible.value = true
  124. formType.value=type
  125. TUsertype.value = userType;
  126. if (formType.value == 'update'){
  127. dialogTitle.value = '编辑'
  128. resetForm()
  129. // 获取导师信息
  130. formLoading.value = true
  131. try {
  132. const user = await UserApi.getUser(supervisorId)
  133. // console.log(user,'11');
  134. formData.value = user
  135. } catch (error) {
  136. console.error('请求失败:', error); // 捕获并打印错误信息
  137. } finally {
  138. formLoading.value = false;
  139. }
  140. }
  141. }
  142. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  143. /** 提交表单 */
  144. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  145. const submitForm = async () => {
  146. // 提交请求
  147. formLoading.value = true
  148. try {
  149. const data = formData.value as unknown as selectionBookVO
  150. if (Array.isArray(data.introduction) && data.introduction.length > 0) {
  151. data.introduction = data.introduction[0]; // 只取数组的第一个元素
  152. }
  153. if (formType.value === 'update') {
  154. await selectionBookApi.updateSelectionBook(data)
  155. console.log(data)
  156. message.success(t('common.updateSuccess'))
  157. }
  158. dialogVisible.value = false
  159. // 发送操作成功的事件
  160. emit('success')
  161. } finally {
  162. formLoading.value = false
  163. }
  164. }
  165. /** 重置表单 */
  166. const resetForm = () => {
  167. formData.value = {
  168. supervisorId:undefined,
  169. nickname: '',
  170. id: undefined,
  171. sex: undefined,
  172. title: '',//职称
  173. status: CommonStatusEnum.ENABLE,
  174. userNumber: '',//工号
  175. major:'',//研究方向
  176. studentAchievementRequirement:"",
  177. introduction:"",//简介
  178. externalSupervisorWorkPlace:"",
  179. }
  180. formRef.value?.resetFields()
  181. }
  182. const innerSupervisors = ref();
  183. const getInnerSupervisor = async () => {
  184. const res = await UserApi.getInnerSupervisor()
  185. innerSupervisors.value = res
  186. console.log(innerSupervisors.value,'innerSupervisors');
  187. }
  188. onMounted(() => {
  189. getUserInfo()
  190. getInnerSupervisor()
  191. })
  192. </script>
  193. <style scoped>
  194. .custom-form {
  195. background-color: #f0f4f8; /* 浅灰色背景 */
  196. padding: 20px;
  197. border-radius: 8px;
  198. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 轻微阴影 */
  199. }
  200. .custom-form .custom-download-button {
  201. color: #4b7bec; /* 灰蓝色字体颜色 */
  202. border: 1px solid #4b7bec; /* 灰蓝色边框 */
  203. background-color: transparent; /* 透明背景 */
  204. padding: 10px 20px; /* 按钮内边距 */
  205. border-radius: 4px; /* 圆角边框 */
  206. font-size: 16px; /* 字体大小 */
  207. transition: all 0.3s ease; /* 平滑过渡效果 */
  208. outline: none; /* 去除点击时的轮廓 */
  209. }
  210. .custom-form .custom-download-button:hover,
  211. .custom-form .custom-download-button:focus {
  212. color: #fff; /* 悬浮时字体颜色 */
  213. background-color: #4b7bec; /* 悬浮时背景颜色 */
  214. border-color: #4b7bec; /* 悬浮时边框颜色 */
  215. }
  216. .custom-form .custom-download-button:active {
  217. background-color: skyblue; /* 点击时背景颜色 */
  218. border-color: #3a66b1; /* 点击时边框颜色 */
  219. }
  220. .full-width-editor {
  221. width: 100%;
  222. border: #e5e7ec;
  223. border-radius: 4px;
  224. }
  225. </style>