Browse Source

修复已知问题

master^2
科技小王子 6 months ago
parent
commit
b5896bc69c
  1. 19
      components/CompanyList.vue
  2. 4
      pages/components/Flash.vue
  3. 3
      pages/index.vue
  4. 30
      pages/item/components/PageBanner.vue
  5. 105
      pages/passport/login.vue
  6. 71
      pages/plug11/components/CardList.vue
  7. 115
      pages/plug11/components/PageBanner.vue
  8. 114
      pages/plug11/detail/[plugId].vue
  9. 99
      pages/plug11/detail/components/Header.vue
  10. 84
      pages/plug11/index.vue
  11. 45
      pages/product/components/CardList.vue
  12. 30
      pages/product/create/index.vue

19
components/CompanyList.vue

@ -32,13 +32,15 @@
<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" @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>-->
<template v-if="item.isBuy">
<el-button v-if="item.installed" type="primary" @click.stop="loginDeveloperCenterByToken(item)">控制台</el-button>
<el-button v-else type="primary" @click.stop="loginDeveloperCenterByToken(item)">控制台</el-button>
</template>
<template v-else>
<el-button v-if="item.chargingMethod == 0" type="primary" @click.stop="loginDeveloperCenterByToken(item)">控制台</el-button>
<el-button v-else type="warning" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">立即开通
</el-button>
</template>
<!-- <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>-->
@ -47,9 +49,6 @@
<!-- <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>

4
pages/components/Flash.vue

@ -98,10 +98,10 @@
<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 items-center">
<el-button size="large" type="primary" :icon="ElIconArrowRight" @click="openSpmUrl(`/product/create`, {},10297,true)">立即开始</el-button>
<el-button size="large" type="primary" :icon="ElIconArrowRight" @click="openSpmUrl(`/passport/login`)">立即开始</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/free`, {},0,true)">源码下载</el-button>
<el-button size="large" type="danger" @click="openSpmUrl(`https://admin.websoft.top`, {},123)">商业版演示</el-button>
<el-button size="large" type="danger" @click="openSpmUrl(`https://website.websoft.top`, {},123)">商业版演示</el-button>
</div>
</div>
</div>

3
pages/index.vue

@ -2,7 +2,8 @@
<Flash/>
<CompanyList :param="{official: true,recommend: true,limit: 4}" :fit="`cover`" title="产品服务" comments="拥抱开源、坚守品质;致力于打造安全稳定高可用的WEB应用!"/>
<CompanyList :param="{official: true,recommend: true,limit: 4}" :fit="`cover`" />
<!-- <ProductList :param="{type:0, official: true,limit: 4}" :fit="`cover`" title="产品服务" comments="拥抱开源、坚守品质;致力于打造安全稳定高可用的WEB应用!"/>-->

30
pages/item/components/PageBanner.vue

@ -47,24 +47,16 @@
<el-rate v-model="form.rate" disabled />
<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>-->
<el-button type="warning" @click.stop="openSpmUrl(`/product/create`,form,form.companyId,true)">立即开通</el-button>
<el-button @click.stop="openSpmUrl(`https://${form.domain}`,form,form.companyId,true)">产品控制台</el-button>
<template v-if="form.isBuy">
<el-button v-if="form.installed" type="primary" @click.stop="loginDeveloperCenterByToken(form)">控制台</el-button>
<el-button v-else type="primary" @click.stop="loginDeveloperCenterByToken(form)">控制台</el-button>
</template>
<template v-else>
<el-button v-if="form.chargingMethod == 0" type="primary" @click.stop="loginDeveloperCenterByToken(form)">控制台</el-button>
<el-button v-else type="warning" @click.stop="openSpmUrl(`/product/create`,form,form.companyId,true)">立即开通
</el-button>
</template>
<!-- <el-button @click.stop="openSpmUrl(`https://${form.domain}`,form,form.companyId,true)">产品控制台</el-button>-->
<el-button @click="openSpmUrl(`/ask`,form,form.companyId,true)">帮助文档</el-button>
<!-- <template v-for="(item,index) in form.links" :key="index">-->
<!-- <div v-if="item.qrcode">-->
@ -106,7 +98,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";
import {loginAdminByToken, loginDeveloperCenterByToken, openSpmUrl} from "~/utils/common";
const token = useToken();

105
pages/passport/login.vue

