Procházet zdrojové kódy

```
feat(i18n): 添加国际化支持并完善消息提示

- 在App.vue中引入useI18n并替换硬编码的消息提示为国际化文本
- 更新登录登出相关的消息提示使用国际化配置
- 添加验证码发送、登录成功等国际化词条到en.js和zh-CN.js
- 修正学习系统路由标题翻译

fix(login): 修复登录组件中的消息提示国际化问题

- 将登录对话框中的硬编码消息提示替换为国际化文本
- 统一使用ElMessage替代混用的DGTMessage
- 添加手机邮箱验证、验证码发送成功等国际化词条

feat(course): 增加课程卡片跳转功能

- 在course-card.vue中导入openNewTab工具函数
- 实现点击课程卡片时在新标签页打开分类URL的功能

refactor(home): 优化首页平台选择逻辑

- 在Home.vue中添加platformUrl响应式变量
- 传递平台URL参数到搜索页面用于后续跳转

feat(search): 增强搜索平台页面交互体验

- 在SearchPlatform.vue中实现点击平台区域跳转到对应URL
- 添加多个平台图标并根据选中平台显示对应图标
- 接收并使用平台URL参数

feat(workflow): 完善工作流发布页面布局和规则展示

- 调整WorkflowAdd.vue页面布局为左右结构
- 添加发布规则展示区域并从API获取规则内容
- 重构表单元素的排列方式

feat(detail): 增加工作流详情页使用功能

- 在WorkflowDetail.vue中添加立即使用按钮
- 实现点击按钮在新标签页打开分类URL的功能

style(order): 微调订单确认页面支付按钮样式

- 调整钱包图标尺寸从13x15px改为16x16px

feat(utils): 新增工具函数openNewTab

- 在util.js中添加openNewTab函数用于在新标签页打开URL
```

zhangningning před 4 týdny
rodič
revize
3579ad8da9

+ 3 - 1
src/App.vue

@@ -68,6 +68,8 @@ import { useAppStore } from '@/pinia/appStore'
 const langStore = useLangStore();
 const appStore = useAppStore();
 $i18n.global.locale.value = langStore.currentLang
+import { useI18n } from 'vue-i18n' 
+const { t } = useI18n() 
 // 动态更新页面标题
 langStore.updateDynamicTitle()
 
