47 4 hónapja
szülő
commit
f28b6a1f05

+ 20 - 1
src/views/system/workroomCollege/dept/DeptForm.vue

@@ -182,6 +182,7 @@ const handleSupervisorChange = (values) => {
   // 如有需要,可以进行其他相关的处理
 }
 
+// const imageUrls = ref<string[]>([]);
 /** 提交表单 */
 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
 const submitForm = async () => {
@@ -192,7 +193,13 @@ const submitForm = async () => {
   // 提交请求
   formLoading.value = true
   try {
-    const data = formData.value as unknown as DeptApi.DeptVO
+    // const data = formData.value as unknown as DeptApi.DeptVO
+    // const content = formData.value.description; // 获取富文本内容
+    // imageUrls.value = extractImages(content);
+    const data = {
+      ...formData.value,
+      // description: content
+    } as unknown as DeptApi.DeptVO;
     if (formType.value === 'create') {
       await DeptApi.createDept(data)
       message.success(t('common.createSuccess'))
@@ -202,12 +209,24 @@ const submitForm = async () => {
     }
     dialogVisible.value = false
     // 发送操作成功的事件
+    // emit('success', imageUrls.value);
     emit('success')
   } finally {
     formLoading.value = false
   }
 }
 
+// const extractImages = (htmlContent: string): string[] => {
+//   const imgRegex = /<img[^>]+src="([^">]+)"/g;
+//   let images: string[] = [];  // 明确声明 images 数组的类型为 string[]
+//   let match;
+//   while ((match = imgRegex.exec(htmlContent)) !== null) {
+//     images.push(match[1]); // match[1] 是图片URL
+//   }
+//   return images;
+// };
+
+
 /** 重置表单 */
 const resetForm = () => {
   formData.value = {

+ 27 - 2
src/views/system/workroomCollege/dept/index.vue

@@ -104,6 +104,17 @@
           {{ userList.filter((user) => scope.row.leaderUserId.includes(user.id)).map(user => user.nickname).join(', ') }}
         </template>
       </el-table-column>
+      <el-table-column prop="phone" label="联系电话" align="center" />
+      <el-table-column prop="email" label="邮箱" align="center" />
+      <el-table-column prop="address" label="工作间地址" align="center" />
+      <el-table-column prop="description" label="简介" align="center">
+  <template #default="scope">
+    <span>
+      {{ stripHtml(scope.row.description).substring(0, 10) + (stripHtml(scope.row.description).length > 10 ? '...' : '') }}
+    </span>
+  </template>
+</el-table-column>
+
       <!-- <el-table-column prop="sort" label="排序" /> -->
       <!-- <el-table-column prop="status" label="状态" align="center">
         <template #default="scope">
@@ -135,7 +146,7 @@
     </el-table>
   </ContentWrap>
   <!-- 表单弹窗:添加/修改 -->
-  <DeptForm ref="formRef" @success="getList" />
+  <DeptForm ref="formRef" @success="handleFormSuccess" />
 </template>
 <script lang="ts" setup>
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
@@ -197,11 +208,25 @@ const handleSupervisorChange = (value: number) => {
   }
 }
 
+const extractedImageUrls = ref<string[]>([]); // 用于保存提取的图片 URL
+const handleFormSuccess = (urls) => {
+  getList();
+  extractedImageUrls.value = urls; // 接收从子组件传递的图片 URL
+  console.log('接收到的图片 URL:', extractedImageUrls.value);
+}
+
 const router = useRouter()
 const openUserAchievement = (id) => {
-  router.push({ name: 'DeptInfo', query: { id: id} });
+  router.push({ 
+    name: 'DeptInfo', 
+    query: { id: id }, 
+  });
 }
 
+const stripHtml = (html) => {
+  if (!html) return '';
+  return html.replace(/<[^>]*>/g, ''); // 去除所有 HTML 标签
+};
 
 /** 展开/折叠操作 */
 const toggleExpandAll = () => {

+ 34 - 5
src/views/system/workroomCollege/deptInfo/index.vue

@@ -66,6 +66,11 @@
           <!-- <Icon class="mr-5px" icon="ep:location" /> -->
           <div class="div-label" style="margin-left: 20px;">简介:</div>
           <div class="description-content">{{ cleanedDescription }}</div>
+          <div class="image-container">
+        <template v-for="(img, index) in extractedImages" :key="index">
+          <img :src="img" alt="简介图片" class="image-item" />
+        </template>
+    </div>
         </div>
       </el-card>
 
@@ -137,9 +142,9 @@ export default defineComponent({
     const formRef = ref();
 
     const route = useRoute()
+    console.log('route.query:', route.query);
     const id = ref(route.query.id);
 
-    
     const form = reactive({
       id: id.value,
       supervisor: '',  
@@ -222,9 +227,20 @@ const toggleEditMode = () => {
 };
 
  // 创建一个 computed 属性来处理并去掉 <p> 标签
-  const cleanedDescription = computed(() => {
-  return userInfo.value.description ? userInfo.value.description.replace(/<\/?[^>]+(>|$)/g, '') : '';
-});
+    const cleanedDescription = computed(() => {
+      return userInfo.value.description ? userInfo.value.description.replace(/<\/?[^>]+(>|$)/g, '') : '';
+    });
+
+    const extractedImages = computed(() => {
+      const imgRegex = /<img[^>]+src="([^">]+)"[^>]*>/g;
+      let images = [];
+      let match;
+      const description = userInfo.value.description || '';
+      while ((match = imgRegex.exec(description))) {
+        images.push(match[1]); // 获取src属性
+      }
+      return images;
+    });
 
     // 表单提交
     const submit = async () => {
@@ -281,7 +297,9 @@ const toggleEditMode = () => {
       users,
       handleSupervisorChange,
       getDeptsupervisor,
-      cleanedDescription
+      cleanedDescription,
+      extractedImages,
+
     };
   }
 });
@@ -382,5 +400,16 @@ const toggleEditMode = () => {
   margin-top: 20px;
 }
 
+.image-container {
+  display: flex; /* 使图片横向排列 */
+  flex-wrap: wrap; /* 如果空间不足则换行 */
+  gap: 10px; /* 图片之间的间距 */
+  margin-top: 20px; /* 与简介之间的间隔 */
+}
+
+.image-item {
+  max-width: 150px; /* 设置图片的最大宽度 */
+  height: auto; /* 保持图片的高度自动 */
+}
 
 </style>

+ 38 - 22
src/views/system/workroomCollege/user/UserForm.vue

@@ -69,20 +69,19 @@
           </el-form-item>
         </el-col>
         <el-col :span="12" v-if="formType === 'create-S' || formType === 'update-S'">
-          <!-- <el-form-item label="用户类型" prop="userType">
-            <el-select v-model="formData.userType" placeholder="请选择用户类型">
+          <el-form-item label="用户类型" prop="userType">
+            <!-- <el-select v-model="formData.userType" placeholder="请选择用户类型" :disabled="formType === 'create-S' || formType === 'update-S'">
               <el-option
-                v-for="option in userTypes"
-                :key="option.value"
-                :label="option.label"
-                :value="option.value"
+                label="在校生"
+                value="1"
                 />
-            </el-select>
-          </el-form-item> -->
-          <el-form-item label="用户类型" prop="userType">
-            <span style="margin-left: 10px;">在校生</span>
-            <input type="hidden" v-model="formData.userType" value="1" /> <!-- 固定为在校生 -->
+            </el-select> -->
+            <el-input  v-model="userTypeS" value="在校生" placeholder="在校生" :disabled="true"/> 
           </el-form-item>
+          <!-- <el-form-item label="用户类型" prop="userType">
+            <span style="margin-left: 10px;">在校生</span>
+            <el-input type="hidden" v-model="formData.userType" value="1" /> 固定为在校生
+          </el-form-item> -->
         </el-col>
         <el-col :span="12" v-if="formType === 'create-T' || formType === 'update-T'">
           <el-form-item label="用户类型" prop="userType">
@@ -129,6 +128,27 @@
           </el-form-item>
         </el-col>
       </el-row>
+  
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="学号" prop="userNumber" v-if="formType === 'create-S' || formType === 'update-S'">
+            <el-input v-model="formData.userNumber" placeholder="请输入学号" />
+          </el-form-item>
+          <el-form-item label="工号" prop="userNumber" v-if="formType === 'create-T' || formType === 'update-T'">
+            <el-input v-model="formData.userNumber" placeholder="请输入工号" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12" v-if="formType === 'update-T' || formType === 'update-S'">
+          <el-form-item label="用户密码" prop="password">
+            <el-input
+              v-model="formData.password"
+              placeholder="请输入用户密码"
+              show-password
+              type="password"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
 
       <el-row>
         <el-col :span="24" v-if="formType === 'update-S'">
@@ -151,17 +171,6 @@
           </el-form-item>
         </el-col>
       </el-row>
-  
-      <el-row>
-        <el-col :span="24">
-          <el-form-item label="学号" prop="userNumber" v-if="formType === 'create-S' || formType === 'update-S'">
-            <el-input v-model="formData.userNumber" placeholder="请输入学号" />
-          </el-form-item>
-          <el-form-item label="工号" prop="userNumber" v-if="formType === 'create-T' || formType === 'update-T'">
-            <el-input v-model="formData.userNumber" placeholder="请输入工号" />
-          </el-form-item>
-        </el-col>
-      </el-row>
 
       <el-row>
         <el-col :span="24">
@@ -193,6 +202,7 @@ defineOptions({ name: 'SystemUserForm' })
 
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
+const userTypeS = ref('1') // 导师类型
 
 const dialogVisible = ref(false) // 弹窗的是否展示
 const dialogTitle = ref('') // 弹窗的标题
@@ -246,6 +256,7 @@ const formRules = reactive<FormRules>({
       message: '请输入正确的手机号码'
     }
   ],
+  supervisorId: [{ required: true, message: '导师不能为空', trigger: 'blur' }],
 })
 
 const formRef = ref() // 表单 Ref
@@ -316,6 +327,11 @@ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
 const submitForm = async () => {
   // 校验表单
+  if(formType.value === 'create-S' || formType.value === 'update-S'){
+    formData.value.userType = userTypeS.value
+  }
+  console.log(formData.value);
+
   if (!formRef) return
   const valid = await formRef.value.validate()
   if (!valid) return

+ 29 - 4
src/views/system/workroomTeacher/dept/index.vue

@@ -65,8 +65,10 @@
           <!-- <Icon class="mr-5px" icon="ep:location" /> -->
           <div class="div-label" style="margin-left: 20px;">简介:</div>
           <div class="description-content">{{ cleanedDescription }}</div>
-          <div v-for="(url, index) in extractedImageUrls" :key="index">
-            <img :src="url" style="max-width: 100px; max-height: 100px;" />
+          <div class="image-container">
+            <div v-for="(url, index) in extractedImageUrls" :key="index" class="image-item">
+              <img :src="url" />
+            </div>
           </div>
         </div>
         
@@ -261,8 +263,18 @@ const handleSuccess = (urls) => {
 const fetchImageUrls = async () => {
   // 你的获取图片 URL 的 API 调用
   const res = await getUserDept();
-  const urls = res.description.match(/<img.*?src="(.*?)"[^>]*>/gi) || [];  // 假设这个函数能返回图片 URL
-  extractedImageUrls.value = urls;     // 将获取到的 URL 赋值
+  const urls = res.description.match(/<img.*?src="(.*?)"/g); // 使用更合理的正则表达式
+    // 如果找到的 URL 数组不为空,则进行处理
+    if (urls) {
+      // 从匹配的字符串中提取出 URL
+      extractedImageUrls.value = urls.map(url => {
+        // 取出匹配到的 src 属性部分
+        const match = url.match(/src="(.*?)"/);
+        return match ? match[1] : '';
+      });
+    } else {
+      extractedImageUrls.value = []; // 没有找到图片则设为空数组
+    }  // 将获取到的 URL 赋值
 };
 
 // 创建一个 computed 属性来处理并去掉 <p> 标签
@@ -433,4 +445,17 @@ const fetchImageUrls = async () => {
   justify-content: center; /* 水平居中 */
   margin-top: 30px; /* 上间距 */
 }
+
+.image-container {
+  display: flex; /* 使图片横向排列 */
+  flex-wrap: wrap; /* 如果空间不足则换行 */
+  gap: 10px; /* 图片之间的间距 */
+  margin-left: 20px; /* 左边距,根据需要设置 */
+}
+
+.image-item img {
+  width: 150px; /* 设置更大的宽度 */
+  height: auto; /* 保持高度自动 */
+}
+
 </style>

+ 1 - 1
src/views/system/workroomTeacher/user/student.vue

@@ -261,7 +261,7 @@ const getList = async () => {
 
 const router = useRouter()
 const openUserAchievement = (id) => {
-  router.push({ name: 'UserAchievementcopy', query: { id: id} });
+  router.push({ name: 'UserAchievement', query: { id: id} });
 }
 
 

+ 2 - 1
src/views/system/workroomTeacher/userAchievement/UserAchievementForm.vue

@@ -75,7 +75,7 @@ const users = ref();
 const getDeptUser = async () => {
     try {
         const response = await UserApi.getDeptUser();
-        console.log(response);
+        // console.log(response);
         users.value = response;
     } catch (error) {
         console.error("Error fetching user data:", error);
@@ -115,6 +115,7 @@ const submitForm = async () => {
   formLoading.value = true
   try {
     const data = formData.value as unknown as UserAchievementVO
+    console.log(data,'submitForm');
     if (formType.value === 'create') {
       await UserAchievementApi.createUserAchievement(data)
       message.success(t('common.createSuccess'))

+ 3 - 1
src/views/system/workroomTeacher/userAchievement/index.vue

@@ -195,11 +195,13 @@ const getDeptUser = async () => {
 }
 
 const getList = async () => {
-  // loading.value = true
+  loading.value = true
   console.log('hsole');
   try {
     console.log('hsole');
     const data = await UserAchievementApi.getUserAchievementPage(queryParams)
+    console.log('hsole');
+    console.log(data,'成果');
     list.value = data.list
     total.value = data.total
   } finally {