@ -15,17 +15,17 @@
<el-tabs v-model="activeName" class="demo-tabs ">
<el-tab-pane label="账号登录" name="account">
<div class="custom-style my-4">
<el-form :model="form" label-width="auto" class="w-[330px]">
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="auto" class="w-[330px]">
<!-- <el-form-item>-->
<!-- <el-input class="w-full" size="large" placeholder="租户ID" :prefix-icon="Shop" v-model="form.tenantId" />-->
<!-- </el-form-item>-->
<el-form-item>
<el-form-item prop="username">
<el-input class="w-full" size="large" placeholder="登录账号" :prefix-icon="Avatar" v-model="form.username" />
</el-form-item>
<el-form-item>
<el-form-item prop="password">
<el-input type="password" size="large" maxlength="100" placeholder="登录密码" :prefix-icon="Briefcase" v-model="form.password" />
</el-form-item>
<el-form-item>
<el-form-item prop="code">
<el-space class="flex justify-between w-full">
<el-input size="large" placeholder="图形验证码" maxlength="5" v-model="form.code" @keyup.enter.prevent="onSubmit" />
<el-image alt="" :src="captcha" @click="changeCaptcha" />
@ -43,13 +43,13 @@
</el-tab-pane>
<el-tab-pane label="短信登录" name="sms">
<div class="custom-style my-4">
<el-form :model="form" label-width="auto" class="w-[330px]">
<el-form-item>
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="auto" class="w-[330px]">
<el-form-item prop="phone">
<el-input class="w-full" size="large" maxlength="11" placeholder="请输入手机号码" v-model="form.phone">
<template #prepend>+86</template>
</el-input>
</el-form-item>
<el-form-item>
<el-form-item prop="code">
<el-space class="flex justify-between w-full">
<el-input size="large" placeholder="短信验证码" maxlength="6" class="w-full" v-model="form.code" @keyup.enter.prevent="onSubmitBySms" />
<el-button size="large" class="w-full" :disabled="!!countdownTime" @click="checkUser">
@ -82,8 +82,8 @@
<el-tabs v-model="activeName" class="demo-tabs ">
<el-tab-pane label="注册账号" name="sms">
<div class="custom-style ">
<el-form :model="form" label-width="auto" class="w-[330px]">
<el-form-item>
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="auto" class="w-[330px]">
<el-form-item prop="phone">
<span class="text-sm text-gray-400 mb-4">
未注册手机号验证通过后将自动注册
</span>
@ -91,7 +91,7 @@
<template #prepend>+86</template>
</el-input>
</el-form-item>
<el-form-item>
<el-form-item prop="code">
<el-space class="flex justify-between w-full">
<el-input size="large" placeholder="短信验证码" maxlength="6" class="w-full" v-model="form.code" />
<el-button size="large" class="w-full" :disabled="!!countdownTime" @click="checkUser">
@ -100,10 +100,10 @@
</el-button>
</el-space>
</el-form-item>
<el-form-item>
<el-input class="w-full" size="large" placeholder="公司名称|品牌名称" v-model="form.companyName" />
<el-form-item prop="companyName">
<el-input class="w-full" size="large" placeholder="企业名称" v-model="form.companyName" />
</el-form-item>
<el-form-item>
<el-form-item prop="email">
<el-input class="w-full" size="large" placeholder="邮箱地址" v-model="form.email" />
</el-form-item>
<el-form-item>
@ -163,10 +163,13 @@ import {useConfigInfo, useToken, useUser, useWebsite} from "~/composables/config
import useFormData from '@/utils/use-form-data';
import type { User } from '@/api/system/user/model';
import { ref } from 'vue'
import type {FormInstance, FormRules, UploadProps, UploadUserFile} from 'element-plus'
import { Shop, Key, Avatar, Briefcase } from '@element-plus/icons-vue'
import {useServerRequest} from "~/composables/useServerRequest";
import type {ApiResult} from "~/api";
import type {CaptchaResult, LoginResult} from "~/api/passport/login/model";
import type {ShopMerchantApply} from "~/api/shop/shopMerchantApply/model";
import {useClientRequest} from "~/composables/useClientRequest";
//
const runtimeConfig = useRuntimeConfig();
@ -174,6 +177,7 @@ const website = useWebsite();
const config = useConfigInfo();
const token = useToken();
const user = useUser();
const formRef = ref<FormInstance>()
const activeName = ref('account')
@ -197,15 +201,15 @@ if(getIdBySpm(0) == 'register'){
}
//
const { form } = useFormData<User>({
const { form,assignFields, resetFields } = useFormData<User>({
userId: undefined,
companyName: undefined,
email: undefined,
username: '',
phone: '',
password: '',
code: '',
smsCode: '',
username: undefined,
phone: undefined,
password: undefined,
code: undefined,
smsCode: undefined,
isAgree: false,
remember: true,
isSuperAdmin: true
@ -232,6 +236,33 @@ const checkUser = async () => {
}
};
//
const rules = reactive<FormRules<User>>({
phone: [
{required: true, message: '请输入手机号码', trigger: 'blur'},
{pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur'},
],
password: [
{required: true, message: '请输入密码', trigger: 'blur'},
],
code: [
{required: true, message: '请输入验证码', trigger: 'blur'},
],
smsCode: [
{required: true, message: '请输入短信验证码', trigger: 'blur'},
],
username: [
{required: true, message: '请输入用户名', trigger: 'blur'},
],
companyName: [
{required: true, message: '请输入公司名称', trigger: 'blur'},
],
email: [
{required: true, message: '请输入邮箱', trigger: 'blur'},
{pattern: /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/, message: '请输入正确的邮箱', trigger: 'blur'},
]
})
/* 发送短信验证码 */
const sendCode = async () => {
@ -297,6 +328,18 @@ useHead({
* 执行登录
*/
const onSubmit = async () => {
if(!form.username){
ElMessage.error('请填登录账号')
return;
}
if(!form.password){
ElMessage.error('请填密码')
return;
}
if(!form.code){
ElMessage.error('请填验证码')
return;
}
const {data: response} = await useServerRequest<ApiResult<LoginResult>>('/login',{baseURL: runtimeConfig.public.apiServer,method: "post",body: form})
//
if(response.value?.code == 0){
@ -313,6 +356,14 @@ const onSubmit = async () => {
* 短信验证码登录
*/
const onSubmitBySms = async () => {
if(!form.phone){
ElMessage.error('请填手机号码')
return;
}
if(!form.code){
ElMessage.error('请填验证码')
return;
}
const {data: response} = await useServerRequest<ApiResult<LoginResult>>('/loginBySms',{baseURL: runtimeConfig.public.apiServer,method: "post",body: {
phone: form.phone,
code: form.code,
@ -333,6 +384,22 @@ const onSubmitBySms = async () => {
* 账号密码注册
*/
const onRegister = async () => {
if(!form.phone){
ElMessage.error('请填手机号码')
return;
}
if(!form.companyName){
ElMessage.error('请填写企业名称')
return;
}
if(!form.code){
ElMessage.error('请填验证码')
return;
}
if(!form.email){
ElMessage.error('请填邮箱')
return;
}
const loading = ElLoading.service({
lock: true,
text: 'Loading'

71
pages/plug11/components/CardList.vue

@ -1,71 +0,0 @@
<template>
<div class="xl:w-screen-xl sm:flex xl:p-0 p-4 m-auto relative" v-infinite-scroll="load">
<el-row :gutter="24" class="flex">
<template v-for="(item,index) in 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 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>
</el-col>
</template>
</el-row>
</div>
<div v-if="disabled" class="px-1 text-center text-gray-500 min-h-xs">
没有更多了
</div>
</template>
<script setup lang="ts">
import {openSpmUrl} from "~/utils/common";
import type {Company} from "~/api/system/company/model";
const props = withDefaults(
defineProps<{
list?: Company[];
disabled?: boolean;
fit?: any;
}>(),
{
fit: 'cover'
}
);
const emit = defineEmits<{
(e: 'done'): void;
}>();
const load = () => {
if(!props.disabled){
emit('done')
}
}
</script>

115
pages/plug11/components/PageBanner.vue

@ -1,115 +0,0 @@
<template>
<div class="banner m-auto relative sm:flex">
<svg viewBox="0 0 1440 181" fill="none" xmlns="http://www.w3.org/2000/svg"
class="pointer-events-none absolute w-full top-[-2px] transition-all text-green-5 flex-shrink-0 opacity-100 duration-[400ms] opacity-80 -z-10">
<mask id="path-1-inside-1_414_5526" fill="white">
<path d="M0 0H1440V181H0V0Z"></path>
</mask>
<path d="M0 0H1440V181H0V0Z" fill="url(#paint0_linear_414_5526)" fill-opacity="0.22"></path>
<path d="M0 2H1440V-2H0V2Z" fill="url(#paint1_linear_414_5526)" mask="url(#path-1-inside-1_414_5526)"></path>
<defs>
<linearGradient id="paint0_linear_414_5526" x1="720" y1="0" x2="720" y2="181" gradientUnits="userSpaceOnUse">
<stop stop-color="currentColor"></stop>
<stop offset="1" stop-color="currentColor" stop-opacity="0"></stop>
</linearGradient>
<linearGradient id="paint1_linear_414_5526" x1="0" y1="90.5" x2="1440" y2="90.5" gradientUnits="userSpaceOnUse">
<stop stop-color="currentColor" stop-opacity="0"></stop>
<stop offset="0.395" stop-color="currentColor"></stop>
<stop offset="1" stop-color="currentColor" stop-opacity="0"></stop>
</linearGradient>
</defs>
</svg>
<div class="md:w-screen-xl m-auto md:p-0 px-4">
<div class="py-8 sm:py-16" _path="/templates" _dir="" _draft="false" _partial="false" _locale=""
_id="content:4.templates.yml" _type="yaml" _source="content" _file="4.templates.yml" _stem="4.templates"
_extension="yml">
<div class="gap-8 sm:gap-y-16 grid lg:grid-cols-2 lg:items-center" v-if="layout">
<div class="">
<h1
class="text-3xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-4xl lg:text-5xl">
<span v-if="layout.title">{{ layout.title }}</span>
<span v-if="layout.name">{{ layout.name }}</span>
</h1>
<div class="mt-4 text-lg text-gray-500 dark:text-gray-400">
{{ layout.description }}
</div>
<div class="flex justify-between w-full items-center mt-4">
<el-space>
<div class="w-[500px]">
<el-input
v-model="where.keywords"
placeholder="搜索"
:prefix-icon="Search"
@keydown.enter="handleClick"
>
<template #append>
<el-button size="large" type="primary" @click="handleClick">搜索</el-button>
</template>
</el-input>
</div>
<el-button
size="large"
@click="openSpmUrl(`/passport/login`)"
>
创建
</el-button>
</el-space>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { Search } from '@element-plus/icons-vue'
import {useConfigInfo} from "~/composables/configState";
import {openSpmUrl} from "~/utils/common";
import type {CompanyParam} from "~/api/system/company/model";
const token = useToken();
const sysDomain = useSysDomain();
withDefaults(
defineProps<{
layout?: any;
title?: string;
desc?: string;
buyUrl?: string;
}>(),
{
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'
}
);
//
const where = reactive<CompanyParam>({
keywords: ''
});
const config = useConfigInfo();
//
const handleClick = async () => {
if (where.keywords == '') {
return false;
}
if(activeName.value == 'web'){
const {data: response} = await useServerRequest<ApiResult<PageResult<Website>>>('/cms/cms-website/page',{baseURL: runtimeConfig.public.apiServer, params: {
page: page.value, keywords: where.keywords
}})
if(response.value?.data){
if (response.value?.data.list) {
websites.value = response.value?.data.list;
}
if(response.value.data.count == 0){
resultText.value = '暂无相关结果'
}
}
}
}
</script>

114
pages/plug11/detail/[plugId].vue

@ -1,114 +0,0 @@
<!-- 文章详情 -->
<template>
<PageContainer :form="form" />
<div class="page-main md:w-screen-xl m-auto bg-white rounded-lg">
<div class="p-4 leading-7" v-html="form?.content">
</div>
</div>
</template>
<script setup lang="ts">
import type {ApiResult} from "~/api";
import {useServerRequest} from "~/composables/useServerRequest";
import {useWebsite} from "~/composables/configState";
import type {BreadcrumbItem} from "~/types/global";
import type {Navigation} from "~/api/cms/navigation/model";
import {getIdBySpm} from "~/utils/common";
import type {Article} from "~/api/cms/article/model";
import useFormData from "~/utils/use-form-data";
//
const route = useRoute();
const website = useWebsite();
const breadcrumb = ref<BreadcrumbItem>();
//
const { form, assignFields } = useFormData<Article>({
// id
articleId: undefined,
//
title: undefined,
//
type: undefined,
//
showType: undefined,
//
categoryId: undefined,
//
categoryName: undefined,
parentId: undefined,
parentName: undefined,
//
image: undefined,
//
files: undefined,
//
thumbnail: undefined,
//
video: undefined,
//
accept: undefined,
//
source: undefined,
//
content: undefined,
//
virtualViews: undefined,
//
actualViews: undefined,
// ID
userId: undefined,
//
nickname: undefined,
//
username: undefined,
//
userAvatar: undefined,
// ID
shopId: undefined,
//
likes: undefined,
//
sortNumber: undefined,
//
comments: undefined,
//
status: undefined,
//
createTime: undefined,
//
updateTime: undefined
});
//
const reload = async () => {
// spm()
const { data: nav } = await useServerRequest<ApiResult<Navigation>>('/cms/cms-article/' + getIdBySpm(5))
if (nav.value?.data) {
assignFields(nav.value.data)
}
// seo
useHead({
title: `${form.title} - ${website.value.websiteName}`,
bodyAttrs: {
class: "page-container",
}
});
//
breadcrumb.value = form
}
watch(
() => route.path,
(path) => {
console.log(path,'=>Path')
reload();
},
{ immediate: true }
);
</script>

99
pages/plug11/detail/components/Header.vue

@ -1,99 +0,0 @@
<template>
<div class="banner m-auto relative sm:flex">
<svg viewBox="0 0 1440 181" fill="none" xmlns="http://www.w3.org/2000/svg"
class="pointer-events-none absolute w-full top-[-2px] transition-all text-green-5 flex-shrink-0 opacity-100 duration-[400ms] opacity-80 -z-10">
<mask id="path-1-inside-1_414_5526" fill="white">
<path d="M0 0H1440V181H0V0Z"></path>
</mask>
<path d="M0 0H1440V181H0V0Z" fill="url(#paint0_linear_414_5526)" fill-opacity="0.22"></path>
<path d="M0 2H1440V-2H0V2Z" fill="url(#paint1_linear_414_5526)" mask="url(#path-1-inside-1_414_5526)"></path>
<defs>
<linearGradient id="paint0_linear_414_5526" x1="720" y1="0" x2="720" y2="181" gradientUnits="userSpaceOnUse">
<stop stop-color="currentColor"></stop>
<stop offset="1" stop-color="currentColor" stop-opacity="0"></stop>
</linearGradient>
<linearGradient id="paint1_linear_414_5526" x1="0" y1="90.5" x2="1440" y2="90.5" gradientUnits="userSpaceOnUse">
<stop stop-color="currentColor" stop-opacity="0"></stop>
<stop offset="0.395" stop-color="currentColor"></stop>
<stop offset="1" stop-color="currentColor" stop-opacity="0"></stop>
</linearGradient>
</defs>
</svg>
<div class="md:w-screen-xl m-auto">
<Breadcrumb :data="form" />
<div class="py-8 sm:py-16" _path="/templates" _dir="" _draft="false" _partial="false" _locale=""
_id="content:4.templates.yml" _type="yaml" _source="content" _file="4.templates.yml" _stem="4.templates"
_extension="yml">
<div class="gap-8 sm:gap-y-16 lg:items-center" v-if="form">
<div class="w-full">
<h1
class="text-2xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-3xl lg:text-4xl">
<span v-if="form.title">{{ form.title }}</span>
</h1>
<div class="mt-4 text-gray-500 dark:text-gray-400">
<span>{{ form.nickname }}</span> · {{ form.createTime }}
</div>
<el-space class="mt-4">
<el-button
:icon="ElIconView"
size="large"
v-if="form.demoUrl"
@click="openSpmUrl(form.demoUrl)"
>
演示地址
</el-button>
<el-button
v-if="form.buyUrl"
:icon="ElIconBottom"
size="large"
@click="openSpmUrl(form.buyUrl)"
>
下载模版
</el-button>
<el-button
:icon="ElIconMemo"
size="large"
v-if="form.docUrl"
@click="openSpmUrl(form.docUrl)"
>
帮助文档
</el-button>
</el-space>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import {useConfigInfo} from "~/composables/configState";
import {openSpmUrl} from "~/utils/common";
import Breadcrumb from "~/components/Breadcrumb.vue";
import type {Article} from "~/api/cms/article/model";
const token = useToken();
const sysDomain = useSysDomain();
withDefaults(
defineProps<{
form?: Article;
title?: string;
desc?: string;
buyUrl?: string;
}>(),
{
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'
}
);
const config = useConfigInfo();
</script>

84
pages/plug11/index.vue

@ -1,84 +0,0 @@
<template>
<PageBanner :layout="layout" :title="`${form?.categoryName}`" :desc="`${form?.comments}`" />
<CardList :param="{type: 0,official: true}" :list="list" :disabled="disabled" @done="onSearch" />
</template>
<script setup lang="ts">
import type {ApiResult, PageResult} from "~/api";
import {useServerRequest} from "~/composables/useServerRequest";
import type {Navigation} from "~/api/cms/navigation/model";
import type {Company, CompanyParam} from "~/api/system/company/model";
import CardList from './components/CardList.vue';
const route = useRoute();
//
const runtimeConfig = useRuntimeConfig();
const list = ref<Company[]>([]);
const page = ref<number>(1);
const resultText = ref('');
const layout = ref<any>();
const disabled = ref<boolean>(false);
//
const form = ref<Navigation>();
//
const where = reactive<CompanyParam>({
keywords: ''
});
const onSearch = () => {
if(!disabled.value){
page.value++;
reload(route.path);
}
}
//
const reload = async (path: string) => {
const {data: response} = await useServerRequest<ApiResult<PageResult<Company>>>('/system/company/pageAll',{baseURL: runtimeConfig.public.apiServer, params: {
page: page.value,
limit: 8,
official: false,
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 = '暂无相关结果'
}
}
}
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(
() => route.path,
(path) => {
reload(path);
},
{ immediate: true }
);
</script>

45
pages/product/components/CardList.vue

@ -25,36 +25,15 @@
<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" @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>-->
<template v-if="item.isBuy">
<el-button v-if="item.installed" type="primary" @click.stop="loginDeveloperCenterByToken(item)">控制台</el-button>
<el-button v-else type="primary" @click.stop="loginDeveloperCenterByToken(item)">控制台</el-button>
</template>
<template v-else>
<el-button v-if="item.chargingMethod == 0" type="primary" @click.stop="loginDeveloperCenterByToken(item)">控制台</el-button>
<el-button v-else type="warning" @click.stop="openSpmUrl(`/product/create`,item,item.companyId,true)">立即开通
</el-button>
</template>
</div>
</div>
</el-card>
@ -65,9 +44,6 @@
<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">
@ -86,6 +62,8 @@ const props = withDefaults(
}
);
const tid = ref<number>();
const emit = defineEmits<{
(e: 'done', index: number): void;
}>();
@ -99,4 +77,5 @@ const emit = defineEmits<{
const onPage = (index: number) => {
emit('done', index)
}
tid.value = localStorage.getItem('TenantId');
</script>

30
pages/product/create/index.vue

@ -13,8 +13,25 @@
</div>
</template>
<div class="flex flex-col">
<el-form-item label="应用名称">
<el-input v-model="cart.appName" style="width: 360px" placeholder="XXX公司官网"></el-input>
<el-form-item label="套餐版本">
<el-radio-group v-model="form.image">
<el-radio-button value="1" border>基础版</el-radio-button>
<el-radio-button value="2" border disabled>专业版</el-radio-button>
<el-radio-button value="3" border disabled>定制版</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="项目名称">
<el-input v-model="cart.appName" style="width: 360px" placeholder="花味官网"></el-input>
</el-form-item>
<el-form-item label="二级域名">
<el-input
v-model="cart.domain"
style="width: 360px"
placeholder="huawei"
>
<template #prepend>Https://</template>
<template #append>.wsdns.cn</template>
</el-input>
</el-form-item>
<!-- <el-form-item label="类型">-->
<!-- <el-radio-button v-if="form.type == 0" border>完整应用</el-radio-button>-->
@ -23,13 +40,6 @@
<!-- <el-form-item label="交付方式" v-if="form.deliveryMethod">-->
<!-- <el-radio-button v-if="form.deliveryMethod == 1" border>SaaS交付</el-radio-button>-->
<!-- <el-radio-button v-if="form.deliveryMethod == 2" border>源码交付</el-radio-button>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="套餐版本">-->
<!-- <el-radio-group v-model="form.image">-->
<!-- <el-radio-button value="1" border>基础版</el-radio-button>-->
<!-- <el-radio-button value="2" border>标准版</el-radio-button>-->
<!-- <el-radio-button value="3" border>专业版</el-radio-button>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<el-form-item label="购买时长" v-if="form.chargingMethod && form.chargingMethod > 1">
<el-radio-group v-model="cart.month" @change="handleChargingMethod">
@ -385,7 +395,7 @@ const onDone = () => {
ElMessage.success('购买成功');
visible.value = !visible.value;
setTimeout(() => {
navigateTo(`/user/order`)
openSpmUrl(`https://console.websoft.top/cost-center/order`)
},500)
}
if(res.code == 1){

Loading…
Cancel
Save