CompanyInfo.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <template>
  2. <div class="company-info-page">
  3. <div class="header-actions">
  4. <h2>企业基本信息管理</h2>
  5. <el-button type="primary" @click="handleSubmit" :loading="loading">保存修改</el-button>
  6. </div>
  7. <div class="form-container" v-loading="fetchLoading">
  8. <el-form :model="form" label-width="120px">
  9. <el-card class="box-card">
  10. <template #header>
  11. <div class="card-header">
  12. <span>公司简介</span>
  13. </div>
  14. </template>
  15. <el-form-item label="简介内容">
  16. <el-input
  17. v-model="form.intro_content"
  18. type="textarea"
  19. :rows="6"
  20. placeholder="请输入公司简介"
  21. />
  22. </el-form-item>
  23. <el-form-item label="简介图片">
  24. <el-upload
  25. class="avatar-uploader"
  26. :http-request="customUpload"
  27. :show-file-list="false"
  28. :on-success="handleUploadSuccess"
  29. >
  30. <img v-if="form.intro_image_url" :src="getImageUrl(form.intro_image_url)" class="avatar" />
  31. <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
  32. </el-upload>
  33. </el-form-item>
  34. </el-card>
  35. <el-card class="box-card" style="margin-top: 20px;">
  36. <template #header>
  37. <div class="card-header">
  38. <span>企业文化</span>
  39. </div>
  40. </template>
  41. <el-form-item label="企业愿景">
  42. <el-input v-model="form.vision" placeholder="例如:成为中国领先的人工智能产教融合服务商" />
  43. </el-form-item>
  44. <el-form-item label="企业使命">
  45. <el-input v-model="form.mission" placeholder="例如:赋能教育,智创未来" />
  46. </el-form-item>
  47. <el-form-item label="核心价值观">
  48. <el-input v-model="form.values" placeholder="例如:客户第一,创新驱动,诚信正直,合作共赢" />
  49. </el-form-item>
  50. </el-card>
  51. <el-card class="box-card" style="margin-top: 20px;">
  52. <template #header>
  53. <div class="card-header">
  54. <span>联系方式</span>
  55. </div>
  56. </template>
  57. <el-form-item label="联系电话">
  58. <el-input v-model="form.phone" placeholder="例如:123-456-7890" />
  59. </el-form-item>
  60. <el-form-item label="联系邮箱">
  61. <el-input v-model="form.email" placeholder="例如:contact@example.com" />
  62. </el-form-item>
  63. <el-form-item label="公众号二维码">
  64. <el-upload
  65. class="avatar-uploader"
  66. :http-request="customUploadQR"
  67. :show-file-list="false"
  68. :on-success="handleUploadSuccessQR"
  69. >
  70. <img v-if="form.qrcode_url" :src="getImageUrl(form.qrcode_url)" class="avatar" />
  71. <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
  72. </el-upload>
  73. </el-form-item>
  74. </el-card>
  75. </el-form>
  76. </div>
  77. </div>
  78. </template>
  79. <script setup>
  80. import { ref, onMounted } from 'vue'
  81. import api from '../api'
  82. import { ElMessage } from 'element-plus'
  83. const fetchLoading = ref(false)
  84. const loading = ref(false)
  85. const form = ref({
  86. id: null,
  87. intro_content: '',
  88. intro_image_url: '',
  89. vision: '',
  90. mission: '',
  91. values: '',
  92. phone: '',
  93. email: '',
  94. qrcode_url: ''
  95. })
  96. const getImageUrl = (url) => {
  97. if (!url) return ''
  98. if (url.startsWith('http')) return url
  99. return `${import.meta.env.VITE_IMG_BASE_URL}${url}`
  100. }
  101. const customUpload = async (options) => {
  102. const { file, onSuccess, onError } = options
  103. const formData = new FormData()
  104. formData.append('file', file)
  105. try {
  106. const res = await api.post('/upload', formData, {
  107. headers: {
  108. 'Content-Type': 'multipart/form-data'
  109. }
  110. })
  111. onSuccess(res.data)
  112. } catch (error) {
  113. onError(error)
  114. ElMessage.error('上传失败')
  115. }
  116. }
  117. const handleUploadSuccess = (response) => {
  118. form.value.intro_image_url = response.url
  119. }
  120. const customUploadQR = async (options) => {
  121. const { file, onSuccess, onError } = options
  122. const formData = new FormData()
  123. formData.append('file', file)
  124. try {
  125. const res = await api.post('/upload', formData, {
  126. headers: {
  127. 'Content-Type': 'multipart/form-data'
  128. }
  129. })
  130. onSuccess(res.data)
  131. } catch (error) {
  132. onError(error)
  133. ElMessage.error('上传失败')
  134. }
  135. }
  136. const handleUploadSuccessQR = (response) => {
  137. form.value.qrcode_url = response.url
  138. }
  139. const fetchData = async () => {
  140. fetchLoading.value = true
  141. try {
  142. const res = await api.get('/company-info')
  143. if (res.data && res.data.id) {
  144. form.value = res.data
  145. } else {
  146. // Initialize with default values if empty
  147. form.value = {
  148. id: null,
  149. intro_content: '四川网讯创智科技有限公司(以下简称“网讯创智”)是一家专注于人工智能领域的产教融合服务商。公司致力于将产业前沿技术转化为教育资源,通过“产、学、研、用”一体化模式,为高校提供专业建设、人才培养、实验室建设等全方位解决方案。\n\n网讯创智依托百度、阿里、华为等头部企业的技术生态,构建了基于 MaaS(Model as a Service)架构的高校训战一体化综合实践平台,助力高校培养具备创新思维与实战能力的人工智能复合型人才。',
  150. intro_image_url: '',
  151. vision: '成为中国领先的人工智能产教融合服务商',
  152. mission: '赋能教育,智创未来',
  153. values: '客户第一,创新驱动,诚信正直,合作共赢',
  154. phone: '123-456-7890',
  155. email: 'contact@example.com',
  156. qrcode_url: 'https://api.qrserver.com/v1/create-qr-code/?size=100x100&data=网讯创智'
  157. }
  158. }
  159. } catch (error) {
  160. ElMessage.error('获取数据失败')
  161. } finally {
  162. fetchLoading.value = false
  163. }
  164. }
  165. const handleSubmit = async () => {
  166. loading.value = true
  167. try {
  168. await api.post('/company-info', form.value)
  169. ElMessage.success('保存成功')
  170. fetchData()
  171. } catch (error) {
  172. ElMessage.error('保存失败')
  173. } finally {
  174. loading.value = false
  175. }
  176. }
  177. onMounted(fetchData)
  178. </script>
  179. <style scoped>
  180. .header-actions {
  181. display: flex;
  182. justify-content: space-between;
  183. align-items: center;
  184. margin-bottom: 20px;
  185. }
  186. .box-card {
  187. width: 100%;
  188. }
  189. .avatar-uploader .el-upload {
  190. border: 1px dashed #d9d9d9;
  191. border-radius: 6px;
  192. cursor: pointer;
  193. position: relative;
  194. overflow: hidden;
  195. }
  196. .avatar-uploader .el-upload:hover {
  197. border-color: #409eff;
  198. }
  199. .avatar-uploader-icon {
  200. font-size: 28px;
  201. color: #8c939d;
  202. width: 300px;
  203. height: 200px;
  204. text-align: center;
  205. line-height: 200px;
  206. }
  207. .avatar {
  208. width: 300px;
  209. height: 200px;
  210. display: block;
  211. object-fit: cover;
  212. }
  213. </style>