@@ -132,7 +134,7 @@ const toPersonal = () => {
 const handleLogout = () => {
   logout().then(() => {
     appStore.LOGOUT()
-    ElMessage.success('注销成功')
+    ElMessage.success(t('login.logoutSuccess'))
     router.push('/')
   })
 };

+ 9 - 9
src/components/LoginDialog.vue

@@ -366,13 +366,13 @@ const handleTabChange = () => {
 // 发送短信验证码
 const sendSmsCode = async () => {
   if (!smsForm.account) {
-    ElMessage.warning('请先输入手机号或邮箱')
+    ElMessage.warning(t('login.placeholderPhoneOrEmail'))
     return
   }
 
   // 验证手机号格式
   if (!PHONE_REGEX.test(smsForm.account) && !EMAIL_REGEX.test(smsForm.account)) {
-    ElMessage.warning('请输入正确的手机号或邮箱')
+    ElMessage.warning(t('login.placeholderPhoneOrEmailTip'))
     return
   }
 
@@ -392,7 +392,7 @@ const sendSmsCode = async () => {
   }
 
   // 模拟发送验证码
-  ElMessage.success('验证码发送成功')
+  ElMessage.success(t('login.captchaSendSuccess'))
   
   // 开始倒计时
   smsCountdown.value = 60
@@ -412,7 +412,7 @@ const sendEmailCode = () => {
   }
 
   // 模拟发送验证码
-  ElMessage.success('验证码发送成功')
+  ElMessage.success(t('login.captchaSendSuccess'))
   
   // 开始倒计时
   emailCountdown.value = 60
@@ -443,7 +443,7 @@ const handlePasswordLogin = () => {
       const res = await loginUsername(params);
       loading.value = false
       if (res.code === 200) {
-        ElMessage.success('登录成功')
+        ElMessage.success(t('login.loginSuccess'))
         // emit('login-success', { type: 'password', userInfo: passwordForm })
         dialogVisible.value = false;
         // 登录成功后,将token存储到localStorage
@@ -473,7 +473,7 @@ const handleSmsLogin = () => {
       }
       loading.value = false
       if (res.code === 200) {
-        ElMessage.success('登录成功')
+        ElMessage.success(t('login.loginSuccess'))
         // emit('login-success', { type: 'sms', userInfo: smsForm })
         dialogVisible.value = false;
         // 登录成功后,将token存储到localStorage
@@ -487,13 +487,13 @@ const handleSmsLogin = () => {
 // 发送重置密码验证码
 const sendPasswordresetCode = async () => {
   if (!resetForm.account) {
-    DGTMessage.warning('请先输入手机号或邮箱')
+    ElMessage.warning(t('login.placeholderPhoneOrEmail'))
     return
   }
 
   // 验证手机号格式
   if (!PHONE_REGEX.test(resetForm.account) && !EMAIL_REGEX.test(resetForm.account)) {
-    ElMessage.warning('请输入正确的手机号或邮箱')
+    ElMessage.warning(t('login.placeholderPhoneOrEmailTip'))
     return
   }
 
@@ -506,7 +506,7 @@ const sendPasswordresetCode = async () => {
   }
 
   // 模拟发送验证码
-  ElMessage.success('验证码发送成功')
+  ElMessage.success(t('login.captchaSendSuccess'))
   
   // 开始倒计时
   passwordresetCountdown.value = 60

+ 2 - 1
src/components/course-card.vue

@@ -71,7 +71,7 @@ import yunIcon from '@/assets/imgs/yun.png'
 import riliIcon from '@/assets/imgs/rili.png'
 import { useAppStore } from '@/pinia/appStore'
 import { inject } from 'vue'
-import { isLogin } from '@/utils/util.js'
+import { isLogin, openNewTab } from '@/utils/util.js'
 import { useI18n } from 'vue-i18n' 
 const { t } = useI18n()
 
@@ -114,6 +114,7 @@ const startUsing = () => {
   if(!isLogin({callback: openLoginDialog,t})){
     return;
   }
+  openNewTab(props.info.categoryUrl);
 };
 </script>
 

+ 4 - 1
src/locales/en.js

@@ -138,13 +138,16 @@ export default {
     placeholderPhone:"Please input phone number",
     passwordNotSame:"Passwords do not match",
     placeholderPhoneOrEmailTip:"Please input right phone or email",
+    captchaSendSuccess:"Captcha send success",
+    loginSuccess:"Login Success",
+    logoutSuccess:"Logout Success",
   },
   // 添加路由标题翻译
   route: {
     home: 'Home',
     gongzuoliu_trade_add: 'Publish Workflow Demand',
     WorkflowDetail: 'Workflow Detail',
-    learning_system: 'Learning System',
+    learning_system: 'Learning Course',
     recharge: 'Recharge ',
     mibiShop: 'MiBi Shop',
 

+ 3 - 0
src/locales/zh-CN.js

@@ -143,6 +143,9 @@ export default {
     placeholderPhone:"请输入手机号",
     passwordNotSame:"两次输入密码不一致",
     placeholderPhoneOrEmailTip:"请输入正确的(手机号或邮箱)",
+    captchaSendSuccess:"验证码发送成功",
+    loginSuccess:"登录成功",
+    logoutSuccess:"注销成功",
   },
   // 添加路由标题翻译
   route: {

+ 4 - 1
src/pages/Home.vue

@@ -24,7 +24,7 @@
       <!-- 平台标识区域 -->
       <div class="platforms">
         <div class="platform-item" v-for="item in categoryListTree" :key="item.categoryId"
-           @click="activePlatform = item.categoryName; categoryId = item.categoryId;" 
+           @click="activePlatform = item.categoryName; categoryId = item.categoryId; platformUrl = item.categoryUrl;" 
            :class="{'active': categoryId === item.categoryId}">
           <img :src="n8Icon" alt="" class="platform-icon n8n-icon bg_color_f5" v-if="item.categoryName === 'n8n'">
           <img :src="cozeIcon" alt="" class="platform-icon coze-icon bg_color_f5" v-if="item.categoryName === 'coze'">
@@ -113,6 +113,7 @@ const activePlatform = ref('');
 const categoryId = ref('');
 const list = ref([]);
 const workflowTitle = ref('');
+const platformUrl = ref('');
 
 
 // 监听图片加载完成,动态设置轮播图高度
@@ -137,6 +138,7 @@ const goSearchPlatform = () => {
       activePlatform: activePlatform.value,
       metaTitle: activePlatform.value ,
       workflowTitle: workflowTitle.value,
+      platformUrl:platformUrl.value
     }
   })
 };
@@ -159,6 +161,7 @@ const getCategoryListTreeFn = () => {
     categoryListTree.value = res.rows || [];
     activePlatform.value = categoryListTree.value[0]?.categoryName || '';
     categoryId.value = categoryListTree.value[0]?.categoryId || '';
+    platformUrl.value = categoryListTree.value[0]?.categoryUrl || '';
   })
 };
 

+ 13 - 3
src/pages/SearchPlatform.vue

@@ -21,8 +21,14 @@
             <img :src="addIcon" alt="" class="icon-add">
             {{$t('common.chuangjiangongzuoliu')}}
           </button>
-          <div class="flex-center-between border_radius_10 pad20 cursor-pointer" style="background: #EAF0FF;height: 56px;">
-            <img :src="n8Icon" alt="" style="width: 30px; height: 30px;" class="mr10">
+          <div class="flex-center-between border_radius_10 pad20 cursor-pointer" 
+          @click="openNewTab(platformUrl)"
+          style="background: #EAF0FF;height: 56px;">
+            <!-- <img :src="n8Icon" alt="" style="width: 30px; height: 30px;" class="mr10"> -->
+            <img :src="n8Icon" alt="" style="width: 30px; height: 30px;"  class="mr10" v-if="activePlatform === 'n8n'">
+            <img :src="cozeIcon" alt="" style="width: 30px; height: 30px;"  class="mr10" v-if="activePlatform === 'coze'">
+            <img :src="difyIcon" alt="" style="width: 30px; height: 30px;"  class="mr10" v-if="activePlatform === 'dify'">
+            <img :src="fastgptIcon" alt="" style="width: 30px; height: 30px;"  class="mr10" v-if="activePlatform === 'fastGpt'">
             <div class="font_size18 color_theme">{{$t('common.go')}}{{activePlatform}}</div>
             <el-icon :size="24" color="#2D71FF"><CaretRight /></el-icon>
           </div>
@@ -83,13 +89,16 @@
   import searchIcon from '@/assets/imgs/search.png'
   import addIcon from '@/assets/imgs/add.png'
   import n8Icon from '@/assets/imgs/8n8.png'
+  import cozeIcon from '@/assets/imgs/coze.png'
+  import difyIcon from '@/assets/imgs/dify.png'
+  import fastgptIcon from '@/assets/imgs/FastGPT.png'
 
   import CourseCard from '@/components/course-card.vue'
   import Pagination from '@/components/Pagination.vue'
 
   import { getCategoryListTree } from '@/api/category.js'
   import { getPublishList } from '@/api/publish.js'
-  import { isLogin,openFullScreenLoading } from '@/utils/util.js'
+  import { isLogin,openFullScreenLoading, openNewTab } from '@/utils/util.js'
   import { useI18n } from 'vue-i18n' 
   const { t } = useI18n() 
 
@@ -102,6 +111,7 @@
   const query = route.query
   const categoryId = ref(query.categoryId || '');
   const activePlatform = ref(query.activePlatform || '');
+  const platformUrl = ref(query.platformUrl || '')
   //获取当前路由路径
   // const currentPath = ref(router.currentRoute.value.path)
   const isChildRoute = computed(() => {

+ 184 - 152
src/pages/WorkflowAdd.vue

@@ -1,165 +1,186 @@
 <template>
   <div class="workflow-add container-height">
     <Breadcrumb />
-    <el-form :model="ruleForm" :rules="rules" ref="ruleFormRef" label-position="top" class="page-add">
-      <div class="padding16 bg_color_fff border_radius_10 box_shadow_card"  v-show="!isFullscreen">
-        <div class="gap10">
-          <div class="line_vertical"></div>
-          <div class="font_size20 bold"><span class="color_required font_size16">*</span>{{$t('workflowTrade.fileUpload')}}</div>
-          <div class="gray999 font_size14">{{$t('workflowTrade.supportFormat')}}:JSON、YAML、ZIP({{$t('common.maxSize')}}10MB)</div>
-        </div>
-        <div class="mt10">
-          <el-form-item label="" prop="workflowFile">
-            <!-- 上传 -->
-            <FileUploader
-              ref="fileUploader"
-              accept=".json,.yaml,.yml,.zip"
-              :multiple="false"
-              :limit="1"
-              :auto-upload="true"
-              :drag="true"
-              v-model="files"
-              :tip="$t('workflowTrade.workflowFileUploadTip')"
-            />
-          </el-form-item>
-        </div>
-      </div>
-      <div class="padding16 bg_color_fff border_radius_10 mt10 box_shadow_card">
-        <div class="gap10">
-          <div class="line_vertical"></div>
-          <div class="font_size20 bold">{{$t('common.basicInfo')}}</div>
-        </div>
-        <div class="mt10">
-          <el-form-item :label="$t('workflowTrade.workflowTitle')" prop="workflowTitle"  v-show="!isFullscreen">
-            <el-input v-model="ruleForm.workflowTitle" :placeholder="$t('workflowTrade.placeholderWorkflowTitle')"  maxlength="50"/>
-          </el-form-item>
-          <el-form-item :label="$t('workflowTrade.workflowCategory')" prop="categoryId3"  v-show="!isFullscreen">
-            <el-cascader 
-              v-model="categoryIdList"
-              :options="categoryListTree"
-              :placeholder="$t('workflowTrade.placeholderWorkflowCategory')"
-              style="width:100%"
-              :props="{
-                label: 'categoryName',
-                value: 'categoryId',
-                children: 'children',
-              }"
-            />
-          </el-form-item>
-          <el-form-item :label="$t('workflowTrade.workflowDescription')" prop="description"  v-show="!isFullscreen">
-            <el-input type="textarea" v-model="ruleForm.description" :placeholder="$t('workflowTrade.placeholderWorkflowDescription')"  maxlength="500" show-word-limit/>
-          </el-form-item>
-          <el-form-item :label="$t('common.coverImage')" prop="coverImage"  v-show="!isFullscreen">
-            <!-- 图片类型 -->
-            <FileUploader
-              ref="fileUploader"
-              accept="image/*"
-              :multiple="false"
-              :limit="1"
-              :auto-upload="true"
-              list-type="picture-card"
-              :data="{ directory: 'workflow' }"
-              buttonText=""
-              v-model="coverImage"
-              tip=""
-              @success="handleUploadSuccess"
-              @error="handleUploadError"
-              @progress="handleUploadProgress"
-            />
-          </el-form-item>
-          <el-form-item :label="$t('common.workflowPreview')"  v-show="!isFullscreen">
-            <div>{{$t('workflowTrade.supportBatchUpload')}}</div>
-            <!-- 图片类型 -->
-            <FileUploader
-              ref="fileUploader"
-              accept="image/*"
-              :multiple="true"
-              :limit="5"
-              :auto-upload="true"
-              list-type="picture-card"
-              :data="{ directory: 'workflow' }"
-              buttonText=""
-              v-model="images"
-              tip=""
-              @success="handleUploadSuccess"
-              @error="handleUploadError"
-              @progress="handleUploadProgress"
-            />
-          </el-form-item>
-          <!-- <el-form-item :label="$t('common.Detail')" prop="workflowContent">
-            <BlockNoteEditor v-model="editorContent" :editable="true" class="border"/>
-          </el-form-item> -->
-          <el-form-item :label="$t('common.Detail')" prop="workflowContent">
-            <div class="editor-container" :class="{ 'fullscreen': isFullscreen }">
-              <div class="editor-header" v-if="isFullscreen">
-                <span class="editor-title">{{$t('common.Detail')}}</span>
-                <el-button 
-                  icon="FullScreen" 
-                  @click="toggleFullscreen"
-                  size="small"
-                  class="exit-fullscreen-btn"
-                >
-                  {{$t('common.exitFullscreen')}}
-                </el-button>
-              </div>
-              <div class="editor-content">
-                <BlockNoteEditor 
-                  v-model="editorContent" 
-                  :editable="true" 
-                  class="border"
-                  :class="{ 'fullscreen-editor': isFullscreen }"
+    <div class="flex-between mt10">
+      <div class="flex_1 mr20">
+        <el-form :model="ruleForm" :rules="rules" ref="ruleFormRef" label-position="top" class="page-add">
+          <div class="padding16 bg_color_fff border_radius_10 box_shadow_card"  v-show="!isFullscreen">
+            <div class="gap10">
+              <div class="line_vertical"></div>
+              <div class="font_size20 bold"><span class="color_required font_size16">*</span>{{$t('workflowTrade.fileUpload')}}</div>
+              <div class="gray999 font_size14">{{$t('workflowTrade.supportFormat')}}:JSON、YAML、ZIP({{$t('common.maxSize')}}10MB)</div>
+            </div>
+            <div class="mt10">
+              <el-form-item label="" prop="workflowFile">
+                <!-- 上传 -->
+                <FileUploader
+                  ref="fileUploader"
+                  accept=".json,.yaml,.yml,.zip"
+                  :multiple="false"
+                  :limit="1"
+                  :auto-upload="true"
+                  :drag="true"
+                  v-model="files"
+                  :tip="$t('workflowTrade.workflowFileUploadTip')"
                 />
-              </div>
-              <el-button 
-                v-if="!isFullscreen"
-                icon="FullScreen" 
-                @click="toggleFullscreen"
-                size="small"
-                class="fullscreen-btn"
-              >
-                {{$t('common.fullscreenEdit')}}
-              </el-button>
+              </el-form-item>
             </div>
-          </el-form-item>
-        </div>
-      </div>
-      <div class="padding16 bg_color_fff border_radius_10 mt10 box_shadow_card" v-show="!isFullscreen">
-        <div class="gap10 mb20">
-          <div class="line_vertical"></div>
-          <div class="font_size20 bold">{{$t('workflowTrade.priceSetting')}}</div>
-        </div>
-       
-        <el-form-item :label="$t('workflowTrade.paySetting')" style="width: 600px">
-          <div class="gap20 mt10 mb20">
-            <div class="payType gap10" @click="workflowPriceType = 'pay'" 
-            :class="{'active': workflowPriceType === 'pay'}">
-              <div class="checkType"></div>
-              <div>{{$t('workflowTrade.paySettingTip')}}</div>
+          </div>
+          <div class="padding16 bg_color_fff border_radius_10 mt10 box_shadow_card">
+            <div class="gap10">
+              <div class="line_vertical"></div>
+              <div class="font_size20 bold">{{$t('common.basicInfo')}}</div>
             </div>
-            <div class="payType gap10" @click="workflowPriceType = 'free';ruleForm.workflowPrice=''" 
-            :class="{'active': workflowPriceType === 'free'}">
-              <div class="checkType"></div>
-              <div>{{$t('workflowTrade.freeSettingTip')}}</div>
+            <div class="mt10">
+              <el-form-item :label="$t('workflowTrade.workflowTitle')" prop="workflowTitle"  v-show="!isFullscreen">
+                <el-input v-model="ruleForm.workflowTitle" :placeholder="$t('workflowTrade.placeholderWorkflowTitle')"  maxlength="50"/>
+              </el-form-item>
+              <el-form-item :label="$t('workflowTrade.workflowCategory')" prop="categoryId3"  v-show="!isFullscreen">
+                <el-cascader 
+                  v-model="categoryIdList"
+                  :options="categoryListTree"
+                  :placeholder="$t('workflowTrade.placeholderWorkflowCategory')"
+                  style="width:100%"
+                  :props="{
+                    label: 'categoryName',
+                    value: 'categoryId',
+                    children: 'children',
+                  }"
+                />
+              </el-form-item>
+              <el-form-item :label="$t('workflowTrade.workflowDescription')" prop="description"  v-show="!isFullscreen">
+                <el-input type="textarea" v-model="ruleForm.description" :placeholder="$t('workflowTrade.placeholderWorkflowDescription')"  maxlength="500" show-word-limit/>
+              </el-form-item>
+              <el-form-item :label="$t('common.coverImage')" prop="coverImage"  v-show="!isFullscreen">
+                <!-- 图片类型 -->
+                <FileUploader
+                  ref="fileUploader"
+                  accept="image/*"
+                  :multiple="false"
+                  :limit="1"
+                  :auto-upload="true"
+                  list-type="picture-card"
+                  :data="{ directory: 'workflow' }"
+                  buttonText=""
+                  v-model="coverImage"
+                  tip=""
+                  @success="handleUploadSuccess"
+                  @error="handleUploadError"
+                  @progress="handleUploadProgress"
+                />
+              </el-form-item>
+              <el-form-item :label="$t('common.workflowPreview')"  v-show="!isFullscreen">
+                <div>{{$t('workflowTrade.supportBatchUpload')}}</div>
+                <!-- 图片类型 -->
+                <FileUploader
+                  ref="fileUploader"
+                  accept="image/*"
+                  :multiple="true"
+                  :limit="5"
+                  :auto-upload="true"
+                  list-type="picture-card"
+                  :data="{ directory: 'workflow' }"
+                  buttonText=""
+                  v-model="images"
+                  tip=""
+                  @success="handleUploadSuccess"
+                  @error="handleUploadError"
+                  @progress="handleUploadProgress"
+                />
+              </el-form-item>
+              <!-- <el-form-item :label="$t('common.Detail')" prop="workflowContent">
+                <BlockNoteEditor v-model="editorContent" :editable="true" class="border"/>
+              </el-form-item> -->
+              <el-form-item :label="$t('common.Detail')" prop="workflowContent">
+                <div class="editor-container" :class="{ 'fullscreen': isFullscreen }">
+                  <div class="editor-header" v-if="isFullscreen">
+                    <span class="editor-title">{{$t('common.Detail')}}</span>
+                    <el-button 
+                      icon="FullScreen" 
+                      @click="toggleFullscreen"
+                      size="small"
+                      class="exit-fullscreen-btn"
+                    >
+                      {{$t('common.exitFullscreen')}}
+                    </el-button>
+                  </div>
+                  <div class="editor-content">
+                    <BlockNoteEditor 
+                      v-model="editorContent" 
+                      :editable="true" 
+                      class="border"
+                      :class="{ 'fullscreen-editor': isFullscreen }"
+                    />
+                  </div>
+                  <el-button 
+                    v-if="!isFullscreen"
+                    icon="FullScreen" 
+                    @click="toggleFullscreen"
+                    size="small"
+                    class="fullscreen-btn"
+                  >
+                    {{$t('common.fullscreenEdit')}}
+                  </el-button>
+                </div>
+              </el-form-item>
             </div>
           </div>
-          <el-input v-model="ruleForm.workflowPrice" :placeholder="$t('workflowTrade.placeholderPrice')"  maxlength="50" type="number" v-if="workflowPriceType === 'pay'">
-            <template #append>{{$t('common.baomibi')}}</template>
-          </el-input>
-        </el-form-item>
+          <div class="padding16 bg_color_fff border_radius_10 mt10 box_shadow_card" v-show="!isFullscreen">
+            <div class="gap10 mb20">
+              <div class="line_vertical"></div>
+              <div class="font_size20 bold">{{$t('workflowTrade.priceSetting')}}</div>
+            </div>
+          
+            <el-form-item :label="$t('workflowTrade.paySetting')" style="width: 600px">
+              <div class="gap20 mt10 mb20">
+                <div class="payType gap10" @click="workflowPriceType = 'pay'" 
+                :class="{'active': workflowPriceType === 'pay'}">
+                  <div class="checkType"></div>
+                  <div>{{$t('workflowTrade.paySettingTip')}}</div>
+                </div>
+                <div class="payType gap10" @click="workflowPriceType = 'free';ruleForm.workflowPrice=''" 
+                :class="{'active': workflowPriceType === 'free'}">
+                  <div class="checkType"></div>
+                  <div>{{$t('workflowTrade.freeSettingTip')}}</div>
+                </div>
+              </div>
+              <el-input v-model="ruleForm.workflowPrice" :placeholder="$t('workflowTrade.placeholderPrice')"  maxlength="50" type="number" v-if="workflowPriceType === 'pay'">
+                <template #append>{{$t('common.baomibi')}}</template>
+              </el-input>
+            </el-form-item>
+          </div>
+          <div class="mt20"  v-show="!isFullscreen">
+            <el-button type="primary" class="font_size16 gradient" 
+            :loading="isSubmiting"
+            @click="submitForm"  size="large">
+              <el-icon><Promotion /></el-icon>
+              <span class="ml10">{{$t('common.publishWorkflow')}}</span>
+            </el-button>
+            <el-button class="font_size16" @click="goBack"  size="large">
+              <el-icon><Close /></el-icon>
+              <span class="ml10">{{$t('common.cancel')}}</span>
+            </el-button>
+          </div>
+        </el-form>
       </div>
-      <div class="mt20"  v-show="!isFullscreen">
-        <el-button type="primary" class="font_size16 gradient" 
-        :loading="isSubmiting"
-        @click="submitForm"  size="large">
-          <el-icon><Promotion /></el-icon>
-          <span class="ml10">{{$t('common.publishWorkflow')}}</span>
-        </el-button>
-        <el-button class="font_size16" @click="goBack"  size="large">
-          <el-icon><Close /></el-icon>
-          <span class="ml10">{{$t('common.cancel')}}</span>
-        </el-button>
+      <!-- 右边内容 -->
+      <div class="detail_right">
+        <div class="detail_right_content detail_right">
+           <div class="padding16 bg_color_fff border_radius_16 box_shadow_card">
+            <div class="gap10">
+              <div class="line_vertical"></div>
+              <div class="font_size20 bold">{{$t('workflowTradeAdd.publishRules')}}</div>
+            </div>
+            <!-- 无序列表 -->
+            <div class="font_size16 ql-container">
+              <div class="ql-editor">
+                <div v-html="release_rules"></div>
+              </div>
+            </div>
+          </div>
+        </div>
       </div>
-    </el-form>
+    </div>
   </div>
 </template>
 
@@ -173,6 +194,7 @@ const route = useRoute()
 const router = useRouter()
 
 import { getCategoryListTree } from '@/api/category.js'
+import { getAgreementType } from '@/api/common.js'
 import { publishAdd, getPublishDetail,publishEdit } from '@/api/publish.js'
 
 import { useI18n } from 'vue-i18n' 
@@ -180,6 +202,9 @@ const { t } = useI18n()
 
 // 防止重复提交的加载状态
 const isSubmiting = ref(false)
+// 发布规则
+const release_rules = ref('');
+
 
 // 从路由参数中获取 activePlatform
 const activePlatform = ref(route.query.activePlatform || '');
@@ -265,6 +290,7 @@ onMounted(() => {
   if(publishId.value){
     getDetail();
   }
+  getAgreementTypeFn();
 });
 
 // 提交表单
@@ -387,6 +413,12 @@ const toggleFullscreen = () => {
     });
   }
 };
+const getAgreementTypeFn = () => {
+  getAgreementType({agreementType: 'workflow_rules'}).then(res => {
+    console.log(res)
+    release_rules.value = res.data.content || '';
+  })
+};
 </script>
 <style lang="scss">
 .workflow-add{

+ 6 - 2
src/pages/WorkflowDetail.vue

@@ -65,7 +65,7 @@
               <el-button type="success" plain size="mini" v-if="ruleForm.workflowPrice === 0">{{$t('common.free')}}</el-button>
             </div>
             <div class="mt20">
-              <el-button type="primary" class="font_size16" size="large" style="width: 100%;">
+              <el-button type="primary" class="font_size16" size="large" style="width: 100%;" @click="startUsing()">
                 <img :src="useNowIcon" alt="员工" style="width: 30px; height: 30px;">
                 <span class="font_size18"> {{$t('common.startUsing')}}</span>
               </el-button>
@@ -147,7 +147,7 @@ import yiguanzhuIcon from '@/assets/imgs/yiguanzhu.png'
 import geshiIcon from '@/assets/imgs/geshi.png'
 import neicunIcon from '@/assets/imgs/neicun.png'
 import banbenIcon from '@/assets/imgs/banben.png'
-import { downloadFile, confirmBuy } from '@/utils/util'
+import { downloadFile, confirmBuy, openNewTab } from '@/utils/util'
 
 import { getPublishDetail } from '@/api/publish.js'
 import { purchase } from '@/api/common.js'
@@ -237,6 +237,10 @@ const downloadWorkflow = () => {
     }
   })
 };
+// 立即使用
+const startUsing = () => {
+  openNewTab(ruleForm.value.categoryUrl);
+};
 </script>
 
 <style scoped lang="scss">

+ 1 - 1
src/pages/order/orderConfirm.vue

@@ -151,7 +151,7 @@
       </div>
       <div style="display: inline-block;" class="mt20" @click="payNowFn" v-loading="loading">
         <div class="gap5 gradient border_radius_4 cursor-pointer zhifu">
-          <img :src="qianbaoIcon" alt="" style="width:13px;height:15px">
+          <img :src="qianbaoIcon" alt="" style="width:16px;height:16px">
           <div>{{$t('common.payNow')}}</div>
         </div>
       </div>

+ 8 - 1
src/utils/util.js

@@ -163,4 +163,11 @@ export function openFullScreenLoading() {
     // background: 'rgba(0, 0, 0, 0.7)',
   })
   return loading;
-}
+}
+//打开新标签跳转地址
+export function openNewTab(url) {
+  if (!url) {
+    return;
+  }
+  window.open(url, '_blank');
+}