WorkflowDetail.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <template>
  2. <div class="workflow-detail container-height">
  3. <Breadcrumb />
  4. <div class="flex-between mt10">
  5. <div class="flex_1 mr20">
  6. <div class="padding16 bg_color_fff border_radius_16">
  7. <div class="bold font_size30">{{ruleForm.workflowTitle || ''}}</div>
  8. <div class="gap20 mt10">
  9. <div class="gap5">
  10. <img :src="yuangong" alt="员工" style="width: 16px; height: 16px;">
  11. <span class="font_size14">{{ruleForm.nickName || ''}}</span>
  12. </div>
  13. <div class="gap5">
  14. <img :src="riliIcon" alt="员工" style="width: 16px; height: 16px;">
  15. <span class="font_size14">{{ruleForm.createTime || ''}}</span>
  16. </div>
  17. <div class="gap5">
  18. <img :src="shiyongIcon" alt="员工" style="width: 16px; height: 16px;">
  19. <span class="font_size14">{{ruleForm.downCount ?? ''}} {{t('common.use')}}</span>
  20. </div>
  21. <div class="gap5">
  22. <img :src="yunIcon" alt="员工" style="width: 16px; height: 16px;">
  23. <span class="font_size14">{{ruleForm.categoryName1 || ''}}</span>
  24. </div>
  25. <div class="gap5">
  26. <img :src="biaoqianIcon" alt="员工" style="width: 16px; height: 16px;">
  27. <span class="font_size14">{{ruleForm.categoryName2 || ''}}-{{ruleForm.categoryName3 || ''}}</span>
  28. </div>
  29. </div>
  30. <div class="font_size16 gray mt10">{{ruleForm.description || ''}}</div>
  31. </div>
  32. <!-- 工作流预览 -->
  33. <div class="padding16 bg_color_fff border_radius_10 mt10">
  34. <div class="gap10">
  35. <div class="line_vertical"></div>
  36. <div class="font_size20 bold">{{$t('common.workflowPreview')}}</div>
  37. </div>
  38. <div class="mt20">
  39. <img :src="item || ''" alt="" v-for="(item, index) in previewImage" :key="index"
  40. style="width: 100%; height: auto;" />
  41. </div>
  42. </div>
  43. <!-- 工作流预览 -->
  44. <div class="padding16 bg_color_fff border_radius_10 mt10">
  45. <div class="gap10">
  46. <div class="line_vertical"></div>
  47. <div class="font_size20 bold">{{$t('common.Detail')}}</div>
  48. </div>
  49. <BlockNoteEditor v-model="editorContent" :editable="false" class="mt20"/>
  50. </div>
  51. </div>
  52. <!-- 详情右侧 -->
  53. <div class="detail_right">
  54. <div class="detail_right_content detail_right">
  55. <div class="padding16 bg_color_fff border_radius_16 box_shadow_card">
  56. <div class="flex-center-between">
  57. <div class="flex-column">
  58. <div class="font_size16">{{$t('common.currentPrice')}}</div>
  59. <div class="color_price">
  60. <span class="font_size32">{{ruleForm.workflowPrice || 0}}</span>
  61. <span>{{$t('common.baomibi')}}</span>
  62. </div>
  63. </div>
  64. <el-button type="success" plain size="mini" v-if="ruleForm.workflowPrice === 0">{{$t('common.free')}}</el-button>
  65. </div>
  66. <div class="mt20">
  67. <el-button type="primary" class="font_size16 gradient" size="large" style="width: 100%;height: 50px;" @click="startUsing()">
  68. <img :src="useNowIcon" alt="员工" style="width: 30px; height: 30px;">
  69. <span class="font_size18"> {{$t('common.startUsing')}}</span>
  70. </el-button>
  71. </div>
  72. <div class="mt20">
  73. <el-tag type="primary" size="large" style="width: 100%;height: auto;" class="cursor-pointer" @click="downloadWorkflow()">
  74. <div class="gap10" style="padding:8px 0;">
  75. <img :src="downIcon" alt="员工" style="width: 30px; height: 30px;">
  76. <span class="font_size18"> {{$t('common.downloadWorkflow')}}</span>
  77. </div>
  78. </el-tag>
  79. </div>
  80. </div>
  81. <!-- 工作流作者 -->
  82. <div class="padding16 bg_color_fff border_radius_16 box_shadow_card mt20">
  83. <div class="flex-center-between">
  84. <div class="flex-center-between flex_1">
  85. <el-avatar :size="50" :src=" ruleForm.userAvatar || appStore.avatarDefault"/>
  86. <div class="ml10 flex_1">
  87. <div class="font_size18 bold">{{ruleForm.nickName || ''}}</div>
  88. <div class="gap5 mt5">
  89. <el-tag type="primary" v-for="item in skillTags" :key="item" >{{item}}</el-tag>
  90. </div>
  91. </div>
  92. </div>
  93. <div>
  94. <!-- <div class="weiguanzhu cursor-pointer gap5" v-if="true">
  95. <img :src="weiguanzhuIcon" alt="" style="width: 16px; height: 16px;">
  96. <span class="font_size14">关注</span>
  97. </div>
  98. <div class="yiguanzhu cursor-pointer gap5 contactInfo_bg" v-else>
  99. <img :src="yiguanzhuIcon" alt="" style="width: 16px; height: 16px;">
  100. <span class="font_size14">已关注</span>
  101. </div> -->
  102. </div>
  103. </div>
  104. </div>
  105. <!-- <div class="padding16 bg_color_fff border_radius_16 box_shadow_card mt20">
  106. <div class="gap10">
  107. <div class="line_vertical"></div>
  108. <div class="font_size20 bold">文件信息</div>
  109. </div>
  110. <div class="contactInfo_bg border_radius_8 padding8 mt10 flex-center-between">
  111. <div class="gap5">
  112. <img :src="geshiIcon" alt="" style="width: 17.5px; height: 17.5px;">
  113. <span class="font_size16">格式</span>
  114. </div>
  115. <span class="font_size16 bold">.josn</span>
  116. </div>
  117. <div class="contactInfo_bg border_radius_8 padding8 mt10 flex-center-between">
  118. <div class="gap5">
  119. <img :src="neicunIcon" alt="" style="width: 17.5px; height: 17.5px;">
  120. <span class="font_size16">大小</span>
  121. </div>
  122. <span class="font_size16 bold">24kb</span>
  123. </div>
  124. <div class="contactInfo_bg border_radius_8 padding8 mt10 flex-center-between">
  125. <div class="gap5">
  126. <img :src="banbenIcon" alt="" style="width: 17.5px; height: 17.5px;">
  127. <span class="font_size16">版本</span>
  128. </div>
  129. <span class="font_size16 bold">v1.0.2</span>
  130. </div>
  131. </div> -->
  132. </div>
  133. </div>
  134. </div>
  135. </div>
  136. </template>
  137. <script setup>
  138. import yuangong from '@/assets/imgs/yuangong.png'
  139. import riliIcon from '@/assets/imgs/rili.png'
  140. import shiyongIcon from '@/assets/imgs/shiyong.png'
  141. import yunIcon from '@/assets/imgs/yun.png'
  142. import biaoqianIcon from '@/assets/imgs/biaoqian.png'
  143. import useNowIcon from '@/assets/imgs/useNow.png'
  144. import downIcon from '@/assets/imgs/down.png'
  145. import weiguanzhuIcon from '@/assets/imgs/weiguanzhu.png'
  146. import yiguanzhuIcon from '@/assets/imgs/yiguanzhu.png'
  147. import geshiIcon from '@/assets/imgs/geshi.png'
  148. import neicunIcon from '@/assets/imgs/neicun.png'
  149. import banbenIcon from '@/assets/imgs/banben.png'
  150. import { downloadFile, confirmBuy, openNewTab } from '@/utils/util'
  151. import { getPublishDetail } from '@/api/publish.js'
  152. import { purchase } from '@/api/common.js'
  153. import BlockNoteEditor from '@/components/BlockNoteEditor.vue';
  154. import { useI18n } from 'vue-i18n'
  155. const { t } = useI18n()
  156. import { useRouter, useRoute } from 'vue-router'
  157. const router = useRouter()
  158. const route = useRoute()
  159. import { useAppStore } from '@/pinia/appStore'
  160. const appStore = useAppStore()
  161. import { ref, onMounted, nextTick, computed } from 'vue'
  162. //获取参数
  163. const query = route.query
  164. const publishId = ref(query.publishId || '');
  165. // 详情内容
  166. const editorContent = ref(null);
  167. const previewImage = ref([]);
  168. // 表单数据
  169. const ruleForm = ref({
  170. workflowTitle: '',
  171. categoryId1: '',
  172. categoryId2: '',
  173. categoryId3: '',
  174. workflowFile: '',
  175. workflowPrice: '',
  176. description: '',
  177. previewImage: '',
  178. coverImage: '',
  179. workflowContent: '',
  180. skillTags:''
  181. });
  182. //计算属性skillTags
  183. const skillTags = computed(() => {
  184. if(ruleForm.value.skillTags){
  185. return ruleForm.value.skillTags.split(',');
  186. }
  187. return [];
  188. });
  189. onMounted(() => {
  190. getPublishDetail({id:publishId.value}).then(res => {
  191. ruleForm.value = res.data || {};
  192. nextTick(() => {
  193. if(ruleForm.value.previewImage){
  194. previewImage.value = ruleForm.value.previewImage.split(',');
  195. };
  196. setTimeout(() => {
  197. if(ruleForm.value.workflowContent){
  198. editorContent.value = JSON.parse(ruleForm.value.workflowContent);
  199. }
  200. }, 500);
  201. });
  202. })
  203. });
  204. // 下载工作流
  205. const downloadWorkflow = () => {
  206. //如果是本人发布的,是有下载地址的,直接下载
  207. if(ruleForm.value.workflowFile){
  208. downloadFile({url:ruleForm.value.workflowFile,t});
  209. return;
  210. }
  211. //如果不是本人发布的,需要购买
  212. purchase({
  213. buyType: 1,
  214. publishId: publishId.value,
  215. }).then(res => {
  216. if(res.code === 200){
  217. if(res.data?.buyFlag == 1){
  218. if(res.data?.workflowFile){
  219. downloadFile({url:res.data?.workflowFile,t});
  220. }
  221. }else{
  222. confirmBuy({
  223. callback:downloadWorkflow,
  224. appStore,
  225. router,
  226. price:ruleForm.value.workflowPrice,
  227. t,
  228. productId:publishId.value,
  229. orderType:'workflow_purchase',
  230. payMethod:'BMI'
  231. })
  232. }
  233. }
  234. })
  235. };
  236. // 立即使用
  237. const startUsing = () => {
  238. openNewTab(ruleForm.value.categoryUrl);
  239. };
  240. </script>
  241. <style scoped lang="scss">
  242. .workflow-detail {
  243. .weiguanzhu{
  244. padding: 8px 12px;
  245. background: #FCEBEB;
  246. border-radius: 8px 8px 8px 8px;
  247. color: #E43434 ;
  248. font-weight: bold;
  249. font-size: 14px;
  250. }
  251. .yiguanzhu{
  252. padding: 8px 12px;
  253. border-radius: 8px 8px 8px 8px;
  254. font-weight: bold;
  255. font-size: 14px;
  256. }
  257. }
  258. </style>