Browse Source

修复已知问题

master
科技小王子 7 months ago
parent
commit
6c454f5880
  1. 2
      api/cms/article/model/index.ts
  2. 4
      api/shop/shopCart/model/index.ts
  3. 1
      api/system/company/model/index.ts
  4. 106
      api/system/orderGoods/index.ts
  5. 55
      api/system/orderGoods/model/index.ts
  6. 2
      components/AppFooter.vue
  7. 31
      components/AppHeader.vue
  8. 31
      components/CompanyList.vue
  9. 16
      components/UserCard.vue
  10. 4
      composables/configState.ts
  11. 4
      nuxt.config.ts
  12. 2
      pages/ask/[userId].vue
  13. 5
      pages/ask/index.vue
  14. 14
      pages/case/components/CardList.vue
  15. 4
      pages/components/Flash.vue
  16. 2
      pages/detail/components/PageBanner.vue
  17. 13
      pages/detail/index.vue
  18. 2
      pages/down/index.vue
  19. 2
      pages/item/components/Comments.vue
  20. 40
      pages/item/components/PageBanner.vue
  21. 105
      pages/item/index.vue
  22. 86
      pages/market/components/CardList.vue
  23. 75
      pages/market/index.vue
  24. 32
      pages/passport/login.vue
  25. 0
      pages/plug11/components/CardList.vue
  26. 0
      pages/plug11/components/PageBanner.vue
  27. 0
      pages/plug11/detail/[plugId].vue
  28. 0
      pages/plug11/detail/components/Header.vue
  29. 0
      pages/plug11/index.vue
  30. 105
      pages/product/[id].vue
  31. 77
      pages/product/components/CardList.vue
  32. 84
      pages/product/create/index.vue
  33. 39
      pages/product/index.vue
  34. 77
      pages/product/website.vue
  35. 11
      pages/templates/components/CardList.vue
  36. 23
      pages/user/components/Order.vue
  37. 17
      pages/user/order.vue
  38. 34
      utils/common.ts

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

