完成适配移动端
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
# 应用模块接口
|
||||
API_BASE=http://127.0.0.1:9001/api
|
||||
#API_BASE=https://cms-api.websoft.top/api
|
||||
VITE_SERVER_URL=https://server.gxwebsoft.com/api
|
||||
API_BASE=https://cms-api.websoft.top/api
|
||||
|
||||
VITE_SERVER_URL=http://127.0.0.1:8000/api
|
||||
#API_BASE=http://127.0.0.1:9001/api
|
||||
#VITE_SERVER_URL=http://127.0.0.1:8000/api
|
||||
|
||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -1,2 +1,11 @@
|
||||
/.nuxt/
|
||||
/.output/
|
||||
node_modules
|
||||
.env
|
||||
.env.local
|
||||
.env.development
|
||||
.env.production
|
||||
.env.test
|
||||
.output
|
||||
.nuxt
|
||||
.idea
|
||||
|
||||
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"git.ignoreLimitWarning": true
|
||||
}
|
||||
@@ -128,7 +128,7 @@ export async function getPrevious(params?: CmsArticleParam) {
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -145,7 +145,7 @@ export async function getNext(params?: CmsArticleParam) {
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -112,6 +112,8 @@ export interface CmsArticle {
|
||||
*/
|
||||
export interface CmsArticleParam extends PageParam {
|
||||
articleId?: number;
|
||||
websiteId?: number;
|
||||
websiteUserId?: number;
|
||||
articleIds?: string;
|
||||
parentId?: number;
|
||||
status?: number;
|
||||
|
||||
@@ -28,6 +28,8 @@ export interface CmsOrder {
|
||||
address?: string;
|
||||
// 订单内容
|
||||
content?: string;
|
||||
// 参考网址
|
||||
reference?: string;
|
||||
// 订单总额
|
||||
totalPrice?: string;
|
||||
// 实际付款
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import type { PageParam } from '@/api';
|
||||
import type {CmsNavigation} from "~/api/cms/cmsNavigation/model";
|
||||
import type {CmsWebsiteSetting} from "~/api/cms/cmsWebsiteSetting/model";
|
||||
|
||||
/**
|
||||
* 网站信息记录表
|
||||
@@ -123,10 +124,12 @@ export interface CmsWebsite {
|
||||
createTime?: string;
|
||||
// 修改时间
|
||||
updateTime?: string;
|
||||
// 网站配置
|
||||
// 网站配置参数
|
||||
config?: any;
|
||||
topNavs?: CmsNavigation[];
|
||||
bottomNavs?: CmsNavigation[];
|
||||
// 网站设置
|
||||
setting?: CmsWebsiteSetting;
|
||||
loginUser?: any;
|
||||
}
|
||||
|
||||
@@ -143,5 +146,6 @@ export interface CmsWebsiteParam extends PageParam {
|
||||
search?: boolean;
|
||||
websiteType?: string;
|
||||
userId?: number;
|
||||
limit?: number;
|
||||
keywords?: string;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ import type { ApiResult } from '@/api';
|
||||
import type { User } from '@/api/system/user/model';
|
||||
import type { UpdatePasswordParam } from './model';
|
||||
import type {CmsWebsite, CmsWebsiteParam} from "~/api/cms/cmsWebsite/model";
|
||||
import {SERVER_API_URL} from "~/config";
|
||||
import {COMMON_API_URL, SERVER_API_URL} from "~/config";
|
||||
|
||||
/**
|
||||
* 获取网站信息
|
||||
@@ -26,7 +26,7 @@ export async function getSiteInfo(params: CmsWebsiteParam) {
|
||||
*/
|
||||
export async function getUserInfo(): Promise<User> {
|
||||
const config = useRuntimeConfig();
|
||||
const res = await request.get<ApiResult<User>>(SERVER_API_URL + '/auth/user',{
|
||||
const res = await request.get<ApiResult<User>>(COMMON_API_URL + '/auth/user',{
|
||||
headers: {
|
||||
TenantId: `${localStorage.getItem('ServerTenantId')}`
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import request from '@/utils/request';
|
||||
import type { ApiResult, PageResult } from '@/api';
|
||||
import type { ShopMerchant, ShopMerchantParam } from './model';
|
||||
import {SERVER_API_URL} from "~/config";
|
||||
import {COMMON_API_URL, SERVER_API_URL} from "~/config";
|
||||
|
||||
/**
|
||||
* 分页查询商户
|
||||
@@ -124,7 +124,7 @@ export async function getShopMerchantByUserId(id: number) {
|
||||
*/
|
||||
export async function getShopMerchantByPhone() {
|
||||
const res = await request.get<ApiResult<ShopMerchant>>(
|
||||
SERVER_API_URL + '/shop/shop-merchant/getByPhone'
|
||||
COMMON_API_URL + '/shop/shop-merchant/getByPhone'
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import request from '@/utils/request';
|
||||
import type { ApiResult, PageResult } from '@/api';
|
||||
import type { ShopMerchantApply, ShopMerchantApplyParam } from './model';
|
||||
import {SERVER_API_URL} from "~/config";
|
||||
import {COMMON_API_URL, SERVER_API_URL} from "~/config";
|
||||
|
||||
/**
|
||||
* 分页查询商户入驻申请
|
||||
@@ -123,7 +123,7 @@ export async function getShopMerchantApplyByUserId() {
|
||||
*/
|
||||
export async function getShopMerchantApplyByPhone() {
|
||||
const res = await request.get<ApiResult<ShopMerchantApply>>(
|
||||
SERVER_API_URL + '/shop/shop-merchant-apply/getByPhone'
|
||||
COMMON_API_URL + '/shop/shop-merchant-apply/getByPhone'
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
<template>
|
||||
|
||||
|
||||
<!-- 下单定制 -->
|
||||
<Customized />
|
||||
<!-- 底部菜单 -->
|
||||
<SubMenu />
|
||||
<!-- 版权信息 -->
|
||||
<Copyright />
|
||||
<!-- 侧边工具栏 -->
|
||||
<ToolBar />
|
||||
<!-- 底部菜单 -->
|
||||
<TabBar />
|
||||
|
||||
</template>
|
||||
|
||||
@@ -14,6 +17,9 @@
|
||||
import SubMenu from "~/components/AppFooter/SubMenu/SubMenu.vue";
|
||||
import Copyright from "~/components/AppFooter/Copyright/Copyright.vue";
|
||||
import ToolBar from "~/components/AppFooter/ToolBar/ToolBar.vue";
|
||||
import TabBar from "~/components/AppFooter/TabBar/TabBar.vue";
|
||||
import Partners from "~/components/Index/Partners.vue";
|
||||
import Customized from "~/components/Index/Customized.vue";
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
@@ -5,16 +5,18 @@
|
||||
<nuxt-link :to="item.url" target="_blank" class="link:text-gray-400 visited:text-gray-400 hover:text-gray-200">{{ item.name }}</nuxt-link>
|
||||
<el-divider v-if="list.length-1 != index" direction="vertical" style="border-color: #9ca3af;" />
|
||||
</template>
|
||||
<el-divider direction="vertical" style="border-color: #9ca3af;" />
|
||||
<nuxt-link :to="`/links`" class="link:text-gray-400 visited:text-gray-400 hover:text-gray-200">更多...</nuxt-link>
|
||||
</el-space>
|
||||
<div class="border-b-solid bg-gray-700 border-1 mt-4 opacity-40 hidden-sm-and-down"></div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import {listCmsLink} from "~/api/cms/cmsLink";
|
||||
import {listCmsLink, pageCmsLink} from "~/api/cms/cmsLink";
|
||||
import type {CmsLink} from "~/api/cms/cmsLink/model";
|
||||
|
||||
const list = ref<CmsLink[]>([])
|
||||
listCmsLink({}).then(res => {
|
||||
list.value = res;
|
||||
pageCmsLink({limit: 10}).then(res => {
|
||||
list.value = res?.list || [];
|
||||
})
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
|
||||
53
components/AppFooter/TabBar/TabBar.vue
Normal file
53
components/AppFooter/TabBar/TabBar.vue
Normal file
@@ -0,0 +1,53 @@
|
||||
<template>
|
||||
<div class="hidden-sm-and-up tab-bar flex justify-around items-center bg-white w-full fixed bottom-0 pt-2 pb-5 border-t border-gray-100 border-solid">
|
||||
<template v-for="(item,index) in list">
|
||||
<nuxt-link class="item flex flex-col justify-center items-center hover:text-green-700 block" @click="onLink(item,index)">
|
||||
<component :is="item.icon" :style="{ fontSize: '18px',color: currentIndex == index ? '#15803DFF' : '#333333' }" />
|
||||
<span :style="{ color: currentIndex == index ? '#15803DFF' : '#333333'}" class="py-1">{{ item.name }}</span>
|
||||
</nuxt-link>
|
||||
</template>
|
||||
</div>
|
||||
<div class="hidden-sm-and-up h-[80px]"></div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { HomeOutlined, MessageOutlined, ShopOutlined, AppstoreOutlined, ReadOutlined } from '@ant-design/icons-vue';
|
||||
|
||||
const currentIndex = ref<number>()
|
||||
|
||||
const list = ref([
|
||||
{
|
||||
name: '首页',
|
||||
icon: HomeOutlined,
|
||||
path: '/'
|
||||
},
|
||||
{
|
||||
name: '产品',
|
||||
icon: AppstoreOutlined,
|
||||
path: '/market'
|
||||
},
|
||||
{
|
||||
name: '文档',
|
||||
icon: ReadOutlined,
|
||||
path: '/docs'
|
||||
},
|
||||
{
|
||||
name: '店铺',
|
||||
icon: ShopOutlined,
|
||||
path: '/user'
|
||||
}
|
||||
])
|
||||
|
||||
const onLink = (item: any,index: number) => {
|
||||
if(item.path == '/'){
|
||||
// 回到页面顶部
|
||||
window.scrollTo(0, 0)
|
||||
}
|
||||
currentIndex.value = index
|
||||
navigateTo(item.path)
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
</style>
|
||||
@@ -1,31 +1,45 @@
|
||||
<script setup lang="ts">
|
||||
import {useConfigInfo, useSetting} from "~/composables/configState";
|
||||
|
||||
const config = useConfigInfo();
|
||||
const setting = useSetting()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div id="toolbar" v-if="setting.floatTool" class="hidden-sm-and-down">
|
||||
|
||||
<div v-if="setting.floatTool" id="toolbar" class="hidden-sm-and-down">
|
||||
<ul>
|
||||
<li><a :href="`http://wpa.qq.com/msgrd?v=3&uin=${config.qqCode}&site=qq&menu=yes`" target="_blank">
|
||||
<!-- <li>-->
|
||||
<!-- <a :href="`http://wpa.qq.com/msgrd?v=3&uin=${config.qqCode}&site=qq&menu=yes`" target="_blank">-->
|
||||
<!-- <span class="icon-font icon-qq"></span>-->
|
||||
<!-- <span class="wz">腾讯QQ{{ config.qqCode }}</span>-->
|
||||
<!-- </a>-->
|
||||
<!-- </li>-->
|
||||
<li>
|
||||
<a href="#">
|
||||
<span class="icon-font icon-qq"></span>
|
||||
<span class="wz">腾讯QQ</span>
|
||||
</a></li>
|
||||
<li><a href="javascript:;">
|
||||
<span class="wz">{{ config.qqCode }}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#">
|
||||
<span class="icon-font icon-phone">config.callPhone</span>
|
||||
<span class="wz">{{ config.callPhone }}</span>
|
||||
</a></li>
|
||||
</a>
|
||||
</li>
|
||||
<li class="ewm">
|
||||
<span class="icon-font icon-ewm"></span>
|
||||
<div class="ewm-box"><img :src="config.wxMpQrcode" alt="微信二维码" /></div>
|
||||
<div class="ewm-box"><img :src="config.wxMpQrcode" alt="微信二维码"/></div>
|
||||
</li>
|
||||
<li><a href="/order/1003.html">
|
||||
<li>
|
||||
<nuxt-link to="/order/3622">
|
||||
<span class="icon-font icon-message"></span>
|
||||
<span class="wz">在线留言</span>
|
||||
</a></li>
|
||||
</nuxt-link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<el-backtop :bottom="50" :right="25"></el-backtop>
|
||||
<el-backtop :bottom="100" :right="25"></el-backtop>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<el-dropdown-item command="user"><nuxt-link to="/user">用户中心</nuxt-link></el-dropdown-item>
|
||||
<el-dropdown-item command="password"><nuxt-link to="/user/password">修改密码</nuxt-link></el-dropdown-item>
|
||||
<el-dropdown-item command="auth"><nuxt-link to="/user/auth">实名认证</nuxt-link></el-dropdown-item>
|
||||
<el-dropdown-item divided command="order"><nuxt-link to="/user/order">已购插件</nuxt-link></el-dropdown-item>
|
||||
<el-dropdown-item command="order" divided><nuxt-link to="/user/order">我的订单</nuxt-link></el-dropdown-item>
|
||||
<el-dropdown-item divided command="logOut"><nuxt-link to="/user/logout">退出登录</nuxt-link>
|
||||
</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
<el-image :src="layout?.banner" class="min-h-sm sm:h-auto w-full"></el-image>
|
||||
<div class="banner-bar absolute top-0 w-full sm:flex hidden">
|
||||
<div class="banner-text py-12 md:w-screen-xl m-auto opacity-90 flex flex-col justify-center">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="mt-12 sm:mt-20"></div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
|
||||
18
components/Index/Customized.vue
Normal file
18
components/Index/Customized.vue
Normal file
@@ -0,0 +1,18 @@
|
||||
<template>
|
||||
<div class="w-full container-bg bg-blue-600 gap-10 flex justify-center items-center py-6">
|
||||
<span class="text-xl text-white font-bold">联系我们,为您降本增效</span>
|
||||
<el-button size="large" @click="navigateTo(`/order/3622.html`)">马上联系</el-button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import {navigateTo} from "#imports";
|
||||
|
||||
</script>
|
||||
<style type="text/css">
|
||||
.container-bg {
|
||||
background-image: url('https://oss.wsdns.cn/20250208/802da34d18434fd5a738622bf734e080.png');
|
||||
background-size: 100%;
|
||||
background-position: center;
|
||||
}
|
||||
</style>
|
||||
@@ -1,17 +1,17 @@
|
||||
<template>
|
||||
<svg viewBox="0 0 1440 181" fill="none" xmlns="http://www.w3.org/2000/svg"
|
||||
class="pointer-events-none absolute w-full md:top-[58px] top-[48px] transition-all text-green-5 flex-shrink-0 opacity-100 duration-[400ms] opacity-80 -z-10">
|
||||
<svg class="pointer-events-none absolute w-full md:top-[58px] top-[48px] transition-all text-green-5 flex-shrink-0 opacity-100 duration-[400ms] opacity-80 -z-10" fill="none" viewBox="0 0 1440 181"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<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">
|
||||
<linearGradient id="paint0_linear_414_5526" gradientUnits="userSpaceOnUse" x1="720" x2="720" y1="0" y2="181">
|
||||
<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">
|
||||
<linearGradient id="paint1_linear_414_5526" gradientUnits="userSpaceOnUse" x1="0" x2="1440" y1="90.5" y2="90.5">
|
||||
<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>
|
||||
@@ -19,126 +19,95 @@
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
<div class="mt-10 py-24 sm:py-32 md:py-20 relative dark:bg-gradient-to-b from-gray-950 to-gray-900 md:pb-36">
|
||||
<svg data-v-835f5c7a="" width="100%" height="700" viewBox="0 0 1440 869" fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg" class="absolute top-0 inset-x-0 w-full hidden lg:block">
|
||||
<div class="mt-10 py-24 sm:py-32 md:py-20 relative dark:bg-gradient-to-b from-gray-950 to-gray-900 md:pb-30">
|
||||
<svg class="absolute top-0 inset-x-0 w-full hidden lg:block" data-v-835f5c7a="" fill="none" height="700" viewBox="0 0 1440 869"
|
||||
width="100%" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_184_92145)" data-v-835f5c7a="">
|
||||
<path
|
||||
d="M1446 275.643L1436.02 274.982C1432.72 274.763 1429.41 275.328 1426.37 276.631L1422.65 278.224C1418.96 279.802 1414.9 280.292 1410.94 279.634L1407.1 278.996C1405.71 278.765 1404.34 278.393 1403.02 277.886L1386.31 271.473C1381.73 269.712 1376.57 270.248 1372.45 272.914L1365.76 277.234C1363.58 278.647 1360.7 278.343 1358.86 276.502V276.502C1356.72 274.374 1353.28 274.343 1351.11 276.433L1344.92 282.403C1340.44 286.717 1333.69 287.644 1328.21 284.694L1326 283.5C1320.44 280.508 1313.71 280.689 1308.33 283.976L1299.03 289.654L1285.59 296.014C1281.96 297.731 1278.9 300.451 1276.77 303.853L1272.93 309.987C1271.03 313.024 1268.38 315.524 1265.24 317.249L1253.92 323.468C1251.36 324.876 1249.11 326.805 1247.34 329.131L1235.04 345.236C1234.37 346.125 1233.62 346.958 1232.81 347.728L1215.19 364.444C1214.42 365.176 1213.59 365.84 1212.7 366.429L1203.62 372.477C1201 374.22 1197.49 373.737 1195.44 371.351V371.351C1193.96 369.62 1191.65 368.841 1189.42 369.318L1184.56 370.36C1181.01 371.12 1177.3 370.529 1174.16 368.701L1173.04 368.049C1169.18 365.802 1164.62 365.075 1160.26 366.01L1159.99 366.067C1155.52 367.024 1150.86 366.28 1146.91 363.98V363.98C1143.13 361.779 1138.68 361 1134.38 361.782L1133.26 361.987C1131.13 362.373 1128.96 362.429 1126.82 362.154L1112.21 360.275C1104.18 359.242 1096.27 362.923 1091.88 369.734L1084.6 381.033C1082.45 384.375 1078.52 386.117 1074.6 385.466V385.466C1071.16 384.895 1067.67 386.16 1065.41 388.803L1065.01 389.266C1060.89 394.06 1053.42 393.901 1049.52 388.934L1049.08 388.388C1047.21 386.002 1044.23 384.755 1041.21 385.091V385.091C1038.59 385.382 1035.98 384.478 1034.09 382.628L1033.56 382.103C1031.28 379.87 1028.11 378.808 1024.95 379.222L1016.74 380.299C1010.61 381.102 1005.15 384.564 1001.81 389.761L1000.9 391.175C1000.6 391.634 1000.34 392.116 1000.12 392.616V392.616C998.034 397.308 992.905 399.853 987.908 398.673L922.828 383.317C914.914 381.45 906.633 384.319 901.57 390.683L881.281 416.19C879.616 418.283 878.366 420.675 877.599 423.237L875.563 430.035C873.756 436.068 869.336 440.972 863.523 443.394L833.628 455.85C832.326 456.392 831.082 457.064 829.916 457.856L805.463 474.443L778.863 492.653C775.823 494.734 773.384 497.578 771.791 500.899L765.453 514.114C764.421 516.265 763.03 518.224 761.34 519.908L758.903 522.336C755.771 525.457 751.734 527.509 747.367 528.201L743.046 528.885C741.042 529.203 739.144 529.997 737.512 531.202V531.202C731.74 535.463 723.583 534.077 719.544 528.147L717.634 525.344C713.701 519.569 706.461 517.035 699.785 519.097L675.952 526.456C674.393 526.938 672.782 527.236 671.153 527.345L642.47 529.257C640.814 529.368 639.178 529.674 637.595 530.169L612.206 538.115C610.18 538.749 608.069 539.072 605.946 539.073L591.266 539.081C586.947 539.084 582.733 537.755 579.198 535.276L559.251 521.29C555.716 518.81 551.502 517.481 547.183 517.484L539.808 517.488L530.734 517.493C527.487 517.495 524.285 518.249 521.379 519.698L509.732 525.502C507.382 526.673 504.835 527.393 502.22 527.625L491.78 528.551C484.992 529.153 478.596 533.199 472.305 535.82C467.807 537.694 461.469 539.153 452.93 539.158C442.362 539.164 430.624 545.001 421.043 551.514C414.832 555.737 394.283 564.38 386.773 564.384V564.384C385.87 564.385 383.099 564.544 382.239 564.815C348.971 575.322 338.889 556.976 329.255 551.758C326.102 550.05 322.456 551.498 319.469 553.484L297.943 567.793C291.932 571.788 284.289 572.417 277.706 569.457L266.573 564.451L242.539 554.686C236.104 552.071 228.793 552.807 223.009 556.652L184.235 582.425C182.617 583.501 180.859 584.346 179.009 584.938L130.261 600.533C128.197 601.194 126.042 601.531 123.874 601.532L100.333 601.545C91.5959 601.55 83.769 596.145 80.6786 587.973L76.9595 578.138C73.8692 569.967 66.5498 566.889 58.67 570.662C46.6763 576.405 29.4795 584.13 19.9733 584.135C4.84173 584.144 -41.9003 571.137 -63.3798 564.633"
|
||||
stroke="url(#paint0_linear_184_92145)" stroke-width="2" class="svg-elem-1" data-v-835f5c7a=""></path>
|
||||
class="svg-elem-1"
|
||||
d="M1446 275.643L1436.02 274.982C1432.72 274.763 1429.41 275.328 1426.37 276.631L1422.65 278.224C1418.96 279.802 1414.9 280.292 1410.94 279.634L1407.1 278.996C1405.71 278.765 1404.34 278.393 1403.02 277.886L1386.31 271.473C1381.73 269.712 1376.57 270.248 1372.45 272.914L1365.76 277.234C1363.58 278.647 1360.7 278.343 1358.86 276.502V276.502C1356.72 274.374 1353.28 274.343 1351.11 276.433L1344.92 282.403C1340.44 286.717 1333.69 287.644 1328.21 284.694L1326 283.5C1320.44 280.508 1313.71 280.689 1308.33 283.976L1299.03 289.654L1285.59 296.014C1281.96 297.731 1278.9 300.451 1276.77 303.853L1272.93 309.987C1271.03 313.024 1268.38 315.524 1265.24 317.249L1253.92 323.468C1251.36 324.876 1249.11 326.805 1247.34 329.131L1235.04 345.236C1234.37 346.125 1233.62 346.958 1232.81 347.728L1215.19 364.444C1214.42 365.176 1213.59 365.84 1212.7 366.429L1203.62 372.477C1201 374.22 1197.49 373.737 1195.44 371.351V371.351C1193.96 369.62 1191.65 368.841 1189.42 369.318L1184.56 370.36C1181.01 371.12 1177.3 370.529 1174.16 368.701L1173.04 368.049C1169.18 365.802 1164.62 365.075 1160.26 366.01L1159.99 366.067C1155.52 367.024 1150.86 366.28 1146.91 363.98V363.98C1143.13 361.779 1138.68 361 1134.38 361.782L1133.26 361.987C1131.13 362.373 1128.96 362.429 1126.82 362.154L1112.21 360.275C1104.18 359.242 1096.27 362.923 1091.88 369.734L1084.6 381.033C1082.45 384.375 1078.52 386.117 1074.6 385.466V385.466C1071.16 384.895 1067.67 386.16 1065.41 388.803L1065.01 389.266C1060.89 394.06 1053.42 393.901 1049.52 388.934L1049.08 388.388C1047.21 386.002 1044.23 384.755 1041.21 385.091V385.091C1038.59 385.382 1035.98 384.478 1034.09 382.628L1033.56 382.103C1031.28 379.87 1028.11 378.808 1024.95 379.222L1016.74 380.299C1010.61 381.102 1005.15 384.564 1001.81 389.761L1000.9 391.175C1000.6 391.634 1000.34 392.116 1000.12 392.616V392.616C998.034 397.308 992.905 399.853 987.908 398.673L922.828 383.317C914.914 381.45 906.633 384.319 901.57 390.683L881.281 416.19C879.616 418.283 878.366 420.675 877.599 423.237L875.563 430.035C873.756 436.068 869.336 440.972 863.523 443.394L833.628 455.85C832.326 456.392 831.082 457.064 829.916 457.856L805.463 474.443L778.863 492.653C775.823 494.734 773.384 497.578 771.791 500.899L765.453 514.114C764.421 516.265 763.03 518.224 761.34 519.908L758.903 522.336C755.771 525.457 751.734 527.509 747.367 528.201L743.046 528.885C741.042 529.203 739.144 529.997 737.512 531.202V531.202C731.74 535.463 723.583 534.077 719.544 528.147L717.634 525.344C713.701 519.569 706.461 517.035 699.785 519.097L675.952 526.456C674.393 526.938 672.782 527.236 671.153 527.345L642.47 529.257C640.814 529.368 639.178 529.674 637.595 530.169L612.206 538.115C610.18 538.749 608.069 539.072 605.946 539.073L591.266 539.081C586.947 539.084 582.733 537.755 579.198 535.276L559.251 521.29C555.716 518.81 551.502 517.481 547.183 517.484L539.808 517.488L530.734 517.493C527.487 517.495 524.285 518.249 521.379 519.698L509.732 525.502C507.382 526.673 504.835 527.393 502.22 527.625L491.78 528.551C484.992 529.153 478.596 533.199 472.305 535.82C467.807 537.694 461.469 539.153 452.93 539.158C442.362 539.164 430.624 545.001 421.043 551.514C414.832 555.737 394.283 564.38 386.773 564.384V564.384C385.87 564.385 383.099 564.544 382.239 564.815C348.971 575.322 338.889 556.976 329.255 551.758C326.102 550.05 322.456 551.498 319.469 553.484L297.943 567.793C291.932 571.788 284.289 572.417 277.706 569.457L266.573 564.451L242.539 554.686C236.104 552.071 228.793 552.807 223.009 556.652L184.235 582.425C182.617 583.501 180.859 584.346 179.009 584.938L130.261 600.533C128.197 601.194 126.042 601.531 123.874 601.532L100.333 601.545C91.5959 601.55 83.769 596.145 80.6786 587.973L76.9595 578.138C73.8692 569.967 66.5498 566.889 58.67 570.662C46.6763 576.405 29.4795 584.13 19.9733 584.135C4.84173 584.144 -41.9003 571.137 -63.3798 564.633" data-v-835f5c7a="" stroke="url(#paint0_linear_184_92145)" stroke-width="2"></path>
|
||||
<path
|
||||
d="M1464.92 266.565L1450.57 258.267C1447.82 256.676 1444.74 255.731 1441.57 255.502L1436.18 255.114C1433 254.885 1429.8 255.384 1426.84 256.574L1422.15 258.457C1418.84 259.79 1415.23 260.254 1411.69 259.805L1407.6 259.288C1405.82 259.063 1404.08 258.613 1402.42 257.948L1385.77 251.281C1381.25 249.468 1376.13 249.961 1372.03 252.602L1365.37 256.895C1363.2 258.296 1360.33 257.964 1358.54 256.102V256.102C1356.45 253.933 1352.99 253.888 1350.85 256L1344.61 262.135C1340.07 266.609 1333.08 267.464 1327.59 264.218L1325.87 263.202C1320.56 260.065 1313.95 260.115 1308.69 263.332L1299.08 269.214L1284.88 276.221C1281.48 277.899 1278.6 280.467 1276.54 283.651L1272.28 290.24C1270.48 293.024 1268.05 295.343 1265.18 297.006L1253.35 303.868C1251.14 305.147 1249.19 306.818 1247.58 308.797L1233.46 326.192L1215.42 344.393C1214.55 345.279 1213.58 346.074 1212.55 346.768L1203.86 352.58C1201.21 354.352 1197.67 353.932 1195.51 351.588V351.588C1194.04 349.997 1191.88 349.245 1189.74 349.584L1184.41 350.428C1180.68 351.018 1176.87 350.318 1173.6 348.444L1173.02 348.115C1169.38 346.028 1165.13 345.248 1160.98 345.905L1159.15 346.195C1154.81 346.882 1150.37 346.14 1146.5 344.083V344.083C1142.62 342.025 1138.18 341.283 1133.84 341.97L1133.07 342.092C1131.11 342.402 1129.12 342.434 1127.15 342.185L1112.1 340.284C1104.04 339.267 1096.13 342.983 1091.76 349.828L1084.59 361.072C1082.36 364.575 1078.29 366.458 1074.17 365.894L1073.85 365.85C1070.48 365.389 1067.11 366.665 1064.89 369.24V369.24C1060.85 373.921 1053.58 373.876 1049.6 369.147L1048.46 367.792C1046.58 365.566 1043.68 364.484 1040.81 364.939V364.939C1038.29 365.338 1035.72 364.557 1033.85 362.82L1033.03 362.054C1030.64 359.833 1027.36 358.834 1024.14 359.345L1015.19 360.762C1009.89 361.602 1005.11 364.442 1001.84 368.698L1000.47 370.478C999.972 371.121 999.555 371.821 999.226 372.562V372.562C997.235 377.05 992.33 379.484 987.552 378.355L922.041 362.871C914.12 360.999 905.832 363.872 900.769 370.244L880.463 395.798C878.8 397.892 877.552 400.284 876.786 402.845L874.743 409.675C872.938 415.71 868.519 420.616 862.705 423.04L832.785 435.515C831.483 436.058 830.238 436.731 829.071 437.523L804.603 454.135L777.983 472.375C774.943 474.457 772.505 477.303 770.913 480.626L764.567 493.874C763.536 496.025 762.147 497.985 760.457 499.67L758.015 502.105C754.882 505.23 750.842 507.285 746.471 507.978L742.149 508.662C740.144 508.98 738.244 509.776 736.61 510.983V510.983C730.836 515.249 722.673 513.861 718.634 507.926L716.717 505.109C712.78 499.325 705.531 496.787 698.846 498.852L675.006 506.218C673.445 506.7 671.833 506.999 670.202 507.108L641.499 509.019C639.842 509.129 638.204 509.436 636.619 509.932L611.215 517.886C609.187 518.521 607.074 518.845 604.948 518.846L590.257 518.851C585.937 518.853 581.72 517.522 578.184 515.039L558.214 501.021C554.678 498.539 550.462 497.208 546.141 497.209L538.759 497.212L529.68 497.216C526.43 497.217 523.224 497.973 520.316 499.423L508.663 505.235C506.312 506.408 503.762 507.129 501.145 507.361L490.698 508.287C483.905 508.889 477.506 512.939 471.212 515.564C466.71 517.441 460.368 518.902 451.82 518.905C441.243 518.91 429.495 524.758 419.907 531.282C413.69 535.513 393.144 544.162 385.625 544.165V544.165C384.72 544.165 381.942 544.324 381.08 544.597C347.792 555.114 337.699 536.736 328.058 531.508C324.902 529.796 321.253 531.246 318.264 533.235L296.726 547.564C290.711 551.566 283.061 552.194 276.473 549.228L265.331 544.212L241.278 534.426C234.839 531.806 227.521 532.543 221.733 536.394L182.935 562.205C181.317 563.281 179.557 564.128 177.706 564.721L128.926 580.335C126.859 580.996 124.703 581.333 122.532 581.334L98.9645 581.343C90.2275 581.347 82.4012 575.94 79.3124 567.767L75.5718 557.87C72.4831 549.697 65.1651 546.62 57.2861 550.396C45.2841 556.147 28.069 563.887 18.5533 563.891"
|
||||
stroke="url(#paint1_linear_184_92145)" stroke-opacity="0.5" stroke-width="2" class="svg-elem-2"
|
||||
data-v-835f5c7a=""></path>
|
||||
class="svg-elem-2"
|
||||
d="M1464.92 266.565L1450.57 258.267C1447.82 256.676 1444.74 255.731 1441.57 255.502L1436.18 255.114C1433 254.885 1429.8 255.384 1426.84 256.574L1422.15 258.457C1418.84 259.79 1415.23 260.254 1411.69 259.805L1407.6 259.288C1405.82 259.063 1404.08 258.613 1402.42 257.948L1385.77 251.281C1381.25 249.468 1376.13 249.961 1372.03 252.602L1365.37 256.895C1363.2 258.296 1360.33 257.964 1358.54 256.102V256.102C1356.45 253.933 1352.99 253.888 1350.85 256L1344.61 262.135C1340.07 266.609 1333.08 267.464 1327.59 264.218L1325.87 263.202C1320.56 260.065 1313.95 260.115 1308.69 263.332L1299.08 269.214L1284.88 276.221C1281.48 277.899 1278.6 280.467 1276.54 283.651L1272.28 290.24C1270.48 293.024 1268.05 295.343 1265.18 297.006L1253.35 303.868C1251.14 305.147 1249.19 306.818 1247.58 308.797L1233.46 326.192L1215.42 344.393C1214.55 345.279 1213.58 346.074 1212.55 346.768L1203.86 352.58C1201.21 354.352 1197.67 353.932 1195.51 351.588V351.588C1194.04 349.997 1191.88 349.245 1189.74 349.584L1184.41 350.428C1180.68 351.018 1176.87 350.318 1173.6 348.444L1173.02 348.115C1169.38 346.028 1165.13 345.248 1160.98 345.905L1159.15 346.195C1154.81 346.882 1150.37 346.14 1146.5 344.083V344.083C1142.62 342.025 1138.18 341.283 1133.84 341.97L1133.07 342.092C1131.11 342.402 1129.12 342.434 1127.15 342.185L1112.1 340.284C1104.04 339.267 1096.13 342.983 1091.76 349.828L1084.59 361.072C1082.36 364.575 1078.29 366.458 1074.17 365.894L1073.85 365.85C1070.48 365.389 1067.11 366.665 1064.89 369.24V369.24C1060.85 373.921 1053.58 373.876 1049.6 369.147L1048.46 367.792C1046.58 365.566 1043.68 364.484 1040.81 364.939V364.939C1038.29 365.338 1035.72 364.557 1033.85 362.82L1033.03 362.054C1030.64 359.833 1027.36 358.834 1024.14 359.345L1015.19 360.762C1009.89 361.602 1005.11 364.442 1001.84 368.698L1000.47 370.478C999.972 371.121 999.555 371.821 999.226 372.562V372.562C997.235 377.05 992.33 379.484 987.552 378.355L922.041 362.871C914.12 360.999 905.832 363.872 900.769 370.244L880.463 395.798C878.8 397.892 877.552 400.284 876.786 402.845L874.743 409.675C872.938 415.71 868.519 420.616 862.705 423.04L832.785 435.515C831.483 436.058 830.238 436.731 829.071 437.523L804.603 454.135L777.983 472.375C774.943 474.457 772.505 477.303 770.913 480.626L764.567 493.874C763.536 496.025 762.147 497.985 760.457 499.67L758.015 502.105C754.882 505.23 750.842 507.285 746.471 507.978L742.149 508.662C740.144 508.98 738.244 509.776 736.61 510.983V510.983C730.836 515.249 722.673 513.861 718.634 507.926L716.717 505.109C712.78 499.325 705.531 496.787 698.846 498.852L675.006 506.218C673.445 506.7 671.833 506.999 670.202 507.108L641.499 509.019C639.842 509.129 638.204 509.436 636.619 509.932L611.215 517.886C609.187 518.521 607.074 518.845 604.948 518.846L590.257 518.851C585.937 518.853 581.72 517.522 578.184 515.039L558.214 501.021C554.678 498.539 550.462 497.208 546.141 497.209L538.759 497.212L529.68 497.216C526.43 497.217 523.224 497.973 520.316 499.423L508.663 505.235C506.312 506.408 503.762 507.129 501.145 507.361L490.698 508.287C483.905 508.889 477.506 512.939 471.212 515.564C466.71 517.441 460.368 518.902 451.82 518.905C441.243 518.91 429.495 524.758 419.907 531.282C413.69 535.513 393.144 544.162 385.625 544.165V544.165C384.72 544.165 381.942 544.324 381.08 544.597C347.792 555.114 337.699 536.736 328.058 531.508C324.902 529.796 321.253 531.246 318.264 533.235L296.726 547.564C290.711 551.566 283.061 552.194 276.473 549.228L265.331 544.212L241.278 534.426C234.839 531.806 227.521 532.543 221.733 536.394L182.935 562.205C181.317 563.281 179.557 564.128 177.706 564.721L128.926 580.335C126.859 580.996 124.703 581.333 122.532 581.334L98.9645 581.343C90.2275 581.347 82.4012 575.94 79.3124 567.767L75.5718 557.87C72.4831 549.697 65.1651 546.62 57.2861 550.396C45.2841 556.147 28.069 563.887 18.5533 563.891" data-v-835f5c7a="" stroke="url(#paint1_linear_184_92145)" stroke-opacity="0.5"
|
||||
stroke-width="2"></path>
|
||||
<path
|
||||
d="M1467.92 245.565L1453.57 237.268C1450.82 235.676 1447.74 234.73 1444.57 234.501L1439.19 234.113C1436 233.884 1432.81 234.383 1429.85 235.573L1425.16 237.455C1421.85 238.788 1418.25 239.251 1414.7 238.803L1410.61 238.285C1408.84 238.061 1407.1 237.611 1405.44 236.946L1388.79 230.277C1384.27 228.465 1379.15 228.957 1375.05 231.599L1368.39 235.891C1366.22 237.292 1363.36 236.96 1361.57 235.098V235.098C1359.48 232.929 1356.02 232.884 1353.87 234.996L1347.64 241.13C1343.1 245.604 1336.11 246.459 1330.62 243.213L1328.9 242.197C1323.6 239.059 1316.99 239.109 1311.73 242.326L1302.12 248.207L1287.93 255.212C1284.53 256.891 1281.65 259.459 1279.59 262.644L1275.33 269.231C1273.54 272.016 1271.1 274.335 1268.23 275.998L1256.41 282.858C1254.2 284.138 1252.25 285.809 1250.64 287.789L1236.52 305.182L1218.49 323.383C1217.61 324.268 1216.65 325.064 1215.61 325.757L1206.93 331.568C1204.29 333.341 1200.74 332.92 1198.58 330.577V330.577C1197.12 328.986 1194.95 328.234 1192.81 328.572L1187.48 329.416C1183.76 330.006 1179.95 329.306 1176.67 327.432L1176.1 327.103C1172.45 325.016 1168.21 324.236 1164.06 324.893L1162.23 325.182C1157.9 325.869 1153.46 325.127 1149.58 323.069V323.069C1145.7 321.011 1141.26 320.27 1136.93 320.956L1136.16 321.078C1134.2 321.388 1132.21 321.419 1130.24 321.171L1115.2 319.27C1107.14 318.253 1099.22 321.97 1094.86 328.816L1087.69 340.057C1085.46 343.559 1081.39 345.441 1077.28 344.878L1076.96 344.834C1073.59 344.373 1070.21 345.648 1067.99 348.223V348.223C1063.95 352.903 1056.69 352.859 1052.71 348.13L1051.57 346.774C1049.69 344.549 1046.79 343.466 1043.92 343.921V343.921C1041.4 344.32 1038.84 343.539 1036.97 341.802L1036.14 341.036C1033.76 338.815 1030.48 337.816 1027.26 338.326L1018.32 339.742C1013.01 340.583 1008.23 343.423 1004.96 347.681L1003.59 349.459C1003.09 350.102 1002.68 350.801 1002.35 351.543V351.543C1000.36 356.03 995.454 358.464 990.676 357.334L925.189 341.85C917.267 339.977 908.976 342.85 903.913 349.224L883.617 374.774C881.954 376.867 880.706 379.259 879.941 381.821L877.899 388.649C876.095 394.685 871.676 399.592 865.862 402.016L835.953 414.488C834.651 415.031 833.406 415.704 832.238 416.497L807.778 433.108L781.167 451.345C778.127 453.428 775.69 456.274 774.098 459.597L767.754 472.844C766.724 474.995 765.334 476.956 763.645 478.641L761.206 481.074C758.073 484.199 754.032 486.255 749.66 486.948L745.343 487.631C743.338 487.949 741.438 488.745 739.805 489.952V489.952C734.033 494.218 725.872 492.83 721.835 486.896L719.916 484.077C715.981 478.294 708.732 475.755 702.049 477.821L678.218 485.184C676.656 485.667 675.043 485.966 673.413 486.074L644.719 487.984C643.062 488.094 641.424 488.401 639.838 488.897L614.444 496.85C612.415 497.485 610.301 497.809 608.175 497.809L593.493 497.815C589.171 497.816 584.954 496.484 581.418 494.001L561.456 479.984C557.919 477.501 553.702 476.169 549.381 476.171L542.004 476.173L532.93 476.177C529.679 476.178 526.472 476.934 523.563 478.385L511.917 484.194C509.566 485.367 507.015 486.088 504.397 486.32L493.96 487.246C487.166 487.848 480.766 491.899 474.471 494.524C469.971 496.4 463.631 497.86 455.088 497.863C444.513 497.867 432.767 503.715 423.181 510.24C416.966 514.47 396.43 523.117 388.912 523.12V523.12C388.007 523.12 385.228 523.279 384.366 523.552C351.09 534.066 340.998 515.692 331.36 510.461C328.204 508.748 324.554 510.199 321.564 512.188L300.039 526.512C294.023 530.515 286.371 531.144 279.782 528.177L268.647 523.162L244.605 513.377C238.165 510.756 230.844 511.493 225.055 515.345L186.274 541.15C184.656 542.227 182.895 543.075 181.043 543.667L132.28 559.278C130.213 559.94 128.055 560.277 125.885 560.278L102.328 560.286C93.5913 560.289 85.7651 554.883 82.6767 546.709L78.9369 536.812C75.8485 528.639 68.5309 525.562 60.652 529.339C48.6535 535.09 31.4455 542.827 21.933 542.831C6.79419 542.836 -39.973 529.798 -61.4641 523.278"
|
||||
stroke="url(#paint2_linear_184_92145)" stroke-opacity="0.25" stroke-width="2" class="svg-elem-3"
|
||||
data-v-835f5c7a=""></path>
|
||||
class="svg-elem-3"
|
||||
d="M1467.92 245.565L1453.57 237.268C1450.82 235.676 1447.74 234.73 1444.57 234.501L1439.19 234.113C1436 233.884 1432.81 234.383 1429.85 235.573L1425.16 237.455C1421.85 238.788 1418.25 239.251 1414.7 238.803L1410.61 238.285C1408.84 238.061 1407.1 237.611 1405.44 236.946L1388.79 230.277C1384.27 228.465 1379.15 228.957 1375.05 231.599L1368.39 235.891C1366.22 237.292 1363.36 236.96 1361.57 235.098V235.098C1359.48 232.929 1356.02 232.884 1353.87 234.996L1347.64 241.13C1343.1 245.604 1336.11 246.459 1330.62 243.213L1328.9 242.197C1323.6 239.059 1316.99 239.109 1311.73 242.326L1302.12 248.207L1287.93 255.212C1284.53 256.891 1281.65 259.459 1279.59 262.644L1275.33 269.231C1273.54 272.016 1271.1 274.335 1268.23 275.998L1256.41 282.858C1254.2 284.138 1252.25 285.809 1250.64 287.789L1236.52 305.182L1218.49 323.383C1217.61 324.268 1216.65 325.064 1215.61 325.757L1206.93 331.568C1204.29 333.341 1200.74 332.92 1198.58 330.577V330.577C1197.12 328.986 1194.95 328.234 1192.81 328.572L1187.48 329.416C1183.76 330.006 1179.95 329.306 1176.67 327.432L1176.1 327.103C1172.45 325.016 1168.21 324.236 1164.06 324.893L1162.23 325.182C1157.9 325.869 1153.46 325.127 1149.58 323.069V323.069C1145.7 321.011 1141.26 320.27 1136.93 320.956L1136.16 321.078C1134.2 321.388 1132.21 321.419 1130.24 321.171L1115.2 319.27C1107.14 318.253 1099.22 321.97 1094.86 328.816L1087.69 340.057C1085.46 343.559 1081.39 345.441 1077.28 344.878L1076.96 344.834C1073.59 344.373 1070.21 345.648 1067.99 348.223V348.223C1063.95 352.903 1056.69 352.859 1052.71 348.13L1051.57 346.774C1049.69 344.549 1046.79 343.466 1043.92 343.921V343.921C1041.4 344.32 1038.84 343.539 1036.97 341.802L1036.14 341.036C1033.76 338.815 1030.48 337.816 1027.26 338.326L1018.32 339.742C1013.01 340.583 1008.23 343.423 1004.96 347.681L1003.59 349.459C1003.09 350.102 1002.68 350.801 1002.35 351.543V351.543C1000.36 356.03 995.454 358.464 990.676 357.334L925.189 341.85C917.267 339.977 908.976 342.85 903.913 349.224L883.617 374.774C881.954 376.867 880.706 379.259 879.941 381.821L877.899 388.649C876.095 394.685 871.676 399.592 865.862 402.016L835.953 414.488C834.651 415.031 833.406 415.704 832.238 416.497L807.778 433.108L781.167 451.345C778.127 453.428 775.69 456.274 774.098 459.597L767.754 472.844C766.724 474.995 765.334 476.956 763.645 478.641L761.206 481.074C758.073 484.199 754.032 486.255 749.66 486.948L745.343 487.631C743.338 487.949 741.438 488.745 739.805 489.952V489.952C734.033 494.218 725.872 492.83 721.835 486.896L719.916 484.077C715.981 478.294 708.732 475.755 702.049 477.821L678.218 485.184C676.656 485.667 675.043 485.966 673.413 486.074L644.719 487.984C643.062 488.094 641.424 488.401 639.838 488.897L614.444 496.85C612.415 497.485 610.301 497.809 608.175 497.809L593.493 497.815C589.171 497.816 584.954 496.484 581.418 494.001L561.456 479.984C557.919 477.501 553.702 476.169 549.381 476.171L542.004 476.173L532.93 476.177C529.679 476.178 526.472 476.934 523.563 478.385L511.917 484.194C509.566 485.367 507.015 486.088 504.397 486.32L493.96 487.246C487.166 487.848 480.766 491.899 474.471 494.524C469.971 496.4 463.631 497.86 455.088 497.863C444.513 497.867 432.767 503.715 423.181 510.24C416.966 514.47 396.43 523.117 388.912 523.12V523.12C388.007 523.12 385.228 523.279 384.366 523.552C351.09 534.066 340.998 515.692 331.36 510.461C328.204 508.748 324.554 510.199 321.564 512.188L300.039 526.512C294.023 530.515 286.371 531.144 279.782 528.177L268.647 523.162L244.605 513.377C238.165 510.756 230.844 511.493 225.055 515.345L186.274 541.15C184.656 542.227 182.895 543.075 181.043 543.667L132.28 559.278C130.213 559.94 128.055 560.277 125.885 560.278L102.328 560.286C93.5913 560.289 85.7651 554.883 82.6767 546.709L78.9369 536.812C75.8485 528.639 68.5309 525.562 60.652 529.339C48.6535 535.09 31.4455 542.827 21.933 542.831C6.79419 542.836 -39.973 529.798 -61.4641 523.278" data-v-835f5c7a="" stroke="url(#paint2_linear_184_92145)" stroke-opacity="0.25"
|
||||
stroke-width="2"></path>
|
||||
<path
|
||||
d="M1464.92 224.565L1450.57 216.268C1447.82 214.676 1444.74 213.73 1441.57 213.501L1436.19 213.113C1433 212.884 1429.81 213.383 1426.85 214.573L1422.16 216.455C1418.85 217.788 1415.25 218.251 1411.7 217.803L1407.61 217.285C1405.84 217.061 1404.1 216.611 1402.44 215.946L1385.79 209.277C1381.27 207.465 1376.15 207.957 1372.05 210.599L1365.39 214.891C1363.22 216.292 1360.36 215.96 1358.57 214.098V214.098C1356.48 211.929 1353.02 211.884 1350.87 213.996L1344.64 220.13C1340.1 224.604 1333.11 225.459 1327.62 222.213L1325.9 221.197C1320.6 218.059 1313.99 218.109 1308.73 221.326L1299.12 227.207L1284.93 234.212C1281.53 235.891 1278.65 238.459 1276.59 241.644L1272.33 248.231C1270.54 251.016 1268.1 253.335 1265.23 254.998L1253.41 261.858C1251.2 263.138 1249.25 264.809 1247.64 266.789L1233.52 284.182L1215.49 302.383C1214.61 303.268 1213.65 304.064 1212.61 304.757L1203.93 310.568C1201.29 312.341 1197.74 311.92 1195.58 309.577V309.577C1194.12 307.986 1191.95 307.234 1189.81 307.572L1184.48 308.416C1180.76 309.006 1176.95 308.306 1173.67 306.432L1173.1 306.103C1169.45 304.016 1165.21 303.236 1161.06 303.893L1159.23 304.182C1154.9 304.869 1150.46 304.127 1146.58 302.069V302.069C1142.7 300.011 1138.26 299.27 1133.93 299.956L1133.16 300.078C1131.2 300.388 1129.21 300.419 1127.24 300.171L1112.2 298.27C1104.14 297.253 1096.22 300.97 1091.86 307.816L1084.69 319.057C1082.46 322.559 1078.39 324.441 1074.28 323.878L1073.96 323.834C1070.59 323.373 1067.21 324.648 1064.99 327.223V327.223C1060.95 331.903 1053.69 331.859 1049.71 327.13L1048.57 325.774C1046.69 323.549 1043.79 322.466 1040.92 322.921V322.921C1038.4 323.32 1035.84 322.539 1033.97 320.802L1033.14 320.036C1030.76 317.815 1027.48 316.816 1024.26 317.326L1015.32 318.742C1010.01 319.583 1005.23 322.423 1001.96 326.681L1000.59 328.459C1000.09 329.102 999.678 329.801 999.349 330.543V330.543C997.359 335.03 992.454 337.464 987.676 336.334L922.189 320.85C914.267 318.977 905.976 321.85 900.913 328.224L880.617 353.774C878.954 355.867 877.706 358.259 876.941 360.821L874.899 367.649C873.095 373.685 868.676 378.592 862.862 381.016L832.953 393.488C831.651 394.031 830.406 394.704 829.238 395.497L804.778 412.108L778.167 430.345C775.127 432.428 772.69 435.274 771.098 438.597L764.754 451.844C763.724 453.995 762.334 455.956 760.645 457.641L758.206 460.074C755.073 463.199 751.032 465.255 746.66 465.948L742.343 466.631C740.338 466.949 738.438 467.745 736.805 468.952V468.952C731.033 473.218 722.872 471.83 718.835 465.896L716.916 463.077C712.981 457.294 705.732 454.755 699.049 456.821L675.218 464.184C673.656 464.667 672.043 464.966 670.413 465.074L641.719 466.984C640.062 467.094 638.424 467.401 636.838 467.897L611.444 475.85C609.415 476.485 607.301 476.809 605.175 476.809L590.493 476.815C586.171 476.816 581.954 475.484 578.418 473.001L558.456 458.984C554.919 456.501 550.702 455.169 546.381 455.171L539.004 455.173L529.93 455.177C526.679 455.178 523.472 455.934 520.563 457.385L508.917 463.194C506.566 464.367 504.015 465.088 501.397 465.32L490.96 466.246C484.166 466.848 477.766 470.899 471.471 473.524C466.971 475.4 460.631 476.86 452.088 476.863C441.513 476.867 429.767 482.715 420.181 489.24C413.966 493.47 393.43 502.117 385.912 502.12V502.12C385.007 502.12 382.228 502.279 381.366 502.552C348.09 513.066 337.998 494.692 328.36 489.461C325.204 487.748 321.554 489.199 318.564 491.188L297.039 505.512C291.023 509.515 283.371 510.144 276.782 507.177L265.647 502.162L241.605 492.377C235.165 489.756 227.844 490.493 222.055 494.345L183.274 520.15C181.656 521.227 179.895 522.075 178.043 522.667L129.28 538.278C127.213 538.94 125.055 539.277 122.885 539.278L99.3284 539.286C90.5913 539.289 82.7651 533.883 79.6767 525.709L75.9369 515.812C72.8485 507.639 65.5309 504.562 57.652 508.339C45.6535 514.09 28.4455 521.827 18.933 521.831C3.79419 521.836 -42.973 508.798 -64.4641 502.278"
|
||||
stroke="url(#paint3_linear_184_92145)" stroke-opacity="0.1" stroke-width="2" class="svg-elem-4"
|
||||
data-v-835f5c7a=""></path>
|
||||
class="svg-elem-4"
|
||||
d="M1464.92 224.565L1450.57 216.268C1447.82 214.676 1444.74 213.73 1441.57 213.501L1436.19 213.113C1433 212.884 1429.81 213.383 1426.85 214.573L1422.16 216.455C1418.85 217.788 1415.25 218.251 1411.7 217.803L1407.61 217.285C1405.84 217.061 1404.1 216.611 1402.44 215.946L1385.79 209.277C1381.27 207.465 1376.15 207.957 1372.05 210.599L1365.39 214.891C1363.22 216.292 1360.36 215.96 1358.57 214.098V214.098C1356.48 211.929 1353.02 211.884 1350.87 213.996L1344.64 220.13C1340.1 224.604 1333.11 225.459 1327.62 222.213L1325.9 221.197C1320.6 218.059 1313.99 218.109 1308.73 221.326L1299.12 227.207L1284.93 234.212C1281.53 235.891 1278.65 238.459 1276.59 241.644L1272.33 248.231C1270.54 251.016 1268.1 253.335 1265.23 254.998L1253.41 261.858C1251.2 263.138 1249.25 264.809 1247.64 266.789L1233.52 284.182L1215.49 302.383C1214.61 303.268 1213.65 304.064 1212.61 304.757L1203.93 310.568C1201.29 312.341 1197.74 311.92 1195.58 309.577V309.577C1194.12 307.986 1191.95 307.234 1189.81 307.572L1184.48 308.416C1180.76 309.006 1176.95 308.306 1173.67 306.432L1173.1 306.103C1169.45 304.016 1165.21 303.236 1161.06 303.893L1159.23 304.182C1154.9 304.869 1150.46 304.127 1146.58 302.069V302.069C1142.7 300.011 1138.26 299.27 1133.93 299.956L1133.16 300.078C1131.2 300.388 1129.21 300.419 1127.24 300.171L1112.2 298.27C1104.14 297.253 1096.22 300.97 1091.86 307.816L1084.69 319.057C1082.46 322.559 1078.39 324.441 1074.28 323.878L1073.96 323.834C1070.59 323.373 1067.21 324.648 1064.99 327.223V327.223C1060.95 331.903 1053.69 331.859 1049.71 327.13L1048.57 325.774C1046.69 323.549 1043.79 322.466 1040.92 322.921V322.921C1038.4 323.32 1035.84 322.539 1033.97 320.802L1033.14 320.036C1030.76 317.815 1027.48 316.816 1024.26 317.326L1015.32 318.742C1010.01 319.583 1005.23 322.423 1001.96 326.681L1000.59 328.459C1000.09 329.102 999.678 329.801 999.349 330.543V330.543C997.359 335.03 992.454 337.464 987.676 336.334L922.189 320.85C914.267 318.977 905.976 321.85 900.913 328.224L880.617 353.774C878.954 355.867 877.706 358.259 876.941 360.821L874.899 367.649C873.095 373.685 868.676 378.592 862.862 381.016L832.953 393.488C831.651 394.031 830.406 394.704 829.238 395.497L804.778 412.108L778.167 430.345C775.127 432.428 772.69 435.274 771.098 438.597L764.754 451.844C763.724 453.995 762.334 455.956 760.645 457.641L758.206 460.074C755.073 463.199 751.032 465.255 746.66 465.948L742.343 466.631C740.338 466.949 738.438 467.745 736.805 468.952V468.952C731.033 473.218 722.872 471.83 718.835 465.896L716.916 463.077C712.981 457.294 705.732 454.755 699.049 456.821L675.218 464.184C673.656 464.667 672.043 464.966 670.413 465.074L641.719 466.984C640.062 467.094 638.424 467.401 636.838 467.897L611.444 475.85C609.415 476.485 607.301 476.809 605.175 476.809L590.493 476.815C586.171 476.816 581.954 475.484 578.418 473.001L558.456 458.984C554.919 456.501 550.702 455.169 546.381 455.171L539.004 455.173L529.93 455.177C526.679 455.178 523.472 455.934 520.563 457.385L508.917 463.194C506.566 464.367 504.015 465.088 501.397 465.32L490.96 466.246C484.166 466.848 477.766 470.899 471.471 473.524C466.971 475.4 460.631 476.86 452.088 476.863C441.513 476.867 429.767 482.715 420.181 489.24C413.966 493.47 393.43 502.117 385.912 502.12V502.12C385.007 502.12 382.228 502.279 381.366 502.552C348.09 513.066 337.998 494.692 328.36 489.461C325.204 487.748 321.554 489.199 318.564 491.188L297.039 505.512C291.023 509.515 283.371 510.144 276.782 507.177L265.647 502.162L241.605 492.377C235.165 489.756 227.844 490.493 222.055 494.345L183.274 520.15C181.656 521.227 179.895 522.075 178.043 522.667L129.28 538.278C127.213 538.94 125.055 539.277 122.885 539.278L99.3284 539.286C90.5913 539.289 82.7651 533.883 79.6767 525.709L75.9369 515.812C72.8485 507.639 65.5309 504.562 57.652 508.339C45.6535 514.09 28.4455 521.827 18.933 521.831C3.79419 521.836 -42.973 508.798 -64.4641 502.278" data-v-835f5c7a="" stroke="url(#paint3_linear_184_92145)" stroke-opacity="0.1"
|
||||
stroke-width="2"></path>
|
||||
</g>
|
||||
<defs data-v-835f5c7a="">
|
||||
<linearGradient id="paint0_linear_184_92145" x1="1419.37" y1="282.77" x2="3.81323" y2="550.717"
|
||||
gradientUnits="userSpaceOnUse" data-v-835f5c7a="">
|
||||
<stop stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.203125" stop-color="#00DC82" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.333238" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.66715" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.757084" stop-color="#00DC82" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.994792" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<linearGradient id="paint0_linear_184_92145" data-v-835f5c7a="" gradientUnits="userSpaceOnUse" x1="1419.37" x2="3.81323"
|
||||
y1="282.77" y2="550.717">
|
||||
<stop data-v-835f5c7a="" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.203125" stop-color="#00DC82"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.333238" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.66715" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.757084" stop-color="#00DC82"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.994792" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_184_92145" x1="1433.93" y1="259.854" x2="-4.14577" y2="537.487"
|
||||
gradientUnits="userSpaceOnUse" data-v-835f5c7a="">
|
||||
<stop stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.203125" stop-color="#00DC82" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.333238" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.66715" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.757084" stop-color="#00DC82" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.994792" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<linearGradient id="paint1_linear_184_92145" data-v-835f5c7a="" gradientUnits="userSpaceOnUse" x1="1433.93" x2="-4.14577"
|
||||
y1="259.854" y2="537.487">
|
||||
<stop data-v-835f5c7a="" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.203125" stop-color="#00DC82"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.333238" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.66715" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.757084" stop-color="#00DC82"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.994792" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_184_92145" x1="1438.07" y1="238.674" x2="6.64425" y2="510.046"
|
||||
gradientUnits="userSpaceOnUse" data-v-835f5c7a="">
|
||||
<stop stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.203125" stop-color="#00DC82" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.333238" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.66715" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.757084" stop-color="#00DC82" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.994792" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<linearGradient id="paint2_linear_184_92145" data-v-835f5c7a="" gradientUnits="userSpaceOnUse" x1="1438.07" x2="6.64425"
|
||||
y1="238.674" y2="510.046">
|
||||
<stop data-v-835f5c7a="" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.203125" stop-color="#00DC82"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.333238" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.66715" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.757084" stop-color="#00DC82"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.994792" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_184_92145" x1="1435.07" y1="217.674" x2="3.64425" y2="489.046"
|
||||
gradientUnits="userSpaceOnUse" data-v-835f5c7a="">
|
||||
<stop stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.203125" stop-color="#00DC82" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.333238" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.66715" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.757084" stop-color="#00DC82" data-v-835f5c7a=""></stop>
|
||||
<stop offset="0.994792" stop-color="#00DC82" stop-opacity="0" data-v-835f5c7a=""></stop>
|
||||
<linearGradient id="paint3_linear_184_92145" data-v-835f5c7a="" gradientUnits="userSpaceOnUse" x1="1435.07" x2="3.64425"
|
||||
y1="217.674" y2="489.046">
|
||||
<stop data-v-835f5c7a="" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.203125" stop-color="#00DC82"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.333238" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.66715" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.757084" stop-color="#00DC82"></stop>
|
||||
<stop data-v-835f5c7a="" offset="0.994792" stop-color="#00DC82" stop-opacity="0"></stop>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0_184_92145" data-v-835f5c7a="">
|
||||
<rect width="1491" height="732" fill="white" transform="translate(-73 144) rotate(-8)" class="svg-elem-5"
|
||||
data-v-835f5c7a=""></rect>
|
||||
<rect class="svg-elem-5" data-v-835f5c7a="" fill="white" height="732" transform="translate(-73 144) rotate(-8)"
|
||||
width="1491"></rect>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
<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="mb-8 cursor-pointer">
|
||||
<el-tag type="warning" round @click="navTo(`/detail`)">v3.0 版本发布
|
||||
<el-tag round type="warning" @click="navTo(`/detail`)">v3.0 版本发布
|
||||
</el-tag>
|
||||
</div>
|
||||
<h1 class="text-5xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-7xl">
|
||||
<h1 class="text-4xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-7xl">
|
||||
<span>构建现代Web应用</span><br/>
|
||||
<!-- <span class="text-primary block lg:inline-block text-green-500">Vue 框架</span>-->
|
||||
<span class="text-primary block lg:inline-block text-green-500 text-2xl sm:text-4xl tracking-wide">Vue | React</span>
|
||||
</h1>
|
||||
<div class="mt-6 text-lg tracking-tight text-gray-400 dark:text-gray-300"> 基于Java SpringBoot构建的SaaS软件平台、支持Vue、React前端框架<br>
|
||||
自信地创建高性能和生产级的全栈web应用程序和网站
|
||||
</div>
|
||||
<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 gap-4">
|
||||
<!-- <el-button size="large" type="danger" :icon="ElIconUser" @click="openUrl(`https://site.websoft.top`)">立即登录</el-button>-->
|
||||
<!-- <el-button size="large" type="primary" :icon="ElIconArrowRight" @click="openUrl(`https://site.websoft.top/register`)">免费注册</el-button>-->
|
||||
|
||||
<div class="flex flex-col justify-center cursor-pointer text-white items-center bg-gray-400 hover:bg-green-600 w-[100px] h-[100px] rounded-full" @click="openUrl(`https://dl.wsdns.cn/soft/WebSoft-window.zip`)">
|
||||
<img alt="Windows" src="data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' viewBox='0 0 40 40'%3E %3Cg fill='%23FFF' fill-rule='evenodd'%3E %3Cpath d='M6.316 21.826v9.025l10.99 1.539V21.826zm12.045 0v10.712l14.463 2.026V21.826zM6.316 11.767v9.004h10.99V10.205zM32.824 8l-14.463 2.055v10.716h14.463z' opacity='1'/%3E %3Cpath fill='none' d='M0 0h40v40H0z'/%3E %3C/g%3E%3C/svg%3E" />
|
||||
<span class="text-sm">Windows</span>
|
||||
<div class="mt-6 text-lg sm:text-xl tracking-tight text-gray-400 dark:text-gray-300"> 基于多租户系统构建的SaaS软件平台、支持Vue、React前端框架<br>
|
||||
快速构建高性能的生产级全栈web应用
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col justify-center cursor-pointer text-white items-center bg-gray-400 hover:bg-green-600 w-[100px] h-[100px] rounded-full" @click="openUrl(`https://dl.wsdns.cn/soft/WebSoft-3.0.0-arm64.dmg`)">
|
||||
<img alt="macOs" src="data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='40' height='40' viewBox='0 0 40 40'%3E %3Cdefs%3E %3Cpath id='47f1323c-993c-4d45-aab1-bebb1206c2bb-a' d='M.001.592h26.926v24.039H.001z'/%3E %3C/defs%3E %3Cg fill='none' fill-rule='evenodd'%3E %3Cpath d='M0 0h40v40H0z'/%3E %3Cg opacity='1' transform='translate(6.316 2.737)'%3E %3Cg transform='translate(0 7.045)'%3E %3Cmask id='47f1323c-993c-4d45-aab1-bebb1206c2bb-b' fill='%23fff'%3E %3Cuse xlink:href='%2347f1323c-993c-4d45-aab1-bebb1206c2bb-a'/%3E %3C/mask%3E %3Cpath fill='%23FFF' d='M20.005.608c-2.722-.193-5.031 1.456-6.32 1.456-1.308 0-3.324-1.415-5.461-1.376-2.806.04-5.393 1.564-6.84 3.972C-1.531 9.506.64 16.687 3.479 20.62c1.389 1.922 3.045 4.088 5.221 4.009 2.094-.08 2.887-1.298 5.418-1.298 2.53 0 3.243 1.298 5.458 1.259 2.254-.04 3.683-1.962 5.061-3.894 1.596-2.23 2.251-4.39 2.29-4.505-.05-.018-4.394-1.614-4.437-6.408-.04-4.008 3.415-5.935 3.573-6.028C24.102.989 21.073.684 20.005.608' mask='url(%2347f1323c-993c-4d45-aab1-bebb1206c2bb-b)'/%3E %3C/g%3E %3Cpath fill='%23FFF' d='M18.325 5.057C19.482 3.718 20.26 1.854 20.045 0c-1.663.063-3.676 1.062-4.87 2.4-1.07 1.185-2.008 3.083-1.753 4.899 1.855.137 3.748-.902 4.903-2.242'/%3E %3C/g%3E %3C/g%3E%3C/svg%3E" />
|
||||
<span class="text-sm">macOs</span>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col justify-center cursor-pointer text-white items-center bg-gray-400 hover:bg-gray-500 w-[100px] h-[100px] rounded-full">
|
||||
<img alt="iOS" src="data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='40' height='40' viewBox='0 0 40 40'%3E %3Cdefs%3E %3Cpath id='f46e5a6d-7d66-4f5f-8628-7f4ceb95844a-a' d='M0 0h27v24.104H0z'/%3E %3C/defs%3E %3Cg fill='none' fill-rule='evenodd' transform='translate(7 4)'%3E %3Cg transform='translate(0 7.658)'%3E %3Cmask id='f46e5a6d-7d66-4f5f-8628-7f4ceb95844a-b' fill='%23fff'%3E %3Cuse xlink:href='%23f46e5a6d-7d66-4f5f-8628-7f4ceb95844a-a'/%3E %3C/mask%3E %3Cpath fill='%23FFF' d='M20.06.016c-2.73-.194-5.046 1.46-6.339 1.46-1.311 0-3.332-1.418-5.475-1.38-2.814.04-5.408 1.57-6.86 3.983-2.922 4.86-.745 12.06 2.102 16.004 1.392 1.927 3.053 4.098 5.235 4.02 2.1-.08 2.895-1.302 5.433-1.302 2.536 0 3.252 1.301 5.473 1.262 2.26-.04 3.692-1.967 5.075-3.904 1.6-2.237 2.257-4.403 2.296-4.517-.05-.018-4.406-1.619-4.45-6.426-.039-4.019 3.425-5.951 3.583-6.044C24.167.398 21.129.092 20.059.016z' mask='url(%23f46e5a6d-7d66-4f5f-8628-7f4ceb95844a-b)'/%3E %3C/g%3E %3Cpath fill='%23FFF' d='M18.375 5.07c1.16-1.342 1.94-3.21 1.725-5.07-1.669.063-3.687 1.065-4.884 2.406-1.072 1.188-2.013 3.091-1.757 4.912 1.86.138 3.758-.904 4.916-2.247z'/%3E %3C/g%3E%3C/svg%3E">
|
||||
<span class="text-sm">iOS</span>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col justify-center cursor-pointer text-white items-center bg-gray-400 hover:bg-gray-500 w-[100px] h-[100px] rounded-full">
|
||||
<img alt="Android" src="data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='40' height='40' viewBox='0 0 40 40'%3E %3Cdefs%3E %3Cpath id='a688108f-309f-4e18-a0dc-ed026741fa12-a' d='M0 0h33.684v18.947H0z'/%3E %3C/defs%3E %3Cg fill='none' fill-rule='evenodd'%3E %3Cpath d='M0 0h40v40H0z'/%3E %3Cg opacity='1' transform='translate(3.158 11.158)'%3E %3Cmask id='a688108f-309f-4e18-a0dc-ed026741fa12-b' fill='%23fff'%3E %3Cuse xlink:href='%23a688108f-309f-4e18-a0dc-ed026741fa12-a'/%3E %3C/mask%3E %3Cpath fill='%23FFF' d='M24.594 14.156a1.402 1.402 0 1 1-.003-2.803 1.402 1.402 0 0 1 .003 2.803m-15.504 0a1.402 1.402 0 1 1-.002-2.803 1.402 1.402 0 0 1 .002 2.803M25.097 5.72L27.9.874a.584.584 0 0 0-1.01-.583L24.05 5.2c-2.17-.989-4.608-1.54-7.21-1.54-2.6 0-5.038.552-7.209 1.54L6.794.291a.584.584 0 0 0-1.01.582l2.803 4.848C3.774 8.335.482 13.2 0 18.947h33.684C33.202 13.2 29.91 8.335 25.097 5.721' mask='url(%23a688108f-309f-4e18-a0dc-ed026741fa12-b)'/%3E %3C/g%3E %3C/g%3E%3C/svg%3E">
|
||||
<span class="text-sm">Android</span>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- <el-button size="large" :icon="ElIconDownload" @click="openUrl(`https://file.gxwebsoft.com/download/website-3.0.1-arm64.dmg`)">macOs</el-button>-->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 图标列表 -->
|
||||
<LandingLogos />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import {useToken} from "~/composables/configState";
|
||||
import {loginAdminByToken, navTo, openUrl} from "~/utils/common";
|
||||
import {navigateTo} from "#imports";
|
||||
const token = useToken();
|
||||
<script lang="ts" setup>
|
||||
import {navTo} from "~/utils/common";
|
||||
import LandingLogos from "~/components/Index/LandingLogos.vue";
|
||||
</script>
|
||||
|
||||
<style scoped lang="less">
|
||||
<style lang="less" scoped>
|
||||
|
||||
</style>
|
||||
41
components/Index/LandingLogos.vue
Normal file
41
components/Index/LandingLogos.vue
Normal file
@@ -0,0 +1,41 @@
|
||||
<template>
|
||||
<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 gap-4">
|
||||
<div
|
||||
class="hidden-sm-and-down flex flex-col justify-center cursor-pointer text-white items-center bg-gray-400 hover:bg-green-600 w-[66px] h-[66px] sm:w-[100px] sm:h-[100px] rounded-full"
|
||||
@click="openUrl(`https://dl.wsdns.cn/soft/WebSoft-window.zip`)">
|
||||
<el-image alt="Windows" class="w-[25px] h-[25px] sm:w-[44px] sm:h-[44px]"
|
||||
src="data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' viewBox='0 0 40 40'%3E %3Cg fill='%23FFF' fill-rule='evenodd'%3E %3Cpath d='M6.316 21.826v9.025l10.99 1.539V21.826zm12.045 0v10.712l14.463 2.026V21.826zM6.316 11.767v9.004h10.99V10.205zM32.824 8l-14.463 2.055v10.716h14.463z' opacity='1'/%3E %3Cpath fill='none' d='M0 0h40v40H0z'/%3E %3C/g%3E%3C/svg%3E" />
|
||||
<span class="text-xs sm:text-sm">Windows</span>
|
||||
</div>
|
||||
<div
|
||||
class="hidden-sm-and-down flex flex-col justify-center cursor-pointer text-white items-center bg-gray-400 hover:bg-green-600 w-[60px] h-[60px] sm:w-[100px] sm:h-[100px] rounded-full"
|
||||
@click="openUrl(`https://dl.wsdns.cn/soft/WebSoft-3.0.0-arm64.dmg`)">
|
||||
<el-image alt="macOs" class="w-[25px] h-[25px] sm:w-[44px] sm:h-[44px]"
|
||||
src="data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='40' height='40' viewBox='0 0 40 40'%3E %3Cdefs%3E %3Cpath id='47f1323c-993c-4d45-aab1-bebb1206c2bb-a' d='M.001.592h26.926v24.039H.001z'/%3E %3C/defs%3E %3Cg fill='none' fill-rule='evenodd'%3E %3Cpath d='M0 0h40v40H0z'/%3E %3Cg opacity='1' transform='translate(6.316 2.737)'%3E %3Cg transform='translate(0 7.045)'%3E %3Cmask id='47f1323c-993c-4d45-aab1-bebb1206c2bb-b' fill='%23fff'%3E %3Cuse xlink:href='%2347f1323c-993c-4d45-aab1-bebb1206c2bb-a'/%3E %3C/mask%3E %3Cpath fill='%23FFF' d='M20.005.608c-2.722-.193-5.031 1.456-6.32 1.456-1.308 0-3.324-1.415-5.461-1.376-2.806.04-5.393 1.564-6.84 3.972C-1.531 9.506.64 16.687 3.479 20.62c1.389 1.922 3.045 4.088 5.221 4.009 2.094-.08 2.887-1.298 5.418-1.298 2.53 0 3.243 1.298 5.458 1.259 2.254-.04 3.683-1.962 5.061-3.894 1.596-2.23 2.251-4.39 2.29-4.505-.05-.018-4.394-1.614-4.437-6.408-.04-4.008 3.415-5.935 3.573-6.028C24.102.989 21.073.684 20.005.608' mask='url(%2347f1323c-993c-4d45-aab1-bebb1206c2bb-b)'/%3E %3C/g%3E %3Cpath fill='%23FFF' d='M18.325 5.057C19.482 3.718 20.26 1.854 20.045 0c-1.663.063-3.676 1.062-4.87 2.4-1.07 1.185-2.008 3.083-1.753 4.899 1.855.137 3.748-.902 4.903-2.242'/%3E %3C/g%3E %3C/g%3E%3C/svg%3E" />
|
||||
<span class="text-xs sm:text-sm">macOs</span>
|
||||
</div>
|
||||
<div
|
||||
class="flex flex-col justify-center cursor-pointer text-white items-center bg-gray-400 hover:bg-gray-500 w-[90px] h-[90px] sm:w-[100px] sm:h-[100px] rounded-full">
|
||||
<el-image alt="iOS"
|
||||
src="data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='40' height='40' viewBox='0 0 40 40'%3E %3Cdefs%3E %3Cpath id='f46e5a6d-7d66-4f5f-8628-7f4ceb95844a-a' d='M0 0h27v24.104H0z'/%3E %3C/defs%3E %3Cg fill='none' fill-rule='evenodd' transform='translate(7 4)'%3E %3Cg transform='translate(0 7.658)'%3E %3Cmask id='f46e5a6d-7d66-4f5f-8628-7f4ceb95844a-b' fill='%23fff'%3E %3Cuse xlink:href='%23f46e5a6d-7d66-4f5f-8628-7f4ceb95844a-a'/%3E %3C/mask%3E %3Cpath fill='%23FFF' d='M20.06.016c-2.73-.194-5.046 1.46-6.339 1.46-1.311 0-3.332-1.418-5.475-1.38-2.814.04-5.408 1.57-6.86 3.983-2.922 4.86-.745 12.06 2.102 16.004 1.392 1.927 3.053 4.098 5.235 4.02 2.1-.08 2.895-1.302 5.433-1.302 2.536 0 3.252 1.301 5.473 1.262 2.26-.04 3.692-1.967 5.075-3.904 1.6-2.237 2.257-4.403 2.296-4.517-.05-.018-4.406-1.619-4.45-6.426-.039-4.019 3.425-5.951 3.583-6.044C24.167.398 21.129.092 20.059.016z' mask='url(%23f46e5a6d-7d66-4f5f-8628-7f4ceb95844a-b)'/%3E %3C/g%3E %3Cpath fill='%23FFF' d='M18.375 5.07c1.16-1.342 1.94-3.21 1.725-5.07-1.669.063-3.687 1.065-4.884 2.406-1.072 1.188-2.013 3.091-1.757 4.912 1.86.138 3.758-.904 4.916-2.247z'/%3E %3C/g%3E%3C/svg%3E" />
|
||||
<span class="text-sm">iOS</span>
|
||||
</div>
|
||||
<div
|
||||
class="flex flex-col justify-center cursor-pointer text-white items-center bg-gray-400 hover:bg-gray-500 w-[90px] h-[90px] sm:w-[100px] sm:h-[100px] rounded-full">
|
||||
<el-image alt="Android"
|
||||
src="data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='40' height='40' viewBox='0 0 40 40'%3E %3Cdefs%3E %3Cpath id='a688108f-309f-4e18-a0dc-ed026741fa12-a' d='M0 0h33.684v18.947H0z'/%3E %3C/defs%3E %3Cg fill='none' fill-rule='evenodd'%3E %3Cpath d='M0 0h40v40H0z'/%3E %3Cg opacity='1' transform='translate(3.158 11.158)'%3E %3Cmask id='a688108f-309f-4e18-a0dc-ed026741fa12-b' fill='%23fff'%3E %3Cuse xlink:href='%23a688108f-309f-4e18-a0dc-ed026741fa12-a'/%3E %3C/mask%3E %3Cpath fill='%23FFF' d='M24.594 14.156a1.402 1.402 0 1 1-.003-2.803 1.402 1.402 0 0 1 .003 2.803m-15.504 0a1.402 1.402 0 1 1-.002-2.803 1.402 1.402 0 0 1 .002 2.803M25.097 5.72L27.9.874a.584.584 0 0 0-1.01-.583L24.05 5.2c-2.17-.989-4.608-1.54-7.21-1.54-2.6 0-5.038.552-7.209 1.54L6.794.291a.584.584 0 0 0-1.01.582l2.803 4.848C3.774 8.335.482 13.2 0 18.947h33.684C33.202 13.2 29.91 8.335 25.097 5.721' mask='url(%23a688108f-309f-4e18-a0dc-ed026741fa12-b)'/%3E %3C/g%3E %3C/g%3E%3C/svg%3E" />
|
||||
<span class="text-sm">Android</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import {openUrl} from "~/utils/common";
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
92
components/Index/MarketList.vue
Normal file
92
components/Index/MarketList.vue
Normal file
@@ -0,0 +1,92 @@
|
||||
<template>
|
||||
<div class="xl:w-screen-xl m-auto py-4 px-4 sm:px-0">
|
||||
<div class="text-center flex flex-col items-center z-0 relative">
|
||||
<h2 class="text-4xl font-bold tracking-tight text-gray-500 dark:text-white">
|
||||
{{ title || '插件市场' }}
|
||||
</h2>
|
||||
<div class="sub-title">
|
||||
<p class="text-gray-400 text-sm dark:text-gray-400 py-3">
|
||||
{{ comments || '第三方开发者开发的应用插件!' }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<el-row id="container" :gutter="24" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :sm="8" :xs="24" class="left mb-8">
|
||||
<el-card :body-style="{ padding: '0px' }" class="cursor-pointer" shadow="hover">
|
||||
<nuxt-link :to="`/market/${item.websiteId}`">
|
||||
<div class="flex-1 px-4 py-5 sm:p-4 !p-4">
|
||||
<div class="text-gray-700 dark:text-white text-base font-semibold flex gap-1.5">
|
||||
<el-avatar
|
||||
:size="55" :src="item.websiteLogo" shape="square" style="background-color: white;"/>
|
||||
<div class="flex-1 text-lg cursor-pointer flex flex-col">
|
||||
{{ item.websiteName }}
|
||||
<div class="flex justify-between items-center">
|
||||
<sapn class="text-xs text-gray-400 font-normal line-clamp-1">
|
||||
{{ id == item.websiteId ? item.domain : item.comments || '暂无描述' }}
|
||||
</sapn>
|
||||
<el-button round size="small">获取</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item-image pt-3 overflow-hidden">
|
||||
<el-image v-if="item.files" :src="`${JSON.parse(item.files)[0]}`" class="w-full h-1/2 max-h-[220px] transition-transform duration-300 ease-in-out hover:scale-110"/>
|
||||
<el-image v-else class="w-full h-[220px]"/>
|
||||
</div>
|
||||
</div>
|
||||
</nuxt-link>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
<div v-if="disabled" class="px-1 text-center text-gray-500 min-h-xs">
|
||||
没有更多了
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import {navigateTo} from "#imports";
|
||||
import type {CmsWebsite, CmsWebsiteParam} from "~/api/cms/cmsWebsite/model";
|
||||
import {pageCmsWebsiteAll} from "~/api/cms/cmsWebsite";
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
param?: CmsWebsiteParam | any;
|
||||
disabled?: boolean;
|
||||
title?: string;
|
||||
comments?: string;
|
||||
fit?: any;
|
||||
}>(),
|
||||
{
|
||||
fit: 'cover'
|
||||
}
|
||||
);
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'done'): void;
|
||||
}>();
|
||||
|
||||
const list = ref<CmsWebsite[]>([]);
|
||||
const id = ref<number>(0);
|
||||
|
||||
const showMenu = (item: CmsWebsite) => {
|
||||
id.value = Number(item.websiteId);
|
||||
};
|
||||
|
||||
const hideMenu = () => {
|
||||
id.value = 0;
|
||||
};
|
||||
|
||||
// 请求数据
|
||||
const reload = async () => {
|
||||
pageCmsWebsiteAll({
|
||||
official: false,
|
||||
plugin: true,
|
||||
limit: 8,
|
||||
sort: 'websiteId',
|
||||
order: 'asc'
|
||||
}).then(data => {
|
||||
list.value = data?.list || [];
|
||||
})
|
||||
}
|
||||
reload();
|
||||
</script>
|
||||
76
components/Index/Partners.vue
Normal file
76
components/Index/Partners.vue
Normal file
@@ -0,0 +1,76 @@
|
||||
<template>
|
||||
<div class="xl:w-screen-xl m-auto py-4 px-4 sm:px-0">
|
||||
<div class="text-center flex flex-col items-center z-0 relative">
|
||||
<h2 class="text-4xl font-bold tracking-tight text-gray-500 dark:text-white">
|
||||
{{ title || '合作伙伴' }}
|
||||
</h2>
|
||||
<div class="sub-title">
|
||||
<p class="text-gray-400 text-sm dark:text-gray-400 py-3">
|
||||
{{ comments || '感谢所有合作伙伴和赞助商的支持!' }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<el-row id="container" :gutter="24" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :sm="4" :xs="12" class="left mb-8">
|
||||
<nuxt-link :to="`${item.url}`" class="flex-1 cursor-pointer flex flex-col text-center" target="_blank">
|
||||
<el-card :body-style="{ padding: '0px' }" class="items-center flex justify-center" shadow="hover"
|
||||
@mouseleave="hideMenu" @mouseover="showMenu(item)">
|
||||
<div class="flex-1 py-5 sm:p-4 !p-4">
|
||||
<el-space class="text-gray-700 dark:text-white text-base font-semibold h-[28px] flex justify-center items-center">
|
||||
<el-image v-if="item.icon" :alt="item.name" :src="item.icon" style="height: 30px"/>
|
||||
<span :title="item.name" class="text-lg line-clamp-1">{{ item.name }}</span>
|
||||
</el-space>
|
||||
</div>
|
||||
</el-card>
|
||||
</nuxt-link>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
<div v-if="disabled" class="px-1 text-center text-gray-500 min-h-xs">
|
||||
没有更多了
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import {navigateTo} from "#imports";
|
||||
import type {CmsWebsite, CmsWebsiteParam} from "~/api/cms/cmsWebsite/model";
|
||||
import {pageCmsWebsiteAll} from "~/api/cms/cmsWebsite";
|
||||
import {pageCmsLink} from "~/api/cms/cmsLink";
|
||||
import type {CmsLink} from "~/api/cms/cmsLink/model";
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
param?: CmsWebsiteParam | any;
|
||||
disabled?: boolean;
|
||||
title?: string;
|
||||
comments?: string;
|
||||
fit?: any;
|
||||
}>(),
|
||||
{
|
||||
fit: 'cover'
|
||||
}
|
||||
);
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'done'): void;
|
||||
}>();
|
||||
|
||||
const list = ref<CmsLink[]>([]);
|
||||
const id = ref<number>(0);
|
||||
|
||||
const showMenu = (item: CmsLink) => {
|
||||
id.value = Number(item.id);
|
||||
};
|
||||
|
||||
const hideMenu = () => {
|
||||
id.value = 0;
|
||||
};
|
||||
|
||||
// 请求数据
|
||||
const reload = async () => {
|
||||
pageCmsLink({limit: 6}).then(data => {
|
||||
list.value = data?.list || [];
|
||||
})
|
||||
}
|
||||
reload();
|
||||
</script>
|
||||
93
components/Index/SiteList.vue
Normal file
93
components/Index/SiteList.vue
Normal file
@@ -0,0 +1,93 @@
|
||||
<template>
|
||||
<div class="xl:w-screen-xl m-auto py-4 px-4 sm:px-0">
|
||||
<div class="text-center flex flex-col items-center z-0 relative">
|
||||
<h2 class="text-4xl font-bold tracking-tight text-gray-500 dark:text-white">
|
||||
{{ title || '产品服务' }}
|
||||
</h2>
|
||||
<div class="sub-title">
|
||||
<p class="text-gray-400 text-sm dark:text-gray-400 py-3">
|
||||
{{ comments || '官方开发的应用' }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<el-row id="container" :gutter="24" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :sm="6" :xs="12" class="left mb-8">
|
||||
<el-card :body-style="{ padding: '0px' }" class="h-[180px] items-center flex justify-center" shadow="hover" @mouseleave="hideMenu" @mouseover="showMenu(item)">
|
||||
<div class="flex-1 px-4 py-5 sm:p-4 !p-4">
|
||||
<div class="text-gray-700 dark:text-white text-base font-semibold flex flex-col items-center gap-1.5">
|
||||
<nuxt-link :to="`https://${item.adminUrl}`" target="_blank">
|
||||
<el-avatar
|
||||
:size="55" :src="item.websiteLogo" shape="square" style="background-color: white;"/>
|
||||
</nuxt-link>
|
||||
<div class="flex-1 cursor-pointer flex flex-col text-center">
|
||||
<nuxt-link :to="`https://${item.adminUrl}`" class="text-lg" target="_blank">{{ item.websiteName }}</nuxt-link>
|
||||
<div v-if="id == item.websiteId" class="flex text-gray-400 text-sm font-normal py2 justify-between items-center">
|
||||
<div>
|
||||
<nuxt-link :to="`https://${item.adminUrl}`" target="_blank"><span class="text-gray-400 hover:text-green-700">控制台</span></nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`/market/${item.websiteId}`"><span class="text-gray-400 hover:text-green-700">详情</span></nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`/market/${item.websiteId}`"><span class="text-gray-400 hover:text-green-700">评论</span></nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`/product/code/${item.websiteId}`"><span class="text-gray-400 hover:text-green-700">源码</span></nuxt-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
<div v-if="disabled" class="px-1 text-center text-gray-500 min-h-xs">
|
||||
没有更多了
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import {navigateTo} from "#imports";
|
||||
import type {CmsWebsite, CmsWebsiteParam} from "~/api/cms/cmsWebsite/model";
|
||||
import {pageCmsWebsiteAll} from "~/api/cms/cmsWebsite";
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
param?: CmsWebsiteParam | any;
|
||||
disabled?: boolean;
|
||||
title?: string;
|
||||
comments?: string;
|
||||
fit?: any;
|
||||
}>(),
|
||||
{
|
||||
fit: 'cover'
|
||||
}
|
||||
);
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'done'): void;
|
||||
}>();
|
||||
|
||||
const list = ref<CmsWebsite[]>([]);
|
||||
const id = ref<number>(0);
|
||||
|
||||
const showMenu = (item: CmsWebsite) => {
|
||||
id.value = Number(item.websiteId);
|
||||
};
|
||||
|
||||
const hideMenu = () => {
|
||||
id.value = 0;
|
||||
};
|
||||
|
||||
// 请求数据
|
||||
const reload = async () => {
|
||||
pageCmsWebsiteAll({
|
||||
official: true,
|
||||
plugin: true,
|
||||
limit: 4,
|
||||
sort: 'websiteId',
|
||||
order: 'asc'
|
||||
}).then(data => {
|
||||
list.value = data?.list || [];
|
||||
})
|
||||
}
|
||||
reload();
|
||||
</script>
|
||||
@@ -16,25 +16,33 @@ const previousArticle = ref<CmsArticle>();
|
||||
const nextArticle = ref<CmsArticle>();
|
||||
|
||||
// 上一篇
|
||||
previousArticle.value = await getPrevious({
|
||||
getPrevious({
|
||||
articleId: props.articleId,
|
||||
lang: i18n.locale.value
|
||||
}).then(res => {
|
||||
previousArticle.value = res;
|
||||
}).catch(() => {
|
||||
})
|
||||
// 下一篇
|
||||
nextArticle.value = await getNext({
|
||||
getNext({
|
||||
articleId: props.articleId,
|
||||
lang: i18n.locale.value
|
||||
}).then(data => {
|
||||
nextArticle.value = data;
|
||||
}).catch(() => {
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="flex justify-between flex-col sm:flex-row my-3 gap-4">
|
||||
<nuxt-link :to="previousArticle ? detail(previousArticle) : ''" class="w-auto sm:w-[50%] flex flex-col justify-center p-4 border-1 border-solid border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50">
|
||||
<nuxt-link :to="previousArticle ? detail(previousArticle) : ''"
|
||||
class="w-auto sm:w-[50%] flex flex-col justify-center p-4 border-1 border-solid border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50">
|
||||
<span class="text-lg text-gray-800">{{ previousArticle?.title || '没有了' }}</span>
|
||||
<span class="text-gray-400">{{ $t('previous') }}</span>
|
||||
</nuxt-link>
|
||||
<nuxt-link :to="nextArticle ? detail(nextArticle) : ''" class="w-auto sm:w-[50%] flex flex-col justify-center p-4 border-1 border-solid border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50">
|
||||
<nuxt-link :to="nextArticle ? detail(nextArticle) : ''"
|
||||
class="w-auto sm:w-[50%] flex flex-col justify-center p-4 border-1 border-solid border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50">
|
||||
<span class="text-lg text-gray-800">{{ nextArticle?.title || '没有了' }}</span>
|
||||
<span class="text-gray-400">{{ $t('next') }}</span>
|
||||
</nuxt-link>
|
||||
|
||||
@@ -29,7 +29,7 @@ const mobile = useIsMobile();
|
||||
const where = reactive<CmsArticleParam>({
|
||||
keywords: '',
|
||||
page: 1,
|
||||
limit: props.pageSize || 12,
|
||||
limit: props.pageSize || 10,
|
||||
status: 0,
|
||||
parentId: undefined,
|
||||
categoryId: undefined,
|
||||
|
||||
30
components/PricingCard.vue
Normal file
30
components/PricingCard.vue
Normal file
@@ -0,0 +1,30 @@
|
||||
<template>
|
||||
<el-card :body-style="{ padding: '0px' }" class="h-[200px] items-center flex justify-center" shadow="hover">
|
||||
<div class="flex-1 px-4 py-5 sm:p-4 !p-4">
|
||||
<div class="text-gray-700 dark:text-white text-base font-semibold flex flex-col items-center gap-1.5">
|
||||
<el-avatar
|
||||
:size="55" shape="square" src="" style="background-color: white;"/>
|
||||
<div class="flex-1 cursor-pointer flex flex-col text-center">
|
||||
<nuxt-link :to="`https://websoft.top`" class="text-lg">websiteName</nuxt-link>
|
||||
<div class="flex text-gray-400 text-sm font-normal py2 justify-between items-center">
|
||||
<div>
|
||||
<nuxt-link :to="`https://websoft.top/docs?appid=`"><span class="text-gray-400 hover:text-green-700">开发文档</span></nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`https://websoft.top/docs?appid=`"><span class="text-gray-400 hover:text-green-700">社区</span></nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`https://websoft.top/market?appid=`"><span class="text-gray-400 hover:text-green-700">插件市场</span></nuxt-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
</style>
|
||||
@@ -1,83 +0,0 @@
|
||||
<template>
|
||||
<div class="xl:w-screen-xl m-auto py-4">
|
||||
<div v-if="title" class="text-center flex flex-col items-center z-100 relative">
|
||||
<h2 class="text-4xl font-bold tracking-tight text-gray-500 dark:text-white">
|
||||
{{ title }}
|
||||
</h2>
|
||||
<div class="sub-title">
|
||||
<p class="text-gray-500 dark:text-gray-400 py-3">
|
||||
{{ comments }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<el-row :gutter="24" id="container" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :span="6" class="left mb-8">
|
||||
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="h-[200px] items-center flex justify-center" @mouseover="showMenu(item)" @mouseleave="hideMenu">
|
||||
<div class="flex-1 px-4 py-5 sm:p-4 !p-4">
|
||||
<div class="text-gray-700 dark:text-white text-base font-semibold flex flex-col items-center gap-1.5">
|
||||
<el-avatar
|
||||
:src="item.websiteLogo" shape="square" :size="55" style="background-color: white;"/>
|
||||
<div class="flex-1 cursor-pointer flex flex-col text-center">
|
||||
<nuxt-link :to="`https://${item.websiteCode}.websoft.top`" class="text-lg">{{ item.websiteName }}</nuxt-link>
|
||||
<div v-if="id == item.websiteId" class="flex text-gray-400 text-sm font-normal py2 justify-between items-center">
|
||||
<div>
|
||||
<nuxt-link :to="`https://websoft.top/docs?appid=${item.websiteId}`"><span class="text-gray-400 hover:text-green-700">开发文档</span></nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`https://websoft.top/docs?appid=${item.websiteId}`"><span class="text-gray-400 hover:text-green-700">社区</span></nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`https://websoft.top/market?appid=${item.websiteId}`"><span class="text-gray-400 hover:text-green-700">插件市场</span></nuxt-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</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 {navigateTo} from "#imports";
|
||||
import type {CmsWebsite, CmsWebsiteParam} from "~/api/cms/cmsWebsite/model";
|
||||
import {pageCmsWebsiteAll} from "~/api/cms/cmsWebsite";
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
param?: CmsWebsiteParam;
|
||||
disabled?: boolean;
|
||||
title?: string;
|
||||
comments?: string;
|
||||
fit?: any;
|
||||
}>(),
|
||||
{
|
||||
fit: 'cover'
|
||||
}
|
||||
);
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'done'): void;
|
||||
}>();
|
||||
|
||||
const list = ref<CmsWebsite[]>([]);
|
||||
const id = ref<number>(0);
|
||||
|
||||
const showMenu = (item: CmsWebsite) => {
|
||||
id.value = Number(item.websiteId);
|
||||
};
|
||||
|
||||
const hideMenu = () => {
|
||||
id.value = 0;
|
||||
};
|
||||
|
||||
// 请求数据
|
||||
const reload = async () => {
|
||||
pageCmsWebsiteAll(props.param).then(data => {
|
||||
list.value = data?.list || [];
|
||||
})
|
||||
}
|
||||
reload();
|
||||
</script>
|
||||
@@ -8,7 +8,7 @@ export const domain = 'https://websoft.top';
|
||||
export const SERVER_API_URL = import.meta.env.VITE_SERVER_URL || 'https://server.gxwebsoft.com/api';
|
||||
// 模块节点
|
||||
export const MODULES_API_URL = import.meta.env.VITE_API_URL || 'https://cms-api.websoft.top/api';
|
||||
export const COMMON_API_URL = import.meta.env.VITE_THINK_URL || 'https://server.gxwebsoft.com/api';
|
||||
export const COMMON_API_URL = import.meta.env.VITE_THINK_URL || 'https://common-api.websoft.top/api';
|
||||
// 文件服务器地址
|
||||
export const FILE_SERVER = 'https://file.wsdns.cn';
|
||||
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
"content": "Content",
|
||||
"realName": "Name",
|
||||
"phone": "Phone",
|
||||
"reference": "Reference Website",
|
||||
"files": "Upload attachments",
|
||||
"email": "E-mail",
|
||||
"address": "Address",
|
||||
"code": "Verification code",
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
"content": "留言内容",
|
||||
"realName": "您的姓名",
|
||||
"phone": "联系电话",
|
||||
"reference": "参考网站",
|
||||
"files": "上传附件",
|
||||
"email": "电子邮箱",
|
||||
"address": "收货地址",
|
||||
"code": "验证码",
|
||||
|
||||
@@ -12,7 +12,6 @@ import {getLoacl, setLocal} from "~/utils/state";
|
||||
import {useI18n} from "#imports";
|
||||
import {getSiteInfo} from "~/api/layout";
|
||||
import {getTenantIdByDomain} from "~/api/cms/cmsDomain";
|
||||
import {getCmsWebsiteSetting} from "~/api/cms/cmsWebsiteSetting";
|
||||
|
||||
// 加载状态
|
||||
const website = useWebsite()
|
||||
@@ -69,9 +68,12 @@ const reload = async () => {
|
||||
localStorage.setItem('SysDomain', data.config.SysDomain);
|
||||
}
|
||||
// 网站设置信息
|
||||
getCmsWebsiteSetting(Number(data.websiteId)).then(res => {
|
||||
setting.value = res;
|
||||
})
|
||||
if(data.setting){
|
||||
setting.value = data.setting;
|
||||
}
|
||||
// getCmsWebsiteSetting(Number(data.websiteId)).then(res => {
|
||||
// setting.value = res;
|
||||
// })
|
||||
// seo
|
||||
useSeoMeta({
|
||||
description: data.comments || data.websiteName,
|
||||
|
||||
@@ -61,10 +61,11 @@ export default defineNuxtConfig({
|
||||
content: 'weSite企业建站系统,助力企业信息化建设和转型,主要产品有:企业官网,电商系统,微信公众号,微信小程序应用等,使用目前最流行的技术栈打造。https://websoft.top'
|
||||
},
|
||||
{ name: 'apple-mobile-web-app-capable', content: 'yes'},
|
||||
{ name: 'apple-mobile-web-app-status-bar-style', content: 'black'}
|
||||
{ name: 'apple-mobile-web-app-status-bar-style', content: 'black'},
|
||||
{ charset: 'utf-8' },
|
||||
{ viewport: 'width=device-width, initial-scale=1' },
|
||||
],
|
||||
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }],
|
||||
viewport: 'width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no',
|
||||
script: [
|
||||
{ innerHTML: 'var备案号 = "备案号:桂ICP备13003666号";', type: 'text/javascript' }
|
||||
]
|
||||
@@ -89,7 +90,8 @@ export default defineNuxtConfig({
|
||||
domain: 'websoft.top',
|
||||
// 核心接口
|
||||
apiServer: 'https://server.gxwebsoft.com/api',
|
||||
appSecret: ''
|
||||
appSecret: '',
|
||||
appName: '你的网站名称'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
12
pages/app/index.vue
Normal file
12
pages/app/index.vue
Normal file
@@ -0,0 +1,12 @@
|
||||
<template>
|
||||
<!-- 底部菜单 -->
|
||||
<TabBar />
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import TabBar from "~/components/AppFooter/TabBar/TabBar.vue";
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
</style>
|
||||
@@ -7,21 +7,18 @@
|
||||
<span class="text-large font-600"> {{ page.title }} </span>
|
||||
</template>
|
||||
<el-row :gutter="24" id="container" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :xs="24" :sm="8" class="left mb-6">
|
||||
<el-col v-for="(item,index) in list" :key="index" :sm="6" :xs="24" class="left mb-6">
|
||||
<el-card shadow="hover" :body-style="{ padding: '0px' }" class=" hover:bg-gray-50 cursor-pointer" @click="navigateTo(`/detail/${item.articleId}.html`)">
|
||||
<el-image
|
||||
:src="item.image"
|
||||
fit="cover"
|
||||
:lazy="true" class="w-full md:h-[166px] h-[199px] cursor-pointer bg-gray-50"/>
|
||||
:lazy="true" class="w-full md:h-[166px] h-[199px] cursor-pointer bg-gray-50 transition-transform duration-300 ease-in-out hover:scale-110"/>
|
||||
<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 min-h-[56px]">
|
||||
{{ item.title }}
|
||||
</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 text-sm">
|
||||
<el-space class="flex items-end">
|
||||
<div class="text-gray-400 gap-1 flex items-center"><el-icon><View /></el-icon><span>{{ getViews(item) }}</span></div>
|
||||
@@ -36,7 +33,7 @@
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-page-header>
|
||||
<Pagination :total="total" @done="search" />
|
||||
<Pagination :pageSize="where.limit" :total="total" @done="search" />
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
@@ -65,7 +62,7 @@ const layout = useLayout();
|
||||
const where = reactive<CmsArticleParam>({
|
||||
keywords: '',
|
||||
page: 1,
|
||||
limit: 20,
|
||||
limit: 12,
|
||||
status: 0,
|
||||
parentId: undefined,
|
||||
categoryId: undefined,
|
||||
@@ -91,7 +88,6 @@ const reload = async () => {
|
||||
parentId: data.parentId == 0 ? data.navigationId : data.parentId
|
||||
}).then(categoryData => {
|
||||
category.value = categoryData;
|
||||
console.log(categoryData)
|
||||
// 加载文章列表
|
||||
if(data.parentId == 0 && category.value.length > 0){
|
||||
where.parentId = data.navigationId;
|
||||
|
||||
130
pages/ask/[id].vue
Normal file
130
pages/ask/[id].vue
Normal file
@@ -0,0 +1,130 @@
|
||||
<template>
|
||||
|
||||
<!-- 主体部分 -->
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600 line-clamp-1"> 技术社区 </span>
|
||||
</template>
|
||||
<template #extra>
|
||||
<FormOutlined />
|
||||
<el-button :icon="Search">发布文章</el-button>
|
||||
</template>
|
||||
<el-row id="container" :gutter="24" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :sm="6" :xs="24" class="left mb-8">
|
||||
<el-card :body-style="{ padding: '0px' }" class=" hover:bg-gray-50 cursor-pointer" shadow="hover" @click="navigateTo(`/detail/${item.articleId}.html`)">
|
||||
<el-image
|
||||
:lazy="true"
|
||||
:src="item.image"
|
||||
class="w-full md:h-[166px] h-[199px] cursor-pointer bg-gray-50 transition-transform duration-300 ease-in-out hover:scale-110" fit="cover"/>
|
||||
<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 min-h-[56px]">
|
||||
{{ item.title }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="button-group flex justify-between items-center mt-3 text-sm">
|
||||
<el-space class="flex items-end">
|
||||
<div class="text-gray-400 gap-1 flex items-center"><el-icon><View /></el-icon><span>{{ getViews(item) }}</span></div>
|
||||
</el-space>
|
||||
<div class="text-gray-400">
|
||||
<el-avatar v-if="item.avatar" :src="`${item.avatar}`" size="small" />
|
||||
{{ dayjs(item.createTime).format('YYYY-MM-DD') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-page-header>
|
||||
|
||||
<Pagination :total="total" @done="search"/>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import {ArrowLeft, Search} from '@element-plus/icons-vue'
|
||||
import type {CmsArticle, CmsArticleParam} from "~/api/cms/cmsArticle/model";
|
||||
import dayjs from "dayjs";
|
||||
import type {CmsWebsite, CmsWebsiteParam} from "~/api/cms/cmsWebsite/model";
|
||||
import {pageCmsArticle} from "~/api/cms/cmsArticle";
|
||||
import {getViews} from "~/utils/common";
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
// 页面信息
|
||||
const list = ref<CmsArticle[]>([]);
|
||||
const total = ref(0);
|
||||
const id = ref<number>();
|
||||
const inputWidth = ref<string>('180px');
|
||||
const showSearch = ref<boolean>(false);
|
||||
|
||||
// 搜索表单
|
||||
const where = reactive<CmsWebsiteParam>({
|
||||
keywords: '',
|
||||
page: 1,
|
||||
limit: 12,
|
||||
status: undefined,
|
||||
recommend: undefined,
|
||||
search: true,
|
||||
websiteType: undefined,
|
||||
categoryId: undefined,
|
||||
lang: undefined
|
||||
});
|
||||
|
||||
const goBack = () => {
|
||||
router.back();
|
||||
}
|
||||
const handleFocus = () => {
|
||||
inputWidth.value = '400px'; // 聚焦时宽度
|
||||
}
|
||||
const handleBlur = () => {
|
||||
inputWidth.value = '180px'; // 聚焦时宽度
|
||||
}
|
||||
|
||||
const showDomain = (item: CmsWebsite) => {
|
||||
id.value = Number(item.websiteId);
|
||||
};
|
||||
|
||||
const hideDomain = () => {
|
||||
id.value = 0;
|
||||
};
|
||||
|
||||
// 加载页面数据
|
||||
const reload = async () => {
|
||||
await pageCmsArticle({
|
||||
...where,
|
||||
model: 'ask'
|
||||
}).then(response => {
|
||||
if (response?.list) {
|
||||
list.value = response?.list;
|
||||
total.value = response.count;
|
||||
}
|
||||
}).catch(() => {
|
||||
}).finally(() => showSearch.value = false)
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索
|
||||
* @param data
|
||||
*/
|
||||
const search = (data: CmsArticleParam) => {
|
||||
where.page = data.page;
|
||||
reload();
|
||||
}
|
||||
|
||||
watch(
|
||||
() => route.params.id,
|
||||
() => {
|
||||
reload();
|
||||
},
|
||||
{immediate: true}
|
||||
);
|
||||
</script>
|
||||
<style lang="scss">
|
||||
.el-input {
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
74
pages/bsnx-h5/index.vue
Normal file
74
pages/bsnx-h5/index.vue
Normal file
@@ -0,0 +1,74 @@
|
||||
<template>
|
||||
<div class="min-h-screen bg-gray-100">
|
||||
<!-- 顶部banner -->
|
||||
<div class="relative bg-center"
|
||||
style="background-image: url('https://oss.wsdns.cn/20250224/0972ad2dbe9c4934919186d13509ef8d.jpg')">
|
||||
<!-- <h1 class="text-2xl mb-2">百色中学 120 周年校庆</h1>-->
|
||||
<!-- <p class="text-sm">百廿风华,教育兴邦;桃李百中,领梦远航</p>-->
|
||||
</div>
|
||||
|
||||
<!-- 功能导航 -->
|
||||
<div class="grid grid-cols-4 bg-white p-5 mx-2.5 my-2.5 rounded-lg">
|
||||
<div v-for="(item, index) in navItems"
|
||||
:key="index"
|
||||
class="flex flex-col items-center gap-2">
|
||||
<img :alt="item.text" :src="item.icon" class="w-10 h-10">
|
||||
<span class="text-sm">{{ item.text }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 新闻列表 -->
|
||||
<div class="mx-2.5">
|
||||
<div v-for="(item, index) in newsItems"
|
||||
:key="index"
|
||||
class="flex bg-white p-2.5 mb-2.5 rounded-lg">
|
||||
<img :alt="item.title"
|
||||
:src="item.image"
|
||||
class="w-20 h-20 object-cover rounded">
|
||||
<div class="ml-2.5 flex-1">
|
||||
<h3 class="text-base font-normal">{{ item.title }}</h3>
|
||||
<p class="text-xs text-gray-400 mt-1.5">{{ item.date }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
const navItems = ref([
|
||||
{ text: '报名活动', icon: 'https://oss.wsdns.cn/20250224/7af6663228f3435cabc85cfd9760f215.jpg' },
|
||||
{ text: '认款项目', icon: 'https://oss.wsdns.cn/20250224/56f6659ffad949458019d501f3f6bae6.jpg' },
|
||||
{ text: '校友风采', icon: 'https://oss.wsdns.cn/20250224/75befc1b351845319c7ff54f52d822e0.jpg' },
|
||||
{ text: '母校动态', icon: 'https://oss.wsdns.cn/20250224/83f03f020bda46b383e2f39dfbc62734.jpg' }
|
||||
])
|
||||
|
||||
const newsItems = ref([
|
||||
{
|
||||
title: '千班万元',
|
||||
image: '/images/news1.jpg',
|
||||
date: '02-09'
|
||||
},
|
||||
{
|
||||
title: '百中故事长廊',
|
||||
image: '/images/news2.jpg',
|
||||
date: '02-09'
|
||||
},
|
||||
{
|
||||
title: '百色中学校史馆建设',
|
||||
image: '/images/news3.jpg',
|
||||
date: '02-13'
|
||||
},
|
||||
{
|
||||
title: '百色中学尚美艺术展厅',
|
||||
image: '/images/news4.jpg',
|
||||
date: '02-13'
|
||||
}
|
||||
])
|
||||
</script>
|
||||
<style>
|
||||
.sdf{
|
||||
background-color: #ff6d6d;
|
||||
}
|
||||
</style>
|
||||
@@ -20,15 +20,15 @@
|
||||
</el-space>
|
||||
</template>
|
||||
<el-row :gutter="24" id="container" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :span="6" class="left">
|
||||
<el-card shadow="hover" :body-style="{ padding: '0px' }" class=" hover:bg-gray-50 cursor-pointer" @click="navigateTo(`/show/${item.articleId}.html`)">
|
||||
<el-col v-for="(item,index) in list" :key="index" :span="6" class="left mb-8">
|
||||
<el-card :body-style="{ padding: '0px' }" class=" hover:bg-gray-50 cursor-pointer" shadow="hover" @click="navigateTo(`/detail/${item.articleId}.html`)">
|
||||
<el-image
|
||||
:src="item.image"
|
||||
fit="cover"
|
||||
:lazy="true" class="w-full md:h-[166px] 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">
|
||||
<div class="text-xl cursor-pointer items-center line-clamp-1">
|
||||
{{ item.title }}
|
||||
</div>
|
||||
</div>
|
||||
@@ -89,8 +89,11 @@ const layout = useLayout();
|
||||
const where = reactive<CmsArticleParam>({
|
||||
keywords: '',
|
||||
page: 1,
|
||||
limit: 20,
|
||||
limit: 12,
|
||||
status: 0,
|
||||
recommend: 1,
|
||||
order: 'desc',
|
||||
sort: 'actualViews',
|
||||
parentId: undefined,
|
||||
categoryId: undefined,
|
||||
lang: i18n.locale.value
|
||||
|
||||
@@ -53,8 +53,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item-image pt-3">
|
||||
<el-image v-if="item.files" :src="`${JSON.parse(item.files)[0]}`" class="w-full h-1/2 max-h-[220px]"/>
|
||||
<div class="item-image pt-3 overflow-hidden">
|
||||
<el-image v-if="item.files" :src="`${JSON.parse(item.files)[0]}`" class="w-full h-1/2 max-h-[220px] transition-transform duration-300 ease-in-out hover:scale-110"/>
|
||||
<el-image v-else class="w-full h-[220px]"/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -116,7 +116,10 @@ const hideDomain = () => {
|
||||
|
||||
// 加载页面数据
|
||||
const reload = async () => {
|
||||
await pageCmsWebsiteAll(where).then(response => {
|
||||
await pageCmsWebsiteAll({
|
||||
...where,
|
||||
plugin: false
|
||||
}).then(response => {
|
||||
if (response?.list) {
|
||||
list.value = response?.list;
|
||||
total.value = response.count;
|
||||
|
||||
@@ -223,6 +223,8 @@ const reload = async () => {
|
||||
showPassword.value = true;
|
||||
return;
|
||||
}
|
||||
}).catch(() => {
|
||||
navigateTo('/404');
|
||||
})
|
||||
|
||||
// seo
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<span class="text-large font-600"> 插件编辑 </span>
|
||||
</template>
|
||||
|
||||
<div class="login-layout mt-10 sm:w-screen-xl w-full">
|
||||
<div v-if="navId" class="login-layout mt-10 sm:w-screen-xl w-full">
|
||||
<el-form :model="form" label-width="auto" size="large">
|
||||
<el-tabs
|
||||
v-model="activeName"
|
||||
|
||||
@@ -1,13 +1,4 @@
|
||||
<template>
|
||||
<div class="flex mb-20 mt-30 justify-start">
|
||||
<div class="w-auto">
|
||||
<div class="w-screen-sm my-1 bg-green-700 h-[50px]"></div>
|
||||
<div class="w-screen-md my-1 bg-green-700 h-[50px]"></div>
|
||||
<div class="w-screen-lg my-1 bg-green-700 h-[50px]"></div>
|
||||
<div class="w-screen-xl my-1 bg-green-700 h-[50px]"></div>
|
||||
<div class="w-screen-2xl my-1 bg-green-700 h-[50px]"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 主体部分 -->
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
|
||||
@@ -92,7 +92,6 @@ const reload = async () => {
|
||||
parentId: data.parentId == 0 ? data.navigationId : data.parentId
|
||||
}).then(categoryData => {
|
||||
category.value = categoryData;
|
||||
console.log(categoryData)
|
||||
// 加载文章列表
|
||||
if(data.parentId == 0 && category.value.length > 0){
|
||||
where.parentId = data.navigationId;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<span class="text-large font-600"> 文档中心 </span>
|
||||
</template>
|
||||
<el-row :gutter="24" id="container" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :xs="12" sm:="8" class="left mb-6">
|
||||
<el-col v-for="(item,index) in list" :key="index" :sm="6" :xs="12" class="left mb-6">
|
||||
<el-card shadow="hover" :body-style="{ padding: '0px' }" class=" hover:bg-white cursor-pointer" @click="navigateTo(`/docs/${item.navigationId}.html`)">
|
||||
<div class="flex-1 px-4 py-5 sm:p-4 !p-4">
|
||||
<div class="text-gray-700 dark:text-white text-base font-semibold flex flex-col items-center gap-1.5">
|
||||
@@ -79,7 +79,6 @@ const reload = async () => {
|
||||
parentId: data.parentId == 0 ? data.navigationId : data.parentId
|
||||
}).then(categoryData => {
|
||||
category.value = categoryData;
|
||||
console.log(categoryData)
|
||||
// 加载文章列表
|
||||
if(data.parentId == 0 && category.value.length > 0){
|
||||
where.parentId = data.navigationId;
|
||||
|
||||
217
pages/index.vue
217
pages/index.vue
@@ -1,14 +1,22 @@
|
||||
|
||||
<template>
|
||||
|
||||
<Carousel />
|
||||
<Flash/>
|
||||
<!-- 幻灯片轮播 -->
|
||||
<Carousel/>
|
||||
|
||||
<SiteList title="产品服务" :param="{official: true,limit: 4,sort: 'websiteId',order:'asc'}" :fit="`cover`" />
|
||||
<!-- 着陆页 -->
|
||||
<LandingHero/>
|
||||
|
||||
<!-- 站点列表 -->
|
||||
<SiteList />
|
||||
|
||||
<!-- 插件列表 -->
|
||||
<!-- <MarketList />-->
|
||||
|
||||
<!-- 合作伙伴 -->
|
||||
<Partners />
|
||||
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import {useConfigInfo} from "~/composables/configState";
|
||||
import type {FormRules, FormInstance} from 'element-plus'
|
||||
import type {CmsArticle} from "~/api/cms/cmsArticle/model";
|
||||
import type {CmsNavigation} from "~/api/cms/cmsNavigation/model";
|
||||
@@ -20,19 +28,21 @@ import {pageCmsArticle} from "~/api/cms/cmsArticle";
|
||||
import {pageCmsLink} from "~/api/cms/cmsLink";
|
||||
import {addCmsOrder} from "~/api/cms/cmsOrder";
|
||||
import {getCaptcha} from "~/api/passport/login";
|
||||
import Flash from './components/Flash.vue';
|
||||
import Carousel from "~/pages/components/Carousel.vue";
|
||||
import Carousel from "~/components/Index/Carousel.vue";
|
||||
import LandingHero from "~/components/Index/LandingHero.vue";
|
||||
import SiteList from "~/components/Index/SiteList.vue";
|
||||
import MarketList from "~/components/Index/MarketList.vue";
|
||||
import Partners from "~/components/Index/Partners.vue";
|
||||
import Customized from "~/components/Index/Customized.vue";
|
||||
|
||||
const route = useRoute();
|
||||
const i18n = useI18n();
|
||||
const config = useConfigInfo();
|
||||
const productList = ref<CmsNavigation[]>([]);
|
||||
const caseList = ref<CmsArticle[]>([]);
|
||||
const topNews = ref<CmsArticle[]>([]);
|
||||
const topNewsImage = ref<string>('');
|
||||
const hotNews = ref<CmsArticle[]>([]);
|
||||
const links = ref<CmsLink[]>([]);
|
||||
const formRef = ref<FormInstance>()
|
||||
// 验证码 base64 数据
|
||||
const captcha = ref('');
|
||||
const text = ref<string>('');
|
||||
@@ -169,8 +179,6 @@ const reload = async () => {
|
||||
}).then(res => {
|
||||
if (res) {
|
||||
caseList.value = res?.list;
|
||||
caseMaxScroll = caseList.value.length * 303 - 1200;
|
||||
setCaseScrollTimer()
|
||||
}
|
||||
})
|
||||
|
||||
@@ -209,199 +217,12 @@ const reload = async () => {
|
||||
}).then(res => {
|
||||
if (res) {
|
||||
links.value = res?.list;
|
||||
linksMaxScroll = links.value.length * 148 - 1200;
|
||||
setLinksScroll()
|
||||
}
|
||||
})
|
||||
setTimeout(() => {
|
||||
setRegionNum()
|
||||
setCountryNum()
|
||||
setOrgNum()
|
||||
setProjectNum()
|
||||
}, 1500)
|
||||
}
|
||||
|
||||
const regionNum = ref(0);
|
||||
const countryNum = ref(0);
|
||||
const orgNum = ref(480);
|
||||
const projectNum = ref(970);
|
||||
|
||||
const setRegionNum = () => {
|
||||
if (regionNum.value < 20) {
|
||||
setTimeout(() => {
|
||||
regionNum.value += 1;
|
||||
setRegionNum();
|
||||
}, 70)
|
||||
}
|
||||
}
|
||||
|
||||
const setCountryNum = () => {
|
||||
if (countryNum.value < 15) {
|
||||
setTimeout(() => {
|
||||
countryNum.value += 1;
|
||||
setCountryNum();
|
||||
}, 70)
|
||||
}
|
||||
}
|
||||
|
||||
const setOrgNum = () => {
|
||||
if (orgNum.value < 500) {
|
||||
setTimeout(() => {
|
||||
orgNum.value += 1;
|
||||
setOrgNum();
|
||||
}, 70)
|
||||
}
|
||||
}
|
||||
|
||||
const setProjectNum = () => {
|
||||
if (projectNum.value < 999) {
|
||||
setTimeout(() => {
|
||||
projectNum.value += 1;
|
||||
setProjectNum();
|
||||
}, 70)
|
||||
}
|
||||
}
|
||||
|
||||
const onScroll = (e: any) => {
|
||||
currentScrollLeft = e.scrollLeft
|
||||
if (currentScrollLeft === 0) currentScrollLeftEnd = 0
|
||||
// console.log(currentScrollLeft)
|
||||
}
|
||||
|
||||
let currentScrollLeft = 0
|
||||
let currentScrollLeftEnd = 0
|
||||
let currentScroll = 0
|
||||
let scrollNum = 0
|
||||
const scrollbarRef = ref()
|
||||
const scroll = (dir: string) => {
|
||||
const maxScrollLeft = 309 * 5 - 1120 - 20
|
||||
if (dir === 'left') {
|
||||
if (currentScrollLeft === 0) scrollNum = maxScrollLeft
|
||||
else if (currentScrollLeft < 309) {
|
||||
scrollNum = -currentScrollLeft
|
||||
} else scrollNum = -309
|
||||
} else {
|
||||
if (currentScrollLeftEnd === maxScrollLeft) scrollNum = -maxScrollLeft
|
||||
else if (maxScrollLeft - currentScrollLeftEnd < 309 && maxScrollLeft - currentScrollLeftEnd > 0) {
|
||||
scrollNum = maxScrollLeft - currentScrollLeftEnd
|
||||
} else if ((maxScrollLeft + 10) === currentScrollLeft || (maxScrollLeft - 10) === currentScrollLeft) {
|
||||
scrollNum = -maxScrollLeft
|
||||
} else scrollNum = 309
|
||||
}
|
||||
setScroll()
|
||||
}
|
||||
|
||||
const setScroll = () => {
|
||||
if (scrollNum > 0) {
|
||||
if (currentScroll < scrollNum) {
|
||||
setTimeout(() => {
|
||||
currentScroll += 5
|
||||
scrollbarRef.value?.setScrollLeft(currentScrollLeftEnd + currentScroll)
|
||||
setScroll()
|
||||
}, 5)
|
||||
} else {
|
||||
currentScroll = 0
|
||||
currentScrollLeftEnd += scrollNum
|
||||
}
|
||||
} else {
|
||||
if (currentScroll > scrollNum) {
|
||||
setTimeout(() => {
|
||||
currentScroll -= 5
|
||||
scrollbarRef.value?.setScrollLeft(currentScrollLeftEnd + currentScroll)
|
||||
setScroll()
|
||||
}, 5)
|
||||
} else {
|
||||
currentScroll = 0
|
||||
currentScrollLeftEnd += scrollNum
|
||||
}
|
||||
}
|
||||
// console.log(currentScrollLeftEnd, scrollNum)
|
||||
}
|
||||
|
||||
const setScrollTimer = () => {
|
||||
setInterval(() => {
|
||||
scroll('right')
|
||||
}, 2000)
|
||||
}
|
||||
setScrollTimer()
|
||||
|
||||
const linksScrollbarRef = ref()
|
||||
let linksCurrentScroll = 0
|
||||
const onLinksScroll = (e: any) => {
|
||||
linksCurrentScroll = e.scrollLeft
|
||||
}
|
||||
|
||||
let linksMaxScroll = 0
|
||||
const setLinksScroll = () => {
|
||||
setTimeout(() => {
|
||||
if (linksCurrentScroll < linksMaxScroll) {
|
||||
linksCurrentScroll += 1
|
||||
} else {
|
||||
linksCurrentScroll = 0
|
||||
}
|
||||
// console.log(linksCurrentScroll, linksMaxScroll)
|
||||
linksScrollbarRef.value?.setScrollLeft(linksCurrentScroll)
|
||||
setLinksScroll()
|
||||
}, 15)
|
||||
|
||||
}
|
||||
|
||||
const caseScrollbarRef = ref()
|
||||
let caseCurrentScroll = 0
|
||||
const onCaseScroll = (e: any) => {
|
||||
caseCurrentScroll = e.scrollLeft
|
||||
}
|
||||
|
||||
let caseMaxScroll = 0
|
||||
let caseScrollNum = 0
|
||||
let caseCurrentScrollLeftEnd = 0
|
||||
const setCaseScroll = () => {
|
||||
if (caseCurrentScrollLeftEnd === caseMaxScroll) {
|
||||
caseScrollNum = 0
|
||||
caseCurrentScrollLeftEnd = 0
|
||||
} else if (caseMaxScroll - caseCurrentScrollLeftEnd < 303 && caseMaxScroll - caseCurrentScrollLeftEnd > 0) {
|
||||
caseScrollNum = caseMaxScroll - caseCurrentScrollLeftEnd
|
||||
} else if ((caseMaxScroll + 20) === caseCurrentScroll || (caseMaxScroll - 20) === caseCurrentScroll) {
|
||||
scrollNum = 0
|
||||
} else caseScrollNum = 303
|
||||
console.log(caseCurrentScrollLeftEnd, caseMaxScroll, caseScrollNum)
|
||||
setCaseScrollJob()
|
||||
}
|
||||
|
||||
const setCaseScrollJob = () => {
|
||||
if (caseScrollNum > 0) {
|
||||
if (caseCurrentScroll < caseScrollNum) {
|
||||
setTimeout(() => {
|
||||
caseCurrentScroll += 5
|
||||
caseScrollbarRef.value?.setScrollLeft(caseCurrentScrollLeftEnd + caseCurrentScroll)
|
||||
setCaseScrollJob()
|
||||
}, 5)
|
||||
} else {
|
||||
caseCurrentScroll = 0
|
||||
caseCurrentScrollLeftEnd += caseScrollNum
|
||||
}
|
||||
} else {
|
||||
if (caseCurrentScroll > caseScrollNum) {
|
||||
setTimeout(() => {
|
||||
caseCurrentScroll -= 5
|
||||
caseScrollbarRef.value?.setScrollLeft(caseCurrentScrollLeftEnd + caseCurrentScroll)
|
||||
setCaseScrollJob()
|
||||
}, 5)
|
||||
} else {
|
||||
caseCurrentScroll = 0
|
||||
caseCurrentScrollLeftEnd += caseScrollNum
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let caseScrollTimer = null
|
||||
const setCaseScrollTimer = () => {
|
||||
if (caseScrollTimer) clearInterval(caseScrollTimer)
|
||||
caseScrollTimer = setInterval(() => {
|
||||
setCaseScroll()
|
||||
}, 2000)
|
||||
}
|
||||
|
||||
watch(
|
||||
() => route.path,
|
||||
(path) => {
|
||||
|
||||
@@ -1,72 +1,117 @@
|
||||
<template>
|
||||
|
||||
<Banner :layout="layout" />
|
||||
|
||||
<!-- 主体部分 -->
|
||||
<div class="xl:w-screen-xl m-auto">
|
||||
<el-row :gutter="24" id="container" class="clearfix">
|
||||
<el-col :span="5" class="left">
|
||||
<!-- 内页左侧组件 -->
|
||||
<Left :category="category" />
|
||||
</el-col>
|
||||
<el-col :span="19" class="right">
|
||||
<div class="sitemp h-[32px] flex justify-between">
|
||||
<h2>{{ page.title }}</h2>
|
||||
<Breadcrumb :data="page" :categoryName="$t('articleTitle')" />
|
||||
</div>
|
||||
<div class="content">
|
||||
|
||||
<!-- 文章模型 -->
|
||||
<ul class="news_listn clearfix">
|
||||
<CmsArticleList :data="list" />
|
||||
</ul>
|
||||
|
||||
<Pagination :total="total" @done="search" />
|
||||
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> {{ page.title }} </span>
|
||||
</template>
|
||||
<template #extra>
|
||||
<el-space class="flex items-center">
|
||||
<el-input
|
||||
v-model="where.keywords"
|
||||
:placeholder="`搜索关键词`"
|
||||
:suffix-icon="Search"
|
||||
class="hidden-sm-and-down"
|
||||
@change="reload"
|
||||
/>
|
||||
<el-button :icon="Search" class="hidden-sm-and-up" @click="showSearch = true"></el-button>
|
||||
</el-space>
|
||||
<el-dialog
|
||||
v-model="showSearch"
|
||||
fullscreen
|
||||
>
|
||||
<el-input
|
||||
v-model="where.keywords"
|
||||
:placeholder="`搜索关键词`"
|
||||
:suffix-icon="Search"
|
||||
class="w-full my-5"
|
||||
size="large"
|
||||
@change="reload"
|
||||
/>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<el-row id="container" :gutter="24" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :sm="4" :xs="12" class="left mb-8">
|
||||
<nuxt-link :to="`${item.url}`" class="flex-1 cursor-pointer flex flex-col text-center" target="_blank">
|
||||
<el-card :body-style="{ padding: '0px' }" class="items-center flex justify-center" shadow="hover">
|
||||
<el-popover
|
||||
:content="item.comments"
|
||||
:width="200"
|
||||
placement="bottom"
|
||||
trigger="hover"
|
||||
>
|
||||
<template #reference>
|
||||
<div class="flex-1 py-5 sm:p-4 !p-4">
|
||||
<el-space class="text-gray-700 dark:text-white text-base font-semibold h-[28px] flex justify-center items-center">
|
||||
<el-image v-if="item.icon" :alt="item.name" :src="item.icon" style="height: 32px"/>
|
||||
<span :title="item.name" class="text-lg line-clamp-1">{{ item.name }}</span>
|
||||
</el-space>
|
||||
</div>
|
||||
</template>
|
||||
</el-popover>
|
||||
</el-card>
|
||||
</nuxt-link>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-page-header>
|
||||
<Pagination :total="total" @done="search" />
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import Banner from "@/components/Banner.vue";
|
||||
import { ArrowLeft,View,Search } from '@element-plus/icons-vue'
|
||||
import {useLayout, usePage} from "~/composables/configState";
|
||||
import type {CmsNavigation} from "~/api/cms/cmsNavigation/model";
|
||||
import type {CmsArticle, CmsArticleParam} from "~/api/cms/cmsArticle/model";
|
||||
import {getNavIdByParamsId, paramsId} from "~/utils/common";
|
||||
import Left from "~/components/Left.vue";
|
||||
import {getNavIdByParamsId, getViews, paramsId} from "~/utils/common";
|
||||
import {getCmsNavigation, listCmsNavigation} from "~/api/cms/cmsNavigation";
|
||||
import {pageCmsArticle} from "~/api/cms/cmsArticle";
|
||||
import CmsArticleList from "~/components/CmsArticleList.vue";
|
||||
import {pageCmsLink} from "~/api/cms/cmsLink";
|
||||
import type {CmsLink, CmsLinkParam} from "~/api/cms/cmsLink/model";
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const navId = ref();
|
||||
const list = ref<CmsArticle[]>([]);
|
||||
const i18n = useI18n();
|
||||
const list = ref<CmsLink[]>([]);
|
||||
const category = ref<CmsNavigation[]>([]);
|
||||
const total = ref<number>(0);
|
||||
|
||||
// 获取状态
|
||||
const page = usePage();
|
||||
const layout = useLayout();
|
||||
const showSearch = ref<boolean>(false);
|
||||
|
||||
// 搜索表单
|
||||
const where = reactive<CmsArticleParam>({
|
||||
const where = reactive<CmsLinkParam>({
|
||||
keywords: '',
|
||||
page: 1,
|
||||
limit: 20,
|
||||
status: 0,
|
||||
parentId: undefined,
|
||||
categoryId: undefined,
|
||||
lang: i18n.locale.value
|
||||
categoryId: undefined
|
||||
});
|
||||
|
||||
const id = ref<number>(0);
|
||||
|
||||
const showMenu = (item: CmsLink) => {
|
||||
id.value = Number(item.id);
|
||||
};
|
||||
|
||||
const hideMenu = () => {
|
||||
id.value = 0;
|
||||
};
|
||||
|
||||
// 加载页面数据
|
||||
const reload = async () => {
|
||||
getCmsNavigation(navId.value).then(data => {
|
||||
// 获取栏目信息
|
||||
page.value = data
|
||||
layout.value.banner = data.banner;
|
||||
if(navId.value){
|
||||
where.categoryId = navId.value;
|
||||
}
|
||||
pageCmsLink(where).then(response => {
|
||||
if(response){
|
||||
total.value = response?.count;
|
||||
list.value = response?.list;
|
||||
}
|
||||
}).finally(() => showSearch.value = false)
|
||||
|
||||
// 设置页面标题
|
||||
useSeoMeta({
|
||||
@@ -75,30 +120,15 @@ const reload = async () => {
|
||||
titleTemplate: `${data?.title}` + ' - %s',
|
||||
})
|
||||
|
||||
// 二级栏目分类
|
||||
listCmsNavigation({
|
||||
parentId: data.parentId == 0 ? data.navigationId : data.parentId
|
||||
}).then(categoryData => {
|
||||
category.value = categoryData;
|
||||
console.log(categoryData)
|
||||
// 加载文章列表
|
||||
if(data.parentId == 0 && category.value.length > 0){
|
||||
where.parentId = data.navigationId;
|
||||
}else {
|
||||
where.categoryId = data.navigationId;
|
||||
}
|
||||
pageCmsArticle(where).then(response => {
|
||||
if(response){
|
||||
total.value = response?.count;
|
||||
list.value = response?.list;
|
||||
}
|
||||
})
|
||||
})
|
||||
}).catch(err => {
|
||||
console.log(err,'加载失败...')
|
||||
})
|
||||
}
|
||||
|
||||
const goBack = () => {
|
||||
router.back(); // 返回上一页
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索
|
||||
* @param data
|
||||
|
||||
142
pages/links/index.vue
Normal file
142
pages/links/index.vue
Normal file
@@ -0,0 +1,142 @@
|
||||
<template>
|
||||
|
||||
<!-- 主体部分 -->
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600 line-clamp-1"> 网址导航 </span>
|
||||
</template>
|
||||
<template #extra>
|
||||
<el-space class="flex items-center">
|
||||
<el-input
|
||||
v-model="where.keywords"
|
||||
:placeholder="`搜索关键词`"
|
||||
:suffix-icon="Search"
|
||||
class="hidden-sm-and-down"
|
||||
@change="reload"
|
||||
/>
|
||||
<el-button :icon="Search" class="hidden-sm-and-up" @click="showSearch = true"></el-button>
|
||||
</el-space>
|
||||
<el-dialog
|
||||
v-model="showSearch"
|
||||
fullscreen
|
||||
>
|
||||
<el-input
|
||||
v-model="where.keywords"
|
||||
:placeholder="`搜索关键词`"
|
||||
:suffix-icon="Search"
|
||||
class="w-full my-5"
|
||||
size="large"
|
||||
@change="reload"
|
||||
/>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<el-row id="container" :gutter="24" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :sm="4" :xs="12" class="left mb-8">
|
||||
<nuxt-link :to="`${item.url}`" class="flex-1 cursor-pointer flex flex-col text-center" target="_blank">
|
||||
<el-card :body-style="{ padding: '0px' }" class="items-center flex justify-center" shadow="hover">
|
||||
<el-popover
|
||||
:content="item.comments"
|
||||
:width="200"
|
||||
placement="bottom"
|
||||
trigger="hover"
|
||||
>
|
||||
<template #reference>
|
||||
<div class="flex-1 py-5 sm:p-4 !p-4">
|
||||
<el-space class="text-gray-700 dark:text-white text-base font-semibold h-[28px] flex justify-center items-center">
|
||||
<el-image v-if="item.icon" :alt="item.name" :src="item.icon" style="height: 32px"/>
|
||||
<span :title="item.name" class="text-lg line-clamp-1">{{ item.name }}</span>
|
||||
</el-space>
|
||||
</div>
|
||||
</template>
|
||||
</el-popover>
|
||||
</el-card>
|
||||
</nuxt-link>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-page-header>
|
||||
|
||||
<Pagination :page-size="48" :total="total" @done="search"/>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import {ArrowLeft, Search} from '@element-plus/icons-vue'
|
||||
import type {CmsArticleParam} from "~/api/cms/cmsArticle/model";
|
||||
import {pageCmsWebsiteAll} from "~/api/cms/cmsWebsite";
|
||||
import type {CmsWebsite, CmsWebsiteParam} from "~/api/cms/cmsWebsite/model";
|
||||
import type {CmsLink, CmsLinkParam} from "~/api/cms/cmsLink/model";
|
||||
import {pageCmsLink} from "~/api/cms/cmsLink";
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
// 页面信息
|
||||
const list = ref<CmsLink[]>([]);
|
||||
const total = ref(0);
|
||||
const id = ref<number>();
|
||||
const inputWidth = ref<string>('180px');
|
||||
const showSearch = ref<boolean>(false);
|
||||
|
||||
// 搜索表单
|
||||
const where = reactive<CmsLinkParam>({
|
||||
keywords: '',
|
||||
page: 1,
|
||||
limit: 48,
|
||||
categoryId: undefined
|
||||
});
|
||||
|
||||
const goBack = () => {
|
||||
router.back();
|
||||
}
|
||||
const handleFocus = () => {
|
||||
inputWidth.value = '400px'; // 聚焦时宽度
|
||||
}
|
||||
const handleBlur = () => {
|
||||
inputWidth.value = '180px'; // 聚焦时宽度
|
||||
}
|
||||
|
||||
const showDomain = (item: CmsWebsite) => {
|
||||
id.value = Number(item.websiteId);
|
||||
};
|
||||
|
||||
const hideDomain = () => {
|
||||
id.value = 0;
|
||||
};
|
||||
|
||||
// 加载页面数据
|
||||
const reload = async () => {
|
||||
await pageCmsLink({
|
||||
...where
|
||||
}).then(response => {
|
||||
if (response?.list) {
|
||||
list.value = response?.list;
|
||||
total.value = response.count;
|
||||
}
|
||||
}).catch(() => {
|
||||
}).finally(() => showSearch.value = false)
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索
|
||||
* @param data
|
||||
*/
|
||||
const search = (data: CmsArticleParam) => {
|
||||
where.page = data.page;
|
||||
reload();
|
||||
}
|
||||
|
||||
watch(
|
||||
() => route.params.id,
|
||||
() => {
|
||||
reload();
|
||||
},
|
||||
{immediate: true}
|
||||
);
|
||||
</script>
|
||||
<style lang="scss">
|
||||
.el-input {
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
28
pages/m.vue
28
pages/m.vue
@@ -1,28 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import 'assets/css/base.css';
|
||||
import 'assets/css/main.css';
|
||||
import 'assets/css/model.css';
|
||||
import 'assets/m/reset.css';
|
||||
import 'assets/m/ui.css';
|
||||
import {getSiteInfo} from "~/api/layout";
|
||||
import {useWebsite} from "~/composables/configState";
|
||||
definePageMeta({
|
||||
layout: 'mobile'
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<meta content="width=device-width,minimum-scale=1.0,maximum-scale=1.0" name="viewport" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||
<meta content="telephone=no" name="format-detection" />
|
||||
<div class="mobile-page">
|
||||
<NuxtPage />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.mobile-page{
|
||||
}
|
||||
</style>
|
||||
@@ -8,9 +8,14 @@
|
||||
<template #extra>
|
||||
<div class="h-[32px]"></div>
|
||||
</template>
|
||||
|
||||
<!-- 应用介绍 -->
|
||||
<PageBanner :form="page" @done="reload"/>
|
||||
|
||||
<!-- 评分插件 -->
|
||||
<AppInfo :form="form" />
|
||||
|
||||
<!-- 应用截屏 -->
|
||||
<div id="screen-item" class="screen-item my-6">
|
||||
<el-descriptions title="截屏" class="mt-5" />
|
||||
<el-scrollbar class="bg-white p-5">
|
||||
@@ -35,7 +40,9 @@
|
||||
|
||||
<!-- 评分及评价 -->
|
||||
<Comments :productId="form.companyId" :comments="comments" :count="commentsTotal" @done="doComments" />
|
||||
|
||||
<div class="h-[100px]"></div>
|
||||
|
||||
</el-page-header>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -1,22 +1,24 @@
|
||||
<template>
|
||||
<el-scrollbar style="height: 100%;" class="bg-white">
|
||||
<div v-if="form" class="app-info bg-white px-5 py-5 flex justify-around items-center">
|
||||
<div class="item text-center">
|
||||
<div class="rate text-gray-400">评分</div>
|
||||
<div class="text-2xl font-bold">3.1</div>
|
||||
<el-rate v-model="form.rate" disabled size="small"/>
|
||||
<div class="item text-center flex flex-col items-center">
|
||||
<div class="text-gray-400">租户ID</div>
|
||||
<el-icon class="py-1" size="24">
|
||||
<Cpu/>
|
||||
</el-icon>
|
||||
<span class="text-gray-500">{{ form.tenantId }}</span>
|
||||
</div>
|
||||
<el-divider class="opacity-40" style="height: 40px" direction="vertical"/>
|
||||
<div class="item text-center flex flex-col items-center">
|
||||
<div class="text-gray-400">类别</div>
|
||||
<div class="text-gray-400">插件类型</div>
|
||||
<el-icon size="24" class="py-1">
|
||||
<Monitor/>
|
||||
</el-icon>
|
||||
<span class="text-gray-500">{{ form.industryParent || '网站' }}</span>
|
||||
</div>
|
||||
<el-divider class="opacity-40" style="height: 40px" direction="vertical"/>
|
||||
<nuxt-link :to="`https://${form.domain}`" class="item text-center flex flex-col items-center">
|
||||
<div class="text-gray-400">域名</div>
|
||||
<div class="item text-center flex flex-col items-center">
|
||||
<div class="text-gray-400">访问域名</div>
|
||||
<div>
|
||||
<svg t="1739721752315" class="icon pt-2" viewBox="0 0 1024 1024" version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg" p-id="11933" width="22" height="22">
|
||||
@@ -27,22 +29,20 @@
|
||||
p-id="11935"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<!-- <el-icon size="24" class="py-1"><Compass /></el-icon>-->
|
||||
<span class="text-gray-500">{{ form.domain }}</span>
|
||||
</nuxt-link>
|
||||
<nuxt-link :to="`https://${form.adminUrl}`" class="text-gray-500">{{ form.adminUrl }}</nuxt-link>
|
||||
</div>
|
||||
<el-divider class="opacity-40" style="height: 40px" direction="vertical"/>
|
||||
<nuxt-link :to="`/market/user/${form.userId}`" class="item text-center flex flex-col items-center">
|
||||
<div class="text-gray-400">开发者</div>
|
||||
<el-icon size="24" class="py-1">
|
||||
<Avatar/>
|
||||
</el-icon>
|
||||
<span class="text-gray-500">{{ 'WebSoft Inc.' }}</span>
|
||||
<span class="text-gray-500">{{ form.developer || '匿名' }}</span>
|
||||
</nuxt-link>
|
||||
<el-divider class="opacity-40" style="height: 40px" direction="vertical"/>
|
||||
<nuxt-link :to="`http://git.gxwebsoft.com`" class="item text-center">
|
||||
<div class="text-gray-400">仓库</div>
|
||||
<nuxt-link :to="`https://git.websoft.top`" class="item text-center">
|
||||
<div class="text-gray-400">源代码</div>
|
||||
<div class="text-2xl font-bold">
|
||||
<!-- <svg t="1739721615244" class="icon pt-2" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10773" width="22" height="22"><path d="M512 64c81.636 0 156.8 19.911 225.493 59.733s122.951 94.08 162.773 162.773S960 430.364 960 512s-19.911 156.8-59.733 225.493-94.08 122.951-162.773 162.773S593.636 960 512 960s-156.8-19.911-225.493-59.733-122.951-94.08-162.773-162.773S64 593.636 64 512s19.911-156.8 59.733-225.493 94.08-122.951 162.773-162.773S430.364 64 512 64z m119.467 812.373c57.742-17.92 108.516-48.782 152.32-92.587 43.804-43.805 75.164-94.578 94.08-152.32 18.916-57.742 23.396-117.476 13.44-179.2-9.956-61.724-32.853-117.476-68.693-167.253-35.84-49.778-81.138-88.604-135.893-116.48C631.964 140.658 573.724 126.72 512 126.72s-119.964 13.938-174.72 41.813-100.053 66.702-135.893 116.48-58.738 105.529-68.693 167.253c-9.956 61.724-5.476 121.458 13.44 179.2s50.276 108.516 94.08 152.32c43.804 43.804 94.578 74.667 152.32 92.587h2.987c5.973 0 10.951-1.493 14.933-4.48 3.982-2.987 5.973-7.467 5.973-13.44v-65.707l-20.907 2.987H377.6c-19.911 1.991-38.329-1.991-55.253-11.947S293.974 759.893 288 741.973l-17.92-32.853-11.947-11.947-23.893-17.92c-3.982-3.982-5.973-6.969-5.973-8.96s0.996-3.982 2.987-5.973l14.933-2.987c5.973 0 11.947 1.493 17.92 4.48 5.973 2.987 11.947 5.476 17.92 7.467l11.947 14.933 11.947 11.947c7.964 13.938 17.422 24.889 28.373 32.853 10.951 7.964 23.893 11.449 38.827 10.453 14.933-0.996 29.369-4.48 43.307-10.453 1.991-9.956 4.978-19.413 8.96-28.373 3.982-8.96 8.96-16.427 14.933-22.4-25.884-1.991-49.778-7.467-71.68-16.427-21.902-8.96-40.818-21.404-56.747-37.333-15.929-15.929-26.88-34.844-32.853-56.747-7.964-25.884-11.947-52.764-11.947-80.64 0-17.92 3.484-35.84 10.453-53.76 6.969-17.92 16.427-33.849 28.373-47.787-1.991-7.964-3.484-15.431-4.48-22.4s-1.493-14.933-1.493-23.893 0.996-17.92 2.987-26.88c1.991-8.96 3.982-18.418 5.973-28.373h8.96c7.964 0 16.427 0.996 25.387 2.987s17.422 4.978 25.387 8.96l26.88 14.933 20.907 11.947c63.716-17.92 127.431-17.92 191.147 0l20.907-11.947 26.88-14.933c7.964-3.982 15.929-6.969 23.893-8.96 7.964-1.991 16.924-2.987 26.88-2.987h5.973c3.982 9.956 6.969 19.413 8.96 28.373 1.991 8.96 2.987 17.92 2.987 26.88 0 8.96-0.498 16.924-1.493 23.893s-2.489 14.436-4.48 22.4c11.947 13.938 21.404 29.867 28.373 47.787 6.969 17.92 10.453 35.84 10.453 53.76 0 27.876-3.982 54.756-11.947 80.64-5.973 21.902-16.924 40.818-32.853 56.747-15.929 15.929-35.342 28.373-58.24 37.333-22.898 8.96-47.289 14.436-73.173 16.427 9.956 7.964 16.924 18.418 20.907 31.36 3.982 12.942 5.973 26.382 5.973 40.32v104.533c0 5.973 1.991 10.453 5.973 13.44 3.982 2.987 7.964 4.48 11.947 4.48h5.972z" p-id="10774"></path></svg>-->
|
||||
<svg t="1739720696276" class="icon pt-2" viewBox="0 0 1024 1024" version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg" p-id="4176" width="22" height="22">
|
||||
<path
|
||||
@@ -50,15 +50,13 @@
|
||||
p-id="4177"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<span class="text-gray-500">3.12 MB</span>
|
||||
<span class="text-gray-500">下载</span>
|
||||
</nuxt-link>
|
||||
<el-divider class="opacity-40" style="height: 40px" direction="vertical"/>
|
||||
<div class="item text-center flex flex-col items-center">
|
||||
<div class="text-gray-400">插件ID</div>
|
||||
<el-icon size="24" class="py-1">
|
||||
<Cpu/>
|
||||
</el-icon>
|
||||
<span class="text-gray-500">{{ form.websiteId }}</span>
|
||||
<div class="rate text-gray-400">评分</div>
|
||||
<div class="text-2xl font-bold">3.5</div>
|
||||
<el-rate v-model="form.rate" disabled size="small"/>
|
||||
</div>
|
||||
<!-- <el-divider class="opacity-40" style="height: 40px" direction="vertical" />-->
|
||||
<!-- <div class="item text-center flex flex-col items-center">-->
|
||||
|
||||
@@ -2,7 +2,13 @@
|
||||
<div class="flex flex-col text-sm bg-white px-4 mt-5 pt-2 pb-2">
|
||||
<div class="flex flex-col">
|
||||
<el-space class="my-2">
|
||||
<h4 class="text-sm w-[40px] text-gray-400 font-normal text-center">行业</h4>
|
||||
<h4 class="text-sm w-[40px] text-gray-400 font-normal text-center">类型</h4>
|
||||
<el-radio-group v-model="selectType" @change="onType">
|
||||
<el-radio-button v-for="(item,index) in websiteType" :key="index" :label="item.label" :value="item.value"/>
|
||||
</el-radio-group>
|
||||
</el-space>
|
||||
<el-space class="my-2">
|
||||
<h4 class="text-sm w-[40px] text-gray-400 font-normal text-center">行业分类</h4>
|
||||
<div class="flex-wrap">
|
||||
<el-radio-group v-model="selectIndustry" @change="onIndustry">
|
||||
<el-radio-button v-for="(item,index) in IndustryData" :key="index" :label="item.label"
|
||||
@@ -11,7 +17,7 @@
|
||||
</div>
|
||||
</el-space>
|
||||
<el-space class="my-2">
|
||||
<h4 class="text-sm w-[40px] text-gray-400 font-normal text-center">类型</h4>
|
||||
<h4 class="text-sm w-[40px] text-gray-400 font-normal text-center">终端</h4>
|
||||
<el-radio-group v-model="selectType" @change="onType">
|
||||
<el-radio-button v-for="(item,index) in websiteType" :key="index" :label="item.label" :value="item.value"/>
|
||||
</el-radio-group>
|
||||
@@ -29,19 +35,20 @@
|
||||
</div>
|
||||
</div>
|
||||
<el-scrollbar style="height: 100%;">
|
||||
<el-space class="gap-4 mt-5">
|
||||
<el-button type="primary" @click="handleDefault">默认</el-button>
|
||||
<el-button @click="handleLast">最新</el-button>
|
||||
<el-button @click="handleHot">最热</el-button>
|
||||
<el-button @click="handleFree">免费</el-button>
|
||||
<el-button @click="handlePay">付费</el-button>
|
||||
<el-button @click="handleOfficial">官方</el-button>
|
||||
<div class="mt-5 flex items-center text-sm">
|
||||
<nuxt-link :to="`?`" @click="handleDefault">插件</nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`?`" @click="handleDefault">应用</nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`?`" @click="handleDefault">模板</nuxt-link>
|
||||
<el-space class="ml-10">
|
||||
<el-input v-model="keywords" :placeholder="`云官网`"
|
||||
style="min-width: 220px"
|
||||
:suffix-icon="Search"
|
||||
class="hidden-sm-and-down"
|
||||
:suffix-icon="Search" @change="handleKeywords"/>
|
||||
style="width: 220px" @change="handleKeywords"/>
|
||||
<el-button class="hidden-sm-and-down" @click="clearWhere">重置</el-button>
|
||||
</el-space>
|
||||
</div>
|
||||
</el-scrollbar>
|
||||
</template>
|
||||
|
||||
@@ -62,9 +69,11 @@ const keywords = ref<string | undefined>()
|
||||
const selectIndustry = ref<string>();
|
||||
const selectType = ref<string>();
|
||||
const selectColor = ref<string>();
|
||||
// 终端
|
||||
const appType = ref<any[]>()
|
||||
// 行业
|
||||
const industry = ref<string>()
|
||||
// 类型
|
||||
// 网站类型
|
||||
const websiteType = ref<any[]>([])
|
||||
// 色系
|
||||
const colors = ref<any[]>()
|
||||
|
||||
@@ -58,8 +58,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item-image pt-3">
|
||||
<el-image v-if="item.files" :src="`${JSON.parse(item.files)[0]}`" class="w-full h-1/2 max-h-[220px]"/>
|
||||
<div class="item-image pt-3 overflow-hidden">
|
||||
<el-image v-if="item.files" :src="`${JSON.parse(item.files)[0]}`" class="w-full h-1/2 max-h-[220px] transition-transform duration-300 ease-in-out hover:scale-110"/>
|
||||
<el-image v-else class="w-full h-[220px]"/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -119,6 +119,9 @@ const reload = async (where: any) => {
|
||||
pageCmsWebsiteAll({
|
||||
...where,
|
||||
market: true,
|
||||
official: false,
|
||||
order: 'desc',
|
||||
sort: 'buys',
|
||||
limit: where.limit || 12
|
||||
}).then(response => {
|
||||
if (response?.list) {
|
||||
@@ -151,6 +154,7 @@ const search = (data: CmsWebsiteParam) => {
|
||||
limit: 12
|
||||
}
|
||||
})
|
||||
// 回到页面顶部
|
||||
window.scrollTo(0, 0)
|
||||
}
|
||||
|
||||
|
||||
@@ -48,17 +48,44 @@
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('order.content')" prop="content" class="hover:bg-gray-50 p-2">
|
||||
<el-input type="textarea" :rows="5" cols="80" v-model="form.content"
|
||||
placeholder="填写您的开发需求"/>
|
||||
placeholder="请填写您的项目需求"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('order.realName')" prop="realName" class="hover:bg-gray-50 p-2">
|
||||
<el-form-item :label="$t('order.reference')" class="hover:bg-gray-50 p-2" prop="reference">
|
||||
<el-input v-model="form.reference" :placeholder="$t('order.reference')"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('order.files')" class="hover:bg-gray-50 p-2" prop="reference">
|
||||
<el-upload
|
||||
v-model:file-list="files"
|
||||
:headers="{
|
||||
Authorization: token,
|
||||
TenantId: 5,
|
||||
}"
|
||||
:limit="2"
|
||||
:on-preview="handlePictureCardPreview"
|
||||
:on-remove="filesRemove"
|
||||
:on-success="filesOnSuccess"
|
||||
action="https://server.gxwebsoft.com/api/oss/upload"
|
||||
list-type="picture-card"
|
||||
>
|
||||
<el-icon>
|
||||
<Plus/>
|
||||
</el-icon>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
<template v-if="token">
|
||||
|
||||
</template>
|
||||
<template v-if="!token">
|
||||
<el-form-item :label="$t('order.realName')" class="hover:bg-gray-50 p-2" prop="realName">
|
||||
<el-input v-model="form.realName" :placeholder="$t('order.realName')"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('order.phone')" prop="phone" class="hover:bg-gray-50 p-2">
|
||||
<el-form-item :label="$t('order.phone')" class="hover:bg-gray-50 p-2" prop="phone">
|
||||
<el-input v-model="form.phone" :maxlength="11" :placeholder="$t('order.phone')"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('order.email')" prop="email" class="hover:bg-gray-50 p-2">
|
||||
<el-form-item :label="$t('order.email')" class="hover:bg-gray-50 p-2" prop="email">
|
||||
<el-input v-model="form.email" :placeholder="$t('order.email')"/>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<el-form-item :label="$t('order.code')" prop="code" class="hover:bg-gray-50 p-2">
|
||||
<el-space class="flex">
|
||||
<el-input size="large" :placeholder="$t('order.imgCode')" maxlength="5" v-model="form.code"/>
|
||||
@@ -67,7 +94,12 @@
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<div class="submitForm ml-2">
|
||||
<el-button type="primary" size="large" @click.stop="submitForm(formRef)">
|
||||
<el-button
|
||||
:loading="loading"
|
||||
size="large"
|
||||
type="primary"
|
||||
@click="submitForm(formRef)"
|
||||
>
|
||||
{{ $t('order.submit') }}
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -89,10 +121,10 @@
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import {ArrowLeft, View, Search} from '@element-plus/icons-vue'
|
||||
import {ArrowLeft, View, Search, Plus} from '@element-plus/icons-vue'
|
||||
import type {FormInstance, FormRules, UploadProps, UploadUserFile} from 'element-plus'
|
||||
import {useLayout, usePage, useUser} from "~/composables/configState";
|
||||
import {getNavIdByParamsId} from "~/utils/common";
|
||||
import type {FormInstance, FormRules} from 'element-plus'
|
||||
import type {CmsOrder} from "~/api/cms/cmsOrder/model";
|
||||
import useFormData from "~/utils/use-form-data";
|
||||
import {addCmsOrder} from "~/api/cms/cmsOrder";
|
||||
@@ -100,10 +132,17 @@ import {getCaptcha} from "~/api/passport/login";
|
||||
import {getCmsNavigation, listCmsNavigation} from "~/api/cms/cmsNavigation";
|
||||
import {listCmsWebsite, pageCmsWebsiteAll} from "~/api/cms/cmsWebsite";
|
||||
import type {CmsWebsite} from "~/api/cms/cmsWebsite/model";
|
||||
import {useHead} from "nuxt/app";
|
||||
|
||||
// 在最顶部添加
|
||||
definePageMeta({
|
||||
title: '订单页面'
|
||||
})
|
||||
|
||||
// 引入状态管理
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const token = useToken();
|
||||
const navId = ref();
|
||||
const layout = useLayout();
|
||||
const user = useUser();
|
||||
@@ -112,9 +151,12 @@ const siteList = ref<CmsWebsite[]>([]);
|
||||
const dialogVisible = ref(false)
|
||||
const formRef = ref<FormInstance>()
|
||||
const dialogImageUrl = ref('')
|
||||
const files = ref<UploadUserFile[]>([])
|
||||
const filesStr = ref<string[]>([])
|
||||
// 验证码 base64 数据
|
||||
const captcha = ref('');
|
||||
const text = ref<string>('');
|
||||
const loading = ref(false)
|
||||
|
||||
|
||||
const {form, resetFields} = useFormData<CmsOrder>({
|
||||
@@ -142,6 +184,8 @@ const {form, resetFields} = useFormData<CmsOrder>({
|
||||
address: undefined,
|
||||
// 订单内容
|
||||
content: undefined,
|
||||
// 附件
|
||||
files: undefined,
|
||||
// 订单总额
|
||||
totalPrice: '0.00',
|
||||
// 实际付款
|
||||
@@ -198,60 +242,118 @@ const changeCaptcha = async () => {
|
||||
})
|
||||
};
|
||||
|
||||
// 将 SEO 相关的逻辑修改为
|
||||
const updateSeo = (data: any) => {
|
||||
const title = data?.title || '';
|
||||
const description = data?.comments || data?.title || '';
|
||||
const appName = useRuntimeConfig().public.appName;
|
||||
|
||||
// 使用 definePageMeta 设置页面元数据
|
||||
useHead({
|
||||
title,
|
||||
meta: [
|
||||
{ name: 'description', content: description },
|
||||
{ name: 'keywords', content: title },
|
||||
{ property: 'og:title', content: title },
|
||||
{ property: 'og:description', content: description }
|
||||
]
|
||||
})
|
||||
}
|
||||
|
||||
// 请求数据
|
||||
const reload = async () => {
|
||||
getCmsNavigation(navId.value).then(data => {
|
||||
try {
|
||||
const data = await getCmsNavigation(navId.value)
|
||||
if (!data) return
|
||||
|
||||
page.value = data
|
||||
layout.value.banner = data.banner;
|
||||
layout.value.banner = data.banner
|
||||
|
||||
// 更新 SEO
|
||||
updateSeo(data)
|
||||
|
||||
// 二级栏目分类
|
||||
pageCmsWebsiteAll({
|
||||
const res = await pageCmsWebsiteAll({
|
||||
official: true,
|
||||
sort: 'websiteId',
|
||||
order: 'asc'
|
||||
}).then(res => {
|
||||
siteList.value = res?.list || [];
|
||||
})
|
||||
siteList.value = res?.list || []
|
||||
|
||||
// 用户信息
|
||||
if (user.value) {
|
||||
form.realName = user.value.realName;
|
||||
form.phone = user.value.phone;
|
||||
form.email = user.value.email;
|
||||
form.realName = user.value.realName
|
||||
form.phone = user.value.phone
|
||||
form.email = user.value.email
|
||||
}
|
||||
|
||||
changeCaptcha()
|
||||
} catch (error) {
|
||||
console.error('Failed to load page data:', error)
|
||||
}
|
||||
// seo
|
||||
useSeoMeta({
|
||||
description: data.comments || data.title,
|
||||
keywords: data.title,
|
||||
titleTemplate: `${data?.title}` + ' - %s',
|
||||
})
|
||||
changeCaptcha();
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => {
|
||||
dialogImageUrl.value = uploadFile.url!
|
||||
dialogVisible.value = true
|
||||
}
|
||||
|
||||
const filesRemove: UploadProps['onRemove'] = (uploadFile) => {
|
||||
const index = filesStr.value.findIndex(f => f == uploadFile.url);
|
||||
filesStr.value.splice(index, 1)
|
||||
}
|
||||
|
||||
const filesOnSuccess = (e: any) => {
|
||||
filesStr.value.push(e.data.downloadUrl)
|
||||
}
|
||||
|
||||
|
||||
const onWebsite = (item: CmsWebsite) => {
|
||||
form.articleId = item.websiteId;
|
||||
form.websiteId = item.websiteId;
|
||||
}
|
||||
|
||||
// 提交表单
|
||||
const submitForm = (formEl: FormInstance | undefined) => {
|
||||
const submitForm = async (formEl: FormInstance | undefined) => {
|
||||
if (!formEl) return
|
||||
if (loading.value) return // 防止重复提交
|
||||
|
||||
if (form.code !== text.value) {
|
||||
changeCaptcha();
|
||||
ElMessage.error('验证码不正确!');
|
||||
return false;
|
||||
}
|
||||
formEl.validate((valid) => {
|
||||
|
||||
if(process.server){
|
||||
return false;
|
||||
}
|
||||
|
||||
loading.value = true
|
||||
try {
|
||||
const valid = await formEl.validate()
|
||||
if (valid) {
|
||||
addCmsOrder(form).then(res => {
|
||||
// 如果reference不为空,将其添加到content前面
|
||||
if (form.reference) {
|
||||
form.content = `参考网站:${form.reference}\n\n${form.content}`
|
||||
}
|
||||
|
||||
if (filesStr.value.length > 0) {
|
||||
form.files = JSON.stringify(filesStr.value);
|
||||
}
|
||||
const res = await addCmsOrder(form)
|
||||
if (res.code == 0) {
|
||||
ElMessage.success(res.message)
|
||||
resetFields();
|
||||
} else {
|
||||
return ElMessage.error(res.message)
|
||||
ElMessage.error(res.message)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const goBack = () => {
|
||||
|
||||
272
pages/order/index.vue
Normal file
272
pages/order/index.vue
Normal file
@@ -0,0 +1,272 @@
|
||||
<template>
|
||||
|
||||
<!-- Banner -->
|
||||
<Banner :layout="layout"/>
|
||||
<!-- 主体部分 -->
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> {{ page.title }} </span>
|
||||
</template>
|
||||
<template #extra>
|
||||
</template>
|
||||
<el-card class="my-5 sm:my-10 sm:px-2" shadow="hover">
|
||||
<div class="grid grid-cols-1 sm:grid-cols-3 gap-8">
|
||||
<div class="col-span-2">
|
||||
<div class="my-2">
|
||||
<el-alert title="填写您的需求,为您量身定制." type="warning"/>
|
||||
</div>
|
||||
<el-form
|
||||
ref="formRef"
|
||||
:model="form"
|
||||
:rules="rules"
|
||||
label-position="left"
|
||||
label-width="80"
|
||||
status-icon
|
||||
>
|
||||
<el-form-item :label="$t('order.title')" class="hover:bg-gray-50 p-2" prop="title">
|
||||
<el-select
|
||||
v-model="form.title"
|
||||
filterable
|
||||
placeholder="选择产品"
|
||||
@change="onWebsite"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in siteList"
|
||||
:key="item.websiteId"
|
||||
:label="item.websiteName"
|
||||
:value="item.websiteId"
|
||||
>
|
||||
<div class="flex justify-between">
|
||||
<span>{{ item.websiteName }}</span>
|
||||
<span class="text-gray-300">
|
||||
{{ `${item.websiteCode}.websoft.top` }}
|
||||
</span>
|
||||
</div>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('order.content')" class="hover:bg-gray-50 p-2" prop="content">
|
||||
<el-input v-model="form.content" :rows="5" cols="80" placeholder="填写您的开发需求"
|
||||
type="textarea"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('order.realName')" class="hover:bg-gray-50 p-2" prop="realName">
|
||||
<el-input v-model="form.realName" :placeholder="$t('order.realName')"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('order.phone')" class="hover:bg-gray-50 p-2" prop="phone">
|
||||
<el-input v-model="form.phone" :maxlength="11" :placeholder="$t('order.phone')"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('order.email')" class="hover:bg-gray-50 p-2" prop="email">
|
||||
<el-input v-model="form.email" :placeholder="$t('order.email')"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('order.code')" class="hover:bg-gray-50 p-2" prop="code">
|
||||
<el-space class="flex">
|
||||
<el-input v-model="form.code" :placeholder="$t('order.imgCode')" maxlength="5" size="large"/>
|
||||
<el-image v-if="captcha" :alt="$t('order.imgCode')" :src="captcha" @click="changeCaptcha"/>
|
||||
</el-space>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<div class="submitForm ml-2">
|
||||
<el-button size="large" type="primary" @click.stop="submitForm(formRef)">
|
||||
{{ $t('order.submit') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="hidden-sm-and-down">
|
||||
<el-image v-if="page.icon" :src="page.icon" class="py-2"/>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-page-header>
|
||||
</div>
|
||||
|
||||
<el-dialog v-model="dialogVisible">
|
||||
<div class="flex justify-center">
|
||||
<el-image :src="dialogImageUrl" alt="查看证件" w-full/>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import {ArrowLeft, View, Search} from '@element-plus/icons-vue'
|
||||
import {useLayout, usePage, useUser} from "~/composables/configState";
|
||||
import {getNavIdByParamsId} from "~/utils/common";
|
||||
import type {FormInstance, FormRules} from 'element-plus'
|
||||
import type {CmsOrder} from "~/api/cms/cmsOrder/model";
|
||||
import useFormData from "~/utils/use-form-data";
|
||||
import {addCmsOrder} from "~/api/cms/cmsOrder";
|
||||
import {getCaptcha} from "~/api/passport/login";
|
||||
import {getCmsNavigation, listCmsNavigation} from "~/api/cms/cmsNavigation";
|
||||
import {listCmsWebsite, pageCmsWebsiteAll} from "~/api/cms/cmsWebsite";
|
||||
import type {CmsWebsite} from "~/api/cms/cmsWebsite/model";
|
||||
|
||||
// 引入状态管理
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const navId = ref();
|
||||
const layout = useLayout();
|
||||
const user = useUser();
|
||||
const page = usePage();
|
||||
const siteList = ref<CmsWebsite[]>([]);
|
||||
const dialogVisible = ref(false)
|
||||
const formRef = ref<FormInstance>()
|
||||
const dialogImageUrl = ref('')
|
||||
// 验证码 base64 数据
|
||||
const captcha = ref('');
|
||||
const text = ref<string>('');
|
||||
|
||||
|
||||
const {form, resetFields} = useFormData<CmsOrder>({
|
||||
// 订单号
|
||||
orderId: undefined,
|
||||
// 模型名称
|
||||
model: 'order',
|
||||
// 订单标题
|
||||
title: undefined,
|
||||
// 订单编号
|
||||
orderNo: undefined,
|
||||
// 订单类型,0商城 1询价 2留言
|
||||
type: undefined,
|
||||
// 关联项目ID,配合订单类型使用
|
||||
articleId: undefined,
|
||||
// 关联网站ID
|
||||
websiteId: undefined,
|
||||
// 真实姓名
|
||||
realName: undefined,
|
||||
// 手机号码
|
||||
phone: undefined,
|
||||
// 电子邮箱
|
||||
email: undefined,
|
||||
// 收货地址
|
||||
address: undefined,
|
||||
// 订单内容
|
||||
content: undefined,
|
||||
// 订单总额
|
||||
totalPrice: '0.00',
|
||||
// 实际付款
|
||||
payPrice: '0.00',
|
||||
// 报价询价
|
||||
price: '0.00',
|
||||
// 购买数量
|
||||
totalNum: undefined,
|
||||
// 二维码地址,保存订单号,支付成功后才生成
|
||||
qrcode: undefined,
|
||||
// 下单渠道,0网站 1小程序 2其他
|
||||
channel: undefined,
|
||||
// 过期时间
|
||||
expirationTime: undefined,
|
||||
// 订单是否已结算(0未结算 1已结算)
|
||||
isSettled: undefined,
|
||||
// 用户id
|
||||
userId: undefined,
|
||||
// 备注
|
||||
comments: undefined,
|
||||
// 排序号
|
||||
sortNumber: undefined,
|
||||
// 是否删除, 0否, 1是
|
||||
deleted: undefined,
|
||||
// 租户id
|
||||
tenantId: undefined,
|
||||
// 创建时间
|
||||
createTime: undefined,
|
||||
// 图像验证码
|
||||
code: '',
|
||||
})
|
||||
|
||||
const rules = reactive<FormRules<CmsOrder>>({
|
||||
title: [
|
||||
{required: true, message: '请输入产品名称', trigger: 'blur'},
|
||||
],
|
||||
phone: [
|
||||
{required: true, message: '请输入手机号码', trigger: 'blur'},
|
||||
{pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur'},
|
||||
],
|
||||
realName: [
|
||||
{required: true, message: '请输入联系人姓名', trigger: 'blur'},
|
||||
],
|
||||
content: [
|
||||
{required: true, message: '请输入您的项目需求', trigger: 'blur'},
|
||||
]
|
||||
})
|
||||
|
||||
/* 获取图形验证码 */
|
||||
const changeCaptcha = async () => {
|
||||
getCaptcha().then(captchaData => {
|
||||
captcha.value = captchaData.base64;
|
||||
text.value = captchaData.text;
|
||||
})
|
||||
};
|
||||
|
||||
// 请求数据
|
||||
const reload = async () => {
|
||||
getCmsNavigation(navId.value).then(data => {
|
||||
page.value = data
|
||||
layout.value.banner = data.banner;
|
||||
// 二级栏目分类
|
||||
pageCmsWebsiteAll({
|
||||
official: true,
|
||||
sort: 'websiteId',
|
||||
order: 'asc'
|
||||
}).then(res => {
|
||||
siteList.value = res?.list || [];
|
||||
})
|
||||
// 用户信息
|
||||
if (user.value) {
|
||||
form.realName = user.value.realName;
|
||||
form.phone = user.value.phone;
|
||||
form.email = user.value.email;
|
||||
}
|
||||
// seo
|
||||
useSeoMeta({
|
||||
description: data.comments || data.title,
|
||||
keywords: data.title,
|
||||
titleTemplate: `${data?.title}` + ' - %s',
|
||||
})
|
||||
changeCaptcha();
|
||||
})
|
||||
}
|
||||
|
||||
const onWebsite = (item: CmsWebsite) => {
|
||||
form.articleId = item.websiteId;
|
||||
form.websiteId = item.websiteId;
|
||||
}
|
||||
|
||||
// 提交表单
|
||||
const submitForm = (formEl: FormInstance | undefined) => {
|
||||
if (!formEl) return
|
||||
if (form.code !== text.value) {
|
||||
changeCaptcha();
|
||||
ElMessage.error('验证码不正确!');
|
||||
return false;
|
||||
}
|
||||
formEl.validate((valid) => {
|
||||
if (valid) {
|
||||
addCmsOrder(form).then(res => {
|
||||
if (res.code == 0) {
|
||||
ElMessage.success(res.message)
|
||||
resetFields();
|
||||
} else {
|
||||
return ElMessage.error(res.message)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const goBack = () => {
|
||||
router.back();
|
||||
}
|
||||
|
||||
watch(
|
||||
() => route.params.id,
|
||||
(id) => {
|
||||
navId.value = getNavIdByParamsId(id);
|
||||
reload();
|
||||
},
|
||||
{immediate: true}
|
||||
);
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
</style>
|
||||
@@ -2,7 +2,7 @@
|
||||
<!-- Banner -->
|
||||
<Banner :layout="layout" />
|
||||
<!-- 主体部分 -->
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<div class="xl:w-screen-xl m-auto py-4 px-4 sm:px-0">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> {{ page.title || '页面标题' }} </span>
|
||||
@@ -30,6 +30,7 @@ import { ArrowLeft,View } from '@element-plus/icons-vue'
|
||||
import {getCmsNavigation, listCmsNavigation} from "~/api/cms/cmsNavigation";
|
||||
import Content from "~/components/Content.vue";
|
||||
import Tags from "~/components/Tags.vue";
|
||||
import { useHead } from 'unhead';
|
||||
|
||||
// 引入状态管理
|
||||
const route = useRoute();
|
||||
@@ -45,24 +46,38 @@ const goBack = () => {
|
||||
|
||||
// 加载页面布局
|
||||
const reload = async () => {
|
||||
getCmsNavigation(navId.value).then(data => {
|
||||
try {
|
||||
const data = await getCmsNavigation(navId.value)
|
||||
if (!data) return
|
||||
|
||||
page.value = data
|
||||
layout.value.banner = data.banner;
|
||||
layout.value.banner = data.banner
|
||||
|
||||
// 更新 SEO
|
||||
const title = data?.title || ''
|
||||
const description = data.comments || data.title || ''
|
||||
const appName = useRuntimeConfig().public.appName
|
||||
|
||||
useHead({
|
||||
title,
|
||||
meta: [
|
||||
{ name: 'description', content: description },
|
||||
{ name: 'keywords', content: title },
|
||||
{ property: 'og:title', content: title },
|
||||
{ property: 'og:description', content: description }
|
||||
]
|
||||
})
|
||||
|
||||
// 二级栏目分类
|
||||
if(data.parentId && data.parentId > 0){
|
||||
listCmsNavigation({
|
||||
const list = await listCmsNavigation({
|
||||
parentId: data.parentId == 0 ? data.navigationId : data.parentId
|
||||
}).then(list => {
|
||||
})
|
||||
category.value = list
|
||||
})
|
||||
}
|
||||
// seo
|
||||
useSeoMeta({
|
||||
description: data.comments || data.title,
|
||||
keywords: data.title,
|
||||
titleTemplate: `${data?.title}` + ' - %s',
|
||||
})
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('Failed to load page data:', error)
|
||||
}
|
||||
}
|
||||
|
||||
watch(
|
||||
|
||||
@@ -1,185 +0,0 @@
|
||||
<template>
|
||||
|
||||
<!-- 主体部分 -->
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> {{ page.title }} </span>
|
||||
</template>
|
||||
<template #extra>
|
||||
<div class="flex items-center">
|
||||
<el-select v-model="value" clearable placeholder="筛选" style="width: 200px">
|
||||
<el-option
|
||||
v-for="item in options"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</div>
|
||||
</template>
|
||||
<el-row :gutter="24" id="container" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :span="6" class="left">
|
||||
<el-card shadow="hover" :body-style="{ padding: '0px' }" class=" hover:bg-gray-50 cursor-pointer" @click="navigateTo(`/item/${item.articleId}.html`)">
|
||||
<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 gap-1.5">
|
||||
<el-avatar
|
||||
:src="item.image" shape="square" :size="44" style="background-color: white;"/>
|
||||
<div class="flex-1 text-xl cursor-pointer flex flex-col">
|
||||
{{ item.title }}
|
||||
<sapn class="text-xs text-gray-400">site.websoft.top</sapn>
|
||||
</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 text-sm">-->
|
||||
<!-- <el-space class="flex items-end">-->
|
||||
<!-- <div class="text-gray-400 gap-1 flex items-center"><el-icon><View /></el-icon><span>{{ getViews(item) }}</span></div>-->
|
||||
<!-- </el-space>-->
|
||||
<!-- <el-button>控制台</el-button>-->
|
||||
<!-- </div>-->
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-page-header>
|
||||
|
||||
<Pagination :total="total" @done="search" />
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import Banner from "@/components/Banner.vue";
|
||||
import { ArrowLeft,View } from '@element-plus/icons-vue'
|
||||
import { ElNotification as notify } from 'element-plus'
|
||||
import {useConfigInfo, useLayout, usePage} from "~/composables/configState";
|
||||
import type {CmsNavigation} from "~/api/cms/cmsNavigation/model";
|
||||
import type {CmsArticle, CmsArticleParam} from "~/api/cms/cmsArticle/model";
|
||||
import type { ComponentSize } from 'element-plus'
|
||||
import { ElNotification } from 'element-plus'
|
||||
import type { TabsPaneContext } from 'element-plus'
|
||||
import { h } from 'vue'
|
||||
import dayjs from "dayjs";
|
||||
import {detail, getNavIdByParamsId, navTo, paramsId} from "~/utils/common";
|
||||
import Left from "~/components/Left.vue";
|
||||
import {getCmsNavigation, listCmsNavigation} from "~/api/cms/cmsNavigation";
|
||||
import {pageCmsArticle} from "~/api/cms/cmsArticle";
|
||||
|
||||
const route = useRoute();
|
||||
const navId = ref();
|
||||
// 页面信息
|
||||
const list = ref<CmsArticle[]>([]);
|
||||
const i18n = useI18n();
|
||||
const category = ref<CmsNavigation[]>([]);
|
||||
const total = ref(0);
|
||||
const activeName = ref('2839');
|
||||
|
||||
// 获取状态
|
||||
const page = usePage();
|
||||
const layout = useLayout();
|
||||
|
||||
// 搜索表单
|
||||
const where = reactive<CmsArticleParam>({
|
||||
keywords: '',
|
||||
page: 1,
|
||||
limit: 20,
|
||||
status: 0,
|
||||
parentId: undefined,
|
||||
categoryId: undefined,
|
||||
lang: i18n.locale.value
|
||||
});
|
||||
|
||||
const goBack = () => {
|
||||
console.log('go back')
|
||||
notify('Back')
|
||||
route.back();
|
||||
}
|
||||
|
||||
// 加载页面数据
|
||||
const reload = async () => {
|
||||
await getCmsNavigation(navId.value).then(data => {
|
||||
page.value = data;
|
||||
layout.value.banner = data.banner;
|
||||
|
||||
// seo
|
||||
useSeoMeta({
|
||||
description: data.comments || data.title,
|
||||
keywords: data.title,
|
||||
titleTemplate: `${data?.title}` + ' - %s',
|
||||
})
|
||||
|
||||
// 二级栏目分类
|
||||
listCmsNavigation({
|
||||
parentId: data.parentId == 0 ? data.navigationId : data.parentId
|
||||
}).then(navigation => {
|
||||
category.value = navigation;
|
||||
// 加载文章列表
|
||||
where.categoryId = page.value.navigationId;
|
||||
pageCmsArticle(where).then(response => {
|
||||
if(response){
|
||||
total.value = response.count;
|
||||
list.value = response.list;
|
||||
}
|
||||
})
|
||||
})
|
||||
}).catch(() => {})
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索
|
||||
* @param data
|
||||
*/
|
||||
const search = (data: CmsArticleParam) => {
|
||||
where.page = data.page;
|
||||
reload();
|
||||
}
|
||||
|
||||
const handleClick = (tab: TabsPaneContext, event: Event) => {
|
||||
console.log(tab, event)
|
||||
}
|
||||
const value = ref('')
|
||||
const options = [
|
||||
{
|
||||
value: 'Option1',
|
||||
label: 'Option1',
|
||||
},
|
||||
{
|
||||
value: 'Option2',
|
||||
label: 'Option2',
|
||||
},
|
||||
{
|
||||
value: 'Option3',
|
||||
label: 'Option3',
|
||||
},
|
||||
{
|
||||
value: 'Option4',
|
||||
label: 'Option4',
|
||||
},
|
||||
{
|
||||
value: 'Option5',
|
||||
label: 'Option5',
|
||||
},
|
||||
]
|
||||
|
||||
watch(
|
||||
() => route.params.id,
|
||||
(id) => {
|
||||
navId.value = getNavIdByParamsId(id);
|
||||
reload();
|
||||
},
|
||||
{ immediate: true }
|
||||
);
|
||||
</script>
|
||||
<style lang="scss">
|
||||
.right .content img{
|
||||
width: auto !important;
|
||||
}
|
||||
.demo-tabs > .el-tabs__content {
|
||||
padding: 32px;
|
||||
color: #6b778c;
|
||||
font-size: 32px;
|
||||
font-weight: 600;
|
||||
}
|
||||
</style>
|
||||
131
pages/product/code/[id].vue
Normal file
131
pages/product/code/[id].vue
Normal file
@@ -0,0 +1,131 @@
|
||||
<template>
|
||||
|
||||
<!-- 主体部分 -->
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> 源码下载 </span>
|
||||
</template>
|
||||
<div class="text-lg">
|
||||
<el-result
|
||||
:title="`权限不足`"
|
||||
icon="warning"
|
||||
/>
|
||||
</div>
|
||||
<el-row id="container" :gutter="24" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :sm="4" :xs="12" class="left mb-8">
|
||||
<nuxt-link :to="`${item.url}`" class="flex-1 cursor-pointer flex flex-col text-center" target="_blank">
|
||||
<el-card :body-style="{ padding: '0px' }" class="items-center flex justify-center" shadow="hover">
|
||||
<el-popover
|
||||
:content="item.comments"
|
||||
:width="200"
|
||||
placement="bottom"
|
||||
trigger="hover"
|
||||
>
|
||||
<template #reference>
|
||||
<div class="flex-1 py-5 sm:p-4 !p-4">
|
||||
<el-space class="text-gray-700 dark:text-white text-base font-semibold h-[28px] flex justify-center items-center">
|
||||
<el-image v-if="item.icon" :alt="item.name" :src="item.icon" style="height: 32px"/>
|
||||
<span :title="item.name" class="text-lg line-clamp-1">{{ item.name }}</span>
|
||||
</el-space>
|
||||
</div>
|
||||
</template>
|
||||
</el-popover>
|
||||
</el-card>
|
||||
</nuxt-link>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-page-header>
|
||||
<Pagination :total="total" @done="search" />
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { ArrowLeft,View,Search } from '@element-plus/icons-vue'
|
||||
import {useLayout, usePage} from "~/composables/configState";
|
||||
import type {CmsNavigation} from "~/api/cms/cmsNavigation/model";
|
||||
import type {CmsArticle, CmsArticleParam} from "~/api/cms/cmsArticle/model";
|
||||
import {getNavIdByParamsId, getViews, paramsId} from "~/utils/common";
|
||||
import {getCmsNavigation, listCmsNavigation} from "~/api/cms/cmsNavigation";
|
||||
import {pageCmsLink} from "~/api/cms/cmsLink";
|
||||
import type {CmsLink, CmsLinkParam} from "~/api/cms/cmsLink/model";
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const navId = ref();
|
||||
const list = ref<CmsLink[]>([]);
|
||||
const category = ref<CmsNavigation[]>([]);
|
||||
const total = ref<number>(0);
|
||||
|
||||
// 获取状态
|
||||
const page = usePage();
|
||||
const layout = useLayout();
|
||||
const showSearch = ref<boolean>(false);
|
||||
|
||||
// 搜索表单
|
||||
const where = reactive<CmsLinkParam>({
|
||||
keywords: '',
|
||||
page: 1,
|
||||
categoryId: undefined
|
||||
});
|
||||
|
||||
const id = ref<number>(0);
|
||||
|
||||
const showMenu = (item: CmsLink) => {
|
||||
id.value = Number(item.id);
|
||||
};
|
||||
|
||||
const hideMenu = () => {
|
||||
id.value = 0;
|
||||
};
|
||||
|
||||
// 加载页面数据
|
||||
const reload = async () => {
|
||||
getCmsNavigation(navId.value).then(data => {
|
||||
// 获取栏目信息
|
||||
page.value = data
|
||||
layout.value.banner = data.banner;
|
||||
if(navId.value){
|
||||
where.categoryId = navId.value;
|
||||
}
|
||||
pageCmsLink(where).then(response => {
|
||||
if(response){
|
||||
total.value = response?.count;
|
||||
list.value = response?.list;
|
||||
}
|
||||
}).finally(() => showSearch.value = false)
|
||||
|
||||
// 设置页面标题
|
||||
useSeoMeta({
|
||||
description: data.comments || data.title,
|
||||
keywords: data.title,
|
||||
titleTemplate: `${data?.title}` + ' - %s',
|
||||
})
|
||||
|
||||
}).catch(err => {
|
||||
console.log(err,'加载失败...')
|
||||
})
|
||||
}
|
||||
|
||||
const goBack = () => {
|
||||
router.back(); // 返回上一页
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索
|
||||
* @param data
|
||||
*/
|
||||
const search = (data: CmsArticleParam) => {
|
||||
where.page = data.page;
|
||||
reload();
|
||||
}
|
||||
|
||||
watch(
|
||||
() => route.params.id,
|
||||
(id) => {
|
||||
navId.value = getNavIdByParamsId(id);
|
||||
reload();
|
||||
},
|
||||
{ immediate: true }
|
||||
);
|
||||
|
||||
</script>
|
||||
131
pages/product/docs/[id].vue
Normal file
131
pages/product/docs/[id].vue
Normal file
@@ -0,0 +1,131 @@
|
||||
<template>
|
||||
<Banner :layout="layout" />
|
||||
<!-- 主体部分 -->
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> {{ '产品文档' }} </span>
|
||||
</template>
|
||||
<!-- <div class="text-lg">-->
|
||||
<!-- <el-result-->
|
||||
<!-- icon="warning"-->
|
||||
<!-- :title="`权限不足`"-->
|
||||
<!-- />-->
|
||||
<!-- </div>-->
|
||||
<el-row id="container" :gutter="24" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :span="6" :xs="24" class="left mb-6">
|
||||
<el-card :body-style="{ padding: '0px' }" class=" hover:bg-gray-50 cursor-pointer" shadow="hover" @click="navigateTo(`/detail/${item.articleId}.html`)">
|
||||
<el-image
|
||||
:lazy="true"
|
||||
:src="item.image"
|
||||
class="w-full md:h-[166px] h-[199px] cursor-pointer bg-gray-50" fit="cover"/>
|
||||
<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 min-h-[56px]">
|
||||
{{ item.title }}
|
||||
</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 text-sm">
|
||||
<el-space class="flex items-end">
|
||||
<div class="text-gray-400 gap-1 flex items-center"><el-icon><View /></el-icon><span>{{ getViews(item) }}</span></div>
|
||||
</el-space>
|
||||
<div class="text-gray-400">
|
||||
<el-avatar v-if="item.avatar" :src="`${item.avatar}`" size="small" />
|
||||
{{ dayjs(item.createTime).format('YYYY-MM-DD') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-page-header>
|
||||
<Pagination :total="total" @done="search" />
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { ArrowLeft,View,Search } from '@element-plus/icons-vue'
|
||||
import {useLayout, usePage} from "~/composables/configState";
|
||||
import type {CmsNavigation} from "~/api/cms/cmsNavigation/model";
|
||||
import type {CmsArticle, CmsArticleParam} from "~/api/cms/cmsArticle/model";
|
||||
import {getNavIdByParamsId, getViews, paramsId} from "~/utils/common";
|
||||
import dayjs from "dayjs";
|
||||
import {getCmsNavigation, listCmsNavigation} from "~/api/cms/cmsNavigation";
|
||||
import {pageCmsArticle} from "~/api/cms/cmsArticle";
|
||||
import Banner from "~/components/Banner.vue";
|
||||
import {getCmsWebsiteAll} from "~/api/cms/cmsWebsite";
|
||||
import type {CmsWebsite} from "~/api/cms/cmsWebsite/model";
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const navId = ref();
|
||||
const website = ref<CmsWebsite>();
|
||||
const list = ref<CmsArticle[]>([]);
|
||||
const i18n = useI18n();
|
||||
const category = ref<CmsNavigation[]>([]);
|
||||
const total = ref<number>(0);
|
||||
|
||||
// 获取状态
|
||||
const page = usePage();
|
||||
const layout = useLayout();
|
||||
|
||||
// 搜索表单
|
||||
const where = reactive<CmsArticleParam>({
|
||||
keywords: '',
|
||||
page: 1,
|
||||
status: 0,
|
||||
parentId: undefined,
|
||||
categoryId: undefined
|
||||
});
|
||||
|
||||
// 加载页面数据
|
||||
const reload = async () => {
|
||||
getCmsWebsiteAll(navId.value).then(data => {
|
||||
// 获取栏目信息
|
||||
website.value = data
|
||||
where.tenantId = data.tenantId;
|
||||
pageCmsArticle(where).then(response => {
|
||||
if(response){
|
||||
total.value = response?.count;
|
||||
list.value = response?.list;
|
||||
}
|
||||
})
|
||||
|
||||
// 设置页面标题
|
||||
useSeoMeta({
|
||||
description: data.comments || data.websiteName,
|
||||
keywords: data.websiteName,
|
||||
titleTemplate: `${data.websiteName}` + ' - %s',
|
||||
})
|
||||
|
||||
}).catch(err => {
|
||||
console.log(err,'加载失败...')
|
||||
})
|
||||
}
|
||||
|
||||
const goBack = () => {
|
||||
router.back(); // 返回上一页
|
||||
// window.history.back();
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索
|
||||
* @param data
|
||||
*/
|
||||
const search = (data: CmsArticleParam) => {
|
||||
where.page = data.page;
|
||||
reload();
|
||||
}
|
||||
|
||||
watch(
|
||||
() => route.params.id,
|
||||
(id) => {
|
||||
navId.value = getNavIdByParamsId(id);
|
||||
reload();
|
||||
},
|
||||
{ immediate: true }
|
||||
);
|
||||
|
||||
</script>
|
||||
141
pages/product/index.vue
Normal file
141
pages/product/index.vue
Normal file
@@ -0,0 +1,141 @@
|
||||
<template>
|
||||
|
||||
<!-- 主体部分 -->
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<div class="text-large font-600"> 产品中心 </div>
|
||||
</template>
|
||||
<!-- 应用列表 -->
|
||||
<el-row id="container" :gutter="24" class="clearfix">
|
||||
<el-col v-for="(item,index) in list" :key="index" :sm="6" :xs="12" class="left mb-8">
|
||||
<el-card :body-style="{ padding: '0px' }" class="h-[180px] items-center flex justify-center" shadow="hover" @mouseleave="hideMenu" @mouseover="showMenu(item)">
|
||||
<div class="flex-1 px-4 py-5 sm:p-4 !p-4">
|
||||
<div class="text-gray-700 dark:text-white text-base font-semibold flex flex-col items-center gap-1.5">
|
||||
<nuxt-link :to="`https://${item.adminUrl}`" target="_blank">
|
||||
<el-avatar
|
||||
:size="55" :src="item.websiteLogo" shape="square" style="background-color: white;"/>
|
||||
</nuxt-link>
|
||||
<div class="flex-1 cursor-pointer flex flex-col text-center">
|
||||
<nuxt-link :to="`https://${item.adminUrl}`" class="text-lg" target="_blank">{{ item.websiteName }}</nuxt-link>
|
||||
<div v-if="id == item.websiteId" class="flex text-gray-400 text-sm font-normal py2 justify-between items-center">
|
||||
<div>
|
||||
<nuxt-link :to="`https://${item.adminUrl}`" target="_blank"><span class="text-gray-400 hover:text-green-700">控制台</span></nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`/market/${item.websiteId}`"><span class="text-gray-400 hover:text-green-700">详情</span></nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`/market/${item.websiteId}`"><span class="text-gray-400 hover:text-green-700">评论</span></nuxt-link>
|
||||
<el-divider direction="vertical" />
|
||||
<nuxt-link :to="`/product/code/${item.websiteId}`"><span class="text-gray-400 hover:text-green-700">源码</span></nuxt-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-page-header>
|
||||
|
||||
<Pagination :total="total" @done="search"/>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import {ArrowLeft} from '@element-plus/icons-vue'
|
||||
import {pageCmsWebsiteAll} from "~/api/cms/cmsWebsite";
|
||||
import type {CmsWebsite, CmsWebsiteParam} from "~/api/cms/cmsWebsite/model";
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
// 页面信息
|
||||
const list = ref<CmsWebsite[]>([]);
|
||||
const total = ref(0);
|
||||
const id = ref<number>();
|
||||
|
||||
const inputWidth = ref<string>('180px');
|
||||
const showSearch = ref<boolean>(false);
|
||||
|
||||
const loading = ref<boolean>(false)
|
||||
const where = ref<CmsWebsiteParam>({
|
||||
|
||||
});
|
||||
|
||||
const goBack = () => {
|
||||
router.back();
|
||||
}
|
||||
const showDomain = (item: CmsWebsite) => {
|
||||
id.value = Number(item.websiteId);
|
||||
};
|
||||
|
||||
const hideDomain = () => {
|
||||
id.value = 0;
|
||||
};
|
||||
|
||||
const showMenu = (item: CmsWebsite) => {
|
||||
id.value = Number(item.websiteId);
|
||||
};
|
||||
|
||||
const hideMenu = () => {
|
||||
id.value = 0;
|
||||
};
|
||||
|
||||
// 加载页面数据
|
||||
const reload = async (where: any) => {
|
||||
if (loading.value) return;
|
||||
loading.value = true;
|
||||
pageCmsWebsiteAll({
|
||||
...where,
|
||||
market: true,
|
||||
official: true,
|
||||
sort: 'websiteId',
|
||||
order: 'asc',
|
||||
limit: where.limit || 12
|
||||
}).then(response => {
|
||||
if (response?.list) {
|
||||
list.value = response?.list.map(d => {
|
||||
if (d.domain == '' || d.domain == null) {
|
||||
d.domain = `${d.websiteCode}.wsdns.cn`;
|
||||
}
|
||||
return d;
|
||||
});
|
||||
total.value = response.count;
|
||||
}
|
||||
loading.value = false;
|
||||
}).catch(() => {
|
||||
loading.value = false;
|
||||
}).finally(() => {
|
||||
showSearch.value = false
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索
|
||||
* @param data
|
||||
*/
|
||||
const search = (data: CmsWebsiteParam) => {
|
||||
navigateTo({
|
||||
path: '/market',
|
||||
query: {
|
||||
market: 1,
|
||||
page: data.page,
|
||||
limit: 12
|
||||
}
|
||||
})
|
||||
window.scrollTo(0, 0)
|
||||
}
|
||||
|
||||
watch(
|
||||
() => route.query,
|
||||
(query) => {
|
||||
where.value = query;
|
||||
console.log(where.value,'>>>>>')
|
||||
reload(query);
|
||||
},
|
||||
{immediate: true}
|
||||
);
|
||||
</script>
|
||||
<style lang="scss">
|
||||
</style>
|
||||
|
||||
|
||||
113
pages/support/authorize/index.vue
Normal file
113
pages/support/authorize/index.vue
Normal file
@@ -0,0 +1,113 @@
|
||||
<template>
|
||||
|
||||
<!-- 主体部分 -->
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600 line-clamp-1"> 商业授权查询 </span>
|
||||
</template>
|
||||
<div class="w-screen-sm m-auto">
|
||||
<el-input
|
||||
v-model="where.keywords"
|
||||
:placeholder="`搜索关键词`"
|
||||
:suffix-icon="Search"
|
||||
class="w-full my-5"
|
||||
size="large"
|
||||
@change="reload"
|
||||
/>
|
||||
<el-card class="my-5 sm:my-10 sm:px-2" shadow="hover">
|
||||
<el-result
|
||||
:title="`websoft.top 该域名已授权`"
|
||||
icon="success"
|
||||
/>
|
||||
</el-card>
|
||||
</div>
|
||||
|
||||
</el-page-header>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import {ArrowLeft, Search} from '@element-plus/icons-vue'
|
||||
import type {CmsArticleParam} from "~/api/cms/cmsArticle/model";
|
||||
import {pageCmsWebsiteAll} from "~/api/cms/cmsWebsite";
|
||||
import type {CmsWebsite, CmsWebsiteParam} from "~/api/cms/cmsWebsite/model";
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
// 页面信息
|
||||
const list = ref<CmsWebsite[]>([]);
|
||||
const total = ref(0);
|
||||
const id = ref<number>();
|
||||
const inputWidth = ref<string>('180px');
|
||||
const showSearch = ref<boolean>(false);
|
||||
|
||||
// 搜索表单
|
||||
const where = reactive<CmsWebsiteParam>({
|
||||
keywords: '',
|
||||
page: 1,
|
||||
limit: 12,
|
||||
status: undefined,
|
||||
recommend: undefined,
|
||||
search: true,
|
||||
websiteType: undefined,
|
||||
categoryId: undefined,
|
||||
lang: undefined
|
||||
});
|
||||
|
||||
const goBack = () => {
|
||||
router.back();
|
||||
}
|
||||
const handleFocus = () => {
|
||||
inputWidth.value = '400px'; // 聚焦时宽度
|
||||
}
|
||||
const handleBlur = () => {
|
||||
inputWidth.value = '180px'; // 聚焦时宽度
|
||||
}
|
||||
|
||||
const showDomain = (item: CmsWebsite) => {
|
||||
id.value = Number(item.websiteId);
|
||||
};
|
||||
|
||||
const hideDomain = () => {
|
||||
id.value = 0;
|
||||
};
|
||||
|
||||
// 加载页面数据
|
||||
const reload = async () => {
|
||||
await pageCmsWebsiteAll({
|
||||
...where,
|
||||
plugin: false
|
||||
}).then(response => {
|
||||
if (response?.list) {
|
||||
list.value = response?.list;
|
||||
total.value = response.count;
|
||||
}
|
||||
}).catch(() => {
|
||||
}).finally(() => showSearch.value = false)
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索
|
||||
* @param data
|
||||
*/
|
||||
const search = (data: CmsArticleParam) => {
|
||||
where.page = data.page;
|
||||
reload();
|
||||
}
|
||||
|
||||
watch(
|
||||
() => route.params.id,
|
||||
() => {
|
||||
reload();
|
||||
},
|
||||
{immediate: true}
|
||||
);
|
||||
</script>
|
||||
<style lang="scss">
|
||||
.el-input {
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
<template>
|
||||
<div class="xl:w-screen-xl m-auto py-4 my-20">
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> 实名认证 </span>
|
||||
</template>
|
||||
<el-card shadow="hover" class="my-10 px-2">
|
||||
<el-row :gutter="30" justify="space-between">
|
||||
<el-col :span="16">
|
||||
<el-col :sm="16" :xs="24">
|
||||
<Auth @done="reload"/>
|
||||
</el-col>
|
||||
<el-col :span="5">
|
||||
<el-col :md="5" :xs="24">
|
||||
<div class="w-full mt-2 text-center" v-if="isCheck">
|
||||
<el-alert type="warning" :closable="false" :title="`扫二维码完成实名认证`" />
|
||||
<el-image :src="config.wxQrcode" shape="square" class="mt-2" />
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<el-space direction="vertical" class="sm:w-[140px] sm:flex sm:mb-0 mb-5 w-full pr-7">
|
||||
<el-space class="hidden-sm-and-down sm:w-[140px] sm:flex sm:mb-0 mb-5 w-full pr-7" direction="vertical">
|
||||
<div class="py-2" v-for="(item,index) in activities" :index="`${item.path}`" :key="index">
|
||||
<el-button :icon="item.icon" link class="text-gray-500" plain @click="navigateTo(item.path)">{{ item.name }}</el-button>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="xl:w-screen-xl m-auto py-4 my-20">
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> 用户中心</span>
|
||||
@@ -8,10 +8,10 @@
|
||||
<nuxt-link to="/user/modify" class="text-gray-400 text-sm">修改资料</nuxt-link>
|
||||
</template>
|
||||
<div class="login-layout mt-10 sm:w-screen-xl w-full">
|
||||
<div class="m-auto flex sm:flex-row flex-col sm:px-0 px-3">
|
||||
<div class="m-auto flex sm:flex-row flex-col sm:px-0">
|
||||
<div class="flash bg-white rounded-lg w-full">
|
||||
<div class="lg:w-screen-lg w-full sm:px-4 sm:py-4 mb-10 mt-5">
|
||||
<el-descriptions title="用户资料" :column="2" class="px-4" border>
|
||||
<el-descriptions :column="columnClasses" border class="px-4" title="用户资料">
|
||||
<el-descriptions-item
|
||||
label="头像"
|
||||
>
|
||||
@@ -42,6 +42,7 @@
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue';
|
||||
import {ArrowLeft, View, Search} from '@element-plus/icons-vue'
|
||||
import useFormData from '@/utils/use-form-data';
|
||||
import type {User} from '@/api/system/user/model';
|
||||
@@ -100,6 +101,15 @@ const onSubmit = () => {
|
||||
});
|
||||
}
|
||||
|
||||
const columnClasses = computed(() => {
|
||||
const width = window.innerWidth;
|
||||
if (width < 640) { // 小于 640px 时为 1 列
|
||||
return 1;
|
||||
} else { // 大于等于 1024px 时为 4 列
|
||||
return 2;
|
||||
}
|
||||
});
|
||||
|
||||
watch(
|
||||
() => route.path,
|
||||
(path) => {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<template>
|
||||
<div class="xl:w-screen-xl m-auto py-4 my-20">
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> 退出登录 </span>
|
||||
</template>
|
||||
<div class="login-layout mt-10 sm:w-screen-xl w-full">
|
||||
<div class="m-auto flex sm:flex-row flex-col sm:px-0 px-3">
|
||||
<div class="m-auto flex sm:flex-row flex-col sm:px-0">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
<template>
|
||||
<div class="xl:w-screen-xl m-auto py-4 my-20">
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> 修改资料 </span>
|
||||
</template>
|
||||
<div class="login-layout mt-10 sm:w-screen-xl w-full">
|
||||
<div class="m-auto flex sm:flex-row flex-col sm:px-0 px-3">
|
||||
<div class="m-auto flex sm:flex-row flex-col sm:px-0">
|
||||
<div class="flash bg-white rounded-lg w-full">
|
||||
<div class="lg:w-screen-lg w-full sm:px-4 sm:py-4 mb-10 mt-4">
|
||||
<el-form :model="form" label-width="auto" size="large" label-position="top">
|
||||
<el-row :gutter="24">
|
||||
<el-col :span="7">
|
||||
<el-col :span="8" :xs="24">
|
||||
<el-form-item label="上传头像" class="px-4">
|
||||
<el-upload
|
||||
v-model:file-list="avatar"
|
||||
@@ -31,7 +31,7 @@
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="16">
|
||||
<el-col :span="16" :xs="24">
|
||||
<el-form-item label="手机号码" class="px-4">
|
||||
<el-input disabled v-model="form.mobile"/>
|
||||
</el-form-item>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<template>
|
||||
<div class="xl:w-screen-xl m-auto py-4 my-20">
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> 已购插件 </span>
|
||||
<span class="text-large font-600"> 我的订单 </span>
|
||||
</template>
|
||||
<div class="login-layout m-auto mt-10 sm:w-screen-xl w-full">
|
||||
<div class="m-auto flex sm:flex-row flex-col sm:px-0 px-3">
|
||||
<div class="m-auto flex sm:flex-row flex-col sm:px-0">
|
||||
<div class=" bg-white rounded-lg w-full">
|
||||
<div class="flash bg-white rounded-lg px-8 py-4 w-auto">
|
||||
<Order :form="form" />
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<template>
|
||||
<div class="xl:w-screen-xl m-auto py-4 my-20">
|
||||
<div class="xl:w-screen-xl m-auto py-4 mt-12 px-4 sm:px-0 sm:mt-20">
|
||||
<el-page-header :icon="ArrowLeft" @back="goBack">
|
||||
<template #content>
|
||||
<span class="text-large font-600"> 用户中心 </span>
|
||||
</template>
|
||||
<div class="login-layout m-auto mt-10 sm:w-screen-xl w-full">
|
||||
<div class="m-auto flex sm:flex-row flex-col sm:px-0 px-3">
|
||||
<div class="m-auto flex sm:flex-row flex-col sm:px-0">
|
||||
<!-- 用户菜单 -->
|
||||
<UserMenu :activeIndex="activeIndex" @done="onDone" class="sm:flex hidden"/>
|
||||
<div class="flash bg-white rounded-lg w-full">
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 796 B |
BIN
public/favicon2.ico
Normal file
BIN
public/favicon2.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
Reference in New Issue
Block a user