index.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <template>
  2. <div class="tenant" :loading="loading">
  3. <div
  4. style="padding: 20px 20px 0 20px; background: #fff; margin-bottom: 80px"
  5. >
  6. <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="byform">
  7. <template #companyCover>
  8. <el-row style="width: 100%">
  9. <el-col :span="6">
  10. <el-form-item prop="companyCover">
  11. <el-upload
  12. class="avatar-uploader"
  13. action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
  14. :data="uploadDataOne"
  15. :show-file-list="false"
  16. accept=".gif, .jpeg, .jpg, .png"
  17. :on-success="companyCoverListSuccess"
  18. :before-upload="uploadFileOne">
  19. <el-image
  20. v-if="formData.data.companyCoverList && formData.data.companyCoverList.length > 0"
  21. :src="formData.data.companyCoverList[0].fileUrl"
  22. fit="scale-down"
  23. class="avatar" />
  24. <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
  25. </el-upload>
  26. <el-button
  27. class="delete-btn"
  28. type="danger"
  29. v-if="formData.data.companyCoverList && formData.data.companyCoverList.length > 0"
  30. @click="formData.data.companyCoverList = []">
  31. 删除
  32. </el-button>
  33. </el-form-item>
  34. </el-col>
  35. </el-row>
  36. </template>
  37. <template #gzhQrCode>
  38. <el-row style="width: 100%">
  39. <el-col :span="6">
  40. <el-form-item prop="gzhQrCode">
  41. <el-upload
  42. class="avatar-uploader"
  43. action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
  44. :data="uploadDataTwo"
  45. :show-file-list="false"
  46. accept=".gif, .jpeg, .jpg, .png"
  47. :on-success="gzhQrCodeListSuccess"
  48. :before-upload="uploadFileTwo">
  49. <el-image
  50. v-if="formData.data.gzhQrCodeList && formData.data.gzhQrCodeList.length > 0"
  51. :src="formData.data.gzhQrCodeList[0].fileUrl"
  52. fit="scale-down"
  53. class="avatar" />
  54. <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
  55. </el-upload>
  56. <el-button
  57. class="delete-btn"
  58. type="danger"
  59. v-if="formData.data.gzhQrCodeList && formData.data.gzhQrCodeList.length > 0"
  60. @click="formData.data.gzhQrCodeList = []">
  61. 删除
  62. </el-button>
  63. </el-form-item>
  64. </el-col>
  65. </el-row>
  66. </template>
  67. <template #companyProfile>
  68. <div style="width: 100%" v-if="!loading">
  69. <TinymceEditor
  70. :value="formData.data.companyProfile"
  71. @updateValue="updateHandover"
  72. ref="contentEditor"
  73. />
  74. </div>
  75. </template>
  76. </byForm>
  77. </div>
  78. <div style="width: 100%;padding: 0 58px 0px 0px; position: fixed;bottom: 0 ;">
  79. <div style="width: 100%;padding: 20px 20px 20px 20px;background: #fff;">
  80. <div style="text-align: center">
  81. <el-button type="primary" v-no-double-click="submitForm" size="large" :loading="submitLoading">确 定</el-button>
  82. </div>
  83. </div>
  84. </div>
  85. </div>
  86. </template>
  87. <script setup>
  88. import byForm from "@/components/byForm/index";
  89. import {computed, reactive, ref} from "vue";
  90. const { proxy } = getCurrentInstance();
  91. import Editor from "@/components/Editor/index.vue";
  92. import TinymceEditor from "@/components/Editor/TinymceEditor.vue";
  93. import {
  94. addAboutUsBaseInfo,
  95. editAboutUsBaseInfo,
  96. getAboutUsBaseInfo,
  97. getFileList, getFileStr,
  98. } from "@/api/XMHJC/aboutUs";
  99. import {ElMessage} from "element-plus";
  100. import {isNullOrUndefined} from "@tinymce/tinymce-vue/lib/es2015/main/ts/Utils";
  101. import {updateUserPwd} from "@/api/system/user";
  102. const loading = ref(false);
  103. const submitLoading = ref(false);
  104. let rules = ref({
  105. mobileOne: [{ required: true, message: "请输入联系方式", trigger: "blur" }],
  106. mobileTwo: [{ required: true, message: "请输入联系方式", trigger: "blur" }],
  107. address: [{ required: true, message: "请输入地址", trigger: "blur" }],
  108. email: [{ required: true, message: "请输入电子邮件", trigger: "blur" }],
  109. filingNumber: [{ required: true, message: "请输入备案号", trigger: "blur" }],
  110. });
  111. let formData = reactive({
  112. data: {
  113. companyCoverList: [],
  114. gzhQrCodeList: [],
  115. companyProfile:''
  116. },
  117. });
  118. const formOption = reactive({
  119. inline: true,
  120. labelWidth: 100,
  121. itemWidth: 100,
  122. rules: [],
  123. });
  124. const formConfig = computed(() => {
  125. return [
  126. {
  127. type: "input",
  128. prop: "mobileOne",
  129. label: "联系方式1",
  130. required: true,
  131. },
  132. {
  133. type: "input",
  134. prop: "mobileTwo",
  135. label: "联系方式2",
  136. required: true,
  137. },
  138. {
  139. type: "input",
  140. prop: "address",
  141. label: "公司地址",
  142. required: true,
  143. },
  144. {
  145. type: "input",
  146. prop: "email",
  147. label: "电子邮件",
  148. required: true,
  149. },
  150. {
  151. type: "input",
  152. prop: "filingNumber",
  153. label: "备案号",
  154. required: true,
  155. },
  156. {
  157. type: "slot",
  158. slotName: "companyCover",
  159. prop: "companyCover",
  160. label: "公司简介图片",
  161. },
  162. {
  163. type: "slot",
  164. slotName: "gzhQrCode",
  165. prop: "gzhQrCode",
  166. label: "公众号二维码",
  167. },
  168. {
  169. type: "slot",
  170. slotName: "companyProfile",
  171. prop: "companyProfile",
  172. label: "公司简介",
  173. },
  174. ];
  175. });
  176. const uploadDataOne = ref({});
  177. const uploadFileOne = async (file) => {
  178. const res = await getFileStr( { fileName: file.name });
  179. uploadDataOne.value = res.data.uploadBody;
  180. file.id = res.data.id;
  181. file.fileName = res.data.fileName;
  182. file.fileUrl = res.data.fileUrl;
  183. return true;
  184. };
  185. const uploadDataTwo = ref({});
  186. const uploadFileTwo = async (file) => {
  187. const res = await getFileStr( { fileName: file.name });
  188. uploadDataTwo.value = res.uploadBody;
  189. file.id = res.data.id;
  190. file.fileName = res.data.fileName;
  191. file.fileUrl = res.data.fileUrl;
  192. return true;
  193. };
  194. const companyCoverListSuccess = (response, uploadFile) => {
  195. formData.data.companyCoverList = [
  196. {
  197. id: uploadFile.raw.id,
  198. fileName: uploadFile.raw.fileName,
  199. fileUrl: uploadFile.raw.fileUrl,
  200. },
  201. ];
  202. };
  203. const gzhQrCodeListSuccess = (response, uploadFile) => {
  204. formData.data.gzhQrCodeList = [
  205. {
  206. id: uploadFile.raw.id,
  207. fileName: uploadFile.raw.fileName,
  208. fileUrl: uploadFile.raw.fileUrl,
  209. },
  210. ];
  211. };
  212. const updateHandover = (val) => {
  213. formData.data.companyProfile = val;
  214. };
  215. const getInfo = async () => {
  216. loading.value = true;
  217. const response = await getAboutUsBaseInfo({})
  218. formData.data = response.data;
  219. const resFile = await getFileList({businessIdList: [response.data.id], fileType: 1})
  220. formData.data.companyCoverList = resFile.data[response.data.id];
  221. const resFile1 = await getFileList({businessIdList: [response.data.id], fileType: 2})
  222. formData.data.gzhQrCodeList = resFile1.data[response.data.id];
  223. loading.value = false;
  224. }
  225. const submitForm = () => {
  226. if (!formData.data.companyCoverList) {
  227. ElMessage({message: "请上传公司简介图片",type: "error",});
  228. return
  229. }
  230. if (!formData.data.gzhQrCodeList) {
  231. ElMessage({message: "请上传公众号图片",type: "error",});
  232. return
  233. }
  234. if (!formData.data.companyProfile) {
  235. ElMessage({message: "请上传公司简介",type: "error",});
  236. return
  237. }
  238. submitLoading.value = true;
  239. if (isNullOrUndefined(formData.data.id)){
  240. addAboutUsBaseInfo(formData.data).then(response => {
  241. ElMessage({
  242. message: "编辑成功",
  243. type: "success",
  244. });
  245. submitLoading.value = false;
  246. }).catch(()=>{
  247. submitLoading.value = false;
  248. });
  249. }else {
  250. editAboutUsBaseInfo(formData.data).then(response => {
  251. ElMessage({
  252. message: "编辑成功",
  253. type: "success",
  254. });
  255. submitLoading.value = false;
  256. }).catch(()=>{
  257. submitLoading.value = false;
  258. });
  259. }
  260. };
  261. getInfo();
  262. </script>
  263. <style lang="scss" scoped>
  264. .tenant {
  265. padding: 20px;
  266. .delete-btn{
  267. margin-top: 10px;
  268. margin-left: 25px;
  269. }
  270. }
  271. .avatar-uploader .avatar {
  272. width: 110px;
  273. height: 110px;
  274. display: block;
  275. background-color: black;
  276. }
  277. .avatar-uploader .el-upload {
  278. border: 1px dashed var(--el-border-color);
  279. border-radius: 6px;
  280. cursor: pointer;
  281. position: relative;
  282. overflow: hidden;
  283. transition: var(--el-transition-duration-fast);
  284. }
  285. .avatar-uploader .el-upload:hover {
  286. border-color: var(--el-color-primary);
  287. }
  288. .el-icon.avatar-uploader-icon {
  289. font-size: 28px;
  290. color: #8c939d;
  291. width: 110px;
  292. height: 110px;
  293. text-align: center;
  294. border: 1px dashed var(--el-border-color);
  295. }
  296. .ql-editor {
  297. padding: 0px;
  298. }
  299. </style>