index.vue 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207
  1. <template>
  2. <div class="transformation-container">
  3. <!-- 页面头部 -->
  4. <div class="page-header">
  5. <div class="header-content">
  6. <div class="header-left">
  7. <el-breadcrumb separator="/">
  8. <el-breadcrumb-item :to="{ path: '/edu-industry' }">产教融合</el-breadcrumb-item>
  9. <el-breadcrumb-item>产学研成果转化加速器</el-breadcrumb-item>
  10. </el-breadcrumb>
  11. <h1 class="page-title">
  12. <el-icon class="title-icon"><TrendCharts /></el-icon>
  13. 产学研成果转化加速器
  14. </h1>
  15. </div>
  16. <div class="header-right">
  17. <el-button type="primary" @click="handleAddAchievement">
  18. <el-icon><Plus /></el-icon>
  19. 添加成果
  20. </el-button>
  21. </div>
  22. </div>
  23. </div>
  24. <!-- 功能导航标签 -->
  25. <div class="function-tabs">
  26. <el-tabs v-model="activeTab" @tab-change="handleTabChange">
  27. <el-tab-pane label="技术成熟度评估仪表盘" name="assessment">
  28. <div class="tab-content">
  29. <!-- 技术成熟度评估 -->
  30. <div class="assessment-dashboard">
  31. <el-row :gutter="24">
  32. <!-- 评估项目列表 -->
  33. <el-col :span="8">
  34. <div class="assessment-list">
  35. <div class="section-header">
  36. <h3>待评估项目</h3>
  37. <el-button type="primary" size="small" @click="handleNewAssessment">
  38. <el-icon><Plus /></el-icon>
  39. 新建评估
  40. </el-button>
  41. </div>
  42. <div class="project-list">
  43. <div
  44. v-for="project in assessmentProjects"
  45. :key="project.id"
  46. class="project-item"
  47. :class="{ active: selectedProject?.id === project.id }"
  48. @click="selectProject(project)"
  49. >
  50. <div class="project-info">
  51. <h4>{{ project.name }}</h4>
  52. <p>{{ project.description }}</p>
  53. <div class="project-meta">
  54. <el-tag :type="getStatusType(project.status)" size="small">
  55. {{ project.status }}
  56. </el-tag>
  57. <span class="project-date">{{ project.createDate }}</span>
  58. </div>
  59. </div>
  60. <div class="project-score">
  61. <el-progress
  62. type="circle"
  63. :percentage="project.maturityScore"
  64. :width="50"
  65. :stroke-width="6"
  66. />
  67. </div>
  68. </div>
  69. </div>
  70. </div>
  71. </el-col>
  72. <!-- 评估详情 -->
  73. <el-col :span="16">
  74. <div class="assessment-detail" v-if="selectedProject">
  75. <div class="detail-header">
  76. <h3>{{ selectedProject.name }} - 技术成熟度评估</h3>
  77. <el-button type="primary" @click="handleStartAssessment">开始评估</el-button>
  78. </div>
  79. <!-- 评估维度 -->
  80. <div class="assessment-dimensions">
  81. <el-row :gutter="16">
  82. <el-col :span="12">
  83. <div class="dimension-card">
  84. <h4>技术可行性</h4>
  85. <div class="dimension-content">
  86. <el-rate
  87. v-model="assessmentScores.feasibility"
  88. :max="10"
  89. show-score
  90. text-color="#ff9900"
  91. />
  92. <div class="score-desc">
  93. <p>评估技术实现的可行性和成熟度</p>
  94. </div>
  95. </div>
  96. </div>
  97. </el-col>
  98. <el-col :span="12">
  99. <div class="dimension-card">
  100. <h4>市场潜力</h4>
  101. <div class="dimension-content">
  102. <el-rate
  103. v-model="assessmentScores.market"
  104. :max="10"
  105. show-score
  106. text-color="#ff9900"
  107. />
  108. <div class="score-desc">
  109. <p>评估市场需求和商业化前景</p>
  110. </div>
  111. </div>
  112. </div>
  113. </el-col>
  114. <el-col :span="12">
  115. <div class="dimension-card">
  116. <h4>团队能力</h4>
  117. <div class="dimension-content">
  118. <el-rate
  119. v-model="assessmentScores.team"
  120. :max="10"
  121. show-score
  122. text-color="#ff9900"
  123. />
  124. <div class="score-desc">
  125. <p>评估研发团队的技术实力</p>
  126. </div>
  127. </div>
  128. </div>
  129. </el-col>
  130. <el-col :span="12">
  131. <div class="dimension-card">
  132. <h4>资源配置</h4>
  133. <div class="dimension-content">
  134. <el-rate
  135. v-model="assessmentScores.resources"
  136. :max="10"
  137. show-score
  138. text-color="#ff9900"
  139. />
  140. <div class="score-desc">
  141. <p>评估资金、设备等资源配置</p>
  142. </div>
  143. </div>
  144. </div>
  145. </el-col>
  146. </el-row>
  147. </div>
  148. <!-- 综合评估结果 -->
  149. <div class="assessment-result">
  150. <h4>综合评估结果</h4>
  151. <div class="result-content">
  152. <div class="result-chart">
  153. <el-progress
  154. type="circle"
  155. :percentage="overallScore"
  156. :width="120"
  157. :stroke-width="8"
  158. >
  159. <template #default="{ percentage }">
  160. <span class="percentage-value">{{ percentage }}%</span>
  161. <span class="percentage-label">综合得分</span>
  162. </template>
  163. </el-progress>
  164. </div>
  165. <div class="result-analysis">
  166. <div class="analysis-item">
  167. <span class="label">成熟度等级:</span>
  168. <el-tag :type="getMaturityType(overallScore)">
  169. {{ getMaturityLevel(overallScore) }}
  170. </el-tag>
  171. </div>
  172. <div class="analysis-item">
  173. <span class="label">转化建议:</span>
  174. <span>{{ getTransformationAdvice(overallScore) }}</span>
  175. </div>
  176. <div class="analysis-item">
  177. <span class="label">风险评估:</span>
  178. <span>{{ getRiskAssessment(overallScore) }}</span>
  179. </div>
  180. </div>
  181. </div>
  182. </div>
  183. <!-- 专家评价 -->
  184. <div class="expert-reviews">
  185. <h4>专家评价</h4>
  186. <div class="review-list">
  187. <div
  188. v-for="review in expertReviews"
  189. :key="review.id"
  190. class="review-item"
  191. >
  192. <div class="reviewer-info">
  193. <el-avatar :src="review.avatar" :size="40" />
  194. <div class="reviewer-details">
  195. <h5>{{ review.name }}</h5>
  196. <p>{{ review.title }}</p>
  197. </div>
  198. </div>
  199. <div class="review-content">
  200. <el-rate v-model="review.score" disabled show-score />
  201. <p>{{ review.comment }}</p>
  202. </div>
  203. </div>
  204. </div>
  205. </div>
  206. </div>
  207. <div v-else class="no-selection">
  208. <el-empty description="请选择一个项目进行评估" />
  209. </div>
  210. </el-col>
  211. </el-row>
  212. </div>
  213. </div>
  214. </el-tab-pane>
  215. <el-tab-pane label="路演匹配系统" name="roadshow">
  216. <div class="tab-content">
  217. <!-- 路演匹配系统 -->
  218. <div class="roadshow-system">
  219. <el-row :gutter="24">
  220. <!-- 路演项目 -->
  221. <el-col :span="12">
  222. <div class="roadshow-projects">
  223. <div class="section-header">
  224. <h3>路演项目</h3>
  225. <el-button type="primary" size="small" @click="handleCreateRoadshow">
  226. <el-icon><Plus /></el-icon>
  227. 创建路演
  228. </el-button>
  229. </div>
  230. <div class="project-cards">
  231. <div
  232. v-for="project in roadshowProjects"
  233. :key="project.id"
  234. class="roadshow-card"
  235. >
  236. <div class="card-header">
  237. <h4>{{ project.name }}</h4>
  238. <el-tag :type="getRoadshowStatusType(project.status)">
  239. {{ project.status }}
  240. </el-tag>
  241. </div>
  242. <div class="card-content">
  243. <p>{{ project.description }}</p>
  244. <div class="project-tags">
  245. <el-tag
  246. v-for="tag in project.tags"
  247. :key="tag"
  248. size="small"
  249. type="info"
  250. >
  251. {{ tag }}
  252. </el-tag>
  253. </div>
  254. <div class="project-stats">
  255. <div class="stat-item">
  256. <span class="label">融资需求:</span>
  257. <span class="value">{{ project.funding }}万元</span>
  258. </div>
  259. <div class="stat-item">
  260. <span class="label">路演时间:</span>
  261. <span class="value">{{ project.roadshowDate }}</span>
  262. </div>
  263. </div>
  264. </div>
  265. <div class="card-actions">
  266. <el-button size="small" @click="handleViewRoadshow(project)">
  267. 查看详情
  268. </el-button>
  269. <el-button size="small" type="primary" @click="handleMatchInvestors(project)">
  270. 匹配投资方
  271. </el-button>
  272. </div>
  273. </div>
  274. </div>
  275. </div>
  276. </el-col>
  277. <!-- 投资机构匹配 -->
  278. <el-col :span="12">
  279. <div class="investor-matching">
  280. <div class="section-header">
  281. <h3>投资机构匹配</h3>
  282. <el-button type="primary" size="small" @click="handleRefreshMatching">
  283. <el-icon><Refresh /></el-icon>
  284. 刷新匹配
  285. </el-button>
  286. </div>
  287. <div class="matching-results">
  288. <div
  289. v-for="investor in matchedInvestors"
  290. :key="investor.id"
  291. class="investor-card"
  292. >
  293. <div class="investor-header">
  294. <div class="investor-info">
  295. <h4>{{ investor.name }}</h4>
  296. <p>{{ investor.type }}</p>
  297. </div>
  298. <div class="match-score">
  299. <el-progress
  300. type="circle"
  301. :percentage="Math.round(investor.matchScore * 100)"
  302. :width="60"
  303. />
  304. </div>
  305. </div>
  306. <div class="investor-details">
  307. <div class="detail-item">
  308. <span class="label">投资领域:</span>
  309. <span>{{ investor.fields.join(', ') }}</span>
  310. </div>
  311. <div class="detail-item">
  312. <span class="label">投资规模:</span>
  313. <span>{{ investor.investmentRange }}</span>
  314. </div>
  315. <div class="detail-item">
  316. <span class="label">投资阶段:</span>
  317. <span>{{ investor.stage }}</span>
  318. </div>
  319. </div>
  320. <div class="investor-actions">
  321. <el-button size="small" @click="handleViewInvestor(investor)">
  322. 查看详情
  323. </el-button>
  324. <el-button size="small" type="primary" @click="handleContactInvestor(investor)">
  325. 发起联系
  326. </el-button>
  327. </div>
  328. </div>
  329. </div>
  330. </div>
  331. </el-col>
  332. </el-row>
  333. <!-- 路演日程 -->
  334. <div class="roadshow-schedule">
  335. <h3>路演日程</h3>
  336. <el-calendar v-model="calendarValue">
  337. <template #date-cell="{ data }">
  338. <div class="calendar-cell">
  339. <p>{{ data.day.split('-').slice(2).join('-') }}</p>
  340. <div v-if="getRoadshowEvents(data.day).length > 0" class="events">
  341. <div
  342. v-for="event in getRoadshowEvents(data.day)"
  343. :key="event.id"
  344. class="event-item"
  345. >
  346. {{ event.title }}
  347. </div>
  348. </div>
  349. </div>
  350. </template>
  351. </el-calendar>
  352. </div>
  353. </div>
  354. </div>
  355. </el-tab-pane>
  356. <el-tab-pane label="成果展示平台" name="showcase">
  357. <div class="tab-content">
  358. <!-- 成果展示平台 -->
  359. <div class="showcase-platform">
  360. <div class="showcase-header">
  361. <h3>成果展示平台</h3>
  362. <div class="header-actions">
  363. <el-input
  364. v-model="searchKeyword"
  365. placeholder="搜索成果"
  366. style="width: 200px; margin-right: 12px;"
  367. >
  368. <template #prefix>
  369. <el-icon><Search /></el-icon>
  370. </template>
  371. </el-input>
  372. <el-button type="primary" @click="handleUploadAchievement">
  373. <el-icon><Upload /></el-icon>
  374. 上传成果
  375. </el-button>
  376. </div>
  377. </div>
  378. <!-- 成果展示网格 -->
  379. <div class="achievement-grid">
  380. <el-row :gutter="20">
  381. <el-col
  382. v-for="achievement in achievements"
  383. :key="achievement.id"
  384. :span="8"
  385. >
  386. <div class="achievement-card">
  387. <div class="card-media">
  388. <img :src="achievement.thumbnail" :alt="achievement.title" />
  389. <div class="media-overlay">
  390. <el-button type="primary" circle @click="handlePreview(achievement)">
  391. <el-icon><View /></el-icon>
  392. </el-button>
  393. </div>
  394. </div>
  395. <div class="card-content">
  396. <h4>{{ achievement.title }}</h4>
  397. <p>{{ achievement.description }}</p>
  398. <div class="achievement-meta">
  399. <div class="meta-item">
  400. <el-icon><User /></el-icon>
  401. <span>{{ achievement.author }}</span>
  402. </div>
  403. <div class="meta-item">
  404. <el-icon><Calendar /></el-icon>
  405. <span>{{ achievement.publishDate }}</span>
  406. </div>
  407. </div>
  408. <div class="achievement-tags">
  409. <el-tag
  410. v-for="tag in achievement.tags"
  411. :key="tag"
  412. size="small"
  413. type="success"
  414. >
  415. {{ tag }}
  416. </el-tag>
  417. </div>
  418. </div>
  419. <div class="card-actions">
  420. <el-button size="small" @click="handleViewAchievement(achievement)">
  421. 查看详情
  422. </el-button>
  423. <el-button size="small" type="primary" @click="handleDownload(achievement)">
  424. 下载资料
  425. </el-button>
  426. </div>
  427. </div>
  428. </el-col>
  429. </el-row>
  430. </div>
  431. </div>
  432. </div>
  433. </el-tab-pane>
  434. </el-tabs>
  435. </div>
  436. </div>
  437. </template>
  438. <script setup lang="ts">
  439. import { ref, computed, onMounted } from 'vue'
  440. import {
  441. TrendCharts,
  442. Plus,
  443. Refresh,
  444. Search,
  445. Upload,
  446. View,
  447. User,
  448. Calendar
  449. } from '@element-plus/icons-vue'
  450. // 活动标签
  451. const activeTab = ref('assessment')
  452. // 选中的项目
  453. const selectedProject = ref(null)
  454. // 评估项目数据
  455. const assessmentProjects = ref([
  456. {
  457. id: 1,
  458. name: '智能语音识别系统',
  459. description: '基于深度学习的多语言语音识别技术',
  460. status: '评估中',
  461. maturityScore: 75,
  462. createDate: '2024-01-15'
  463. },
  464. {
  465. id: 2,
  466. name: '区块链供应链管理',
  467. description: '去中心化的供应链追溯与管理平台',
  468. status: '待评估',
  469. maturityScore: 60,
  470. createDate: '2024-01-20'
  471. },
  472. {
  473. id: 3,
  474. name: '新能源电池技术',
  475. description: '高能量密度锂电池技术研发',
  476. status: '已完成',
  477. maturityScore: 85,
  478. createDate: '2024-01-10'
  479. }
  480. ])
  481. // 评估分数
  482. const assessmentScores = ref({
  483. feasibility: 7,
  484. market: 8,
  485. team: 6,
  486. resources: 7
  487. })
  488. // 综合得分
  489. const overallScore = computed(() => {
  490. const scores = assessmentScores.value
  491. return Math.round((scores.feasibility + scores.market + scores.team + scores.resources) * 2.5)
  492. })
  493. // 专家评价
  494. const expertReviews = ref([
  495. {
  496. id: 1,
  497. name: '张教授',
  498. title: '人工智能专家',
  499. avatar: '/avatars/expert1.jpg',
  500. score: 4,
  501. comment: '技术方案具有创新性,但需要进一步验证市场需求。'
  502. },
  503. {
  504. id: 2,
  505. name: '李博士',
  506. title: '产业化专家',
  507. avatar: '/avatars/expert2.jpg',
  508. score: 5,
  509. comment: '商业化前景良好,建议加强团队建设。'
  510. }
  511. ])
  512. // 路演项目
  513. const roadshowProjects = ref([
  514. {
  515. id: 1,
  516. name: '智能医疗诊断系统',
  517. description: '基于AI的医学影像诊断辅助系统',
  518. status: '路演中',
  519. tags: ['人工智能', '医疗健康', '图像识别'],
  520. funding: 500,
  521. roadshowDate: '2024-02-15'
  522. },
  523. {
  524. id: 2,
  525. name: '绿色能源管理平台',
  526. description: '智能化的新能源发电管理系统',
  527. status: '准备中',
  528. tags: ['新能源', '物联网', '大数据'],
  529. funding: 800,
  530. roadshowDate: '2024-02-20'
  531. }
  532. ])
  533. // 匹配的投资机构
  534. const matchedInvestors = ref([
  535. {
  536. id: 1,
  537. name: '红杉资本',
  538. type: '风险投资',
  539. matchScore: 0.92,
  540. fields: ['人工智能', '医疗健康'],
  541. investmentRange: '1000万-5000万',
  542. stage: 'A轮-B轮'
  543. },
  544. {
  545. id: 2,
  546. name: '经纬中国',
  547. type: '创业投资',
  548. matchScore: 0.87,
  549. fields: ['企业服务', '新能源'],
  550. investmentRange: '500万-2000万',
  551. stage: '天使轮-A轮'
  552. }
  553. ])
  554. // 日历值
  555. const calendarValue = ref(new Date())
  556. // 搜索关键词
  557. const searchKeyword = ref('')
  558. // 成果展示数据
  559. const achievements = ref([
  560. {
  561. id: 1,
  562. title: '智能制造控制系统',
  563. description: '工业4.0智能制造生产线控制系统',
  564. author: '王教授团队',
  565. publishDate: '2024-01-15',
  566. thumbnail: '/images/achievement1.jpg',
  567. tags: ['智能制造', '工业4.0', '自动化']
  568. },
  569. {
  570. id: 2,
  571. title: '环保材料研发成果',
  572. description: '可降解生物材料的研发与应用',
  573. author: '李博士团队',
  574. publishDate: '2024-01-20',
  575. thumbnail: '/images/achievement2.jpg',
  576. tags: ['环保材料', '生物技术', '可持续发展']
  577. },
  578. {
  579. id: 3,
  580. title: '金融科技创新平台',
  581. description: '基于区块链的数字金融服务平台',
  582. author: '张副教授团队',
  583. publishDate: '2024-01-25',
  584. thumbnail: '/images/achievement3.jpg',
  585. tags: ['金融科技', '区块链', '数字货币']
  586. }
  587. ])
  588. // 方法
  589. const handleTabChange = (tabName: string) => {
  590. console.log('切换标签:', tabName)
  591. }
  592. const handleAddAchievement = () => {
  593. console.log('添加成果')
  594. }
  595. const selectProject = (project: any) => {
  596. selectedProject.value = project
  597. }
  598. const getStatusType = (status: string) => {
  599. const typeMap = {
  600. '评估中': 'warning',
  601. '待评估': 'info',
  602. '已完成': 'success'
  603. }
  604. return typeMap[status] || 'info'
  605. }
  606. const getMaturityType = (score: number) => {
  607. if (score >= 80) return 'success'
  608. if (score >= 60) return 'warning'
  609. return 'danger'
  610. }
  611. const getMaturityLevel = (score: number) => {
  612. if (score >= 80) return '高成熟度'
  613. if (score >= 60) return '中等成熟度'
  614. return '低成熟度'
  615. }
  616. const getTransformationAdvice = (score: number) => {
  617. if (score >= 80) return '建议立即启动产业化进程'
  618. if (score >= 60) return '需要进一步完善技术方案'
  619. return '建议继续研发,暂不适合转化'
  620. }
  621. const getRiskAssessment = (score: number) => {
  622. if (score >= 80) return '低风险'
  623. if (score >= 60) return '中等风险'
  624. return '高风险'
  625. }
  626. const getRoadshowStatusType = (status: string) => {
  627. const typeMap = {
  628. '路演中': 'success',
  629. '准备中': 'warning',
  630. '已结束': 'info'
  631. }
  632. return typeMap[status] || 'info'
  633. }
  634. const getRoadshowEvents = (date: string) => {
  635. // 模拟路演事件数据
  636. const events = {
  637. '2024-02-15': [{ id: 1, title: '智能医疗诊断系统路演' }],
  638. '2024-02-20': [{ id: 2, title: '绿色能源管理平台路演' }]
  639. }
  640. return events[date] || []
  641. }
  642. const handleNewAssessment = () => {
  643. console.log('新建评估')
  644. }
  645. const handleStartAssessment = () => {
  646. console.log('开始评估')
  647. }
  648. const handleCreateRoadshow = () => {
  649. console.log('创建路演')
  650. }
  651. const handleViewRoadshow = (project: any) => {
  652. console.log('查看路演:', project)
  653. }
  654. const handleMatchInvestors = (project: any) => {
  655. console.log('匹配投资方:', project)
  656. }
  657. const handleRefreshMatching = () => {
  658. console.log('刷新匹配')
  659. }
  660. const handleViewInvestor = (investor: any) => {
  661. console.log('查看投资方:', investor)
  662. }
  663. const handleContactInvestor = (investor: any) => {
  664. console.log('联系投资方:', investor)
  665. }
  666. const handleUploadAchievement = () => {
  667. console.log('上传成果')
  668. }
  669. const handlePreview = (achievement: any) => {
  670. console.log('预览成果:', achievement)
  671. }
  672. const handleViewAchievement = (achievement: any) => {
  673. console.log('查看成果详情:', achievement)
  674. }
  675. const handleDownload = (achievement: any) => {
  676. console.log('下载成果资料:', achievement)
  677. }
  678. onMounted(() => {
  679. // 默认选择第一个项目
  680. if (assessmentProjects.value.length > 0) {
  681. selectedProject.value = assessmentProjects.value[0]
  682. }
  683. console.log('产学研成果转化加速器已加载')
  684. })
  685. </script>
  686. <style scoped>
  687. .transformation-container {
  688. padding: 20px;
  689. background: #f5f7fa;
  690. min-height: 100vh;
  691. }
  692. /* 页面头部 */
  693. .page-header {
  694. background: white;
  695. border-radius: 12px;
  696. padding: 20px;
  697. margin-bottom: 20px;
  698. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
  699. }
  700. .header-content {
  701. display: flex;
  702. justify-content: space-between;
  703. align-items: center;
  704. }
  705. .page-title {
  706. display: flex;
  707. align-items: center;
  708. font-size: 24px;
  709. font-weight: 600;
  710. color: #2c3e50;
  711. margin: 8px 0 0 0;
  712. }
  713. .title-icon {
  714. margin-right: 8px;
  715. color: #f093fb;
  716. }
  717. /* 功能标签 */
  718. .function-tabs {
  719. background: white;
  720. border-radius: 12px;
  721. padding: 20px;
  722. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
  723. }
  724. .tab-content {
  725. padding-top: 20px;
  726. }
  727. /* 评估仪表盘 */
  728. .assessment-list {
  729. background: #f8f9fa;
  730. border-radius: 8px;
  731. padding: 20px;
  732. height: 600px;
  733. overflow-y: auto;
  734. }
  735. .section-header {
  736. display: flex;
  737. justify-content: space-between;
  738. align-items: center;
  739. margin-bottom: 20px;
  740. }
  741. .section-header h3 {
  742. margin: 0;
  743. color: #2c3e50;
  744. }
  745. .project-item {
  746. background: white;
  747. border-radius: 8px;
  748. padding: 16px;
  749. margin-bottom: 12px;
  750. cursor: pointer;
  751. transition: all 0.3s ease;
  752. display: flex;
  753. justify-content: space-between;
  754. align-items: center;
  755. }
  756. .project-item:hover,
  757. .project-item.active {
  758. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  759. border-left: 4px solid #f093fb;
  760. }
  761. .project-info h4 {
  762. margin: 0 0 8px 0;
  763. color: #2c3e50;
  764. }
  765. .project-info p {
  766. margin: 0 0 12px 0;
  767. color: #7f8c8d;
  768. font-size: 14px;
  769. }
  770. .project-meta {
  771. display: flex;
  772. align-items: center;
  773. gap: 12px;
  774. }
  775. .project-date {
  776. font-size: 12px;
  777. color: #95a5a6;
  778. }
  779. .assessment-detail {
  780. background: #f8f9fa;
  781. border-radius: 8px;
  782. padding: 20px;
  783. height: 600px;
  784. overflow-y: auto;
  785. }
  786. .detail-header {
  787. display: flex;
  788. justify-content: space-between;
  789. align-items: center;
  790. margin-bottom: 24px;
  791. }
  792. .detail-header h3 {
  793. margin: 0;
  794. color: #2c3e50;
  795. }
  796. .assessment-dimensions {
  797. margin-bottom: 24px;
  798. }
  799. .dimension-card {
  800. background: white;
  801. border-radius: 8px;
  802. padding: 16px;
  803. margin-bottom: 16px;
  804. }
  805. .dimension-card h4 {
  806. margin: 0 0 12px 0;
  807. color: #2c3e50;
  808. }
  809. .dimension-content {
  810. display: flex;
  811. flex-direction: column;
  812. gap: 8px;
  813. }
  814. .score-desc p {
  815. margin: 0;
  816. font-size: 12px;
  817. color: #7f8c8d;
  818. }
  819. .assessment-result {
  820. background: white;
  821. border-radius: 8px;
  822. padding: 20px;
  823. margin-bottom: 24px;
  824. }
  825. .assessment-result h4 {
  826. margin: 0 0 16px 0;
  827. color: #2c3e50;
  828. }
  829. .result-content {
  830. display: flex;
  831. gap: 24px;
  832. align-items: center;
  833. }
  834. .percentage-value {
  835. display: block;
  836. font-size: 20px;
  837. font-weight: 600;
  838. }
  839. .percentage-label {
  840. display: block;
  841. font-size: 12px;
  842. color: #7f8c8d;
  843. }
  844. .result-analysis {
  845. flex: 1;
  846. }
  847. .analysis-item {
  848. margin-bottom: 12px;
  849. display: flex;
  850. align-items: center;
  851. }
  852. .analysis-item .label {
  853. font-weight: 600;
  854. margin-right: 8px;
  855. min-width: 80px;
  856. }
  857. .expert-reviews {
  858. background: white;
  859. border-radius: 8px;
  860. padding: 20px;
  861. }
  862. .expert-reviews h4 {
  863. margin: 0 0 16px 0;
  864. color: #2c3e50;
  865. }
  866. .review-item {
  867. display: flex;
  868. gap: 16px;
  869. margin-bottom: 16px;
  870. padding-bottom: 16px;
  871. border-bottom: 1px solid #eee;
  872. }
  873. .reviewer-info {
  874. display: flex;
  875. gap: 12px;
  876. align-items: center;
  877. min-width: 200px;
  878. }
  879. .reviewer-details h5 {
  880. margin: 0;
  881. color: #2c3e50;
  882. }
  883. .reviewer-details p {
  884. margin: 4px 0 0 0;
  885. font-size: 12px;
  886. color: #7f8c8d;
  887. }
  888. .review-content {
  889. flex: 1;
  890. }
  891. .review-content p {
  892. margin: 8px 0 0 0;
  893. color: #5a6c7d;
  894. }
  895. .no-selection {
  896. display: flex;
  897. align-items: center;
  898. justify-content: center;
  899. height: 400px;
  900. }
  901. /* 路演系统 */
  902. .roadshow-projects,
  903. .investor-matching {
  904. background: #f8f9fa;
  905. border-radius: 8px;
  906. padding: 20px;
  907. height: 500px;
  908. overflow-y: auto;
  909. }
  910. .roadshow-card,
  911. .investor-card {
  912. background: white;
  913. border-radius: 8px;
  914. padding: 16px;
  915. margin-bottom: 16px;
  916. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  917. }
  918. .card-header,
  919. .investor-header {
  920. display: flex;
  921. justify-content: space-between;
  922. align-items: center;
  923. margin-bottom: 12px;
  924. }
  925. .card-header h4,
  926. .investor-info h4 {
  927. margin: 0;
  928. color: #2c3e50;
  929. }
  930. .card-content p,
  931. .investor-info p {
  932. margin: 4px 0 12px 0;
  933. color: #7f8c8d;
  934. font-size: 14px;
  935. }
  936. .project-tags {
  937. margin-bottom: 12px;
  938. }
  939. .project-tags .el-tag {
  940. margin-right: 8px;
  941. }
  942. .project-stats,
  943. .investor-details {
  944. margin-bottom: 12px;
  945. }
  946. .stat-item,
  947. .detail-item {
  948. display: flex;
  949. margin-bottom: 4px;
  950. }
  951. .stat-item .label,
  952. .detail-item .label {
  953. font-weight: 600;
  954. margin-right: 8px;
  955. min-width: 80px;
  956. }
  957. .card-actions,
  958. .investor-actions {
  959. text-align: right;
  960. }
  961. .roadshow-schedule {
  962. margin-top: 24px;
  963. background: white;
  964. border-radius: 8px;
  965. padding: 20px;
  966. }
  967. .roadshow-schedule h3 {
  968. margin: 0 0 20px 0;
  969. color: #2c3e50;
  970. }
  971. .calendar-cell {
  972. height: 100%;
  973. padding: 4px;
  974. }
  975. .calendar-cell p {
  976. margin: 0;
  977. text-align: center;
  978. }
  979. .events {
  980. margin-top: 4px;
  981. }
  982. .event-item {
  983. background: #f093fb;
  984. color: white;
  985. font-size: 10px;
  986. padding: 2px 4px;
  987. border-radius: 2px;
  988. margin-bottom: 2px;
  989. }
  990. /* 成果展示 */
  991. .showcase-platform {
  992. background: #f8f9fa;
  993. border-radius: 8px;
  994. padding: 20px;
  995. }
  996. .showcase-header {
  997. display: flex;
  998. justify-content: space-between;
  999. align-items: center;
  1000. margin-bottom: 24px;
  1001. }
  1002. .showcase-header h3 {
  1003. margin: 0;
  1004. color: #2c3e50;
  1005. }
  1006. .header-actions {
  1007. display: flex;
  1008. align-items: center;
  1009. }
  1010. .achievement-grid {
  1011. margin-top: 20px;
  1012. }
  1013. .achievement-card {
  1014. background: white;
  1015. border-radius: 12px;
  1016. overflow: hidden;
  1017. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  1018. transition: transform 0.3s ease;
  1019. margin-bottom: 20px;
  1020. }
  1021. .achievement-card:hover {
  1022. transform: translateY(-4px);
  1023. }
  1024. .card-media {
  1025. position: relative;
  1026. height: 200px;
  1027. overflow: hidden;
  1028. }
  1029. .card-media img {
  1030. width: 100%;
  1031. height: 100%;
  1032. object-fit: cover;
  1033. }
  1034. .media-overlay {
  1035. position: absolute;
  1036. top: 0;
  1037. left: 0;
  1038. right: 0;
  1039. bottom: 0;
  1040. background: rgba(0, 0, 0, 0.5);
  1041. display: flex;
  1042. align-items: center;
  1043. justify-content: center;
  1044. opacity: 0;
  1045. transition: opacity 0.3s ease;
  1046. }
  1047. .achievement-card:hover .media-overlay {
  1048. opacity: 1;
  1049. }
  1050. .card-content {
  1051. padding: 16px;
  1052. }
  1053. .card-content h4 {
  1054. margin: 0 0 8px 0;
  1055. color: #2c3e50;
  1056. }
  1057. .card-content p {
  1058. margin: 0 0 12px 0;
  1059. color: #7f8c8d;
  1060. font-size: 14px;
  1061. line-height: 1.5;
  1062. }
  1063. .achievement-meta {
  1064. display: flex;
  1065. gap: 16px;
  1066. margin-bottom: 12px;
  1067. }
  1068. .meta-item {
  1069. display: flex;
  1070. align-items: center;
  1071. gap: 4px;
  1072. font-size: 12px;
  1073. color: #95a5a6;
  1074. }
  1075. .achievement-tags {
  1076. margin-bottom: 12px;
  1077. }
  1078. .achievement-tags .el-tag {
  1079. margin-right: 8px;
  1080. }
  1081. .card-actions {
  1082. padding: 0 16px 16px;
  1083. text-align: right;
  1084. }
  1085. </style>