Browse Source

分离common端

master
科技小王子 7 months ago
parent
commit
081431c385
  1. 6
      api/cms/article/model/index.ts
  2. 1
      api/cms/navigation/model/index.ts
  3. 2
      components/AppHeader.vue
  4. 74
      components/PageBanner.vue
  5. 4
      composables/useServerRequest.ts
  6. 6
      layouts/default.vue
  7. 6
      nuxt.config.ts
  8. 5
      pages/ask/components/CardList.vue
  9. 2
      pages/components/ArticleList.vue
  10. 64
      pages/detail/index.vue
  11. 43
      pages/developer/index.vue

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

@ -40,6 +40,12 @@ export interface Article {
virtualViews?: number;
// 实际阅读量
actualViews?: number;
// 浏览权限
permission?: number;
// 访问密码
password?: string;
// 访问密码(客户端传)
password2?: string;
// 用户ID
userId?: number;
// 用户昵称

1
api/cms/navigation/model/index.ts

@ -14,6 +14,7 @@ export interface Navigation{
sortNumber?: number;
hide?: number;
permission?: number;
password?: string;
home?: number;
position?: number;
meta?: string;

2
components/AppHeader.vue

@ -176,6 +176,7 @@ const reload = async () => {
if (domain) {
sysDomain.value = domain;
}
//
if (token && token != '') {
const {data: response} = await useServerRequest<ApiResult<User>>('/auth/user', {baseURL: runtimeConfig.public.apiServer})
if (response.value?.data) {
@ -183,6 +184,7 @@ const reload = async () => {
}
//
const {data: company} = await useServerRequest<ApiResult<Company>>('/system/company/profile', {baseURL: runtimeConfig.public.apiServer})
console.log(company.value,'>>>>90')
if (company.value?.data?.domain) {
sysDomain.value = company.value?.data?.domain;
localStorage.setItem('SysDomain', `${company.value?.data?.domain}`);

74
components/PageBanner.vue

@ -55,6 +55,23 @@
</div>
</div>
</div>
<!-- 密码可见 -->
<el-dialog
v-model="dialogVisible"
title="请输入查看密码"
:show-close="false"
:close-on-click-modal="false"
width="400"
>
<el-input type="password" v-model="password2" show-password placeholder="请输入查看密码">请输入查看密码</el-input>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="checkPassword">
确定
</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
@ -63,9 +80,11 @@ import {openSpmUrl} from "~/utils/common";
import {useServerRequest} from "~/composables/useServerRequest";
import type {ApiResult} from "~/api";
import type {Navigation} from "~/api/cms/navigation/model";
import {ref} from 'vue'
withDefaults(
defineProps<{
form?: any;
layout?: any;
title?: string;
desc?: string;
@ -79,21 +98,62 @@ withDefaults(
}
);
const emit = defineEmits<{
(e: 'done', show: boolean): void;
}>();
const route = useRoute();
const token = useToken();
const form = ref<Navigation>();
const layout = ref<any>();
const password2 = ref('');
//
const dialogVisible = ref(false)
//
const checkPassword = async () => {
const {data: response} = await useServerRequest<ApiResult<unknown>>('/cms/cms-navigation/checkNavigationPassword', {
query: {
password: form.value?.password,
password2: password2.value
}
})
if(response.value?.code === 0){
dialogVisible.value = false;
emit('done', true);
console.log(response.value.message);
}else {
ElMessage.error(response.value?.message);
}
}
const { data: nav } = await useServerRequest<ApiResult<Navigation>>('/cms/cms-navigation/getNavigationByPath',{query: {path: route.path}})
if(nav.value?.data){
//
const {data: nav} = await useServerRequest<ApiResult<Navigation>>('/cms/cms-navigation/getNavigationByPath', {
query: {
path: route.path
}
})
if (nav.value?.data) {
form.value = nav.value?.data;
console.log('PageBanner.vue => ', form.value)
//
if(form.value?.layout){
if (form.value?.layout) {
layout.value = JSON.parse(form.value?.layout)
}
//
if(form.value.permission === 1){
// navigateTo(`/passport/login`)
// 访
if(form.value?.permission === 0){
emit('done', true);
}
//
if (form.value?.permission === 1) {
navigateTo(`/passport/login`);
if(token && token.value.length > 0){
emit('done', true);
}
}
//
if (form.value?.permission === 2) {
dialogVisible.value = true;
}
}
</script>

4
composables/useServerRequest.ts

@ -20,11 +20,11 @@ export const useServerRequest = <T>(url: string, opts?: UseFetchOptions<T, unkno
if(_token){
token.value = _token
}
baseUrl.value = runtimeConfig.public.apiBase;
baseUrl.value = runtimeConfig.public.apiServer;
// 开发环境
if(process.env.NODE_ENV === 'development'){
baseUrl.value = `${runtimeConfig.public.apiBase}`
baseUrl.value = `${runtimeConfig.public.apiServer}`
}
const defaultOptions: UseFetchOptions<unknown> = {
baseURL: baseUrl.value,

6
layouts/default.vue

@ -157,6 +157,12 @@ const reload = async () => {
// title: `宿`,
// meta: [{ name: website.value.keywords, content: website.value.comments }]
// });
// TODO
// if(form.value.permission === 1){
// // navigateTo(`/passport/login`)
// }
}
reload()

6
nuxt.config.ts

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

5
pages/ask/components/CardList.vue

@ -7,11 +7,13 @@
<el-image :src="item.image" fit="fill" :lazy="true" class="w-full md:h-[150px] h-[199px] 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>
<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>
<el-icon v-if="item.permission > 0"><Lock /></el-icon>
</p>
</div>
</el-card>
@ -27,6 +29,7 @@
<script setup lang="ts">
import {openSpmUrl} from "~/utils/common";
import dayjs from "dayjs";
import { Lock } from '@element-plus/icons-vue'
const props = withDefaults(
defineProps<{

2
pages/components/ArticleList.vue

@ -30,7 +30,7 @@
</template>
</el-row>
</div>
<div v-if="disabled" class="px-1 text-center text-gray-500 min-h-xs">
<div v-if="disabled" class="p-4 text-center text-gray-500">
没有更多了
</div>
</template>

64
pages/detail/index.vue

@ -4,9 +4,33 @@
<div class="page-main md:w-screen-xl m-auto md:px-3" ref="container">
<el-row :gutter="24">
<el-col :xs="24" :sm="12" :md="12" :lg="18" class="min-w-xs">
<div class="p-6 leading-7 bg-white md:rounded-lg text-lg line-height-loose text-gray-600 content"
v-html="form?.content">
</div>
<template v-if="form.permission === 0 || showContent">
<div class="p-6 leading-7 bg-white md:rounded-lg text-lg line-height-loose text-gray-600 content">
<p v-html="form?.content"></p>
</div>
</template>
<template v-if="form.permission === 1">
<el-result
v-if="!showContent && form.permission === 1"
icon="warning"
title="无访问权限"
>
</el-result>
</template>
<template v-if="form.permission === 2">
<el-result
v-if="!showContent && form.permission === 2"
icon="warning"
title="请输入访问密码"
>
<template #extra>
<el-space>
<el-input type="password" v-model="form.password2" show-password placeholder="请输入查看密码">请输入查看密码</el-input>
<el-button type="primary" @click="checkPassword">确定</el-button>
</el-space>
</template>
</el-result>
</template>
<div class="page md:gap-xl gap-xs md:mt-4 m-auto md:p-0 p-4 flex justify-between">
<div v-if="previousArticle" class="bg-white text-gray-600 hover:shadow hover:text-gray-800 hover:font-bold rounded-lg p-4 cursor-pointer w-[50%]"
@click="openSpmUrl(`/detail`,previousArticle,previousArticle?.articleId)">
@ -25,7 +49,6 @@
</el-col>
</el-row>
</div>
</template>
<script setup lang="ts">
import type {ApiResult} from "~/api";
@ -45,7 +68,8 @@ const website = useWebsite();
const breadcrumb = ref<BreadcrumbItem>();
const previousArticle = ref<Article>();
const nextArticle = ref<Article>();
const showContent = ref<boolean>();
const showPassword = ref<boolean>();
//
const {form, assignFields} = useFormData<Article>({
@ -82,6 +106,11 @@ const {form, assignFields} = useFormData<Article>({
virtualViews: undefined,
//
actualViews: undefined,
// 访
permission: undefined,
// 访
password: undefined,
password2: undefined,
// ID
userId: undefined,
//
@ -106,6 +135,22 @@ const {form, assignFields} = useFormData<Article>({
updateTime: undefined
});
//
const checkPassword = async () => {
const {data: response} = await useServerRequest<ApiResult<unknown>>('/cms/cms-article/checkArticlePassword', {
query: {
password: form?.password,
password2: form.password2
}
})
if(response.value?.code === 0){
showPassword.value = false;
showContent.value = true;
}else {
ElMessage.error(response.value?.message);
}
}
//
const reload = async () => {
@ -113,6 +158,15 @@ const reload = async () => {
const {data: nav} = await useServerRequest<ApiResult<Navigation>>('/cms/cms-article/' + getIdBySpm(5))
if (nav.value?.data) {
assignFields(nav.value.data)
if(form.permission === 1){
console.log('登录可见')
return;
}
if(form.permission === 2){
console.log('需要密码')
showPassword.value = true;
return;
}
form.parentPath = getSpmUrl(`/category`,form,form.articleId);
console.log(form.parentPath)
}

43
pages/developer/index.vue

@ -1,7 +1,8 @@
<template>
<PageBanner :layout="layout" title="入驻成为开发者" />
<div class="md:w-screen-xl md:px-0 px-4 m-auto relative sm:flex bg-white rounded-lg py-4 ">
<el-tabs class="px-4 bg-white">
<PageBanner :layout="layout" title="入驻成为开发者" @done="onDone" />
<div v-if="showContent" class="md:w-screen-xl md:px-0 px-4 m-auto relative sm:flex bg-white rounded-lg py-4 ">
1231232
<el-tabs class="px-4 bg-white" v-if="form">
<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="真实姓名">
@ -81,10 +82,8 @@ 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[]>([]);
@ -95,6 +94,7 @@ const disabled = ref<boolean>(false);
//
const form = ref<Navigation>();
const showContent = ref<boolean>(false);
const website = useWebsite();
//
@ -102,15 +102,8 @@ const where = reactive<CompanyParam>({
keywords: ''
});
const handleClick = (e:any) => {
console.log(e.index)
}
const onSearch = () => {
if(!disabled.value){
page.value++;
reload(route.path);
}
const onDone = (index: boolean) => {
showContent.value = index;
}
//
@ -136,19 +129,19 @@ 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){
layout.value = JSON.parse(form.value?.layout)
}
// 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}`,
title: `开发者中心 - ${website.value?.websiteName}`,
bodyAttrs: {
class: "page-container",
}

Loading…
Cancel
Save