Browse Source

修复已知问题

master
科技小王子 8 months ago
parent
commit
8d85fcce3f
  1. 2
      api/oa/app/model/index.ts
  2. 4
      api/shop/goods/model/index.ts
  3. 15
      components/AppHeader.vue
  4. 6
      pages/case/components/CardList.vue
  5. 10
      pages/case/components/PageBanner.vue
  6. 11
      pages/case/index.vue
  7. 4
      pages/components/ArticleList.vue
  8. 11
      pages/components/Flash.vue
  9. 2
      pages/components/PlugList.vue
  10. 8
      pages/components/ProductList.vue
  11. 48
      pages/developer/components/CardList.vue
  12. 165
      pages/developer/index.vue
  13. 149
      pages/developer/join-in.vue
  14. 11
      pages/docs/index.vue
  15. 8
      pages/index.vue
  16. 7
      pages/item/components/PageBanner.vue
  17. 158
      pages/item/index.vue
  18. 2
      pages/market/components/CardList.vue
  19. 82
      pages/merchant/index.vue
  20. 174
      pages/merchant/join-in.vue
  21. 1
      pages/passport/login.vue

2
api/oa/app/model/index.ts

@ -137,6 +137,8 @@ export interface App {
showCase?: boolean;
showIndex?: boolean;
recommend?: boolean;
categoryName?: string;
title?: string;
}
/**

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

@ -36,9 +36,9 @@ export interface Goods {
// 货架
position?: string;
// 进货价格
price?: string;
price?: number;
// 销售价格
salePrice?: string;
salePrice?: number;
// 库存计算方式(10下单减库存 20付款减库存)
deductStockType?: number;
// 封面图

15
components/AppHeader.vue

@ -42,6 +42,9 @@
</el-sub-menu>
<el-menu-item v-else :index="`${item.path}`"><h3>{{ item.title }}</h3></el-menu-item>
</template>
<el-menu-item v-if="user.roleId === 858" :index="`/merchant`"><h3>商家中心</h3></el-menu-item>
<el-menu-item v-if="user.roleId === 859" :index="`/developer`"><h3>开发者中心</h3></el-menu-item>
<el-menu-item v-else :index="`/developer`"><h3>入驻</h3></el-menu-item>
<!-- 顶部菜单超出数量折叠 -->
<!-- <el-sub-menu index="more" v-if="navigations && navigations.length > (config.elMenuMaxNumber)">-->
@ -65,7 +68,7 @@
<ClientOnly>
<template v-if="token">
<el-dropdown @command="handleCommand">
<el-avatar class="cursor-pointer" :src="userInfo?.avatar" :size="30"/>
<el-avatar class="cursor-pointer" :src="user?.avatar" :size="30"/>
<el-button circle :icon="ElIconUserFilled" color="#155FAA"></el-button>
<template #dropdown>
<el-dropdown-menu>
@ -95,13 +98,11 @@ import {
useConfigInfo,
useMenu,
useProductAffix,
useShowLogin,
useSysDomain,
useToken,
useUser,
useWebsite
} from "~/composables/configState";
import UnderMaintenance from "~/components/UnderMaintenance.vue";
import {useServerRequest} from "~/composables/useServerRequest";
import type {ApiResult} from "~/api";
import type {User} from "~/api/system/user/model";
@ -113,10 +114,8 @@ const route = useRoute();
const runtimeConfig = useRuntimeConfig();
const website = useWebsite()
const showPassport = ref<boolean>(false);
const searchValue = ref<string>();
const token = useToken();
const userInfo = ref<User>();
const showLogin = useShowLogin();
const user = useUser();
const navigations = useMenu();
const config = useConfigInfo();
const affix = useProductAffix();
@ -167,7 +166,9 @@ const reload = async () => {
}
if (token && token != '') {
const {data: response} = await useServerRequest<ApiResult<User>>('/auth/user', {baseURL: runtimeConfig.public.apiServer})
userInfo.value = response.value?.data;
if(response.value?.data){
user.value = response.value?.data;
}
//
const {data: company} = await useServerRequest<ApiResult<Company>>('/system/company/profile', {baseURL: runtimeConfig.public.apiServer})
if (company.value?.data?.domain) {

6
pages/case/components/CardList.vue

@ -4,16 +4,16 @@
<template v-for="(item,index) in list" :key="index">
<el-col :span="6" class="mb-5 min-w-xs">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer">
<el-image :src="item.companyLogo" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" />
<el-image :src="item.appIcon" fit="contain" :lazy="true" class="w-full h-[150px] cursor-pointer" />
<div class="flex-1 px-4 py-5 sm:p-6 !p-4">
<p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5">
<span class="flex-1 text-xl cursor-pointer">{{ item.tenantName }}</span>
<span class="flex-1 text-xl cursor-pointer">{{ item.appName }}</span>
</p>
<p class="flex items-center gap-1.5 py-2 text-gray-500 justify-between">
<span class="text-gray-500">{{ item.comments }} </span>
</p>
<div class="button-group flex justify-center mt-3">
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl(`https://websoft.top/item`,item,item.companyId)">查看详情</el-button>
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl(`https://websoft.top/item`,item,item.appId)">查看详情</el-button>
<el-button v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买</el-button>
<el-button v-else class="w-full" :icon="ElIconSetting">控制台</el-button>
</div>

10
pages/case/components/Header.vue → pages/case/components/PageBanner.vue

@ -36,19 +36,11 @@
</div>
<el-space class="mt-4">
<el-button
:icon="ElIconView"
size="large"
v-if="layout.demoUrl"
@click="openSpmUrl(layout.demoUrl)"
>
演示地址
</el-button>
<el-button
v-if="layout.buyUrl"
:icon="ElIconBottom"
size="large"
@click="openSpmUrl(layout.buyUrl)"
@click="openSpmUrl(`http://git.gxwebsoft.com/gxwebsoft/websoft-cms.git`, {},0,true)"
>
下载模版
</el-button>

11
pages/case/index.vue

@ -1,5 +1,5 @@
<template>
<Header :layout="layout" />
<PageBanner :layout="layout" />
<CardList :list="list" :disabled="disabled" @done="onSearch" />
</template>
<script setup lang="ts">
@ -8,16 +8,15 @@ import {useServerRequest} from "~/composables/useServerRequest";
import {useWebsite} from "~/composables/configState";
import type {Navigation} from "~/api/cms/navigation/model";
import type {CompanyParam} from "~/api/system/company/model";
import type {Tenant} from "~/api/system/tenant/model";
import type {Article} from "~/api/cms/article/model";
import CardList from './components/CardList.vue';
import Header from "./components/Header.vue";
import PageBanner from "./components/PageBanner.vue";
import type {App} from "~/api/oa/app/model";
const route = useRoute();
//
const runtimeConfig = useRuntimeConfig();
const list = ref<Tenant[]>([]);
const list = ref<App[]>([]);
const page = ref<number>(1);
const resultText = ref('');
const layout = ref<any>();
@ -46,7 +45,7 @@ const onSearch = () => {
//
const reload = async (path: string) => {
const {data: response} = await useServerRequest<ApiResult<PageResult<Article>>>('/system/company/pageAll',{baseURL: runtimeConfig.public.apiServer, params: {
const {data: response} = await useServerRequest<ApiResult<PageResult<App>>>('/oa/oa-app/page',{baseURL: runtimeConfig.public.apiServer, params: {
page: page.value,
limit: 8,
keywords: where.keywords

4
pages/components/ArticleList.vue

@ -1,11 +1,11 @@
<template>
<div class="text-center flex flex-col items-center py-10">
<h2 class="text-3xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-4xl lg:text-5xl">
文章推荐
开发者社区
</h2>
<div class="sub-title">
<p class="text-gray-500 dark:text-gray-400 py-3">
拥抱开源坚守品质致力于打造安全稳定高可用的WEB应用
分享研发成果 交流技术经验
</p>
</div>
</div>

11
pages/components/Flash.vue

@ -96,8 +96,10 @@
<div class="mt-10 flex flex-wrap gap-x-6 gap-y-3 justify-center">
<div class="flex flex-col gap-4">
<div class="flex items-center gap-2">
<el-button size="large" type="primary" :icon="ElIconArrowRight" @click="openSpmUrl(`http://git.gxwebsoft.com/gxwebsoft/websoft-cms.git`, {},0,true)">立即开始</el-button>
<el-button size="large" type="success" :icon="ElIconBottom">下载源码</el-button>
<el-button size="large" type="primary" v-if="!token" :icon="ElIconArrowRight" @click="openSpmUrl(`https://websoft.top/passport/login`, {},0,true)">立即开始</el-button>
<el-button size="large" type="primary" v-else :icon="ElIconArrowRight" @click="openSpmUrl(`https://${sysDomain}/token-login`,{},undefined,true)">进入控制台</el-button>
<el-button size="large" type="success" :icon="ElIconDownload" @click="openSpmUrl(`http://git.gxwebsoft.com/gxwebsoft/websoft-cms.git`, {},0,true)">下载源码</el-button>
<el-button size="large" type="warning" :icon="ElIconShoppingCart">商业版授权</el-button>
</div>
</div>
</div>
@ -107,7 +109,10 @@
</template>
<script setup lang="ts">
import {useSysDomain, useToken} from "~/composables/configState";
import {openSpmUrl} from "~/utils/common";
const token = useToken();
const sysDomain = useSysDomain();
</script>
<style scoped lang="less">

2
pages/components/PlugList.vue

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

8
pages/components/ProductList.vue

@ -20,14 +20,14 @@
<div class="flex-1 px-4 py-5 sm:p-6 !p-4">
<p class="text-gray-700 dark:text-white text-base font-semibold flex flex-col gap-1.5">
<div class="flex-1 text-xl cursor-pointer">{{ item.goodsName }}</div>
<!-- <div class="text-red-500">{{ item.price }}</div>-->
<div class="text-red-500">{{ item.price }}</div>
</p>
<p v-if="item?.price > 0" class="flex items-center gap-1.5 py-2 text-gray-500 justify-between">
<p v-if="item.price > 0" class="flex items-center gap-1.5 py-2 text-gray-500 justify-between">
<div class="text-gray-500">{{ item.comments }}</div>
</p>
<div class="button-group flex justify-center mt-3">
<el-button class="w-full" :icon="ElIconView">查看详情</el-button>
<el-button type="primary" v-if="item?.price > 0" class="w-full" :icon="ElIconShoppingCart">购买
<el-button class="w-full" :icon="ElIconView" @click="openSpmUrl('https://websoft.top/item', item,item.goodsId)">查看详情</el-button>
<el-button type="primary" v-if="item.price > 0" class="w-full" :icon="ElIconShoppingCart">购买
</el-button>
<el-button v-else class="w-full" :icon="ElIconShoppingCart">下载</el-button>
</div>

48
pages/developer/components/CardList.vue

@ -0,0 +1,48 @@
<template>
<div class="md:w-screen-xl m-auto relative sm:flex" v-infinite-scroll="load">
<el-row :gutter="24" class="flex">
<template v-for="(item,index) in list" :key="index">
<el-col :span="6" class="mb-5 min-w-xs">
<el-card shadow="hover" :body-style="{ padding: '0px' }" class="hover:bg-gray-50 cursor-pointer" @click="openSpmUrl(`https://websoft.top/detail`,item,item.articleId)">
<el-image :src="item.image" fit="fill" :lazy="true" class="w-full h-[150px] cursor-pointer" />
<div class="flex-1 px-4 py-5 sm:p-6 !p-4">
<p class="text-gray-700 dark:text-white text-base font-semibold flex items-center gap-1.5">
<span class="flex-1 text-xl cursor-pointer max-h-[57px] overflow-hidden">{{ item.title }}</span>
</p>
<p class="flex items-center gap-1.5 py-2 text-gray-500">
<el-avatar :src="item.avatar" :size="20" />
<span>{{ item.nickname }} · {{ dayjs(item.createTime).format('MM-DD hh:mm') }}</span>
</p>
</div>
</el-card>
</el-col>
</template>
</el-row>
</div>
<div v-if="disabled" class="px-1 text-center text-gray-500 min-h-xs">
没有更多了
</div>
</template>
<script setup lang="ts">
import {openSpmUrl} from "~/utils/common";
import dayjs from "dayjs";
const props = withDefaults(
defineProps<{
list?: any[];
disabled?: boolean;
}>(),
{}
);
const emit = defineEmits<{
(e: 'done'): void;
}>();
const load = () => {
if(!props.disabled){
emit('done')
}
}
</script>

165
pages/developer/index.vue

@ -0,0 +1,165 @@
<template>
<PageBanner :layout="layout" />
<div class="md:w-screen-xl m-auto relative sm:flex bg-white rounded-lg py-4 ">
<el-tabs class="px-7 bg-white">
<el-tab-pane label="个人开发者认证">
<el-form :model="form" label-width="auto" size="large" label-position="top" class="sm:w-screen-md w-full sm:py-2">
<el-form-item label="真实姓名">
<el-input v-model="form.realName" placeholder="请输入真实姓名" />
</el-form-item>
<el-form-item label="证件号码">
<el-input v-model="form.idCard" placeholder="请输入证件号码" />
</el-form-item>
<el-form-item label="身份证(正面)">
<Upload />
</el-form-item>
<el-form-item label="身份证(反面)">
<Upload />
</el-form-item>
<el-form-item>
<el-button type="primary" size="large" @click="onSubmit">提交</el-button>
</el-form-item>
</el-form>
<el-result
icon="success"
title="个人认证成功"
sub-title="认证完成时间 2024-09-30"
>
<template #extra>
<el-button type="text">修改认证信息</el-button>
</template>
</el-result>
</el-tab-pane>
<el-tab-pane label="企业开发者认证">
<el-form :model="form" label-width="auto" size="large" label-position="top" class="sm:w-screen-md w-full sm:py-2">
<el-form-item label="企业名称">
<el-input v-model="form.companyName" placeholder="请输入企业名称" />
</el-form-item>
<el-form-item label="社会信用代码">
<el-input v-model="form.idCard" placeholder="请输入社会信用代码" />
</el-form-item>
<el-form-item label="营业执照">
<Upload />
</el-form-item>
<el-form-item label="所属行业">
<el-select v-model="form.city" placeholder="请选择所属行业">
</el-select>
</el-form-item>
<el-form-item label="网站信息">
<el-input v-model="form.idCard" placeholder="请输入网站信息" />
</el-form-item>
<el-form-item label="您的身份">
<el-radio-group v-model="form.sex">
<el-radio value="1">法定代表人</el-radio>
<el-radio value="2">被授权人</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="用户协议">
<el-checkbox v-model="form.status">请务必提供真实信息我司有权自行或委托第三方审查您提供的身份信息是否属真实有效若提供虚假信息由此的全部后果由您承担</el-checkbox>
</el-form-item>
<el-form-item>
<el-button type="primary" size="large" @click="onSubmit">提交</el-button>
</el-form-item>
</el-form>
<el-result
icon="success"
title="企业认证成功"
sub-title="认证完成时间 2024-09-30"
>
<template #extra>
<el-button type="text">修改认证信息</el-button>
</template>
</el-result>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script setup lang="ts">
import type {ApiResult, PageResult} from "~/api";
import {useServerRequest} from "~/composables/useServerRequest";
import {useWebsite} from "~/composables/configState";
import type {Navigation} from "~/api/cms/navigation/model";
import type {CompanyParam} from "~/api/system/company/model";
import type {Article} from "~/api/cms/article/model";
import CardList from './components/CardList.vue';
const route = useRoute();
//
const runtimeConfig = useRuntimeConfig();
const list = ref<Article[]>([]);
const page = ref<number>(1);
const resultText = ref('');
const layout = ref<any>();
const disabled = ref<boolean>(false);
const activeName = ref(undefined)
//
const form = ref<Navigation>();
const website = useWebsite();
//
const where = reactive<CompanyParam>({
keywords: ''
});
const handleClick = (e:any) => {
console.log(e.index)
}
const onSearch = () => {
if(!disabled.value){
page.value++;
reload(route.path);
}
}
//
const reload = async (path: string) => {
const {data: response} = await useServerRequest<ApiResult<PageResult<Article>>>('/cms/cms-article/page',{baseURL: runtimeConfig.public.apiServer, params: {
page: page.value,
limit: 8,
userId: 0,
keywords: where.keywords
}})
if(response.value?.data){
if (list.value.length < response.value?.data.count) {
disabled.value = false;
if (response.value?.data.list) {
list.value = list.value.concat(response.value?.data.list);
}
}else {
disabled.value = true;
}
if(response.value.data.count == 0){
resultText.value = '暂无相关结果'
}
}
}
const { data: nav } = await useServerRequest<ApiResult<Navigation>>('/cms/cms-navigation/getNavigationByPath',{query: {path: route.path}})
console.log(nav.value?.data)
if(nav.value?.data){
form.value = nav.value?.data;
console.log(form.value,'form...')
}
//
if(form.value?.layout){
layout.value = JSON.parse(form.value?.layout)
}
useHead({
title: `文档 - ${website.value.websiteName}`,
bodyAttrs: {
class: "page-container",
}
});
watch(
() => route.path,
(path) => {
reload(path);
},
{ immediate: true }
);
</script>

149
pages/developer/join-in.vue

@ -0,0 +1,149 @@
<template>
<PageBanner :layout="layout" />
<div class="login-layout mt-[100px] m-auto sm:w-screen-xl w-full">
<div class="mt-[100px] m-auto flex sm:flex-row flex-col sm:p-0 p-3">
<div class="flash ml-8 bg-white rounded-lg px-7 py-4 w-full">
<el-tabs class="flash bg-white ml-0">
<el-tab-pane label="个人开发者">
<el-form :model="form" label-width="auto" size="large" label-position="top" class="sm:w-screen-md w-full sm:py-2">
<el-form-item label="真实姓名">
<el-input v-model="form.realName" placeholder="请输入真实姓名" />
</el-form-item>
<el-form-item label="证件号码">
<el-input v-model="form.idCard" placeholder="请输入证件号码" />
</el-form-item>
<el-form-item label="身份证(正面)">
<Upload />
</el-form-item>
<el-form-item label="身份证(反面)">
<Upload />
</el-form-item>
<el-form-item>
<el-button type="primary" size="large" @click="onSubmit">提交</el-button>
</el-form-item>
</el-form>
<el-result
icon="success"
title="个人认证成功"
sub-title="认证完成时间 2024-09-30"
>
<template #extra>
<el-button type="text">修改认证信息</el-button>
</template>
</el-result>
</el-tab-pane>
<el-tab-pane label="企业开发者">
<el-form :model="form" label-width="auto" size="large" label-position="top" class="sm:w-screen-md w-full sm:py-2">
<el-form-item label="企业名称">
<el-input v-model="form.companyName" placeholder="请输入企业名称" />
</el-form-item>
<el-form-item label="社会信用代码">
<el-input v-model="form.idCard" placeholder="请输入社会信用代码" />
</el-form-item>
<el-form-item label="营业执照">
<Upload />
</el-form-item>
<el-form-item label="所属行业">
<el-select v-model="form.city" placeholder="请选择所属行业">
</el-select>
</el-form-item>
<el-form-item label="网站信息">
<el-input v-model="form.idCard" placeholder="请输入网站信息" />
</el-form-item>
<el-form-item label="您的身份">
<el-radio-group v-model="form.sex">
<el-radio value="1">法定代表人</el-radio>
<el-radio value="2">被授权人</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="用户协议">
<el-checkbox v-model="form.status">请务必提供真实信息我司有权自行或委托第三方审查您提供的身份信息是否属真实有效若提供虚假信息由此的全部后果由您承担</el-checkbox>
</el-form-item>
<el-form-item>
<el-button type="primary" size="large" @click="onSubmit">提交</el-button>
</el-form-item>
</el-form>
<el-result
icon="success"
title="企业认证成功"
sub-title="认证完成时间 2024-09-30"
>
<template #extra>
<el-button type="text">修改认证信息</el-button>
</template>
</el-result>
</el-tab-pane>
</el-tabs>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import {useConfigInfo, useToken, useWebsite} from "~/composables/configState";
import useFormData from '@/utils/use-form-data';
import type { User } from '@/api/system/user/model';
import { ref } from 'vue'
import {useServerRequest} from "~/composables/useServerRequest";
import type {ApiResult} from "~/api";
//
const runtimeConfig = useRuntimeConfig();
const route = useRoute();
const activeIndex = ref('');
const website = useWebsite()
const config = useConfigInfo();
const token = useToken();
const userInfo = ref<User>();
//
const { form, assignFields } = useFormData<User>({
userId: undefined,
nickname: '',
username: '',
phone: '',
mobile: '',
sex: '',
sexName: '',
email: '',
password: '',
code: '',
smsCode: '',
comments: '',
remember: true
});
useHead({
title: `用户中心 - ${config.value?.siteName}`,
meta: [{ name: website.value.keywords, content: website.value.comments }]
});
const onSubmit = async () => {
const {data: modify } = await useServerRequest<ApiResult<User>>('/auth/user',{
baseURL: runtimeConfig.public.apiServer,
method: 'put',
body: form
})
if(modify.value?.code == 0){
ElMessage.success('修改成功')
}
}
const reload = async () => {
const {data: response} = await useServerRequest<ApiResult<User>>('/auth/user',{baseURL: runtimeConfig.public.apiServer})
if(response.value?.data){
userInfo.value = response.value?.data;
assignFields(response.value?.data);
}
}
watch(
() => route.path,
(path) => {
activeIndex.value = path;
console.log(path,'=>Path')
reload();
},
{ immediate: true }
);
</script>

11
pages/docs/index.vue

@ -1,15 +1,13 @@
<template>
<PageBanner :layout="layout" />
<el-tabs v-model="activeName" class="md:w-screen-xl m-auto relative sm:flex pb-2" @tab-click="handleClick">
<el-tab-pane label="轻松一刻" name="happy"></el-tab-pane>
<el-tab-pane label="企业官网" name="website"></el-tab-pane>
<el-tab-pane label="企业商城" name="weShop"></el-tab-pane>
<el-tab-pane label="内容管理" name="cms"></el-tab-pane>
<el-tab-pane label="点餐外卖" name="food"></el-tab-pane>
<el-tab-pane label="派单系统" name="task"></el-tab-pane>
<el-tab-pane label="办公OA" name="oa"></el-tab-pane>
<el-tab-pane label="问答" name="ask"></el-tab-pane>
<el-tab-pane label="分享" name="share"></el-tab-pane>
<el-tab-pane label="常见问题" name="ask"></el-tab-pane>
</el-tabs>
<CardList :list="list" :disabled="disabled" @done="onSearch" />
@ -57,7 +55,10 @@ const onSearch = () => {
//
const reload = async (path: string) => {
const {data: response} = await useServerRequest<ApiResult<PageResult<Article>>>('/cms/cms-article/page',{baseURL: runtimeConfig.public.apiServer, params: {
page: page.value,limit: 8, keywords: where.keywords
page: page.value,
limit: 8,
userId: 0,
keywords: where.keywords
}})
if(response.value?.data){
if (list.value.length < response.value?.data.count) {
@ -75,8 +76,10 @@ const reload = async (path: string) => {
}
const { data: nav } = await useServerRequest<ApiResult<Navigation>>('/cms/cms-navigation/getNavigationByPath',{query: {path: route.path}})
console.log(nav.value?.data)
if(nav.value?.data){
form.value = nav.value?.data;
console.log(form.value,'form...')
}
//
if(form.value?.layout){

8
pages/index.vue

@ -51,10 +51,10 @@ const reload = async () => {
// ()
if (!token.value || token.value == '') {
if (config.value.MustLogin) {
navigateTo('/passport/login');
return false;
}
// if (config.value.MustLogin) {
// navigateTo('/passport/login');
// return false;
// }
}
// seo

7
pages/item/components/PageBanner.vue

@ -27,7 +27,7 @@
<div class="gap-8 sm:gap-y-16 lg:items-center" v-if="form">
<div class="w-full">
<div class="flex">
<el-avatar :src="form.companyLogo" class="mr-2" />
<el-avatar :src="form.appIcon" shape="square" class="mr-2" />
<h1
class="text-2xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-3xl lg:text-4xl">
<span v-if="form.title">{{ form.title }}</span>
@ -73,9 +73,8 @@
</template>
<script setup lang="ts">
import {openSpmUrl} from "~/utils/common";
import Breadcrumb from "~/components/Breadcrumb.vue";
import type {Article} from "~/api/cms/article/model";
import type {App} from "~/api/oa/app/model";
withDefaults(
@ -83,7 +82,7 @@ withDefaults(
title?: string;
desc?: string;
buyUrl?: string;
form?: Article;
form?: App;
}>(),
{
title: 'Templates',

158
pages/item/index.vue

@ -5,7 +5,25 @@
<div class="page-main md:w-screen-xl m-auto">
<el-row :gutter="24">
<el-col :span="18">
<div class="p-6 leading-7 bg-white rounded-lg text-lg line-height-loose text-gray-600 content" v-html="form?.content">
<div class="leading-7 bg-white rounded-lg text-lg line-height-loose text-gray-600 content">
<el-tabs
v-model="activeName"
type="card"
class="demo-tabs"
@tab-click="handleClick"
>
<el-tab-pane label="基本信息" name="base">基本信息</el-tab-pane>
<el-tab-pane label="成员管理" name="users">成员管理</el-tab-pane>
<el-tab-pane label="项目参数" name="param">项目参数</el-tab-pane>
<el-tab-pane label="账号密码" name="domain">账号密码</el-tab-pane>
<el-tab-pane label="开发文档" name="profile">协同文档</el-tab-pane>
<el-tab-pane label="项目附件" name="annex">项目附件</el-tab-pane>
<el-tab-pane label="项目工单" name="task">项目工单</el-tab-pane>
<el-tab-pane label="应用截图" name="photo">应用截图</el-tab-pane>
<el-tab-pane label="项目介绍" name="about">
<div class="p-6 content" v-html="form?.content"></div>
</el-tab-pane>
</el-tabs>
</div>
</el-col>
<el-col :span="6">
@ -31,6 +49,7 @@ import type {Article} from "~/api/cms/article/model";
import useFormData from "~/utils/use-form-data";
import PageBanner from './components/PageBanner.vue';
import type {Company} from "~/api/system/company/model";
import type {App} from "~/api/oa/app/model";
//
const route = useRoute();
@ -41,33 +60,136 @@ const nextArticle = ref<Article>();
//
const { form, assignFields } = useFormData<Company>({
companyId: undefined,
companyName: undefined,
companyLogo: undefined,
shortName: undefined,
domain: undefined,
email: undefined,
tenantId: undefined,
tenantName: '',
const { form, assignFields } = useFormData<App>({
// id
appId: undefined,
//
appSecret: '',
enName: '',
//
appName: '',
// id, 0
parentId: undefined,
//
appCode: '',
//
appIcon: '',
appQrcode: '',
//
images: '',
//
appType: '',
appTypeMultiple: undefined,
//
menuType: undefined,
//
appUrl: '',
//
adminUrl: undefined,
//
downUrl: undefined,
serverUrl: undefined,
callbackUrl: undefined,
gitUrl: undefined,
docsUrl: undefined,
prototypeUrl: undefined,
ipAddress: undefined,
fileUrl: undefined,
//
packageName: '',
//
clicks: '',
//
installs: '',
//
content: '',
// ()
developer: '',
director: '',
projectDirector: '',
salesman: '',
//
price: '',
//
score: '',
//
star: '',
//
component: '',
//
path: '',
//
authority: '',
//
target: '',
// , 0, 1()
hide: undefined,
// path
active: '',
//
meta: '',
//
edition: '',
//
version: '',
//
isUse: undefined,
//
sortNumber: undefined,
//
comments: '',
nickname: undefined,
version: undefined,
createTime: undefined,
title: '',
parentName: '',
categoryName: ''
tenantName: '',
companyName: '',
//
tenantCode: '',
// id
tenantId: undefined,
//
createTime: '',
appStatus: '开发中',
//
status: undefined,
//
userId: '',
//
nickname: '',
//
children: [],
// , 0, 1
checked: false,
//
key: undefined,
//
value: undefined,
//
parentIds: [],
//
openType: undefined,
//
search: undefined,
//
users: [],
//
requirement: '',
file1: '[]',
file2: '[]',
file3: '[]',
showCase: undefined,
showIndex: undefined,
recommend: undefined,
categoryName: '',
title: ''
});
//
const reload = async () => {
// spm()
const { data: nav } = await useServerRequest<ApiResult<Company>>('/system/company/profileAll/' + getIdBySpm(5))
const { data: nav } = await useServerRequest<ApiResult<App>>('/oa/oa-app/' + getIdBySpm(5))
if (nav.value?.data) {
assignFields(nav.value.data)
form.nickname = nav.value.data?.companyName;
form.title = nav.value.data?.tenantName;
form.title = nav.value.data?.appName;
form.categoryName = '应用详情';
}

2
pages/market/components/CardList.vue

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

82
pages/merchant/index.vue

@ -0,0 +1,82 @@
<template>
</template>
<script setup lang="ts">
import type {ApiResult} from "~/api";
import {useServerRequest} from "~/composables/useServerRequest";
import {useConfigInfo, useForm, useToken, useWebsite} from "~/composables/configState";
import type {BreadcrumbItem} from "~/types/global";
import type {Navigation} from "~/api/cms/navigation/model";
import {getIdBySpm} from "~/utils/common";
//
const route = useRoute();
const user = useUser();
const layout = ref<any>();
const config = useConfigInfo();
const token = useToken();
const form = useForm();
const breadcrumb = ref<BreadcrumbItem>();
//
const reload = async () => {
// spm()
const {data: nav} = await useServerRequest<ApiResult<Navigation>>('/cms/cms-navigation/' + getIdBySpm(5))
if (nav.value?.data) {
form.value = nav.value.data
} else {
const {data: nav} = await useServerRequest<ApiResult<Navigation>>('/cms/cms-navigation/getNavigationByPath', {query: {path: route.path}})
if (nav.value?.data) {
form.value = nav.value?.data;
}
}
//
if (form.value?.layout) {
layout.value = JSON.parse(form.value?.layout)
}
// ()
if (!token.value || token.value == '') {
if (config.value.MustLogin) {
navigateTo('/passport/login');
return false;
}
}
//
if(!user.value?.merchantId){
navigateTo('/user/auth');
return false;
}
//
if(user.value.merchantId){
console.log('已认证未开发者>')
}
// seo
useHead({
title: `现代Web应用开发(Vue)框架 · WEBSOFT`,
meta: [{name: form.value.design?.keywords, content: form.value.design?.description}],
bodyAttrs: {
class: "page-container",
},
script: [
{
children: `console.log(${JSON.stringify(form.value)})`,
},
],
});
//
breadcrumb.value = form.value
}
watch(
() => route.path,
(path) => {
console.log(path, '=>Path')
reload();
},
{immediate: true}
);
</script>

174
pages/merchant/join-in.vue

@ -0,0 +1,174 @@
<template>
<div class="login-layout mt-[100px] m-auto sm:w-screen-xl w-full">
<div class="mt-[100px] m-auto flex sm:flex-row flex-col sm:p-0 p-3">
<!-- 用户菜单 -->
<UserMenu :activeIndex="activeIndex" @done="onDone" />
<div class="flash ml-8 bg-white rounded-lg px-7 py-4 w-full">
<el-tabs class="flash bg-white ml-0">
<el-tab-pane label="个人认证">
<el-form :model="form" label-width="auto" size="large" label-position="top" class="sm:w-screen-md w-full sm:py-2">
<el-form-item label="真实姓名">
<el-input v-model="form.realName" placeholder="请输入真实姓名" />
</el-form-item>
<el-form-item label="证件号码">
<el-input v-model="form.idCard" placeholder="请输入证件号码" />
</el-form-item>
<el-form-item label="身份证(正面)">
<Upload />
</el-form-item>
<el-form-item label="身份证(反面)">
<Upload />
</el-form-item>
<el-form-item>
<el-button type="primary" size="large" @click="onSubmit">提交</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="企业认证">
<el-form :model="form" label-width="auto" size="large" label-position="top" class="sm:w-screen-md w-full sm:py-2">
<el-form-item label="企业名称">
<el-input v-model="form.companyName" placeholder="请输入企业名称" />
</el-form-item>
<el-form-item label="社会信用代码">
<el-input v-model="form.idCard" placeholder="请输入社会信用代码" />
</el-form-item>
<el-form-item label="营业执照">
<Upload />
</el-form-item>
<el-form-item label="所属行业">
<el-select v-model="form.city" placeholder="请选择所属行业">
</el-select>
</el-form-item>
<el-form-item label="网站信息">
<el-input v-model="form.idCard" placeholder="请输入网站信息" />
</el-form-item>
<el-form-item label="您的身份">
<el-radio-group v-model="form.sex">
<el-radio value="1">法定代表人</el-radio>
<el-radio value="2">被授权人</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="用户协议">
<el-checkbox v-model="form.status">请务必提供真实信息我司有权自行或委托第三方审查您提供的身份信息是否属真实有效若提供虚假信息由此的全部后果由您承担</el-checkbox>
</el-form-item>
<el-form-item>
<el-button type="primary" size="large" @click="onSubmit">提交</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="个人认证成功">
<el-result
icon="success"
title="个人认证成功"
sub-title="认证完成时间 2024-09-30"
>
<template #extra>
<el-button type="text">修改认证信息</el-button>
</template>
</el-result>
</el-tab-pane>
<el-tab-pane label="企业认证成功">
<el-result
icon="success"
title="企业认证成功"
sub-title="认证完成时间 2024-09-30"
>
<template #extra>
<el-button type="text">修改认证信息</el-button>
</template>
</el-result>
</el-tab-pane>
</el-tabs>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import {useConfigInfo, useToken, useWebsite} from "~/composables/configState";
import useFormData from '@/utils/use-form-data';
import type { User } from '@/api/system/user/model';
import { ref } from 'vue'
import { Plus } from '@element-plus/icons-vue'
import {useServerRequest} from "~/composables/useServerRequest";
import type {ApiResult} from "~/api";
import UserMenu from "~/components/UserMenu.vue";
//
const runtimeConfig = useRuntimeConfig();
const route = useRoute();
const activeIndex = ref('');
const website = useWebsite()
const config = useConfigInfo();
const token = useToken();
const userInfo = ref<User>();
//
const { form, assignFields } = useFormData<User>({
userId: undefined,
nickname: '',
username: '',
phone: '',
mobile: '',
sex: '',
sexName: '',
email: '',
password: '',
code: '',
smsCode: '',
comments: '',
remember: true
});
useHead({
title: `用户中心 - ${config.value?.siteName}`,
meta: [{ name: website.value.keywords, content: website.value.comments }]
});
const onSubmit = async () => {
const {data: modify } = await useServerRequest<ApiResult<User>>('/auth/user',{
baseURL: runtimeConfig.public.apiServer,
method: 'put',
body: form
})
if(modify.value?.code == 0){
ElMessage.success('修改成功')
}
}
const handleAvatarSuccess: UploadProps['onSuccess'] = (
response,
uploadFile
) => {
imageUrl.value = URL.createObjectURL(uploadFile.raw!)
}
const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
if (rawFile.type !== 'image/jpeg') {
ElMessage.error('Avatar picture must be JPG format!')
return false
} else if (rawFile.size / 1024 / 1024 > 2) {
ElMessage.error('Avatar picture size can not exceed 2MB!')
return false
}
return true
}
const reload = async () => {
const {data: response} = await useServerRequest<ApiResult<User>>('/auth/user',{baseURL: runtimeConfig.public.apiServer})
if(response.value?.data){
userInfo.value = response.value?.data;
assignFields(response.value?.data);
}
}
watch(
() => route.path,
(path) => {
activeIndex.value = path;
console.log(path,'=>Path')
reload();
},
{ immediate: true }
);
</script>

1
pages/passport/login.vue

@ -356,6 +356,7 @@ const doLogin = async (data: any) => {
user.value.gradeName = data.user.gradeName;
user.value.avatar = data.user.avatar;
localStorage.setItem('UserId',data.user.userId);
localStorage.setItem('Avatar',data.user.avatar);
localStorage.setItem('TID_ADMIN',data.user.tenantId);
}
setTimeout(() => {

Loading…
Cancel
Save