Selaa lähdekoodia

Merge branch 'dev' of https://git.citupro.com/zhengnaiwen_citu/menduner-admin into dev

lifanagju_citu 1 päivä sitten
vanhempi
commit
8b08b026f1

+ 1 - 1
src/views/member/user/detail/UserOrderList.vue

@@ -273,7 +273,7 @@ const openDetail = (id: number) => {
 /** 初始化 **/
 onMounted(async () => {
   await getList()
-  pickUpStoreList.value = await PickUpStoreApi.getListAllSimple()
+  pickUpStoreList.value = await PickUpStoreApi.getSimpleDeliveryPickUpStoreList()
   deliveryExpressList.value = await DeliveryExpressApi.getSimpleDeliveryExpressList()
 })
 </script>

+ 7 - 4
src/views/menduner/system/enterprise/message/details/components/job.vue

@@ -25,10 +25,11 @@
     </div>
     <el-button class="ml-10px" type="success" plain @click="handleRefresh"><Icon icon="ep:refresh" class="mr-5px" /> 刷新</el-button>
   </div>
-  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px">
-    <el-table-column label="职位名称" align="center" prop="name">
+  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px" height="calc(100vh - 360px)">
+    <el-table-column label="职位名称" align="center" prop="name" fixed="left">
       <template #default="{ row }">{{ formatName(row.name) }}</template>
     </el-table-column>
+    <el-table-column label="发布人" align="center" prop="sendUser.name" />
     <el-table-column label="招聘会" align="center" prop="jobFairName" />
     <el-table-column label="职位类型" align="center" prop="positionName" />
     <el-table-column label="地区" align="center" prop="areaName">
@@ -72,7 +73,7 @@
         {{ timesTampChange(scope.row.updateTime, 'Y-M-D h:m') }}
       </template>
     </el-table-column>
-    <el-table-column label="操作" align="center">
+    <el-table-column label="操作" align="center" fixed="right" min-width="200">
       <template #default="scope">
         <el-button link type="primary" @click="openDetail(scope.row)">详情</el-button>
         <el-button link type="primary" @click="handleActions(scope.row.id, 0)">刷新</el-button>
@@ -148,7 +149,8 @@ import { formatName } from '@/utils'
 import { JobFairManageApi } from '@/api/menduner/system/jobFair/manage'
 
 const props = defineProps({
-  id: String
+  id: String,
+  userId: String
 })
 
 const { t } = useI18n() // 国际化
@@ -161,6 +163,7 @@ const queryParams = reactive({
   pageSize: 10,
   name: undefined,
   fairId: undefined,
+  userId: props.userId,
   enterpriseId: props.id
 })
 const payUnit = getIntDictOptions(DICT_TYPE.MENDUNER_PAY_UNIT)

+ 16 - 8
src/views/menduner/system/enterprise/message/details/components/resume.vue

@@ -39,15 +39,15 @@
     <el-button type="success" class="ml-10px" plain @click="handleRefresh"><Icon icon="ep:refresh" class="mr-5px" /> 刷新</el-button>
   </div>
 
-  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px">
+  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px" height="calc(100vh - 360px)">
 		<el-table-column label="求职者" align="center" prop="person.name" />
     <el-table-column label="投递职位" align="center" prop="job.name">
       <template #default="{ row }">{{ formatName(row.job.name) }}</template>
     </el-table-column>
 		<el-table-column v-if="fairId" label="发布企业" align="center" prop="enterprise.anotherName">
-      <template #default="{ row }">{{ formatName(row.enterprise.anotherName || rpw.enterprise.name) }}</template>
+      <template #default="{ row }">{{ formatName(row.enterprise.anotherName || row.enterprise.name) }}</template>
     </el-table-column>
-		<el-table-column label="职位发布人" align="center" prop="contact.name" />
+		<el-table-column v-if="isRecruitmentOfficer" label="职位发布人" align="center" prop="contact.name" />
     <el-table-column label="求职者联系电话" align="center" prop="person.phone" />
     <el-table-column v-if="!fairId" label="招聘会" align="center" prop="jobFair.title" />
     <el-table-column label="简历查看状态" align="center" prop="cvRel.status">
@@ -64,7 +64,7 @@
       :formatter="dateFormatter"
       width="180px"
     />
-    <el-table-column label="操作" align="center">
+    <el-table-column label="操作" align="center" fixed="right" min-width="80">
       <template #default="scope">
         <el-link
 					v-if="scope.row.cvRel?.url"
@@ -99,7 +99,9 @@ import { JobFairWhiteApi } from '@/api/menduner/system/jobFair/white'
 
 const props = defineProps({
   id: String,
-	fairId: String
+	fairId: String,
+  userId: String,
+  isRecruitmentOfficer: { type: Boolean, default: true }
 })
 
 const { t } = useI18n() // 国际化
@@ -111,6 +113,7 @@ const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
 	jobId: undefined,
+  userId: props.userId ?? undefined,
   jobFairId: props.fairId ?? undefined,
   enterpriseId: props.id
 })