@ -26,6 +26,8 @@ export interface Article {
image?: string;
// 附件
files?: string;
// 附件
fileList?: string[];
// 缩列图
thumbnail?: string;
// 视频地址

4
api/shop/shopCart/model/index.ts

@ -1,5 +1,6 @@
import type { PageParam } from '@/api';
import type {ShopOrderInfo} from "~/api/shop/shopOrderInfo/model";
import type {Company} from "~/api/system/company/model";
/**
*
@ -57,10 +58,11 @@ export interface ShopCartParam extends PageParam {
export interface MyCart {
num?: number,
type?: number;
payType?: number,
payPrice?: number,
month?: number,
comments?: string,
orderProduct?: ShopOrderInfo[],
list?: Company[],
totalPrice?: number
}

1
api/system/company/model/index.ts

@ -92,6 +92,7 @@ export interface Company {
installed?: boolean;
parameters?: CompanyParameter[];
links?: CompanyUrl[];
accounts?: CompanyUrl[];
gits?: CompanyGit[];
}

106
api/system/orderGoods/index.ts

@ -0,0 +1,106 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import type { OrderGoods, OrderGoodsParam } from './model';
import {SERVER_API_URL} from '@/config/setting';
/**
*
*/
export async function pageOrderGoods(params: OrderGoodsParam) {
const res = await request.get<ApiResult<PageResult<OrderGoods>>>(
SERVER_API_URL + '/system/order-goods/page',
{
params
}
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
*
*/
export async function listOrderGoods(params?: OrderGoodsParam) {
const res = await request.get<ApiResult<OrderGoods[]>>(
SERVER_API_URL + '/system/order-goods',
{
params
}
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
*
*/
export async function addOrderGoods(data: OrderGoods) {
const res = await request.post<ApiResult<unknown>>(
SERVER_API_URL + '/system/order-goods',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
*
*/
export async function updateOrderGoods(data: OrderGoods) {
const res = await request.put<ApiResult<unknown>>(
SERVER_API_URL + '/system/order-goods',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
*
*/
export async function removeOrderGoods(id?: number) {
const res = await request.delete<ApiResult<unknown>>(
SERVER_API_URL + '/system/order-goods/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
*
*/
export async function removeBatchOrderGoods(data: (number | undefined)[]) {
const res = await request.delete<ApiResult<unknown>>(
SERVER_API_URL + '/system/order-goods/batch',
{
data
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* id查询订单商品
*/
export async function getOrderGoods(id: number) {
const res = await request.get<ApiResult<OrderGoods>>(
SERVER_API_URL + '/system/order-goods/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}

55
api/system/orderGoods/model/index.ts

@ -0,0 +1,55 @@
import type { PageParam } from '@/api';
/**
*
*/
export interface OrderGoods {
// 订单号
id?: number;
// 订单类型,0商城 1应用插件
type?: number;
// 订单ID
orderId?: number;
// 项目ID
itemId?: number;
// 实际付款
payPrice?: string;
// 购买数量
totalNum?: number;
// 0未付款,1已付款
payStatus?: string;
// 0未完成,1已完成,2已取消,3取消中,4退款申请中,5退款被拒绝,6退款成功,7客户端申请退款
orderStatus?: number;
// 预约详情开始时间数组
startTime?: string;
// 是否已开具发票:0未开发票,1已开发票,2不能开具发票
isInvoice?: string;
// 发票流水号
invoiceNo?: string;
// 支付时间
payTime?: string;
// 过期时间
expirationTime?: string;
// 用户id
userId?: number;
// 备注
comments?: string;
// 排序号
sortNumber?: number;
// 是否删除, 0否, 1是
deleted?: number;
// 租户id
tenantId?: number;
// 修改时间
updateTime?: string;
// 创建时间
createTime?: string;
}
/**
*
*/
export interface OrderGoodsParam extends PageParam {
id?: number;
keywords?: string;
}

2
components/AppFooter.vue

@ -49,7 +49,7 @@
<el-collapse-item :title="item.title" :name="index">
<template v-if="item.children">
<template v-for="sub in item.children">
<a :href="sub.path" class="block cursor-pointer text-gray-600 hover:text-gray-900">aa{{ sub.title }}</a>
<a :href="sub.path" class="block cursor-pointer text-gray-600 hover:text-gray-900">{{ sub.title }}</a>
</template>
</template>
</el-collapse-item>

31
components/AppHeader.vue

@ -45,24 +45,24 @@
</el-sub-menu>
<el-menu-item v-else :index="`${item.path}`"><h3 @click="openSpmUrl(`${item.path}`,item,item.navigationId)">{{ item.title }}</h3></el-menu-item>
</template>
<el-menu-item v-if="user?.certification">
<el-space @click="loginDeveloperCenterByToken">
<h3>开发者中心</h3>
</el-space>
</el-menu-item>
<el-menu-item v-else>
<el-space @click="openSpmUrl(`/user/auth`)">
<h3>开发者中心</h3>
</el-space>
</el-menu-item>
<!-- <el-menu-item v-if="user?.certification">-->
<!-- <el-space @click="loginDeveloperCenterByToken({domain:'developer.websoft.top'})">-->
<!-- <h3>开发者中心</h3>-->
<!-- </el-space>-->
<!-- </el-menu-item>-->
<!-- <el-menu-item v-else>-->
<!-- <el-space @click="openSpmUrl(`https://developer.websoft.top`)">-->
<!-- <h3>开发者中心</h3>-->
<!-- </el-space>-->
<!-- </el-menu-item>-->
</el-menu>
</div>
</div>
<div class="header__right items-center pr-4 xl:pr-0 md:flex hidden">
<el-space class="sm:flex hidden" size="large" v-if="config.showSearchTools">
<!-- <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="token" @click="loginAdminByToken">控制台</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="token" @click="loginAdminByToken">控制台</el-button>-->
<ClientOnly>
<template v-if="token">
<el-dropdown @command="handleCommand">
@ -76,6 +76,7 @@
<el-dropdown-item command="password" @click="openSpmUrl(`/user/password`)">修改密码</el-dropdown-item>
<el-dropdown-item command="auth" @click="openSpmUrl(`/user/auth`)">实名认证</el-dropdown-item>
<el-dropdown-item command="order" @click="openSpmUrl(`/user/order`)">我的订单</el-dropdown-item>
<el-dropdown-item divided command="order" @click="loginDeveloperCenterByToken({domain:'developer.websoft.top'})">开发者中心</el-dropdown-item>
<el-dropdown-item divided command="logOut" @click="openSpmUrl('/user/logout')">退出登录
</el-dropdown-item>
</el-dropdown-menu>
@ -103,8 +104,8 @@
</el-dropdown-item>
</template>
<template v-if="token">
<el-dropdown-item divided @click="loginAdminByToken">控制台</el-dropdown-item>
<el-dropdown-item divided command="user" @click="navigateTo(`/user`)">账户中心</el-dropdown-item>
<el-dropdown-item divided @click="loginDeveloperCenterByToken">开发者中心</el-dropdown-item>
<!-- <el-dropdown-item divided command="user" @click="navigateTo(`/user`)">账户中心</el-dropdown-item>-->
<el-dropdown-item divided command="logOut" @click="navigateTo('/user/logout')">退出</el-dropdown-item>
</template>
<el-dropdown-item v-if="!token" divided @click="navigateTo(`/passport/login`)">登录</el-dropdown-item>

31
components/CompanyList.vue

@ -32,16 +32,23 @@
<el-avatar size="small" :src="item.companyLogo" />
<span class="text-gray-400 line-clamp-1 pr-2">{{ item.companyName }}</span>
</el-space>
<el-button type="warning" v-if="item.price" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">
<div class="flex items-center">
<span>{{ item.price }}</span>
<span v-if="item.chargingMethod == 2">/</span>
<span v-if="item.chargingMethod == 3">/</span>
<span v-if="item.chargingMethod == 4">/</span>
</div>
</el-button>
<el-button v-else type="success" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">立即开通
</el-button>
<!-- <el-button @click.stop="loginDeveloperCenterByToken(item)">控制台</el-button>-->
<template v-if="item.isBuy">
<el-button v-if="item.installed" @click.stop="openSpmUrl(`https://${item.domain}`,item,item.companyId,true)">控制台</el-button>
<el-button v-else type="success">立即开通</el-button>
</template>
<template v-else>
<el-button type="warning" v-if="item.price" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">
<div class="flex items-center">
<span>{{ item.price * 0.1 }}</span>
<span v-if="item.chargingMethod == 2">/</span>
<span v-if="item.chargingMethod == 3">/</span>
<span v-if="item.chargingMethod == 4">/</span>
</div>
</el-button>
<el-button v-else type="success" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">立即开通
</el-button>
</template>
</div>
</div>
</el-card>
@ -56,7 +63,7 @@
</template>
<script setup lang="ts">
import {openSpmUrl} from "~/utils/common";
import {loginAdminByToken, loginByToken, loginDeveloperCenterByToken, openSpmUrl} from "~/utils/common";
import {useServerRequest} from "~/composables/useServerRequest";
import type {ApiResult, PageResult} from "~/api";
import type {Company, CompanyParam} from "~/api/system/company/model";
@ -82,7 +89,7 @@ const list = ref<Company[]>([]);
//
const reload = async () => {
const {data: response} = await useServerRequest<ApiResult<PageResult<Company>>>('/system/company/pageAll', {
const {data: response} = await useServerRequest<ApiResult<PageResult<Company>>>('/system/company/page', {
params: props.param
})
if (response.value?.data) {

16
components/UserCard.vue

@ -42,14 +42,14 @@
>
关注
</el-button>
<el-tree-select
v-model="where.categoryId"
v-if="navigation?.length > 0"
:data="navigation"
placeholder="选择分类"
:render-after-expand="false"
style="width: 240px"
/>
<!-- <el-tree-select-->
<!-- v-model="where.categoryId"-->
<!-- v-if="navigation?.length > 0"-->
<!-- :data="navigation"-->
<!-- placeholder="选择分类"-->
<!-- :render-after-expand="false"-->
<!-- style="width: 240px"-->
<!-- />-->
<div class="w-[300px]">
<el-input
v-model="where.keywords"

4
composables/configState.ts

@ -53,6 +53,7 @@ export const useUser = () =>
userId: 0,
avatar: '',
phone: '',
balance: 0,
nickname: '',
gradeId: 0,
gradeName: '',
@ -75,11 +76,12 @@ export const useShowLogin = () => useState('showLogin',() => false)
export const useCart = () => useState<MyCart>('cart', () => {
return {
num: 1,
type: 1,
payType: 102,
payPrice: 0,
month: 1,
comments: '',
orderProduct: [],
list: [],
totalPrice: 0
};
});

4
nuxt.config.ts

@ -33,10 +33,10 @@ export default defineNuxtConfig({
public: {
// 开发环境配置
// tenantId: '5',
apiServer: 'http://127.0.0.1:30000/api',
// apiServer: 'http://127.0.0.1:30000/api',
// 生产环境
// apiServer: 'https://common-api.websoft.top/api',
apiServer: 'https://common-api.websoft.top/api',
globalTitle: '网宿软件',
domain: 'websoft.top'
},

2
pages/ask/[userId].vue

@ -1,5 +1,5 @@
<template>
<UserCard :form="form" title="社区" desc="1分享研发成果 交流技术经验" :avatar="user?.avatar"/>
<UserCard :form="form" title="社区" desc="分享研发成果 交流技术经验" :avatar="user?.avatar"/>
<CardList :list="list" :disabled="disabled" @done="onSearch" />
</template>
<script setup lang="ts">

5
pages/ask/index.vue

@ -57,7 +57,10 @@ const onSearch = () => {
//
const reload = async (path: string) => {
const {data: response} = await useServerRequest<ApiResult<PageResult<Article>>>('/cms/cms-article/page',{baseURL: runtimeConfig.public.apiServer, params: {
page: page.value,limit: 8, keywords: where.keywords
page: page.value,
limit: 8,
tenantId: getIdBySpm(1),
keywords: where.keywords
}})
if(response.value?.data){
if (list.value.length < response.value?.data.count) {

14
pages/case/components/CardList.vue

@ -11,7 +11,6 @@
<div class="text-gray-700 dark:text-white text-base font-semibold flex flex-col gap-1.5">
<div class="flex-1 text-xl cursor-pointer flex items-center">
{{ item.shortName }}
<el-tag v-if="item.chargingMethod === 0" size="small" type="success" class="text-white ml-2" effect="dark">免费</el-tag>
</div>
</div>
<div class="flex items-center gap-1.5 py-2 text-gray-500 justify-between">
@ -22,15 +21,8 @@
<el-avatar size="small" :src="item.companyLogo" />
<span class="text-gray-400 line-clamp-1 pr-2">{{ item.companyName }}</span>
</el-space>
<el-button type="warning" v-if="item.price" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">
<div class="flex items-center">
<span>{{ item.price }}</span>
<span v-if="item.chargingMethod == 2">/</span>
<span v-if="item.chargingMethod == 3">/</span>
<span v-if="item.chargingMethod == 4">/</span>
</div>
</el-button>
<el-button v-else type="success" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">立即开通
<el-button @click.stop="loginByToken(item)">
控制台
</el-button>
</div>
</div>
@ -45,7 +37,7 @@
</template>
<script setup lang="ts">
import {openSpmUrl} from "~/utils/common";
import {loginByToken, openSpmUrl} from "~/utils/common";
import type {Company} from "~/api/system/company/model";
const props = withDefaults(

4
pages/components/Flash.vue

@ -100,8 +100,8 @@
<div class="flex items-center">
<el-button size="large" type="primary" v-if="!token" :icon="ElIconArrowRight" @click="openSpmUrl(`/passport/login`, {},0,true)">立即开始</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/website/web.git`, {},0,true)">源码下载</el-button>
<el-button size="large" type="danger" @click="openSpmUrl(`/down`, {},123)">商业版演示</el-button>
<el-button size="large" type="success" :icon="ElIconDownload" @click="openSpmUrl(`http://git.gxwebsoft.com/free`, {},0,true)">源码下载</el-button>
<el-button size="large" type="danger" @click="openSpmUrl(`https://admin.websoft.top`, {},123)">商业版演示</el-button>
</div>
</div>
</div>

2
pages/detail/components/PageBanner.vue

@ -32,7 +32,7 @@
</h1>
<el-space class="mt-4 text-gray-500 dark:text-gray-400">
<el-avatar size="small" :src="form.logo" />
<span class="cursor-pointer text-gray-500" @click="navigateTo(`/ask/${form.userId}`)">{{ form.tenantName }}</span> · {{ dayjs(form.createTime).format('YYYY-MM-DD hh:mm') }}
<span class="cursor-pointer text-gray-500" @click="openSpmUrl(`/ask/${form.userId}`)">{{ form.tenantName }}</span> · {{ dayjs(form.createTime).format('YYYY-MM-DD hh:mm') }}
</el-space>
<!-- <el-space class="mt-4">-->

13
pages/detail/index.vue

@ -7,6 +7,17 @@
<template v-if="form.permission === 0 || showContent">
<div class="p-6 leading-7 bg-white md:rounded-lg text-lg line-height-loose text-gray-600 content">
<p v-html="form?.content"></p>
<template v-for="(item,index) in form.fileList" :key="index" class="text item">
<el-image
:src="item"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="form.fileList"
:initial-index="4"
fit="contain"
/>
</template>
</div>
</template>
<template v-if="form.permission === 1">
@ -92,6 +103,8 @@ const {form, assignFields} = useFormData<Article>({
image: undefined,
//
files: undefined,
//
fileList: [],
//
thumbnail: undefined,
//

2
pages/down/index.vue

@ -1,7 +1,7 @@
<template>
<PageBanner :layout="layout" :title="`演示中心`"
:desc="`拥抱开源、坚守品质;致力于打造安全稳定高可用的WEB应用!`"/>
<div class="text-3xl py-5">{{ count }}</div>
<!-- <div class="text-3xl py-5">{{ count }}</div>-->
<!-- <el-button @click="increment">点击</el-button>-->
<CardList :list="list" :disabled="disabled" @done="onSearch"/>
</template>

2
pages/item/components/Comments.vue

@ -104,7 +104,7 @@
<template #footer>
<div class="dialog-footer">
<el-button @click="visible2 = false">取消</el-button>
<el-button type="primary" @click="visible2 = false">
<el-button type="primary" @click="submitForm(formRef)">
提交
</el-button>
</div>

40
pages/item/components/PageBanner.vue

@ -45,22 +45,37 @@
<!-- {{ form.companyName || 'WebSoft Inc.' }}-->
<!-- </a>-->
<el-rate v-model="form.rate" disabled />
<div class="btn">
<div class="btn" v-if="form.companyId">
<el-space class="mt-4">
<template v-if="form.isBuy">
<el-button v-if="form.installed" @click.stop="openSpmUrl(`https://${form.domain}`,form,form.companyId,true)">进入控制台</el-button>
<el-button v-else type="success">立即开通</el-button>
</template>
<template v-else>
<el-button type="warning" v-if="form.price" @click.stop="openSpmUrl(`/product/create`,form,form.companyId,true)">
<div class="flex items-center">
<span>{{ form.price * 0.1 }}</span>
<span v-if="form.chargingMethod == 2">/</span>
<span v-if="form.chargingMethod == 3">/</span>
<span v-if="form.chargingMethod == 4">/</span>
</div>
</el-button>
<el-button v-else type="success" @click.stop="openSpmUrl(`/product/create`,form,form.companyId,true)">立即开通
</el-button>
</template>
<!-- 2. 已购买 @click="installPlug"-->
<!-- <el-button type="primary" @click="openSpmUrl(`https://${form.domain}`,form,form.companyId,true)">-->
<!-- 产品控制台-->
<!-- </el-button>-->
<!-- 1. 未购买 -->
<!-- <el-button-->
<!-- v-if="!form.isBuy && !form.price"-->
<!-- type="success"-->
<!-- @click="onBuy(form)"-->
<!-- @click="openSpmUrl(`/product/create`,form,form.companyId,true)"-->
<!-- >-->
<!-- 立即开通-->
<!-- </el-button>-->
<!-- 2. 已购买 @click="installPlug"-->
<el-button type="primary">
产品控制台
</el-button>
<el-button @click="openSpmUrl(`/ask`,form,form.companyId,true)">产品文档</el-button>
<!-- 3. 其他按钮 -->
<template v-for="(item,index) in form.links" :key="index">
@ -119,6 +134,7 @@ import {FullScreen} from '@element-plus/icons-vue'
import Breadcrumb from "~/components/Breadcrumb.vue";
import type {ApiResult} from "~/api";
import type {Company} from "~/api/system/company/model";
import {loginAdminByToken, openSpmUrl} from "~/utils/common";
const token = useToken();
@ -130,13 +146,7 @@ const props = withDefaults(
form?: Company;
value?: number;
}>(),
{
title: 'Templates',
desc: 'Explore community templates to get up and running in a few seconds.',
demoUrl: '/product/website',
buyUrl: 'https://github.com/websoft9/ansible-templates',
value: 4.2
}
{}
);
const emit = defineEmits<{

105
pages/item/index.vue

@ -12,38 +12,75 @@
</div>
</template>
<el-descriptions title="应用参数" :column="2" border>
<el-descriptions-item label="租户ID">{{form.tenantId}}</el-descriptions-item>
<el-descriptions-item label="插件ID">{{form.menuId || '-'}}</el-descriptions-item>
<el-descriptions-item label="名称">{{form.tenantName}}</el-descriptions-item>
<el-descriptions-item label="控制台"><a class="cursor-pointer" @click="openUrl(`https://${form.domain}`)">{{form.domain}}</a></el-descriptions-item>
<el-descriptions-item v-for="(item,index) in form.parameters" :key="index" :label="item.name">{{ item.value }}</el-descriptions-item>
</el-descriptions>
<div class="h-[24px]"></div>
<el-descriptions title="代码仓库" :column="1" border>
<el-descriptions-item v-for="(item,index) in form.gits" :key="index" :label="item.title">
<el-input v-model="item.domain" readonly />
</el-descriptions-item>
</el-descriptions>
<div class="h-[24px]"></div>
<el-descriptions title="安装说明" />
<p v-html="form.content" class="content"></p>
</el-card>
<el-card shadow="hover" v-if="form.files?.length" class="hover:border-green-50 hover:border-2 mb-5">
<template #header>
<div class="card-header font-bold text-xl">
<span>应用截图</span>
</div>
</template>
<div class="flex gap-xl">
<template v-for="(item,index) in form.files" :key="index" class="text item">
<el-image
:src="item.url"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="srcList"
:initial-index="4"
fit="contain"
/>
<template v-if="form.gits && form.gits.length > 0">
<div class="h-[24px]"></div>
<el-descriptions title="代码仓库" :column="1" border>
<el-descriptions-item v-for="(item,index) in form.gits" :key="index" :label="item.title">
<el-input v-model="item.domain" readonly />
</el-descriptions-item>
</el-descriptions>
</template>
<template v-if="form.accounts && form.accounts.length > 0">
<div class="h-[24px]"></div>
<el-descriptions title="演示账号" :column="1" border>
<template v-for="(item,index) in form.accounts" :key="index">
<el-descriptions-item :label="item.type" v-if="item.account">
<el-space>
<span>{{ item.domain }}</span>
<span>{{ item.account }}</span>
<span>{{ item.password }}</span>
</el-space>
</el-descriptions-item>
</template>
</el-descriptions>
</template>
</div>
</el-card>
<template v-if="form.content">
<div class="h-[24px]"></div>
<el-descriptions title="详细说明" />
<p v-html="form.content" class="content"></p>
</template>
<template v-if="form.files && form.files.length > 0">
<div class="h-[24px]"></div>
<el-descriptions title="应用截图" />
<div v-for="(item,index) in form.files" :key="index" class="text item">
<el-image
:src="item.url"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="srcList"
:initial-index="4"
fit="contain"
/>
</div>
</template>
</el-card>
<!-- <el-card shadow="hover" v-if="form.files?.length" class="hover:border-green-50 hover:border-2 mb-5">-->
<!-- <template #header>-->
<!-- <div class="card-header font-bold text-xl">-->
<!-- <span>应用截图</span>-->
<!-- </div>-->
<!-- </template>-->
<!-- <div class="flex gap-xl">-->
<!-- <template v-for="(item,index) in form.files" :key="index" class="text item">-->
<!-- <el-image-->
<!-- :src="item.url"-->
<!-- :zoom-rate="1.2"-->
<!-- :max-scale="7"-->
<!-- :min-scale="0.2"-->
<!-- :preview-src-list="srcList"-->
<!-- :initial-index="4"-->
<!-- fit="contain"-->
<!-- />-->
<!-- </template>-->
<!-- </div>-->
<!-- </el-card>-->
<!-- 产品评论 -->
<Comments :productId="form.companyId" :comments="comments" :count="commentsTotal" @done="doComments" />
</el-col>
@ -51,7 +88,7 @@
<el-card shadow="hover" class="hover:border-green-50 hover:border-2 mb-5">
<template #header>
<div class="card-header font-bold text-xl">
<span>开发者</span>
<span>开发者信息</span>
</div>
</template>
<el-space class="flex items-center">
@ -81,7 +118,7 @@ import type {ApiResult, PageResult} from "~/api";
import {useServerRequest} from "~/composables/useServerRequest";
import {useWebsite} from "~/composables/configState";
import type {BreadcrumbItem} from "~/types/global";
import {getIdBySpm} from "~/utils/common";
import {getIdBySpm, openUrl} from "~/utils/common";
import useFormData from "~/utils/use-form-data";
import PageBanner from './components/PageBanner.vue';
import Comments from './components/Comments.vue';
@ -152,6 +189,7 @@ const {form, assignFields} = useFormData<Company>({
planId: undefined,
sortNumber: undefined,
authoritative: undefined,
menuId: undefined,
merchantId: undefined,
tenantId: undefined,
tenantName: undefined,
@ -182,7 +220,10 @@ const {form, assignFields} = useFormData<Company>({
categoryName: undefined,
parameters: undefined,
links: undefined,
gits: undefined
accounts: undefined,
gits: undefined,
isBuy: undefined,
installed: undefined
});
const doComments = async (page: any) => {
commentsPage.value = page;

86
pages/market/components/CardList.vue

@ -0,0 +1,86 @@
<template>
<div class="xl:w-screen-xl sm:flex xl:p-0 p-4 m-auto relative">
<el-row :gutter="24" class="flex">
<template v-for="(item,index) in data?.list" :key="index">
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" class="mb-5 min-w-xs">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`/item`, item,item.companyId,true)">
<el-image
:src="item.image"
:fit="fit" :lazy="true" class="w-full md:h-[150px] h-[199px] cursor-pointer bg-gray-50"/>
<div class="flex-1 px-4 py-5 sm:p-6 !p-4">
<div class="text-gray-700 dark:text-white text-base font-semibold flex flex-col gap-1.5">
<div class="flex-1 text-xl cursor-pointer flex items-center">
{{ item.shortName }}
<el-tag v-if="item.chargingMethod === 0" size="small" type="success" class="text-white ml-2" effect="dark">免费</el-tag>
</div>
</div>
<div class="flex items-center gap-1.5 py-2 text-gray-500 justify-between">
<div class="text-gray-500 line-clamp-2">{{ item.comments }}</div>
</div>
<div class="button-group flex justify-between items-center mt-3">
<el-space class="flex items-end">
<el-avatar size="small" :src="item.companyLogo" />
<span class="text-gray-400 line-clamp-1 pr-2">{{ item.companyName }}</span>
</el-space>
<!-- <el-button @click.stop="loginDeveloperCenterByToken(item)">控制台</el-button>-->
<!-- 已购买 -->
<!-- <template v-if="item.isBuy">-->
<!-- <el-button v-if="item.isBuy && item.installed" type="success" @click.stop="openSpmUrl(`https://${item.domain}`,item,item.companyId,true)">进入控制台</el-button>-->
<!-- <el-button v-if="item.isBuy && !item.installed" type="primary" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">立即开通</el-button>-->
<!-- </template>-->
<!-- 未够买 -->
<!-- <template v-if="!item.isBuy">-->
<!-- <div class="flex items-center cursor-pointer" v-if="!item.isBuy" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">-->
<!-- <div class="flex items-center text-red-600">-->
<!-- <span>{{ item.price }}</span>-->
<!-- <span v-if="item.chargingMethod == 2">/</span>-->
<!-- <span v-if="item.chargingMethod == 3">/</span>-->
<!-- <span v-if="item.chargingMethod == 4">/</span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </template>-->
</div>
</div>
</el-card>
</el-col>
</template>
</el-row>
</div>
<div class="flex justify-center py-3">
<el-pagination background layout="prev, pager, next" :total="data?.count" @change="onPage" />
</div>
<!-- <div v-if="disabled" class="px-1 text-center text-gray-500">-->
<!-- 没有更多了-->
<!-- </div>-->
</template>
<script setup lang="ts">
import {openSpmUrl} from "~/utils/common";
import type {Company} from "~/api/system/company/model";
import type {PageResult} from "~/api";
const props = withDefaults(
defineProps<{
data?: PageResult<Company>;
disabled?: boolean;
fit?: any;
}>(),
{
fit: 'cover'
}
);
const emit = defineEmits<{
(e: 'done', index: number): void;
}>();
// const load = () => {
// if(!props.disabled){
// emit('done')
// }
// }
const onPage = (index: number) => {
emit('done',index)
}
</script>

75
pages/market/index.vue

@ -0,0 +1,75 @@
<template>
<PageBanner :layout="layout" :title="`${form?.categoryName}`" :desc="`${form?.comments}`" />
<CardList :param="{type: 0,official: true}" :data="data" :disabled="disabled" @done="onSearch" />
</template>
<script setup lang="ts">
import type {ApiResult, PageResult} from "~/api";
import {useServerRequest} from "~/composables/useServerRequest";
import {useWebsite} from "~/composables/configState";
import type {Navigation} from "~/api/cms/navigation/model";
import type {Company, CompanyParam} from "~/api/system/company/model";
import CardList from './components/CardList.vue';
import {getIdBySpm} from "~/utils/common";
const route = useRoute();
//
const runtimeConfig = useRuntimeConfig();
const data = ref<PageResult<Company>>();
const page = ref<number>(0);
const resultText = ref('');
const layout = ref<any>();
const disabled = ref<boolean>(false);
//
const form = ref<Navigation>();
//
const where = reactive<CompanyParam>({
keywords: ''
});
const onSearch = (index: number) => {
page.value = index;
reload();
}
//
const reload = async () => {
const {data: response} = await useServerRequest<ApiResult<PageResult<Company>>>('/system/company/page',{baseURL: runtimeConfig.public.apiServer, params: {
page: page.value,
limit: 12,
categoryId: getIdBySpm(5),
keywords: where.keywords
}})
if(response.value?.data){
data.value = response.value?.data;
}
}
const { data: nav } = await useServerRequest<ApiResult<Navigation>>(`/cms/cms-navigation/${getIdBySpm(5)}`)
if(nav.value?.data){
form.value = nav.value?.data;
useHead({
title: `${form.value.title} - WEBSOFT`,
bodyAttrs: {
class: "page-container",
}
});
}
//
if(form.value?.layout){
layout.value = JSON.parse(form.value?.layout)
}
watch(
() => getIdBySpm(5),
(id) => {
console.log(id,'id = .>>>>')
reload();
},
{ immediate: true }
);
</script>

32
pages/passport/login.vue

@ -325,7 +325,11 @@ const onSubmitBySms = async () => {
*/
const onRegister = async () => {
form.isAgree = false;
const {data: response} = await useServerRequest<ApiResult<LoginResult>>('/register',{baseURL: runtimeConfig.public.apiServer,method: "post",body: {
const loading = ElLoading.service({
lock: true,
text: 'Loading'
})
await useClientRequest<ApiResult<LoginResult>>('/register',{method: "post",body: {
companyName: '应用名称',
username: form.phone,
phone: form.phone,
@ -333,17 +337,20 @@ const onRegister = async () => {
code: form.code,
email: form.email,
isSuperAdmin: true
}})
//
if(response.value?.code == 0){
console.log(response.value)
ElMessage.success(response.value?.message)
await doLogin(response.value.data)
}
if(response.value?.code != 0){
ElMessage.error(response.value?.message)
await changeCaptcha()
}
}}).then(response => {
//
if(response?.code == 0){
loading.close();
ElMessage.success(response?.message)
doLogin(response.data)
}
if(response?.code != 0){
loading.close;
ElMessage.error(response?.message)
changeCaptcha()
}
})
}
@ -361,6 +368,7 @@ const doLogin = async (data: any) => {
user.value.gradeId = data.user.gradeId;
user.value.gradeName = data.user.gradeName;
user.value.avatar = data.user.avatar;
user.value.balance = data.user.balance;
localStorage.setItem('UserId',data.user.userId);
localStorage.setItem('Avatar',data.user.avatar);
localStorage.setItem('TID_ADMIN',data.user.tenantId);

0
pages/plug/components/CardList.vue → pages/plug11/components/CardList.vue

0
pages/plug/components/PageBanner.vue → pages/plug11/components/PageBanner.vue

0
pages/plug/detail/[plugId].vue → pages/plug11/detail/[plugId].vue

0
pages/plug/detail/components/Header.vue → pages/plug11/detail/components/Header.vue

0
pages/plug/index.vue → pages/plug11/index.vue

105
pages/product/[id].vue

@ -1,105 +0,0 @@
<template>
<!-- Banner -->
<Banner :layout="layout" />
333
<div class="container md:w-screen-xl m-auto">
<div class="flex flex-col" v-if="app">
<Breadcrumb :data="form" :title="`应用详情`" />
<div class="page-main w-full bg-white rounded-lg">
<div class="p-4 leading-7">
<div class="goods-info flex">
<el-avatar :src="app.appIcon" class="mr-2" size="large" />
<div class="flex flex-col ml-2">
<div class="text-lg">{{ app.appName }}</div>
<div class="text-gray-400 w-screen-lg">{{ app.comments }}</div>
<div>应用ID: <span class="text-blue-500">{{ app.appId }}</span></div>
<div>后台演示: <span class="text-blue-500">{{ app.adminUrl }}</span></div>
<div>前端演示: <span class="text-blue-500">{{ app.appUrl }}</span></div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 空白页 -->
<div class="mt-[60px]" v-if="!app">
<el-empty description="404 页面不存在"></el-empty>
</div>
</template>
<script setup lang="ts">
import { Search } from '@element-plus/icons-vue'
import type {ApiResult, PageResult} from "~/api";
import {useServerRequest} from "~/composables/useServerRequest";
import {useWebsite} from "~/composables/configState";
import type {Navigation} from "~/api/cms/navigation/model";
import {getIdByParam, getPath} from "~/utils/common";
import type {Company, CompanyParam} from "~/api/system/company/model";
import {navigateTo} from "#imports";
import Breadcrumb from "~/components/Breadcrumb.vue";
import type {App} from "~/api/oa/app/model";
const route = useRoute();
//
const runtimeConfig = useRuntimeConfig();
const resultText = ref('');
const layout = ref<any>();
//
const form = ref<Navigation>();
const website = useWebsite();
const app = ref<App>()
//
const where = reactive<CompanyParam>({
keywords: ''
});
const navTo = (item: Company) => {
navigateTo(`/market/${item.companyId}`)
}
//
const reload = async () => {
const { data: nav } = await useServerRequest<ApiResult<Navigation>>('/cms/cms-navigation/getNavigationByPath',{query: {path: getPath()}})
if(nav.value?.data){
form.value = nav.value?.data;
}
//
if(form.value?.layout){
layout.value = JSON.parse(form.value?.layout)
}
useHead({
title: `搜索结果 - ${website.value.websiteName}`,
bodyAttrs: {
class: "page-container",
}
});
await handleClick()
}
//
const handleClick = async () => {
const {data: response} = await useServerRequest<ApiResult<App>>(`/oa/oa-app/${getIdByParam()}`,{baseURL: runtimeConfig.public.apiServer})
if(response.value?.data){
if (response.value.data) {
app.value = response.value.data
}
if(!response.value){
resultText.value = '暂无相关结果'
}
}
}
watch(
() => route,
() => {
reload();
},
{ immediate: true }
);
</script>

77
pages/product/components/CardList.vue

@ -1,9 +1,10 @@
<template>
<div class="xl:w-screen-xl sm:flex xl:p-0 p-4 m-auto relative" v-infinite-scroll="load">
<div class="xl:w-screen-xl sm:flex xl:p-0 p-4 m-auto relative">
<el-row :gutter="24" class="flex">
<template v-for="(item,index) in list" :key="index">
<template v-for="(item,index) in data?.list" :key="index">
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" class="mb-5 min-w-xs">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`/item`, item,item.companyId,true)">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer"
@click="openSpmUrl(`/item`, item,item.companyId,true)">
<el-image
:src="item.image"
:fit="fit" :lazy="true" class="w-full md:h-[150px] h-[199px] cursor-pointer bg-gray-50"/>
@ -11,7 +12,9 @@
<div class="text-gray-700 dark:text-white text-base font-semibold flex flex-col gap-1.5">
<div class="flex-1 text-xl cursor-pointer flex items-center">
{{ item.shortName }}
<el-tag v-if="item.chargingMethod === 0" size="small" type="success" class="text-white ml-2" effect="dark">免费</el-tag>
<el-tag v-if="item.chargingMethod === 0" size="small" type="success" class="text-white ml-2"
effect="dark">免费
</el-tag>
</div>
</div>
<div class="flex items-center gap-1.5 py-2 text-gray-500 justify-between">
@ -19,19 +22,37 @@
</div>
<div class="button-group flex justify-between items-center mt-3">
<el-space class="flex items-end">
<el-avatar size="small" :src="item.companyLogo" />
<el-avatar size="small" :src="item.companyLogo"/>
<span class="text-gray-400 line-clamp-1 pr-2">{{ item.companyName }}</span>
</el-space>
<el-button type="warning" v-if="item.price" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">
<div class="flex items-center">
<span>{{ item.price }}</span>
<span v-if="item.chargingMethod == 2">/</span>
<span v-if="item.chargingMethod == 3">/</span>
<span v-if="item.chargingMethod == 4">/</span>
</div>
</el-button>
<el-button v-else type="success" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">立即开通
</el-button>
<!-- <el-button @click.stop="loginByToken(item)">控制台</el-button>-->
<!-- <el-button type="warning" v-if="item.price" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">-->
<!-- <div class="flex items-center">-->
<!-- <span>{{ item.price * 0.1 }}</span>-->
<!-- <span v-if="item.chargingMethod == 2">/</span>-->
<!-- <span v-if="item.chargingMethod == 3">/</span>-->
<!-- <span v-if="item.chargingMethod == 4">/</span>-->
<!-- </div>-->
<!-- </el-button>-->
<!-- <el-button v-else type="success" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">立即开通-->
<!-- </el-button>-->
<template v-if="item.isBuy">
<el-button v-if="item.installed" @click.stop="openSpmUrl(`https://${item.domain}`,item,item.companyId,true)">进入控制台</el-button>
<el-button v-else type="success">立即开通</el-button>
</template>
<template v-else>
<el-button type="warning" v-if="item.price" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">
<div class="flex items-center">
<span>{{ item.price * 0.1 }}</span>
<span v-if="item.chargingMethod == 2">/</span>
<span v-if="item.chargingMethod == 3">/</span>
<span v-if="item.chargingMethod == 4">/</span>
</div>
</el-button>
<el-button v-else type="success" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">立即开通
</el-button>
</template>
</div>
</div>
</el-card>
@ -39,18 +60,22 @@
</template>
</el-row>
</div>
<div v-if="disabled" class="px-1 text-center text-gray-500 min-h-xs">
没有更多了
<div class="flex justify-center py-3">
<el-pagination background layout="prev, pager, next" :total="data?.count" @change="onPage"/>
</div>
<!-- <div v-if="disabled" class="px-1 text-center text-gray-500">-->
<!-- 没有更多了-->
<!-- </div>-->
</template>
<script setup lang="ts">
import {openSpmUrl} from "~/utils/common";
import {loginAdminByToken, loginByToken, openSpmUrl} from "~/utils/common";
import type {Company} from "~/api/system/company/model";
import type {PageResult} from "~/api";
const props = withDefaults(
defineProps<{
list?: Company[];
data?: PageResult<Company>;
disabled?: boolean;
fit?: any;
}>(),
@ -60,12 +85,16 @@ const props = withDefaults(
);
const emit = defineEmits<{
(e: 'done'): void;
(e: 'done', index: number): void;
}>();
const load = () => {
if(!props.disabled){
emit('done')
}
// const load = () => {
// if(!props.disabled){
// emit('done')
// }
// }
const onPage = (index: number) => {
emit('done', index)
}
</script>

84
pages/product/create/index.vue

@ -106,8 +106,8 @@
<el-radio-button :value="0" border>余额支付</el-radio-button>
</el-radio-group>
</div>
<div class="flex justify-center py-4">
<el-avatar v-if="cart.payType == 102" :size="250" :src="wxPayQrCode"
<div class="flex justify-center py-4" v-if="cart.payType == 102">
<el-avatar :size="250" :src="wxPayQrCode"
shape="square"/>
</div>
<template #footer>
@ -116,19 +116,20 @@
使用微信扫码完成支付
</el-tag>
</div>
<div class="flex justify-center pb-12" v-if="cart.payType === 0">
<el-space class="flex justify-between">
<el-input type="password" v-model="payPassword" maxlength="6" show-password placeholder="请输入支付密码" />
<el-button type="danger" @click="onDone">
确定
<div class="flex flex-col justify-center w-1/2 m-auto pb-12" v-if="cart.payType === 0">
<span class="py-2 text-center">可用余额{{ userInfo?.balance || 0.00 }}</span>
<div class="flex flex-col">
<el-input type="password" class="py-2" size="large" v-model="payPassword" maxlength="6" show-password placeholder="请输入支付密码" />
<el-button type="danger" class="py-2 my-3" size="large" @click="onDone">
确定支付
</el-button>
</el-space>
</div>
</div>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import {useConfigInfo, useToken, useWebsite} from "~/composables/configState";
import {useConfigInfo, useToken, useUser, useWebsite} from "~/composables/configState";
import useFormData from '@/utils/use-form-data';
import type {User} from '@/api/system/user/model';
import {ref} from 'vue'
@ -153,7 +154,7 @@ const payPassword = ref<string>()
const formRef = ref<FormInstance>()
const config = useConfigInfo();
const token = useToken();
const userInfo = ref<User>();
const userInfo = useUser();
const cart = useCart();
const qrOptions = ref({
width: 200, //
@ -320,32 +321,19 @@ const reload = async () => {
navigateTo(`/passport/login`)
return false;
}
// useClientRequest(`/auth/user`, {}).then(res => {
// if(res?.data?.balance){
// cart.value.balance = res?.data?.balance;
// }
// })
const {data: response} = await useServerRequest<ApiResult<Company>>(`/system/company/${getIdBySpm(5)}`, {baseURL: runtimeConfig.public.apiServer})
console.log(response.value?.data,'response')
if (response.value?.data) {
assignFields(response.value?.data);
form.categoryName = '选择套餐';
cart.value.comments = `购买${response.value?.data.shortName}`;
if(response.value?.data.price){
cart.value.payPrice = response.value?.data.price;
cart.value.comments = `购买${response.value?.data.shortName}`;
computeTotalPrice();
// let goodsName = '';
// if(form.type == 0){
// goodsName = `${form.title}`
// }
// if(form.type == 1){
// goodsName = `${form.title}`
// }
// cart.value.orderProduct?.push({
// goodsId: form.productId,
// goodsName: goodsName,
// image: form.image,
// price: response.value?.data.price,
// totalPrice: cart.value.totalPrice,
// num: cart.value.num,
// month: cart.value?.month,
// payType: cart.value.payType
// });
}
useHead({
title: `${form.shortName}`,
@ -378,20 +366,40 @@ const submitForm = async (formEl: FormInstance | undefined) => {
// })
}
//
//
const onDone = () => {
useClientRequest<ApiResult<any>>(`/system/menu/install`, {
cart.value.type = 1;
cart.value.list = [];
cart.value.list?.push(form);
useClientRequest<ApiResult<any>>(`/system/order/createOrder`, {
method: 'POST',
body: {
companyId: getIdBySpm(5)
}
body: cart.value
}).then(res => {
if (res.code == 0) {
ElMessage.success(res.message)
} else {
return ElMessage.error(res.message)
if(res.code == 0){
ElMessage.success(res.message);
visible.value = !visible.value;
}
if(res.code == 1){
ElMessage.error(res.message);
}
}).catch(res => {
})
// useClientRequest<ApiResult<any>>(`/system/menu/install`, {
// method: 'POST',
// body: {
// companyId: getIdBySpm(5)
// }
// }).then(res => {
// if (res.code == 0) {
// ElMessage.success(res.message)
// } else {
// return ElMessage.error(res.message)
// }
// })
}
watch(

39
pages/product/index.vue

@ -1,6 +1,6 @@
<template>
<PageBanner :layout="layout" :title="`${form?.categoryName}`" :desc="`${form?.comments}`" />
<CardList :param="{type: 0,official: true}" :list="list" :disabled="disabled" @done="onSearch" />
<CardList :param="{type: 0}" :data="data" :disabled="disabled" @done="onSearch" />
</template>
<script setup lang="ts">
import type {ApiResult, PageResult} from "~/api";
@ -9,13 +9,14 @@ import {useWebsite} from "~/composables/configState";
import type {Navigation} from "~/api/cms/navigation/model";
import type {Company, CompanyParam} from "~/api/system/company/model";
import CardList from './components/CardList.vue';
import {getIdBySpm} from "~/utils/common";
const route = useRoute();
//
const runtimeConfig = useRuntimeConfig();
const list = ref<Company[]>([]);
const page = ref<number>(1);
const data = ref<PageResult<Company>>();
const page = ref<number>(0);
const resultText = ref('');
const layout = ref<any>();
const disabled = ref<boolean>(false);
@ -28,32 +29,21 @@ const where = reactive<CompanyParam>({
keywords: ''
});
const onSearch = () => {
if(!disabled.value){
page.value++;
reload(route.path);
}
const onSearch = (index: number) => {
page.value = index;
reload();
}
//
const reload = async (path: string) => {
const reload = async () => {
const {data: response} = await useServerRequest<ApiResult<PageResult<Company>>>('/system/company/page',{baseURL: runtimeConfig.public.apiServer, params: {
page: page.value,
limit: 8,
limit: 12,
categoryId: getIdBySpm(5),
keywords: where.keywords
}})
if(response.value?.data){
if (list.value.length < response.value?.data.count) {
disabled.value = false;
if (response.value?.data.list) {
list.value = list.value.concat(response.value?.data.list);
}
}else {
disabled.value = true;
}
if(response.value.data.count == 0){
resultText.value = '暂无相关结果'
}
data.value = response.value?.data;
}
}
@ -75,9 +65,10 @@ if(form.value?.layout){
watch(
() => route.path,
(path) => {
reload(path);
() => getIdBySpm(5),
(id) => {
console.log(id,'id = .>>>>')
reload();
},
{ immediate: true }
);

77
pages/product/website.vue

@ -1,77 +0,0 @@
<template>
<!-- Banner -->
<Banner :layout="layout" />
<!-- 简单模式 -->
<PageContainer :form="form" :layout="layout" />
<!-- 高级模式 -->
<div class="flex flex-col" v-if="layout?.showLayout">
{{ layout }}
</div>
</template>
<script setup lang="ts">
import type {ApiResult} from "~/api";
import {useServerRequest} from "~/composables/useServerRequest";
import {useConfigInfo, useForm, useToken, useWebsite} from "~/composables/configState";
import Breadcrumb from "~/components/Breadcrumb.vue";
import type {BreadcrumbItem} from "~/types/global";
import type {Navigation} from "~/api/cms/navigation/model";
import {getIdBySpm} from "~/utils/common";
import PageContainer from "~/components/PageContainer.vue";
//
const route = useRoute();
const website = useWebsite();
const config = useConfigInfo();
const token = useToken();
const form = useForm();
const breadcrumb = ref<BreadcrumbItem>();
const layout = ref<any>();
//
const reload = async () => {
// spm()
const { data: nav } = await useServerRequest<ApiResult<Navigation>>('/cms/cms-navigation/' + getIdBySpm(5))
if (nav.value?.data) {
form.value = nav.value.data
}else{
const { data: nav } = await useServerRequest<ApiResult<Navigation>>('/cms/cms-navigation/getNavigationByPath',{query: {path: route.path}})
if(nav.value?.data){
form.value = nav.value?.data;
}
}
//
if(form.value?.layout){
layout.value = JSON.parse(form.value?.layout)
}
// seo
useHead({
title: `${form.value.title} - ${website.value.websiteName}`,
meta: [{ name: form.value.design?.keywords, content: form.value.design?.description }],
bodyAttrs: {
class: "page-container",
},
script: [
{
children: `console.log(${JSON.stringify(form.value)})`,
},
],
});
//
breadcrumb.value = form.value
}
watch(
() => route.path,
(path) => {
console.log(path,'=>Path')
reload();
},
{ immediate: true }
);
</script>

11
pages/templates/components/CardList.vue

@ -11,7 +11,6 @@
<div class="text-gray-700 dark:text-white text-base font-semibold flex flex-col gap-1.5">
<div class="flex-1 text-xl cursor-pointer flex items-center">
{{ item.shortName }}
<el-tag v-if="item.chargingMethod === 0" size="small" type="success" class="text-white ml-2" effect="dark">免费</el-tag>
</div>
</div>
<div class="flex items-center gap-1.5 py-2 text-gray-500 justify-between">
@ -22,16 +21,6 @@
<el-avatar size="small" :src="item.companyLogo" />
<span class="text-gray-400 line-clamp-1 pr-2">{{ item.companyName }}</span>
</el-space>
<el-button type="warning" v-if="item.price" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">
<div class="flex items-center">
<span>{{ item.price }}</span>
<span v-if="item.chargingMethod == 2">/</span>
<span v-if="item.chargingMethod == 3">/</span>
<span v-if="item.chargingMethod == 4">/</span>
</div>
</el-button>
<el-button v-else type="success" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">立即开通
</el-button>
</div>
</div>
</el-card>

23
pages/user/components/Order.vue

@ -1,13 +1,18 @@
<template>
<el-table :data="tableData" class="sm:py-2 w-full">
<el-table-column prop="date" label="下单日期" width="180" />
<el-table-column prop="name" label="产品名称" width="180" />
<el-table-column prop="address" label="订单信息" />
<el-table :data="tableData">
<el-table-column prop="orderId" label="订单号" />
<el-table-column prop="comments" label="产品名称" />
<el-table-column prop="payPrice" label="订单金额" />
<el-table-column prop="month" label="购买时长(月)" />
<el-table-column prop="createTime" label="下单时间" />
<el-table-column prop="action" label="操作" />
</el-table>
</template>
<script setup lang="ts">
import {ref} from "vue";
import type {ApiResult, PageResult} from "~/api";
import type {OrderGoods} from "~/api/system/orderGoods/model";
withDefaults(
defineProps<{
@ -18,8 +23,16 @@ withDefaults(
{}
);
const tableData = ref<any[]>();
const tableData = ref<OrderGoods[]>([]);
const {data: response} = await useServerRequest<ApiResult<PageResult<OrderGoods>>>('/system/order-goods/page',{
params: {
userId: localStorage.getItem('UserId')
}
})
if(response.value?.data){
tableData.value = response.value.data.list;
}
</script>
<style scoped lang="less">

17
pages/user/order.vue

@ -4,9 +4,9 @@
<div class="m-auto flex sm:flex-row flex-col sm:p-0 p-3">
<!-- 用户菜单 -->
<UserMenu :activeIndex="activeIndex" @done="onDone" />
<div class="flash bg-white rounded-lg w-full">
<div class=" bg-white rounded-lg w-full">
<div class="title text-xl text-gray-700 md:px-8 p-4 md:mt-3 font-500">订单列表</div>
<div class="sm:w-screen-md w-full sm:px-4 sm:py-2">
<div class="flash bg-white rounded-lg px-8 py-4 w-auto">
<Order :form="form" />
</div>
</div>
@ -22,6 +22,7 @@ import {useServerRequest} from "~/composables/useServerRequest";
import type {ApiResult} from "~/api";
import UserMenu from "./components/UserMenu.vue";
import Order from './components/Order.vue';
import Auth from "~/pages/user/auth.vue";
//
const runtimeConfig = useRuntimeConfig();
@ -74,18 +75,18 @@ const reload = async () => {
navigateTo('/passport/login');
return false;
}
const {data: response} = await useServerRequest<ApiResult<User>>('/auth/user',{baseURL: runtimeConfig.public.apiServer})
if(response.value?.data){
userInfo.value = response.value?.data;
assignFields(response.value?.data);
}
// const {data: response} = await useServerRequest<ApiResult<Order>>('/system/order',{baseURL: runtimeConfig.public.apiServer})
// if(response.value?.data){
// console.log(response.value,'order')
// // userInfo.value = response.value?.data;
// // assignFields(response.value?.data);
// }
}
watch(
() => route.path,
(path) => {
activeIndex.value = path;
console.log(path,'=>Path')
reload();
},
{ immediate: true }

34
utils/common.ts

@ -1,4 +1,5 @@
import { v4 as uuidv4 } from 'uuid';
import type {Company} from "~/api/system/company/model";
const route = useRoute();
/**需要进行持久化的数据:把需要持久化的数据放在下面这个对象中,才会持久化,不需要持久化的数据就不用放到这里了。 */
@ -115,13 +116,12 @@ export function openSpmUrl(p: string, d?: any, id = 0, isOpen?: boolean, isToken
const cid = d?.categoryId || 0;
const uid = localStorage.getItem('UserId') || 0;
const timestamp = ref(Date.now() / 1000);
let token = uuidv4();
let token = '';
// TODO 登录控制台
if(isToken){
token = `${localStorage.getItem('token')}`;
token = `&token=${localStorage.getItem('token')}`;
}
// TODO 判断模型
if(d?.articleId){
model.value = 'a';
@ -145,8 +145,12 @@ export function openSpmUrl(p: string, d?: any, id = 0, isOpen?: boolean, isToken
path.value = p;
itemId.value = id;
}
if(d?.model === 'links'){
window.open(d.path,'_blank');
return;
}
// TODO 封装spm
spm.value = `?spm=${model.value}.${tid}.${mid}.${pid}.${cid}.${itemId.value}.${uid}.${timestamp.value}&token=${token}`;
spm.value = `?spm=${model.value}.${tid}.${mid}.${pid}.${cid}.${itemId.value}.${uid}.${timestamp.value}${token}`;
// TODO 账号密码
if(d?.account || d?.password){
@ -173,11 +177,23 @@ export function loginAdminByToken(): void {
// 单点登录开发者中心
export function loginDeveloperCenterByToken(): void {
export function loginDeveloperCenterByToken(item: Company): void {
const user = useUser();
const uid = user.value?.userId;
const tenantId = Number(user.value?.tenantId);
openSpmUrl(`https://developer.websoft.top/token-login`,undefined, tenantId, true,true)
const token = localStorage.getItem('token');
if(!token){
window.open(`https://${item.domain}`, '_blank')
return;
}
openSpmUrl(`https://${item.domain}/token-login`,undefined, tenantId, true,true)
}
// 单点登录应用控制台
export function loginByToken(item: Company): void {
const user = useUser();
const tenantId = Number(user.value?.tenantId);
const token = localStorage.getItem('token');
window.open(`https://${item.domain}`, '_blank')
}
export function getSpmUrl(path: string, d?: any, id = 0): string {
@ -195,3 +211,7 @@ export function getSpmUrl(path: string, d?: any, id = 0): string {
spm.value = `?spm=${model.value}.${tid}.${mid}.${pid}.${cid}.${id}.${uid}.${timestamp.value}&token=${token}`;
return `${path}${spm.value}`
}
export function openUrl(url: string) {
window.open(url, '_blank')
}

Loading…
Cancel
Save