Browse Source

优化spmUrl生成规则

master
科技小王子 7 months ago
parent
commit
d49cf4c30b
  1. 2
      api/cms/website/model/index.ts
  2. 3
      components/AppHeader.vue
  3. 4
      components/CardList.vue
  4. 2
      package.json
  5. 2
      pages/article/components/CardList.vue
  6. 2
      pages/ask/components/CardList.vue
  7. 4
      pages/case/components/CardList.vue
  8. 2
      pages/case/components/PageBanner.vue
  9. 2
      pages/components/ArticleList.vue
  10. 2
      pages/components/CardList.vue
  11. 8
      pages/components/Flash.vue
  12. 2
      pages/components/PlugList.vue
  13. 2
      pages/components/ProductList.vue
  14. 6
      pages/detail/index.vue
  15. 2
      pages/developer/components/CardList.vue
  16. 2
      pages/docs/components/CardList.vue
  17. 7
      pages/item/index.vue
  18. 2
      pages/market/components/CardList.vue
  19. 2
      pages/market/components/CardList2.vue
  20. 2
      pages/product/components/CardList.vue
  21. 17
      pnpm-lock.yaml
  22. 80
      utils/common.ts

2
api/cms/website/model/index.ts

@ -2,6 +2,7 @@ import type { WebsiteField } from '@/api/cms/website/field/model';
import type {Navigation} from "@/api/cms/navigation/model"; import type {Navigation} from "@/api/cms/navigation/model";
import type {ArrangeCategory} from "@/api/cms/category/model"; import type {ArrangeCategory} from "@/api/cms/category/model";
import type {Link} from "~/api/cms/link/model"; import type {Link} from "~/api/cms/link/model";
import type {User} from "~/api/system/user/model";
/** /**
* *
@ -63,6 +64,7 @@ export interface Website {
config?: any; config?: any;
topNavs?: Navigation[]; topNavs?: Navigation[];
bottomNavs?: Navigation[]; bottomNavs?: Navigation[];
loginUser?: User;
} }
/** /**

3
components/AppHeader.vue

@ -63,7 +63,7 @@
<!-- <el-button v-if="token" @click="navigateTo(`/manage`)">控制台</el-button>--> <!-- <el-button v-if="token" @click="navigateTo(`/manage`)">控制台</el-button>-->
<!-- <el-button v-if="config.showSearchIcon" circle :icon="ElIconSearch" @click="navigateTo('/search')"></el-button>--> <!-- <el-button v-if="config.showSearchIcon" circle :icon="ElIconSearch" @click="navigateTo('/search')"></el-button>-->
<el-button v-if="token && sysDomain" <el-button v-if="token && sysDomain"
@click="openSpmUrl(`https://${sysDomain}/token-login`,website,Number(TID_ADMIN))">控制台
@click="loginAdminByToken">控制台
</el-button> </el-button>
<ClientOnly> <ClientOnly>
<template v-if="token"> <template v-if="token">
@ -108,6 +108,7 @@ import type {ApiResult} from "~/api";
import type {User} from "~/api/system/user/model"; import type {User} from "~/api/system/user/model";
import {navigateTo, openSpmUrl} from "#imports"; import {navigateTo, openSpmUrl} from "#imports";
import type {Company} from "~/api/system/company/model"; import type {Company} from "~/api/system/company/model";
import {loginAdminByToken} from "~/utils/common";
const route = useRoute(); const route = useRoute();
// //

4
components/CardList.vue

@ -4,10 +4,10 @@
<template v-for="(item,index) in list" :key="index"> <template v-for="(item,index) in list" :key="index">
<el-col :span="6" class="mb-5 min-w-xs"> <el-col :span="6" class="mb-5 min-w-xs">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50"> <el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50">
<el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" @click="openSpmUrl(`https://websoft.top/detail`,item,item.articleId)" />
<el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" @click="openSpmUrl(`/detail`,item,item.articleId)" />
<div class="flex-1 px-4 py-5 sm:p-6 !p-4"> <div class="flex-1 px-4 py-5 sm:p-6 !p-4">
<p class="text-gray-900 dark:text-white text-base font-semibold flex items-center gap-1.5"> <p class="text-gray-900 dark:text-white text-base font-semibold flex items-center gap-1.5">
<a class="flex-1 cursor-pointer" @click="openSpmUrl(`https://websoft.top/detail`,item,item.articleId)">{{ item.title }}</a>
<a class="flex-1 cursor-pointer" @click="openSpmUrl(`/detail`,item,item.articleId)">{{ item.title }}</a>
</p> </p>
<div class="text-[15px] text-gray-500 dark:text-gray-400 mt-1 line-clamp-2 sm:min-h-[45px]"> <div class="text-[15px] text-gray-500 dark:text-gray-400 mt-1 line-clamp-2 sm:min-h-[45px]">
{{ item.comments }} {{ item.comments }}

2
package.json

@ -32,6 +32,7 @@
"nuxt": "^3.12.4", "nuxt": "^3.12.4",
"qrcode.vue": "^3.3.3", "qrcode.vue": "^3.3.3",
"sass": "^1.57.1", "sass": "^1.57.1",
"uuid": "^10.0.0",
"vue": "latest", "vue": "latest",
"vue-i18n": "^9.14.0", "vue-i18n": "^9.14.0",
"vue-router": "^4.1.5", "vue-router": "^4.1.5",
@ -45,6 +46,7 @@
"@nuxt/image": "^1.7.0", "@nuxt/image": "^1.7.0",
"@nuxtjs/eslint-config-typescript": "^12.1.0", "@nuxtjs/eslint-config-typescript": "^12.1.0",
"@nuxtjs/i18n": "^8.5.2", "@nuxtjs/i18n": "^8.5.2",
"@types/uuid": "^10.0.0",
"@typescript-eslint/parser": "^7.1.1", "@typescript-eslint/parser": "^7.1.1",
"@unocss/nuxt": "^0.62.2", "@unocss/nuxt": "^0.62.2",
"@unocss/preset-attributify": "^0.62.2", "@unocss/preset-attributify": "^0.62.2",

2
pages/article/components/CardList.vue

@ -3,7 +3,7 @@
<el-row :gutter="24" class="flex"> <el-row :gutter="24" class="flex">
<template v-for="(item,index) in list" :key="index"> <template v-for="(item,index) in list" :key="index">
<el-col :span="6" class="mb-5 min-w-xs"> <el-col :span="6" class="mb-5 min-w-xs">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`https://websoft.top/detail`,item,item.articleId)">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`/detail`,item,item.articleId,true)">
<el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" /> <el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" />
<div class="flex-1 px-4 py-5 sm:p-6 !p-4"> <div class="flex-1 px-4 py-5 sm:p-6 !p-4">
<p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5"> <p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5">

2
pages/ask/components/CardList.vue

@ -3,7 +3,7 @@
<el-row :gutter="24" class="flex"> <el-row :gutter="24" class="flex">
<template v-for="(item,index) in list" :key="index"> <template v-for="(item,index) in list" :key="index">
<el-col :span="6" class="mb-5 min-w-xs"> <el-col :span="6" class="mb-5 min-w-xs">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`https://websoft.top/detail`,item,item.articleId)">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`/detail`,item,item.articleId,true)">
<el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" /> <el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" />
<div class="flex-1 px-4 py-5 sm:p-6 !p-4"> <div class="flex-1 px-4 py-5 sm:p-6 !p-4">
<p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5"> <p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5">

4
pages/case/components/CardList.vue

@ -13,9 +13,9 @@
<span class="text-gray-500">{{ item.comments }} </span> <span class="text-gray-500">{{ item.comments }} </span>
</p> </p>
<div class="button-group flex justify-center mt-3"> <div class="button-group flex justify-center mt-3">
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl(`https://websoft.top/item`,item,item.appId)">查看详情</el-button>
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl(`/item`,item,item.appId,true)">查看详情</el-button>
<el-button v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买</el-button> <el-button v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买</el-button>
<el-button v-else class="w-full" :icon="ElIconSetting">控制台</el-button>
<el-button v-else class="w-full" :icon="ElIconSetting" @click="openSpmUrl(`https://${item.tenantId}.websoft.top`,item,item.appId,true)">控制台</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>

2
pages/case/components/PageBanner.vue

@ -48,7 +48,7 @@
:icon="ElIconMemo" :icon="ElIconMemo"
size="large" size="large"
v-if="layout.docUrl" v-if="layout.docUrl"
@click="openSpmUrl(`https://websoft.top/docs`)"
@click="openSpmUrl(`/docs`)"
> >
帮助文档 帮助文档
</el-button> </el-button>

2
pages/components/ArticleList.vue

@ -13,7 +13,7 @@
<el-row :gutter="24" class="flex"> <el-row :gutter="24" class="flex">
<template v-for="(item,index) in list" :key="index"> <template v-for="(item,index) in list" :key="index">
<el-col :span="6" class="mb-5 min-w-xs"> <el-col :span="6" class="mb-5 min-w-xs">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`https://websoft.top/detail`,item,item.articleId)">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`/detail`,item,item.articleId,true)">
<el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" /> <el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" />
<div class="flex-1 px-4 py-5 sm:p-6 !p-4"> <div class="flex-1 px-4 py-5 sm:p-6 !p-4">
<p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5"> <p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5">

2
pages/components/CardList.vue

@ -13,7 +13,7 @@
<span class="text-gray-500">{{ item.comments }} </span> <span class="text-gray-500">{{ item.comments }} </span>
</p> </p>
<div class="button-group flex justify-center mt-3"> <div class="button-group flex justify-center mt-3">
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl(`https://websoft.top/case/${item.companyId}`,item,item.companyId)">查看详情</el-button>
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl(`/case/${item.companyId}`,item,item.companyId)">查看详情</el-button>
<el-button v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买</el-button> <el-button v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买</el-button>
<el-button v-else class="w-full" :icon="ElIconShoppingCart">下载</el-button> <el-button v-else class="w-full" :icon="ElIconShoppingCart">下载</el-button>
</div> </div>

8
pages/components/Flash.vue

@ -85,7 +85,7 @@
<div class="mx-auto px-4 sm:px-6 lg:px-8 max-w-7xl gap-16 sm:gap-y-24 flex flex-col "> <div class="mx-auto px-4 sm:px-6 lg:px-8 max-w-7xl gap-16 sm:gap-y-24 flex flex-col ">
<div class="text-center relative z-[1]"> <div class="text-center relative z-[1]">
<div class="mb-8 cursor-pointer"> <div class="mb-8 cursor-pointer">
<el-tag type="warning" round @click="openSpmUrl(`https://websoft.top/detail`, {},730,true)">v3.0 版本发布
<el-tag type="warning" round @click="openSpmUrl(`/detail`, {},730,true)">v3.0 版本发布
</el-tag> </el-tag>
</div> </div>
<h1 class="text-5xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-7xl"> 现代Web应用 <br><span <h1 class="text-5xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-7xl"> 现代Web应用 <br><span
@ -96,8 +96,8 @@
<div class="mt-10 flex flex-wrap gap-x-6 gap-y-3 justify-center"> <div class="mt-10 flex flex-wrap gap-x-6 gap-y-3 justify-center">
<div class="flex flex-col gap-4"> <div class="flex flex-col gap-4">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<el-button size="large" type="primary" v-if="!token" :icon="ElIconArrowRight" @click="openSpmUrl(`https://websoft.top/passport/login`, {},0,true)">立即开始</el-button>
<el-button size="large" type="primary" v-else :icon="ElIconArrowRight" @click="openSpmUrl(`https://${sysDomain}/token-login`,{},undefined,true)">进入控制台</el-button>
<el-button size="large" type="primary" v-if="!token" :icon="ElIconArrowRight" @click="openSpmUrl(`/passport/login`, {},0)">立即开始</el-button>
<el-button size="large" type="primary" v-else :icon="ElIconArrowRight" @click="loginAdminByToken">进入控制台</el-button>
<el-button size="large" type="success" :icon="ElIconDownload" @click="openSpmUrl(`http://git.gxwebsoft.com/gxwebsoft/websoft-cms.git`, {},0,true)">下载源码</el-button> <el-button size="large" type="success" :icon="ElIconDownload" @click="openSpmUrl(`http://git.gxwebsoft.com/gxwebsoft/websoft-cms.git`, {},0,true)">下载源码</el-button>
<el-button size="large" type="warning" :icon="ElIconShoppingCart">商业版授权</el-button> <el-button size="large" type="warning" :icon="ElIconShoppingCart">商业版授权</el-button>
</div> </div>
@ -110,7 +110,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {useSysDomain, useToken} from "~/composables/configState"; import {useSysDomain, useToken} from "~/composables/configState";
import {openSpmUrl} from "~/utils/common";
import {loginAdminByToken, openSpmUrl} from "~/utils/common";
const token = useToken(); const token = useToken();
const sysDomain = useSysDomain(); const sysDomain = useSysDomain();
</script> </script>

2
pages/components/PlugList.vue

@ -26,7 +26,7 @@
<div class="text-gray-500">{{ item.comments }}</div> <div class="text-gray-500">{{ item.comments }}</div>
</p> </p>
<div class="button-group flex justify-center mt-3"> <div class="button-group flex justify-center mt-3">
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl('https://websoft.top/item', item,item.plugId)">查看详情</el-button>
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl(`/item`, item,item.plugId,true)">查看详情</el-button>
<el-button type="primary" v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买 <el-button type="primary" v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买
</el-button> </el-button>
<el-button v-else class="w-full" :icon="ElIconShoppingCart">下载</el-button> <el-button v-else class="w-full" :icon="ElIconShoppingCart">下载</el-button>

2
pages/components/ProductList.vue

@ -26,7 +26,7 @@
<div class="text-gray-500">{{ item.comments }}</div> <div class="text-gray-500">{{ item.comments }}</div>
</p> </p>
<div class="button-group flex justify-center mt-3"> <div class="button-group flex justify-center mt-3">
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl('https://websoft.top/item', item,item.goodsId)">查看详情</el-button>
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl('/item', item,item.goodsId,true)">查看详情</el-button>
<el-button type="primary" v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买 <el-button type="primary" v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买
</el-button> </el-button>
<el-button v-else class="w-full" :icon="ElIconShoppingCart">下载</el-button> <el-button v-else class="w-full" :icon="ElIconShoppingCart">下载</el-button>

6
pages/detail/index.vue

@ -8,10 +8,10 @@
<div class="p-6 leading-7 bg-white rounded-lg text-lg line-height-loose text-gray-600 content" v-html="form?.content"> <div class="p-6 leading-7 bg-white rounded-lg text-lg line-height-loose text-gray-600 content" v-html="form?.content">
</div> </div>
<div class="page gap-xl m-auto mt-[30px] flex justify-between"> <div class="page gap-xl m-auto mt-[30px] flex justify-between">
<div v-if="previousArticle" class="bg-white rounded-lg p-4 cursor-pointer hover:shadow w-[50%]" @click="getSpmUrl(`https://websoft.top/detail`,previousArticle,previousArticle?.articleId)">
<div v-if="previousArticle" class="bg-white rounded-lg p-4 cursor-pointer hover:shadow w-[50%]" @click="openSpmUrl(`/detail`,previousArticle,previousArticle?.articleId)">
<span>上一篇{{ previousArticle?.title }}</span> <span>上一篇{{ previousArticle?.title }}</span>
</div> </div>
<div v-if="nextArticle" class="bg-white rounded-lg p-4 cursor-pointer hover:shadow w-[50%]" @click="openSpmUrl(`https://websoft.top/detail`,nextArticle,nextArticle?.articleId)">
<div v-if="nextArticle" class="bg-white rounded-lg p-4 cursor-pointer hover:shadow w-[50%]" @click="openSpmUrl(`/detail`,nextArticle,nextArticle?.articleId)">
<span>下一篇{{ nextArticle?.title}}</span> <span>下一篇{{ nextArticle?.title}}</span>
</div> </div>
</div> </div>
@ -34,7 +34,7 @@ import {useServerRequest} from "~/composables/useServerRequest";
import {useWebsite} from "~/composables/configState"; import {useWebsite} from "~/composables/configState";
import type {BreadcrumbItem} from "~/types/global"; import type {BreadcrumbItem} from "~/types/global";
import type {Navigation} from "~/api/cms/navigation/model"; import type {Navigation} from "~/api/cms/navigation/model";
import {getIdBySpm, getSpmUrl, openSpmUrl} from "~/utils/common";
import {getIdBySpm, openSpmUrl} from "~/utils/common";
import type {Article} from "~/api/cms/article/model"; import type {Article} from "~/api/cms/article/model";
import useFormData from "~/utils/use-form-data"; import useFormData from "~/utils/use-form-data";
import PageBanner from './components/PageBanner.vue'; import PageBanner from './components/PageBanner.vue';

2
pages/developer/components/CardList.vue

@ -3,7 +3,7 @@
<el-row :gutter="24" class="flex"> <el-row :gutter="24" class="flex">
<template v-for="(item,index) in list" :key="index"> <template v-for="(item,index) in list" :key="index">
<el-col :span="6" class="mb-5 min-w-xs"> <el-col :span="6" class="mb-5 min-w-xs">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`https://websoft.top/detail`,item,item.articleId)">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`/detail`,item,item.articleId)">
<el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" /> <el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" />
<div class="flex-1 px-4 py-5 sm:p-6 !p-4"> <div class="flex-1 px-4 py-5 sm:p-6 !p-4">
<p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5"> <p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5">

2
pages/docs/components/CardList.vue

@ -3,7 +3,7 @@
<el-row :gutter="24" class="flex"> <el-row :gutter="24" class="flex">
<template v-for="(item,index) in list" :key="index"> <template v-for="(item,index) in list" :key="index">
<el-col :span="6" class="mb-5 min-w-xs"> <el-col :span="6" class="mb-5 min-w-xs">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`https://websoft.top/detail`,item,item.articleId)">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`/detail`,item,item.articleId)">
<el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" /> <el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" />
<div class="flex-1 px-4 py-5 sm:p-6 !p-4"> <div class="flex-1 px-4 py-5 sm:p-6 !p-4">
<p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5"> <p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5">

7
pages/item/index.vue

@ -10,7 +10,7 @@
v-model="activeName" v-model="activeName"
type="card" type="card"
class="demo-tabs" class="demo-tabs"
@tab-click="handleClick"
@tab-click="reload"
> >
<el-tab-pane label="基本信息" name="base">基本信息</el-tab-pane> <el-tab-pane label="基本信息" name="base">基本信息</el-tab-pane>
<el-tab-pane label="成员管理" name="users">成员管理</el-tab-pane> <el-tab-pane label="成员管理" name="users">成员管理</el-tab-pane>
@ -43,12 +43,10 @@ import type {ApiResult} from "~/api";
import {useServerRequest} from "~/composables/useServerRequest"; import {useServerRequest} from "~/composables/useServerRequest";
import {useWebsite} from "~/composables/configState"; import {useWebsite} from "~/composables/configState";
import type {BreadcrumbItem} from "~/types/global"; import type {BreadcrumbItem} from "~/types/global";
import type {Navigation} from "~/api/cms/navigation/model";
import {getIdBySpm, getSpmUrl, openSpmUrl} from "~/utils/common";
import {getIdBySpm} from "~/utils/common";
import type {Article} from "~/api/cms/article/model"; import type {Article} from "~/api/cms/article/model";
import useFormData from "~/utils/use-form-data"; import useFormData from "~/utils/use-form-data";
import PageBanner from './components/PageBanner.vue'; import PageBanner from './components/PageBanner.vue';
import type {Company} from "~/api/system/company/model";
import type {App} from "~/api/oa/app/model"; import type {App} from "~/api/oa/app/model";
// //
@ -57,6 +55,7 @@ const website = useWebsite();
const breadcrumb = ref<BreadcrumbItem>(); const breadcrumb = ref<BreadcrumbItem>();
const previousArticle = ref<Article>(); const previousArticle = ref<Article>();
const nextArticle = ref<Article>(); const nextArticle = ref<Article>();
const activeName = ref();
// //

2
pages/market/components/CardList.vue

@ -14,7 +14,7 @@
<div class="text-gray-500">{{ item.comments }} </div> <div class="text-gray-500">{{ item.comments }} </div>
</p> </p>
<div class="button-group flex justify-center mt-3"> <div class="button-group flex justify-center mt-3">
<el-button class="w-full" @click="openSpmUrl(`https://websoft.top/item`, item, item.plugId)">查看详情</el-button>
<el-button class="w-full" @click="openSpmUrl(`/item`, item, item.plugId,true)">查看详情</el-button>
<el-button type="primary" v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买</el-button> <el-button type="primary" v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买</el-button>
<el-button v-else class="w-full">下载插件</el-button> <el-button v-else class="w-full">下载插件</el-button>
</div> </div>

2
pages/market/components/CardList2.vue

@ -3,7 +3,7 @@
<el-row :gutter="24" class="flex"> <el-row :gutter="24" class="flex">
<template v-for="(item,index) in list" :key="index"> <template v-for="(item,index) in list" :key="index">
<el-col :span="24" class="mb-5 min-w-xs"> <el-col :span="24" class="mb-5 min-w-xs">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`https://websoft.top/market/detail`,item,item.articleId)">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`/market/detail`,item,item.articleId)">
<div class="flex"> <div class="flex">
<el-image :src="item.appIcon" fit="fill" :lazy="true" class="w-[150px] h-[150px] cursor-pointer" /> <el-image :src="item.appIcon" fit="fill" :lazy="true" class="w-[150px] h-[150px] cursor-pointer" />
<div class="flex-1 px-4 py-5 sm:p-6 !p-4"> <div class="flex-1 px-4 py-5 sm:p-6 !p-4">

2
pages/product/components/CardList.vue

@ -14,7 +14,7 @@
<div class="text-gray-500">{{ item.comments }}</div> <div class="text-gray-500">{{ item.comments }}</div>
</p> </p>
<div class="button-group flex justify-center mt-3"> <div class="button-group flex justify-center mt-3">
<el-button class="w-full" :icon="ElIconView">查看详情</el-button>
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl(`/item`, item, item.goodsId,true)">查看详情</el-button>
<el-button type="primary" v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买</el-button> <el-button type="primary" v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买</el-button>
<el-button v-else class="w-full" :icon="ElIconShoppingCart">下载</el-button> <el-button v-else class="w-full" :icon="ElIconShoppingCart">下载</el-button>
</div> </div>

17
pnpm-lock.yaml

@ -62,6 +62,9 @@ importers:
sass: sass:
specifier: ^1.57.1 specifier: ^1.57.1
version: 1.77.8 version: 1.77.8
uuid:
specifier: ^10.0.0
version: 10.0.0
vue: vue:
specifier: latest specifier: latest
version: 3.4.38(typescript@5.5.4) version: 3.4.38(typescript@5.5.4)
@ -90,6 +93,9 @@ importers:
'@nuxtjs/i18n': '@nuxtjs/i18n':
specifier: ^8.5.2 specifier: ^8.5.2
version: 8.5.2(magicast@0.3.4)(rollup@4.21.0)(vue@3.4.38(typescript@5.5.4)) version: 8.5.2(magicast@0.3.4)(rollup@4.21.0)(vue@3.4.38(typescript@5.5.4))
'@types/uuid':
specifier: ^10.0.0
version: 10.0.0
'@unocss/nuxt': '@unocss/nuxt':
specifier: ^0.62.2 specifier: ^0.62.2
version: 0.62.2(magicast@0.3.4)(postcss@8.4.41)(rollup@4.21.0)(vite@3.2.10(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.31.6))(webpack@5.93.0(esbuild@0.23.1)) version: 0.62.2(magicast@0.3.4)(postcss@8.4.41)(rollup@4.21.0)(vite@3.2.10(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)(terser@5.31.6))(webpack@5.93.0(esbuild@0.23.1))
@ -1488,6 +1494,9 @@ packages:
'@types/semver@7.5.8': '@types/semver@7.5.8':
resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==, tarball: https://registry.npmmirror.com/@types/semver/-/semver-7.5.8.tgz} resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==, tarball: https://registry.npmmirror.com/@types/semver/-/semver-7.5.8.tgz}
'@types/uuid@10.0.0':
resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==, tarball: https://registry.npmmirror.com/@types/uuid/-/uuid-10.0.0.tgz}
'@types/web-bluetooth@0.0.16': '@types/web-bluetooth@0.0.16':
resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==, tarball: https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz} resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==, tarball: https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz}
@ -6013,6 +6022,10 @@ packages:
util-deprecate@1.0.2: util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, tarball: https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz} resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, tarball: https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz}
uuid@10.0.0:
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==, tarball: https://registry.npmmirror.com/uuid/-/uuid-10.0.0.tgz}
hasBin: true
validate-npm-package-license@3.0.4: validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, tarball: https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz} resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, tarball: https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz}
@ -8019,6 +8032,8 @@ snapshots:
'@types/semver@7.5.8': {} '@types/semver@7.5.8': {}
'@types/uuid@10.0.0': {}
'@types/web-bluetooth@0.0.16': {} '@types/web-bluetooth@0.0.16': {}
'@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)':
@ -13452,6 +13467,8 @@ snapshots:
util-deprecate@1.0.2: {} util-deprecate@1.0.2: {}
uuid@10.0.0: {}
validate-npm-package-license@3.0.4: validate-npm-package-license@3.0.4:
dependencies: dependencies:
spdx-correct: 3.2.0 spdx-correct: 3.2.0

80
utils/common.ts

@ -1,3 +1,4 @@
import { v4 as uuidv4 } from 'uuid';
const route = useRoute(); const route = useRoute();
/**需要进行持久化的数据:把需要持久化的数据放在下面这个对象中,才会持久化,不需要持久化的数据就不用放到这里了。 */ /**需要进行持久化的数据:把需要持久化的数据放在下面这个对象中,才会持久化,不需要持久化的数据就不用放到这里了。 */
@ -91,7 +92,6 @@ export const getPath = () => {
return route.path; return route.path;
} }
/** /**
* *
* *
@ -99,61 +99,59 @@ export const getPath = () => {
* @param id 128 * @param id 128
* @param d * @param d
* @param isOpen * @param isOpen
* @param isToken
* {}{path}?spm=c.{ID}.{ID}.{ID}.{ID}.{timestamp}&token={token} * {}{path}?spm=c.{ID}.{ID}.{ID}.{ID}.{timestamp}&token={token}
* @return https:///websoft.top/product/detail/128.html?spm=c.5.3057.10005.undefined&token=DDkr1PpE9DouIVMjLEMt9733QsgG7oNV * @return https:///websoft.top/product/detail/128.html?spm=c.5.3057.10005.undefined&token=DDkr1PpE9DouIVMjLEMt9733QsgG7oNV
*/ */
export function openSpmUrl(path: string, d?: any, id = 0, isOpen?: boolean): void {
const domain = route.path;
export function openSpmUrl(path: string, d?: any, id = 0, isOpen?: boolean, isToken?: boolean): void {
const config = useWebsite();
const spm = ref<string>(''); const spm = ref<string>('');
const token = ref<string>();
const url = ref<string>();
const tid = d?.tenantId || 0;
const model = ref<string>('c');
const tid = config.value.tenantId || 0;
const mid = config.value.loginUser?.merchantId || 0;
const pid = d?.parentId || 0; const pid = d?.parentId || 0;
const cid = d?.categoryId || 0; const cid = d?.categoryId || 0;
const uid = localStorage.getItem('UserId') || 0;
const uid = config.value.loginUser?.userId || 0;
const timestamp = ref(Date.now() / 1000); const timestamp = ref(Date.now() / 1000);
token.value = `&token=${localStorage.getItem('token')}`;
let token = uuidv4();
// TODO 封装租户ID和店铺ID
spm.value = `?spm=c.${uid}.${tid}.${pid}.${cid}.${id}.${timestamp.value}${token.value}`;
// TODO 登录控制台
if(isToken){
token = `${localStorage.getItem('token')}`;
}
// TODO 含http直接跳转
if (path.slice(0, 4) == 'http') {
// TODO 判断模型
if(d?.articleId){
model.value = 'a';
}
if(d?.goodsId){
model.value = 'g';
}
if(d?.productId){
model.value = 'p';
}
if(d?.appId){
model.value = 'app';
}
if(d?.plugId){
model.value = 'plug';
}
// TODO 封装spm
spm.value = `?spm=${model.value}.${tid}.${mid}.${pid}.${cid}.${id}.${uid}.${timestamp.value}&token=${token}`;
// TODO 新窗口打开
if(isOpen){ if(isOpen){
window.open(`${path}${spm.value}`); window.open(`${path}${spm.value}`);
return; return;
} }
location.href = `${path}${spm.value}`;
return;
}
// 跳转页面 // 跳转页面
url.value = `${path}${spm.value}${token.value}`;
navigateTo(`${path}${spm.value}`)
} }
/**
* spm路径
*
* @param path /product/detail.html
* @param id 128
* @param d
* {}{path}?spm=c.{ID}.{ID}.{ID}.{ID}.{timestamp}&token={token}
* @return https:///websoft.top/product/detail/128.html?spm=c.5.3057.10005.undefined&token=DDkr1PpE9DouIVMjLEMt9733QsgG7oNV
*/
export function getSpmUrl(path: string, d?: any, id = 0): string {
const domain = route.path;
const spm = ref<string>('');
const token = ref<string>();
const url = ref<string>();
const tid = d?.tenantId || 0;
const pid = d?.parentId || 0;
const cid = d?.categoryId || 0;
const uid = localStorage.getItem('UserId') || 0;
const timestamp = ref(Date.now() / 1000);
token.value = `&token=${localStorage.getItem('token')}`;
// TODO 封装租户ID和店铺ID
spm.value = `?spm=c.${uid}.${tid}.${pid}.${cid}.${id}.${timestamp.value}${token.value}`;
return spm.value;
// 单点登录控制台
export function loginAdminByToken(): void {
const sysDomain = useSysDomain();
openSpmUrl(`https://${sysDomain.value}/token-login`,undefined, 0, true,true)
} }

Loading…
Cancel
Save