uploadIng.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. <template>
  2. <!-- 上传资源模态框 -->
  3. <a-modal
  4. v-model:visible="uploadModalVisible"
  5. :title="isState == 0 ? '上传资源' : '编辑'"
  6. width="600px"
  7. >
  8. <a-form :model="formState" :rules="rules" ref="formRef">
  9. <a-form-item label="单位" name="collegeId" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
  10. <a-cascader
  11. v-model:value="majorIdName"
  12. :options="collegeMajorOptions"
  13. :fieldNames="{ label: 'name', value: 'id', children: 'children' }"
  14. placeholder="请选择单位"
  15. style="width: 300px"
  16. changeOnSelect
  17. @change="changeCollegeMajor"
  18. />
  19. </a-form-item>
  20. <a-form-item label="资源类型" name="resourceType" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
  21. <a-cascader
  22. style="width: 240px; margin-left: 8px"
  23. v-model:value="resourceName"
  24. :options="resourceTypeOptions"
  25. :fieldNames="{ label: 'name', value: 'id', children: 'children' }"
  26. placeholder="请选择资源类型"
  27. changeOnSelect
  28. @change="changeCollegeResource"
  29. />
  30. </a-form-item>
  31. <a-form-item
  32. label="关键词(需添加2-5个关键词)"
  33. name="keywordValue"
  34. :label-col="{ span: 10 }"
  35. :wrapper-col="{ span: 18 }"
  36. >
  37. <div v-if="!formState.keywordValue.length" style="color: #ccc">请选择下方热门关键词</div>
  38. <div v-if="formState.keywordValue.length">
  39. <a-tag
  40. v-for="(keyword, index) in formState.keywordValue"
  41. :key="index"
  42. @close="handleRemoveKeyword(keyword, index)"
  43. >
  44. {{ keyword }}
  45. </a-tag>
  46. </div>
  47. </a-form-item>
  48. <a-form-item label="热门关键词" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
  49. <a-checkbox-group
  50. v-model:value="formState.keyword"
  51. :options="HotKeywordsOptions"
  52. @change="handleChangeKeyword"
  53. />
  54. </a-form-item>
  55. <a-row>
  56. <a-col :span="5"></a-col>
  57. <a-col :span="8">
  58. <a-input v-model:value="newKeyword" placeholder="请输入关键词" @pressEnter="handleAddKeyword" />
  59. </a-col>
  60. <a-col :span="9" style="line-height: 30px"> 按回车Enter创建新关键词 </a-col>
  61. </a-row>
  62. <a-form-item label="资源是否公开" style="margin-top: 10px" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
  63. <div class="public-status-buttons">
  64. <button :class="['status-button', { active: formState.authType === '0' }]" @click="setPublicStatus('0')">
  65. 公开
  66. </button>
  67. <button :class="['status-button', { active: formState.authType === '1' }]" @click="setPublicStatus('1')">
  68. 部分人可见
  69. </button>
  70. </div>
  71. </a-form-item>
  72. <a-form-item label="是否热门" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
  73. <a-radio-group v-model:value="formState.isHot">
  74. <a-radio :value="0">否</a-radio>
  75. <a-radio :value="1">是</a-radio>
  76. </a-radio-group>
  77. </a-form-item>
  78. <a-form-item label="是否推荐" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
  79. <a-radio-group v-model:value="formState.isRecommend">
  80. <a-radio :value="0">否</a-radio>
  81. <a-radio :value="1">是</a-radio>
  82. </a-radio-group>
  83. </a-form-item>
  84. <!-- 选择成员 -->
  85. <userSelection
  86. :visible="userReleaseVisible"
  87. :userRelateIds="userRelateIdss"
  88. @close="userReleaseVisible = false"
  89. @confirm="confirmUser"
  90. ></userSelection>
  91. </a-form>
  92. <template v-if="isState == 0">
  93. <!-- 资源上传 -->
  94. <!-- <UploadModal @success="uploadSuccess"></UploadModal> -->
  95. <!-- <UpLoadBreakPoint ref="upLoadBreakPointRef" @onSuccess="onSuccess"></UpLoadBreakPoint>-->
  96. </template>
  97. </a-modal>
  98. </template>
  99. <script setup>
  100. import { ref, reactive, onMounted } from 'vue'
  101. import { Modal, Upload, Form } from 'ant-design-vue'
  102. import resourceAuditApi from '@/api/resourceAudit.js'
  103. import userSelection from './userSelection.vue'
  104. import UpLoadBreakPoint from './upLoadBreakPoint.vue'
  105. import tool from '@/utils/tool'
  106. import sysConfig from "@/config";
  107. const { proxy } = getCurrentInstance()
  108. const props = defineProps({
  109. isState: {
  110. type: Number,
  111. required: true,
  112. default: 0
  113. },
  114. isVerifyStatus: {
  115. type: Number,
  116. required: true,
  117. default: 0
  118. },
  119. resourcesId: {
  120. type: Number,
  121. required: true,
  122. default: null
  123. }
  124. })
  125. const emit = defineEmits(['close', 'getList'])
  126. const headers = ref({
  127. token: tool.data.get('TOKEN')
  128. })
  129. //课程类型
  130. const courseTypeOptions = tool.dictList('COURSE_TYPE')
  131. const action = ref(sysConfig.API_URL+'/api/webapp/dev/file/uploadMinioReturnId')
  132. const formState = reactive({
  133. userfileIds: null, //资源文件id
  134. coverImage: undefined, //封面id
  135. // courseId: null, //课程
  136. // majorType: null, //专业
  137. resourceType: null, //资源类型一级
  138. resourceTwoType: null, //资源类型二级
  139. resourceThreeType: null, //资源类型二级
  140. collegeId: null, //院校一级id
  141. collegeTwoId: null, //院校二级id
  142. collegeThreeId: null, //院校三级id
  143. resourceDesc: null, //资源介绍
  144. // majorId: null, //专业id
  145. // courseTypeName: [], // 资源类型
  146. keywordValue: [], // 添加关键词
  147. keyword: [], // 热门关键词
  148. authType: '0', // 资源是否公开
  149. userRelateIds: null, //资源公开人员id
  150. isRecommend: 0, // 资源是否推荐
  151. isHot: 0 // 资源是否热门
  152. })
  153. import { miniyunStore } from '@/store/miniyun'
  154. const myMiniyunStore = miniyunStore()
  155. const upLoadBreakPointRef = ref(null) // 预览回显
  156. const coverImagePath = ref() // 预览回显
  157. const formRef = ref() // 添加表单引用
  158. const collegeMajorOptions = ref([]) //院系
  159. const resourceTypeOptions = ref([]) //资源类型下拉数据
  160. const HotKeywordsOptions = ref([]) //热门关键词列表
  161. const majorIdName = ref([]) //院系回显
  162. const resourceName = ref([]) //资源回显
  163. const majorOptions = ref([]) //专业
  164. const courseOptions = ref([]) //课程
  165. const userRelateIdss = ref([])
  166. const myHot = ref({})
  167. // 上传资源模态框
  168. const uploadModalVisible = ref(false)
  169. // 用户选择模态框
  170. const userReleaseVisible = ref(false)
  171. // 文件列表
  172. const fileList = ref([])
  173. const open = () =>{
  174. uploadModalVisible.value = true
  175. getOrgTreeSelector()
  176. getHotKeywords()
  177. getResourceTypeTree()
  178. getformState()
  179. // if (props.isState == 1) {
  180. // getDetail()
  181. // } else {
  182. // getformState()
  183. // }
  184. nextTick(()=>{
  185. upLoadBreakPointRef.value.open()
  186. })
  187. }
  188. // 关闭模态框
  189. const handleUploadCancel = () => {
  190. emit('close')
  191. fileList.value = []
  192. }
  193. // 新增Set记录已处理ID
  194. // const processedIds = ref(new Set())
  195. //资源文件上传成功返回
  196. const uploadSuccess = async (idsArr) => {
  197. formState.userfileIds = idsArr.join(',')
  198. // const newIds = idsArr.filter((id) => !processedIds.value.has(id))
  199. // if (newIds.length === 0) return
  200. // //文件转换
  201. // try {
  202. // const requests = newIds.map((id) => resourceAuditApi.fileFormatConversion({ userFileId: id }))
  203. // await Promise.all(requests)
  204. // newIds.forEach((id) => processedIds.value.add(id))
  205. // newKeyword.value = ''
  206. // } catch (err) {
  207. // console.error('部分请求失败:', err)
  208. // }
  209. }
  210. const onSuccess = (uploadFileList) => {
  211. let list = []
  212. console.log('formState.userfileIds是数组:', uploadFileList)
  213. for (let i = 0; i < uploadFileList.length; i++) {
  214. if (uploadFileList[i].userFileId) {
  215. list.push(uploadFileList[i].userFileId)
  216. }
  217. }
  218. console.log('formState.userfileIds是:', list)
  219. formState.userfileIds = list.join(',')
  220. }
  221. // 自定义校验函数示例
  222. const validateKeywords = (rule, value, callback) => {
  223. if (value.length < 2) {
  224. callback(new Error('至少需要添加2个关键词'))
  225. } else if (value.length > 5) {
  226. callback(new Error('最多只能添加5个关键词'))
  227. } else {
  228. callback()
  229. }
  230. }
  231. // 封面文件id
  232. const handleChangeCover = (fileId) => {
  233. formState.coverImage = fileId
  234. }
  235. // 移除封面文件
  236. const handleRemoveCover = () => {
  237. formState.coverImage = undefined
  238. }
  239. const rules = {
  240. // courseTypeName: [{ required: true, message: '请选择资源类型', trigger: 'change' }],
  241. collegeId: [{ required: true, message: '请选择单位', trigger: 'blur' }],
  242. keywordValue: [
  243. { required: true, message: '请选择关键词', trigger: 'blur' },
  244. { validator: validateKeywords, trigger: 'blur' }
  245. ],
  246. // coverImage: [{ required: true, message: '请上传封面', trigger: 'blur' }],
  247. resourceType: [{ required: true, message: '请选择资源类型', trigger: 'blur' }],
  248. resourceDesc: [
  249. { required: true, message: '请输入资源描述', trigger: 'blur' },
  250. { pattern: /^[\s\S]{10,500}$/, message: '描述长度应在10-500字符之间', trigger: 'blur' }
  251. ],
  252. coverImage: [{ required: true, message: '请上传封面', trigger: 'blur' }],
  253. }
  254. const newKeyword = ref('') //关键词
  255. const handleAddKeyword = (e) => {
  256. const newKeywords = newKeyword.value.trim()
  257. resourceAuditApi
  258. .addHotKeywords({
  259. wordName: newKeywords,
  260. popular: 0
  261. })
  262. .then((res) => {
  263. console.log(res.data, '添加热门关键词')
  264. getHotKeywords()
  265. newKeyword.value = ''
  266. })
  267. .catch((err) => {
  268. console.log(err)
  269. })
  270. // if (newKeywords && !formState.keywordValue.includes(newKeywords)) {
  271. // formState.keywordValue.push(newKeywords)
  272. // }
  273. }
  274. const handleRemoveKeyword = (keywordName, index) => {
  275. console.log('删除的东西 01 ', ' keywordName ',keywordName,' index ',index)
  276. console.log('删除的东西 02 ', ' formState.keyword ',formState.keyword)
  277. console.log(keywordName, index,myHot.value)
  278. // // 1. 从显示列表中删除
  279. // formState.keywordValue = formState.keywordValue.filter((name) => name !== keywordName)
  280. // // console.log('看看点击取消了什么',' formState.keywordValue ',formState.keywordValue)
  281. // // formState.keyword
  282. // // 2. 更新checkbox的绑定值
  283. // formState.keyword = HotKeywordsOptions.value
  284. // .filter((option) => formState.keywordValue.includes(option.label))
  285. // .map((item) => item.value)
  286. // // formState.keyword = formState.keyword.filter((item, i) => i !== index)
  287. // // console.log('看看点123123',' formState.keyword ',formState.keyword,' index ',index)
  288. let myId = myHot.value[keywordName]
  289. // console.log('换算出来',formState.keyword,index)
  290. // for (let i = formState.keyword.length-1; i > 0 ; i--) {
  291. // // console.log('看看',formState.keyword[i] , i , index)
  292. // console.log('要删除第几个' ,i, index , formState.keyword[i])
  293. // if( i == index){
  294. //
  295. // // formState.keyword.splice(i,1)
  296. // }
  297. // }
  298. // console.log('换算出来 结果',formState.keyword)
  299. // formState.keyword.filter((item, i) => item != keywordName)
  300. // formState.keyword = [{'专业' : 1}]
  301. // formState.keyword.filter((item, i) => item != index)
  302. // formState.keyword.filter((option) => formState.keywordValue.includes(option.value))
  303. // .map((item) => item.label)
  304. // console.log('换算出来 剩下',formState.keyword)
  305. // console.log('还有吗',formState.keywordValue)
  306. }
  307. const getHotKeywords = () => {
  308. myHot.value = {}
  309. resourceAuditApi
  310. .HotKeywords()
  311. .then((res) => {
  312. console.log(res.data, '获取热门关键词')
  313. HotKeywordsOptions.value = res.data.map((it) => {
  314. myHot.value[it.wordName] = it.id
  315. return {
  316. value: it.id,
  317. label: it.wordName
  318. }
  319. })
  320. })
  321. .catch((err) => {
  322. console.log(err)
  323. })
  324. }
  325. //资源类型下拉查询
  326. const getResourceTypeTree = () => {
  327. resourceAuditApi
  328. .resourceTypeTree()
  329. .then((res) => {
  330. console.log(res.data, '资源类型下拉')
  331. resourceTypeOptions.value = res.data
  332. })
  333. .catch((err) => {
  334. console.log(err)
  335. })
  336. }
  337. const handleChangeKeyword = (checkedValues) => {
  338. formState.keyword = checkedValues
  339. console.log('点击checkbox',checkedValues )
  340. formState.keywordValue = HotKeywordsOptions.value
  341. .filter((option) => checkedValues.includes(option.value))
  342. .map((item) => item.label)
  343. console.log('点击checkbox 123 ',formState.keywordValue )
  344. }
  345. const setPublicStatus = (status) => {
  346. formState.authType = status
  347. if (status === '1') {
  348. userReleaseVisible.value = true
  349. }
  350. }
  351. //院系组织查询
  352. const getOrgTreeSelector = () => {
  353. resourceAuditApi
  354. .orgTreeSelector()
  355. .then((res) => {
  356. console.log(res.data, '获取组织树选择器')
  357. collegeMajorOptions.value = res.data
  358. })
  359. .catch((err) => {
  360. console.log(err)
  361. })
  362. }
  363. //院系组织查询
  364. const changeCollegeMajor = (value, selectedOptions) => {
  365. console.log('Selected:', value, selectedOptions)
  366. if (!value) {
  367. majorIdName.value = ''
  368. return false
  369. }
  370. majorIdName.value = selectedOptions.map((it) => it.name).join('/')
  371. formState.collegeId = value[0] || null
  372. formState.collegeTwoId = value[1] || null
  373. formState.collegeThreeId = value[2] || null
  374. if (selectedOptions.length) {
  375. // 获取选中的最后一级
  376. const lastSelected = selectedOptions[selectedOptions.length - 1]
  377. // formState.selectedCollegeMajor = {
  378. // id: lastSelected.id,
  379. // name: lastSelected.name,
  380. // fullPath: selectedOptions.map((opt) => opt.name).join(' / ')
  381. // }
  382. console.log(lastSelected, '最后一级id')
  383. getCollegeMajor(lastSelected.id)
  384. }
  385. }
  386. const changeCollegeResource = (value, selectedOptions) => {
  387. console.log('Selected:', value, selectedOptions)
  388. if (!value) {
  389. resourceName.value = ''
  390. return false
  391. }
  392. resourceName.value = selectedOptions.map((it) => it.name).join('/')
  393. formState.resourceType = value[0] || undefined
  394. formState.resourceTwoType = value[1] || undefined
  395. formState.resourceThreeType = value[2] || undefined
  396. }
  397. const getCollegeMajor = (id) => {
  398. resourceAuditApi
  399. .zyselect({ collegeId: id })
  400. .then((res) => {
  401. console.log(res.data, '专业下拉数据')
  402. majorOptions.value = res.data
  403. })
  404. .catch((err) => {
  405. console.log(err)
  406. })
  407. }
  408. const confirmUser = (userIds) => {
  409. console.log(userIds, '用户id')
  410. userReleaseVisible.value = false
  411. formState.userRelateIds = userIds.join(',')
  412. }
  413. // 确认上传
  414. const handleUploadOk = async () => {
  415. try {
  416. await formRef.value.validate()
  417. // console.log('formState.userfileIds是:提交了', formState.userfileIds)
  418. // if (!formState.userfileIds) {
  419. // Modal.error({ content: '请先上传文件!!' })
  420. // return
  421. // }
  422. if (upLoadBreakPointRef.value.getUploadFileList().length == 0) {
  423. Modal.error({ content: '请先上传文件!!' })
  424. return
  425. }
  426. const formData = {
  427. // userfileIds: formState.userfileIds,
  428. resourceType: formState.resourceType,
  429. resourceTwoType: formState.resourceTwoType,
  430. resourceThreeType: formState.resourceThreeType,
  431. collegeId: formState.collegeId,
  432. collegeTwoId: formState.collegeTwoId,
  433. collegeThreeId: formState.collegeThreeId,
  434. keywordValue: formState.keywordValue.join(','),
  435. keyword: formState.keyword.join(','),
  436. resourceDesc: formState.resourceDesc,
  437. isHot: formState.isHot,
  438. isRecommend: formState.isRecommend,
  439. coverImage: formState.coverImage,
  440. publicStatus: formState.publicStatus,
  441. authType: formState.authType,
  442. userRelateIds: formState.authType == 1 ? formState.userRelateIds : null,
  443. uploadFileList : upLoadBreakPointRef.value.getUploadFileList()
  444. }
  445. console.log('上传数据',formData )
  446. myMiniyunStore.addFileForms(formData)
  447. // resourceAuditApi
  448. // .add(formData)
  449. // .then((res) => {
  450. // emit('getList')
  451. // Modal.success({ content: '资源上传成功' })
  452. // })
  453. // .catch((err) => {
  454. // Modal.success({ content: '资源上传失败' })
  455. // console.log(err)
  456. // })
  457. } catch (error) {
  458. console.error('错误信息',error)
  459. if (error.errorFields) {
  460. // 表单验证错误
  461. Modal.error({ content: '请检查表单填写是否正确' })
  462. } else {
  463. // API错误
  464. Modal.error({ content: '资源上传失败' })
  465. console.error(error)
  466. }
  467. }
  468. }
  469. // 获取资源详情
  470. const getDetail = () => {
  471. resourceAuditApi.detail({ id: props.resourcesId }).then((res) => {
  472. console.log(res.data, '资源详情')
  473. formState.userfileIds = res.data.fileId
  474. formState.userRelateIds = res.data.userRelateIdList?.join(',')
  475. userRelateIdss.value = res.data.userRelateIdList
  476. formState.resourceType = res.data.resourceType
  477. formState.resourceTwoType = res.data.resourceTwoType
  478. formState.resourceThreeType = res.data.resourceThreeType
  479. formState.collegeId = res.data.collegeId
  480. formState.coverImage = res.data.coverImage
  481. coverImagePath.value = res.data.coverImagePath
  482. formState.collegeTwoId = res.data.collegeTwoId
  483. formState.collegeThreeId = res.data.collegeThreeId
  484. majorIdName.value = res.data.collegeAllId?.split(',')
  485. resourceName.value = res.data.resourceALLTypeName?.split(',')
  486. getCollegeMajor(majorIdName.value[majorIdName.value.length - 1])
  487. formState.resourceDesc = res.data.resourceDesc
  488. // formState.majorId = res.data.majorId
  489. formState.keywordValue = res.data.keywordValue?.split(',')
  490. formState.keyword = res.data.keyword.split(',').filter(Boolean).map(Number)
  491. formState.isRecommend = Number(res.data.isRecommend) || 0
  492. formState.isHot = Number(res.data.isHot) || 0
  493. formState.authType = res.data.authType
  494. })
  495. }
  496. // 获取历史添加表单
  497. const getformState = () => {
  498. resourceAuditApi.recentlyRecord().then((res) => {
  499. console.log(res.data, '历史表单数据')
  500. formState.resourceType = res.data.resourceType
  501. formState.userRelateIds = res.data.userRelateIdList?.join(',')
  502. userRelateIdss.value = res.data.userRelateIdList
  503. formState.resourceTwoType = res.data.resourceTwoType
  504. formState.resourceThreeType = res.data.resourceThreeType
  505. formState.collegeId = res.data.collegeId
  506. formState.collegeTwoId = res.data.collegeTwoId
  507. formState.collegeThreeId = res.data.collegeThreeId
  508. majorIdName.value = res.data.collegeAllId?.split(',')
  509. resourceName.value = res.data.resourceAllType?.split(',')
  510. getCollegeMajor(majorIdName.value[majorIdName.value.length - 1])
  511. formState.resourceDesc = res.data.resourceDesc
  512. // formState.majorId = res.data.majorId
  513. formState.keywordValue = res.data.keywordValue?.split(',')
  514. formState.keyword = res.data.keyword?.split(',').filter(Boolean).map(Number)
  515. })
  516. }
  517. // 上传前的钩子函数
  518. const beforeUpload = (file) => {
  519. const isLt2G = file.size / 1024 / 1024 / 1024 < 2
  520. if (!isLt2G) {
  521. Modal.error({ content: '文件大小不能超过 2GB!' })
  522. }
  523. return isLt2G
  524. }
  525. // 移除文件
  526. const handleRemove = (file) => {
  527. const index = fileList.value.indexOf(file)
  528. const newFileList = fileList.value.slice()
  529. newFileList.splice(index, 1)
  530. fileList.value = newFileList
  531. // 如果移除的是当前封面文件,则清空coverImageId
  532. if (formState.userfileIds === file.id) {
  533. formState.userfileIds = null
  534. }
  535. }
  536. // 文件状态改变时的处理函数
  537. const handleChange = ({ file, fileList: newFileList }) => {
  538. if (newFileList.length > 1) {
  539. fileList.value = [newFileList[0]] // 只保留最新上传的文件
  540. Modal.error({ content: '只能上传一个文件!' })
  541. return
  542. }
  543. if (file.response?.code == 200) {
  544. // 上传成功,获取文件ID
  545. const fileId = file.response?.data || file.id
  546. console.log('上传成功,获取文件ID', fileId)
  547. if (fileId) {
  548. formState.userfileIds = fileId
  549. }
  550. }
  551. fileList.value = newFileList
  552. if (file.status === 'uploading') {
  553. file.percent = Math.floor(file.percent)
  554. }
  555. if (file.response?.code == 200) {
  556. file.percent = 100
  557. Modal.success({ content: '文件上传成功' })
  558. } else if (file.response?.code == 500) {
  559. Modal.error({ content: '文件上传失败' })
  560. file.percent = 0
  561. }
  562. }
  563. onMounted(() => {
  564. // getOrgTreeSelector()
  565. // getHotKeywords()
  566. // getResourceTypeTree()
  567. // if (props.isState == 1) {
  568. // getDetail()
  569. // } else {
  570. // getformState()
  571. // }
  572. })
  573. defineExpose({
  574. open
  575. })
  576. </script>
  577. <style scoped>
  578. .upload-area {
  579. border: 2px dashed #3ca9f5;
  580. padding: 40px;
  581. text-align: center;
  582. }
  583. .upload-area p {
  584. margin: 10px 0;
  585. }
  586. .file-item {
  587. display: flex;
  588. align-items: center;
  589. margin: 10px 0;
  590. }
  591. .file-item .ant-progress {
  592. flex: 1;
  593. margin: 0 10px;
  594. }
  595. /* 新增表单样式 */
  596. .ant-form-item {
  597. margin-bottom: 16px;
  598. }
  599. .public-status-buttons {
  600. display: flex;
  601. }
  602. .status-button {
  603. padding: 5px 10px;
  604. /* margin-right: 10px; */
  605. border: 1px solid #ccc;
  606. /* border-radius: 3px; */
  607. cursor: pointer;
  608. background-color: #fff;
  609. }
  610. .status-button.active {
  611. background-color: #40a9ff;
  612. color: #fff;
  613. border-color: #40a9ff;
  614. }
  615. .upload-area {
  616. border: 2px dashed #3ca9f5;
  617. padding: 40px;
  618. text-align: center;
  619. transition: border-color 0.3s; /* 平滑过渡效果 */
  620. }
  621. .upload-area.drag-over {
  622. border-color: #1890ff;
  623. background-color: rgba(24, 144, 255, 0.05);
  624. }
  625. </style>