@@ -156,8 +159,12 @@ const handleGetMore = () => {
 // 获取招聘职位列表
 const jobList = ref([])
 const getJobList = async () => {
+  const params = {
+    enterpriseId: props.id
+  }
+  if (props.userId) params.userId = props.userId
   try {
-    const data = await statisticAnalysisApi.getAnalysisJobAdvertisedList({ enterpriseId: props.id })
+    const data = await statisticAnalysisApi.getAnalysisJobAdvertisedList(params)
     jobList.value = jobList.value.concat(data)
   } catch {}
 }
@@ -182,8 +189,9 @@ const handleGetEnterpriseMore = () => {
   getEnterpriseList()
 }
 
-if (!props.fairId) {
+if (props.id || props.userId) {
   getJobFairList()
   getJobList()
-} else getEnterpriseList()
+}
+if (props.fairId) getEnterpriseList()
 </script>

+ 1 - 1
src/views/menduner/system/enterprise/message/details/components/subordinateEnterprises.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px">
+  <el-table v-loading="loading" :data="tableData" :stripe="true" height="calc(100vh - 310px)">
     <el-table-column label="企业全称" align="center" prop="name">
       <template #default="scope">{{ formatName(scope.row.name) }}</template>
     </el-table-column>

+ 1 - 1
src/views/menduner/system/enterprise/message/details/components/user.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px">
+  <el-table v-loading="loading" :data="tableData" :stripe="true" height="calc(100vh - 310px)">
     <el-table-column label="用户名" align="center" prop="name" />
     <el-table-column label="联系电话" align="center" prop="phone" />
     <el-table-column label="邮箱" align="center" prop="email" />

+ 13 - 7
src/views/menduner/system/enterprise/message/details/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-row :gutter="10">
+    <!-- <el-row :gutter="10">
       <el-col :span="12">
         <el-card shadow="never">
           <template #header>
@@ -17,12 +17,18 @@
           <Business :id="id" />
         </el-card>
       </el-col>
-    </el-row>
+    </el-row> -->
 
-    <el-row class="m-t-20px">
+    <el-row>
       <el-col :span="24">
-        <el-card shadow="never">
-          <el-tabs>
+        <!-- <el-card shadow="never"> -->
+          <el-tabs type="border-card">
+            <el-tab-pane label="企业详情">
+              <Info :id="id"/>
+            </el-tab-pane>
+            <el-tab-pane label="企业工商信息" v-hasPermi="['menduner:system:enterprise-business:query']">
+              <Business :id="id" />
+            </el-tab-pane>
             <el-tab-pane label="下级企业">
               <SubordinateEnterprises :id="id" />
             </el-tab-pane>
@@ -32,11 +38,11 @@
             <el-tab-pane label="招聘职位">
               <EnterpriseJob :id="id" />
             </el-tab-pane>
-            <el-tab-pane label="收到的简历记录">
+            <el-tab-pane label="职位投递记录">
               <EnterpriseResume :id="id" />
             </el-tab-pane>
           </el-tabs>
-        </el-card>
+        <!-- </el-card> -->
       </el-col>
     </el-row>
   </div>

+ 1 - 1
src/views/menduner/system/enterprise/userbind/details/components/account.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-descriptions class="margin-top" :column="2" border>
+    <el-descriptions class="margin-top" :column="1" border>
       <!-- <template #extra>
         <el-button type="primary">Operation</el-button>
       </template> -->

+ 20 - 6
src/views/menduner/system/enterprise/userbind/details/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-row :gutter="10">
+    <!-- <el-row :gutter="10">
       <el-col :span="12">
         <el-card shadow="never">
           <template #header>
@@ -17,20 +17,32 @@
           <Account :user-id="userId" :enterprise-id="enterpriseId" />
         </el-card>
       </el-col>
-    </el-row>
+    </el-row> -->
 
-    <el-row class="m-t-20px">
+    <el-row>
       <el-col :span="24">
-        <el-card shadow="never">
-          <el-tabs>
+        <!-- <el-card shadow="never"> -->
+          <el-tabs type="border-card">
+            <el-tab-pane label="企业用户详情">
+              <User :id="id"/>
+            </el-tab-pane>
+            <el-tab-pane label="账户信息">
+              <Account :user-id="userId" :enterprise-id="enterpriseId" />
+            </el-tab-pane>
             <el-tab-pane label="交易订单">
               <TradeOrder :user-id="userId" :enterprise-id="enterpriseId" />
             </el-tab-pane>
             <el-tab-pane label="充值订单" v-hasPermi="['pay:currency-recharge:query']">
               <RechargeOrder :user-id="userId" :enterprise-id="enterpriseId" />
             </el-tab-pane>
+            <el-tab-pane label="招聘职位">
+              <JobPage :user-id="userId" />
+            </el-tab-pane>
+            <el-tab-pane label="职位投递记录">
+              <ResumePage :user-id="userId" :isRecruitmentOfficer="false" :id="enterpriseId" />
+            </el-tab-pane>
           </el-tabs>
-        </el-card>
+        <!-- </el-card> -->
       </el-col>
     </el-row>
   </div>
@@ -44,6 +56,8 @@ import User from './components/user.vue'
 import Account from './components/account.vue'
 import TradeOrder from './components/tradingOrder.vue'
 import RechargeOrder from './components/rechargeOrder.vue'
+import JobPage from '@/views/menduner/system/enterprise/message/details/components/job.vue'
+import ResumePage from '@/views/menduner/system/enterprise/message/details/components/resume.vue'
 
 /** 初始化 */
 const { currentRoute } = useRouter() // 路由

+ 0 - 11
src/views/menduner/system/enterprise/userbind/index.vue

@@ -112,7 +112,6 @@
       <el-table-column label="操作" align="center" fixed="right" min-width="260">
         <template #default="scope">
           <el-button link type="primary" @click="openDetail(scope.row.id, scope.row.enterpriseId, scope.row.userId)">详情</el-button>
-          <!-- <el-button link type="primary" @click="openEditEmail(scope.row.id)">修改登录邮箱</el-button> -->
           <el-button link type="primary" @click="openEdit(scope.row.id)" v-hasPermi="['menduner:system:enterprise-user-bind:update']">编辑</el-button>
           <el-button link type="primary" @click="openEditPassword(scope.row.id)" v-hasPermi="['menduner:system:enterprise-user-bind:update']">修改登录密码</el-button>
           <el-button v-if="scope.row.status === '0'" link type="danger" @click="handleActions(scope.row.id, 'disabled')" v-hasPermi="['menduner:system:enterprise-user-bind:update']">禁用</el-button>
@@ -129,9 +128,6 @@
     />
   </ContentWrap>
 
-  <!-- 修改用户登录邮箱 -->
-  <!-- <EditEmail ref="editEmailRef" @success="getList" /> -->
-
   <!-- 编辑 -->
   <Edit ref="editRef" @success="getList" />
 
@@ -145,7 +141,6 @@ import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
 import { formatName } from '@/utils'
 import { EnterpriseUserBindApi, EnterpriseUserBindVO } from '@/api/menduner/system/enterprise/userBind'
-// import EditEmail from './EditEmail.vue'
 import Edit from './Edit.vue'
 import EditPassword from './EditPassword.vue'
 
@@ -212,12 +207,6 @@ const resetQuery = () => {
   handleQuery()
 }
 
-/* 修改用户邮箱 */
-// const editEmailRef = ref()
-// const openEditEmail = (id: number) => {
-//   editEmailRef.value.open(id)
-// }
-
 /* 编辑 */
 const editRef = ref()
 const openEdit = (id: number) => {

+ 1 - 1
src/views/menduner/system/person/details/components/deliveryJob.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px">
+  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px" height="calc(100vh - 310px)">
     <el-table-column label="职位名称" align="center" prop="job.name">
       <template #default="scope">{{ formatName(scope.row.job.name) }}</template>
     </el-table-column>

+ 1 - 1
src/views/menduner/system/person/details/components/interviewInvite.vue

@@ -1,6 +1,6 @@
 <template>
   <ContentWrap>
-    <el-table v-loading="loading" :data="list" :stripe="true">
+    <el-table v-loading="loading" :data="list" :stripe="true" height="calc(100vh - 310px)">
       <el-table-column label="投递岗位" align="center" prop="job.name">
         <template #default="scope">{{ formatName(scope.row.job.name) }}</template>
       </el-table-column>

+ 1 - 1
src/views/menduner/system/person/details/components/jobIntention.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px">
+  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px" height="calc(100vh - 310px)">
     <el-table-column label="期望职位" align="center" prop="positionName" />
     <el-table-column label="期望行业" align="center" prop="industryNameList">
       <template #default="scope">

+ 168 - 0
src/views/menduner/system/talentMap/maintenance/gather/webPageParsing/index copy.vue

@@ -0,0 +1,168 @@
+<template>
+	<ContentWrap>
+		<el-form
+			class="-mb-15px"
+			:model="queryParams"
+			ref="queryFormRef"
+			:inline="true"
+			label-width="90px"
+		>
+			<el-form-item label="url抓取数据" prop="urls">
+				<el-input
+					v-model="queryParams.urls"
+					class="!w-60vw"
+					type="textarea"
+					:rows="1"
+					placeholder="请输入需要爬取的页面,多个页面请用 ',' 隔开"
+				/>
+			</el-form-item>
+			<el-form-item>
+				<el-button type="primary" plain :loading="loading" @click="handleExecute">执行</el-button>
+			</el-form-item>
+		</el-form>
+	</ContentWrap>
+
+	<ContentWrap v-if="contents.length">
+		<el-row gutter="20">
+			<el-col v-for="(content, index) in contents" :key="index" :span="12">
+				<el-card class="!h-500px" v-loading="!content.data">
+					<template #header>
+						<div class="flex items-center justify-between">
+							<el-text class="flex-1" truncated>{{ content.url }}</el-text>
+							<div class="!w-85px">
+								<Icon icon="ep:view" size="25" class="ml-10px cursor-pointer" color="#409eff" @click="showPage(content)" />
+								<Icon icon="ep:refresh" size="25" class=" ml-18px cursor-pointer" color="#409eff" @click="handleReload(content)" />
+							</div>
+						</div>
+					</template>
+					<div v-if="content.data">
+						<template v-if="typeof content.data === 'string'">{{ content.data }}</template>
+            <el-tabs v-else v-model="content.tab">
+              <el-tab-pane v-for="(v, k) in content.data.data[0]" :key="k" :label="k" :name="k" class="overflow-y-auto !h-360px">
+								<template v-if="k === 'html'">
+									<div class="position-sticky float-right">
+										<el-button
+											type="primary"
+											class="cursor-pointer"
+											@click="content.showHtml = !content.showHtml"
+											:icon="SetUp"
+											circle
+										/>
+									</div>
+                  <pre v-if="!content.showHtml">{{ v }}</pre>
+                  <div v-else v-html="v"></div>
+                </template>
+                <pre v-else>{{ v || '暂无数据' }}</pre>
+							</el-tab-pane>
+            </el-tabs>
+          </div>
+				</el-card>
+			</el-col>
+		</el-row>
+	</ContentWrap>
+
+	<el-drawer
+		v-model="drawer"
+		class="!w-50vw"
+		:with-header="false"
+		:modal="true"
+	>
+		<iframe class="!w-100% !h-[calc(100vh-90px)]" :src="drawerUrl" frameborder="0"></iframe>
+		<el-divider class="!ma-0" />
+		<div class="position-sticky left-20px !h-50px lh-50px">
+			<el-button type="primary" class="!w-100px" @click="drawer = false; drawerUrl = ''">关 闭</el-button>
+		</div>
+	</el-drawer>
+</template>
+
+<script setup>
+/** 人才采集 网页解析 */
+defineOptions({ name: 'WebPageParsing' })
+import FirecrawlApp from '@mendable/firecrawl-js'
+import { SetUp } from '@element-plus/icons-vue'
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(false)
+const queryParams = reactive({
+	// urls: 'https://element.eleme.cn/#/zh-CN/component/installation'
+	urls: 'https://mp.weixin.qq.com/s/WeCRR3zN3fPvlGR4t8YFDA'
+})
+const queryFormRef = ref()
+const contents = ref([])
+const drawer = ref(false)
+const drawerUrl = ref('')
+
+const showPage = (content) => {
+	drawer.value = true
+	drawerUrl.value = content.url
+}
+
+const handleReload = async (content) => {
+	content.data = null
+	const res = await handleData(queryParams.urls)
+	content.tab = 0
+	content.data = res
+}
+
+const handleData = async (url) => {
+	try {
+    const app = new FirecrawlApp({ apiKey: 'fc-85c1550c6db64ce4ae8f2d2cd2606e6f' })
+    const crawlResponse = await app.crawlUrl(url, {
+      limit: 100,
+      scrapeOptions: {
+        formats: ['markdown', 'html']
+      }
+    })
+    if (!crawlResponse.success) {
+      throw new Error(`Failed to crawl: ${crawlResponse.error}`)
+    }
+    return crawlResponse
+  } catch (error) {
+    return error.message
+  }
+}
+
+// const handleExecute = async () => {
+// 	if (!queryParams.urls) return
+// 	contents.value = []
+// 	const urls = queryParams.urls.split(',')
+
+// 	const run = async (url) => {
+// 	  contents.value.push({ url, tab: 'markdown', showHtml: false, data: null })
+// 		const res = await handleData(url)
+// 		contents.value[contents.value.length - 1] = { url, tab: 'markdown', showHtml: false, data: res }
+
+// 		if (contents.value.length < urls.length) {
+// 			await run(urls[contents.value.length])
+// 		}
+// 	}
+
+// 	await run(urls[contents.value.length])
+// }
+
+// 执行
+const handleExecute = async () => {
+	if (!queryParams.urls) return
+	contents.value = []
+	const urls = queryParams.urls.split(',').map(url => url.trim()).filter(url => url)
+	if (urls.length === 0) return
+
+	urls.forEach(url => {
+	  contents.value.push({ url, tab: 'markdown', showHtml: false, data: null })
+	})
+
+	const crawlPromises = urls.map(async (url, index) => {
+		const res = await handleData(url)
+		contents.value[index] = { ...contents.value[index], data: res }
+	})
+
+	try {
+		await Promise.all(crawlPromises)
+		console.log('All crawls completed:', contents.value); // 可在此处添加成功回调
+	} catch (error) {
+		console.error('爬取过程中发生错误:', error);
+	}
+}
+</script>

+ 70 - 93
src/views/menduner/system/talentMap/maintenance/gather/webPageParsing/index.vue

@@ -7,13 +7,13 @@
 			:inline="true"
 			label-width="90px"
 		>
-			<el-form-item label="url抓取数据" prop="urls">
+			<el-form-item label="url提取内容" prop="urls">
 				<el-input
 					v-model="queryParams.urls"
 					class="!w-60vw"
 					type="textarea"
-					:rows="1"
-					placeholder="请输入需要取的页面,多个页面请用 ',' 隔开"
+					:rows="2"
+					placeholder="请输入需要取的页面,多个页面请用 ',' 隔开"
 				/>
 			</el-form-item>
 			<el-form-item>
@@ -29,32 +29,13 @@
 					<template #header>
 						<div class="flex items-center justify-between">
 							<el-text class="flex-1" truncated>{{ content.url }}</el-text>
-							<div class="!w-85px">
+							<div class="!w-40px">
 								<Icon icon="ep:view" size="25" class="ml-10px cursor-pointer" color="#409eff" @click="showPage(content)" />
-								<Icon icon="ep:refresh" size="25" class=" ml-18px cursor-pointer" color="#409eff" @click="handleReload(content)" />
 							</div>
 						</div>
 					</template>
-					<div v-if="content.data">
-						<template v-if="typeof content.data === 'string'">{{ content.data }}</template>
-            <el-tabs v-else v-model="content.tab">
-              <el-tab-pane v-for="(v, k) in content.data.data[0]" :key="k" :label="k" :name="k" class="overflow-y-auto !h-360px">
-								<template v-if="k === 'html'">
-									<div class="position-sticky float-right">
-										<el-button
-											type="primary"
-											class="cursor-pointer"
-											@click="content.showHtml = !content.showHtml"
-											:icon="SetUp"
-											circle
-										/>
-									</div>
-                  <pre v-if="!content.showHtml">{{ v }}</pre>
-                  <div v-else v-html="v"></div>
-                </template>
-                <pre v-else>{{ v || '暂无数据' }}</pre>
-							</el-tab-pane>
-            </el-tabs>
+          <div class="overflow-y-auto !h-360px" v-if="content.data">
+            <pre>{{ content.data }}</pre>
           </div>
 				</el-card>
 			</el-col>
@@ -67,10 +48,10 @@
 		:with-header="false"
 		:modal="true"
 	>
-		<iframe class="!w-100% !h-[calc(100vh-90px)]" :src="drawerUrl" frameborder="0"></iframe>
+		<iframe id="iFrame" class="!w-100% !h-[calc(100vh-90px)]" src="" frameborder="0"></iframe>
 		<el-divider class="!ma-0" />
 		<div class="position-sticky left-20px !h-50px lh-50px">
-			<el-button type="primary" class="!w-100px" @click="drawer = false; drawerUrl = ''">关 闭</el-button>
+			<el-button type="primary" class="!w-100px" @click="drawer = false">关 闭</el-button>
 		</div>
 	</el-drawer>
 </template>
@@ -78,91 +59,87 @@
 <script setup>
 /** 人才采集 网页解析 */
 defineOptions({ name: 'WebPageParsing' })
-import FirecrawlApp from '@mendable/firecrawl-js'
-import { SetUp } from '@element-plus/icons-vue'
+import axios from 'axios'
 
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
 
 const loading = ref(false)
 const queryParams = reactive({
-	// urls: 'https://element.eleme.cn/#/zh-CN/component/installation'
-	urls: 'https://mp.weixin.qq.com/s/WeCRR3zN3fPvlGR4t8YFDA'
+	urls: 'https://mp.weixin.qq.com/s/vQLWlSB6DzqSewtBLkk_kQ'
 })
 const queryFormRef = ref()
 const contents = ref([])
 const drawer = ref(false)
-const drawerUrl = ref('')
 
-const showPage = (content) => {
-	drawer.value = true
-	drawerUrl.value = content.url
-}
-
-const handleReload = async (content) => {
-	content.data = null
-	const res = await handleData(queryParams.urls)
-	content.tab = 0
-	content.data = res
-}
-
-const handleData = async (url) => {
-	try {
-    const app = new FirecrawlApp({ apiKey: 'fc-85c1550c6db64ce4ae8f2d2cd2606e6f' })
-    const crawlResponse = await app.crawlUrl(url, {
-      limit: 100,
-      scrapeOptions: {
-        formats: ['markdown', 'html']
-      }
+// 查看原网页
+const showPage = (res) => {
+  if (res.data) {
+    drawer.value = true
+    let html = res.data
+    html = html.replace(/data-src/g, 'src') // 将 data-src 转化为 src
+      .replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/g, '') // 移除HTML内容中所有的<script>标签,这样可以避免在iframe中执行潜在的不受信任的脚本。
+      .replace(/https/g, 'http') // 将HTML内容中所有的https替换为http,可能是为了避免在HTTPS环境下加载非HTTPS资源导致浏览器警告
+    
+    nextTick(() => {
+      const iframe = document.getElementById('iFrame')
+      if (!iframe) return
+      const doc = iframe.contentDocument || iframe.document
+      // 设置 iframe 中请求不发送 referrer,以绕过图片防盗链
+      const htmlArr = html.split('</head>')
+      const html_src_add = htmlArr[0] + '<meta name="referrer" content="never"></head>' + htmlArr[1]
+      doc.open()
+      doc.write(html_src_add)
+      doc.close()
+      // 通过延时获取文档高度赋值Iframe去除滚动条,根据实际情况增加延时时间
+      setTimeout(() => {
+        const jsContent = doc.getElementById('js_content')
+        if (jsContent) {
+          jsContent.style.visibility = 'visible'
+          jsContent.style.opacity = 1
+        }
+      }, 100)
     })
-    if (!crawlResponse.success) {
-      throw new Error(`Failed to crawl: ${crawlResponse.error}`)
-    }
-    return crawlResponse
-  } catch (error) {
-    return error.message
   }
 }
 
-// const handleExecute = async () => {
-// 	if (!queryParams.urls) return
-// 	contents.value = []
-// 	const urls = queryParams.urls.split(',')
-
-// 	const run = async (url) => {
-// 	  contents.value.push({ url, tab: 'markdown', showHtml: false, data: null })
-// 		const res = await handleData(url)
-// 		contents.value[contents.value.length - 1] = { url, tab: 'markdown', showHtml: false, data: res }
-
-// 		if (contents.value.length < urls.length) {
-// 			await run(urls[contents.value.length])
-// 		}
-// 	}
-
-// 	await run(urls[contents.value.length])
-// }
-
 // 执行
 const handleExecute = async () => {
 	if (!queryParams.urls) return
 	contents.value = []
-	const urls = queryParams.urls.split(',').map(url => url.trim()).filter(url => url)
-	if (urls.length === 0) return
-
-	urls.forEach(url => {
-	  contents.value.push({ url, tab: 'markdown', showHtml: false, data: null })
-	})
-
-	const crawlPromises = urls.map(async (url, index) => {
-		const res = await handleData(url)
-		contents.value[index] = { ...contents.value[index], data: res }
-	})
-
+	loading.value = true
 	try {
-		await Promise.all(crawlPromises)
-		console.log('All crawls completed:', contents.value); // 可在此处添加成功回调
-	} catch (error) {
-		console.error('爬取过程中发生错误:', error);
+		const urlArr = queryParams.urls.split(',').map(url => url.trim()).filter(Boolean)
+		const isWeChatUrl = urlArr.every(url => url.includes('https://mp.weixin.qq.com'))
+		if (!isWeChatUrl) {
+			message.warning('请输入微信公众文章链接')
+			return
+		}
+
+		const requests = urlArr.map(url => {
+			const path = url.split('mp.weixin.qq.com')[1]
+			const realurl = `/weixin-article${path}`
+			return axios.get(realurl).then(res => ({
+				url: url,
+				data: res.data
+			}))
+		})
+
+		const results = await Promise.all(requests)
+		contents.value = results.filter(item => item.data)
+	} catch (e) {
+		console.error(e)
+		message.error('获取失败')
+	} finally {
+		loading.value = false
 	}
 }
-</script>
+</script>
+
+<style scoped>
+.iframe-container {
+  position: relative;
+  width: 100%;
+  height: calc(100vh - 90px);
+}
+</style>

+ 1 - 1
src/views/menduner/system/talentMap/maintenance/labeling/LabelingForm.vue

@@ -92,7 +92,7 @@ import DefaultData from '@/views/menduner/system/talentMap/details/defaultData'
 import { getDict } from '@/hooks/web/useDictionaries'
 import { cloneDeep } from 'lodash-es'
 import { TalentMap } from '@/api/menduner/system/talentMap'
-import FormPage from '@/views/menduner/system/talentMap/maintenance/gather/businessCard/FormPage.vue'
+import FormPage from '@/views/menduner/system/talentMap/components/FormPage.vue'
 
 const message = useMessage() // 消息弹窗
 const loading = ref(false)

+ 6 - 0
vite.config.ts

@@ -45,6 +45,12 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
           secure: false, // 是否支持 https,默认 false
           changeOrigin: true, // 是否支持跨域
           rewrite: (path) => path.replace(new RegExp(`^/api`), '/api')
+        },
+        '/weixin-article': {
+          target: 'https://mp.weixin.qq.com/',
+          secure: true,
+          changeOrigin: true,
+          rewrite: (path) => path.replace(new RegExp(`^/weixin-article`), '')
         }
       }
     },