diff --git a/.env.development b/.env.development index 928582d..b86d68a 100644 --- a/.env.development +++ b/.env.development @@ -1,8 +1,7 @@ - VITE_SOCKET_URL=wss://server.gxwebsoft.com VITE_SERVER_URL=https://server.gxwebsoft.com/api #VITE_API_URL=https://modules.gxwebsoft.com/api -#VITE_API_URL=http://127.0.0.1:9090/api +VITE_API_URL=http://127.0.0.1:9090/api #VITE_SOCKET_URL=ws://localhost:9191 -VITE_API_URL=http://103.233.255.195:9300/api +#VITE_API_URL=http://103.233.255.195:9300/api diff --git a/.env.production b/.env.production index ec31f26..d5ac172 100644 --- a/.env.production +++ b/.env.production @@ -1,5 +1,5 @@ VITE_SERVER_URL=https://server.gxwebsoft.com/api VITE_SOCKET_URL=wss://server.gxwebsoft.com -#VITE_API_URL=https://modules.gxwebsoft.com/api -VITE_API_URL=http://103.233.255.195:9300/api +VITE_API_URL=https://modules.gxwebsoft.com/api +#VITE_API_URL=http://103.233.255.195:9300/api diff --git a/src/api/cms/article/model/index.ts b/src/api/cms/article/model/index.ts index 4f508eb..14d4839 100644 --- a/src/api/cms/article/model/index.ts +++ b/src/api/cms/article/model/index.ts @@ -38,6 +38,8 @@ export interface Article { userAvatar?: string; // 所属门店ID shopId?: string; + // 附件 + files?: string; // 排序 sortNumber?: number; // 备注 diff --git a/src/api/cms/form-record/index.ts b/src/api/cms/form-record/index.ts new file mode 100644 index 0000000..110f4c4 --- /dev/null +++ b/src/api/cms/form-record/index.ts @@ -0,0 +1,126 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { FormRecord, FormRecordParam } from './model'; +import { MODULES_API_URL } from '@/config/setting'; + +/** + * 分页查询表单设计 + */ +export async function pageFormRecord(params: FormRecordParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/form-record/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询表单设计列表 + */ +export async function listFormRecord(params?: FormRecordParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/form-record', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加表单设计 + */ +export async function addFormRecord(data: FormRecord) { + const res = await request.post>( + MODULES_API_URL + '/cms/form-record', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改表单设计 + */ +export async function updateFormRecord(data: FormRecord) { + const res = await request.put>( + MODULES_API_URL + '/cms/form-record', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除表单设计 + */ +export async function removeFormRecord(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/form-record/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除表单设计 + */ +export async function removeBatchFormRecord(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/form-record/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询表单设计 + */ +export async function getFormRecord(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/form-record/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/form-record/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/src/api/cms/form-record/model/index.ts b/src/api/cms/form-record/model/index.ts new file mode 100644 index 0000000..7bf747e --- /dev/null +++ b/src/api/cms/form-record/model/index.ts @@ -0,0 +1,25 @@ +import type { PageParam } from '@/api'; + +/** + * 表单数据 + */ +export interface FormRecord { + formRecordId?: number; + formId?: number; + name?: string; + formData?: string; + userId?: number; + sortNumber?: number; + comments?: string; + status?: number; + createTime?: string; + layout?: string; +} + +/** + * 搜索条件 + */ +export interface FormRecordParam extends PageParam { + formRecordId?: string; + name?: number; +} diff --git a/src/api/cms/form/index.ts b/src/api/cms/form/index.ts new file mode 100644 index 0000000..7679845 --- /dev/null +++ b/src/api/cms/form/index.ts @@ -0,0 +1,143 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Form, FormParam } from './model'; +import { MODULES_API_URL } from '@/config/setting'; + +/** + * 分页查询表单设计 + */ +export async function pageForm(params: FormParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/form/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询表单设计列表 + */ +export async function listForm(params?: FormParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/form', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加表单设计 + */ +export async function addForm(data: Form) { + const res = await request.post>( + MODULES_API_URL + '/cms/form', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改表单设计 + */ +export async function updateForm(data: Form) { + const res = await request.put>( + MODULES_API_URL + '/cms/form', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除表单设计 + */ +export async function removeForm(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/form/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除表单设计 + */ +export async function removeBatchForm(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/form/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateFormStatus(formId?: number, status?: number) { + const res = await request.put>( + MODULES_API_URL + '/cms/form/status', + { + formId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询表单设计 + */ +export async function getForm(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/form/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/form/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/src/api/cms/form/model/index.ts b/src/api/cms/form/model/index.ts new file mode 100644 index 0000000..52fb81f --- /dev/null +++ b/src/api/cms/form/model/index.ts @@ -0,0 +1,31 @@ +import type { PageParam } from '@/api'; + +/** + * 表单设计 + */ +export interface Form { + formId?: number; + name?: string; + photo?: string; + background?: string; + submitNumber?: number; + layout?: any; + userId?: number; + sortNumber?: number; + comments?: string; + status?: number; + createTime?: string; + hidePhoto?: any; + hideBackground?: number; + opacity?: number; + data?: any[]; + clearCache?: number; +} + +/** + * 搜索条件 + */ +export interface FormParam extends PageParam { + formId?: number; + name?: number; +} diff --git a/src/api/cms/navigation/model/index.ts b/src/api/cms/navigation/model/index.ts index b77cdfa..cf8c89a 100644 --- a/src/api/cms/navigation/model/index.ts +++ b/src/api/cms/navigation/model/index.ts @@ -4,6 +4,8 @@ export interface Navigation { // 菜单id navigationId?: number; + // 菜单类型 + type?: number; // 上级id, 0是顶级 parentId?: number; // 菜单名称 @@ -26,6 +28,8 @@ export interface Navigation { icon?: string; // 是否隐藏, 0否,1是(仅注册路由不显示左侧菜单) hide?: number; + // 位置 + position?: number; // 路由元信息 meta?: string; // 创建时间 diff --git a/src/store/modules/tenant.ts b/src/store/modules/tenant.ts index f104ca5..1aef834 100644 --- a/src/store/modules/tenant.ts +++ b/src/store/modules/tenant.ts @@ -9,12 +9,14 @@ import {useUserStore} from "@/store/modules/user"; import {getSiteInfo} from "@/api/cms/website"; import {ArrangeCategory} from "@/api/cms/category/model"; import {Website} from "@/api/cms/website/model"; +import {Navigation} from "@/api/cms/navigation/model"; export interface UserState { config: any | null; menus: MenuItem[] | null | undefined; siteInfo: Website | null; categoryList: ArrangeCategory[] | null | undefined; + subMenu: Navigation[] | null | undefined; } export const useTenantStore = defineStore({ @@ -26,6 +28,8 @@ export const useTenantStore = defineStore({ menus: null, // 企业信息 siteInfo: null, + // 底部链接 + subMenu: null, // 文章分类 categoryList: null }), @@ -39,7 +43,7 @@ export const useTenantStore = defineStore({ if (!siteInfo) { return {}; } - const { categoryList,config } = siteInfo; + const { navigations,config } = siteInfo; this.siteInfo = siteInfo; localStorage.setItem('tenantId', String(siteInfo.tenantId)); localStorage.setItem('tenantName', String(siteInfo.websiteName)); @@ -51,25 +55,30 @@ export const useTenantStore = defineStore({ // 用户菜单, 过滤掉按钮类型并转为 children 形式 const { menus, homePath } = formatMenus( toTreeData({ - data: categoryList - ?.map((d) => { - // 新闻列表 - if(d.type == 0){ - d.path = `/article/${d.categoryId}` - } - return { - ...d, - name: d.title, - path: d.path, - component: d.component - }; - }), - idField: 'categoryId', + data: navigations?.filter(d => d.position != 2).map((d) => { + if(d.parentId == 0 && d.type == 0 && d.path != '/'){ + d.path = '/' + d.navigationId; + } + return { + ...d, + name: d.title, + path: d.path, + component: d.component + }; + }), + idField: 'navigationId', parentIdField: 'parentId' }) ); this.menus = menus; - console.log(menus); + // 处理底部链接 + this.subMenu = toTreeData({ + data: navigations?.filter(d => d.position != 1).map((d) => { + return { ...d, key: d.navigationId, value: d.navigationId }; + }), + idField: 'navigationId', + parentIdField: 'parentId' + }); const userStore = useUserStore(); // 更新网站菜单数据 userStore.setMenu(menus); diff --git a/src/utils/request.ts b/src/utils/request.ts index 1520fd2..bb58294 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -2,84 +2,89 @@ * axios 实例 */ import axios from 'axios'; -import type { AxiosResponse } from 'axios'; -import { unref } from 'vue'; +import type {AxiosResponse} from 'axios'; +import {unref} from 'vue'; import router from '@/router'; -import { Modal } from 'ant-design-vue'; +import {Modal} from 'ant-design-vue'; import { - API_BASE_URL, - TOKEN_HEADER_NAME, - LAYOUT_PATH, - TENANT_ID + API_BASE_URL, + TOKEN_HEADER_NAME, + LAYOUT_PATH, + TENANT_ID } from '@/config/setting'; -import { getToken, setToken } from './token-util'; -import { logout } from './page-tab-util'; -import type { ApiResult } from '@/api'; +import {getToken, setToken} from './token-util'; +import {logout} from './page-tab-util'; +import type {ApiResult} from '@/api'; import {getDomainPart1} from "@/utils/domain"; // import {getTenantId} from "@/utils/domain"; const service = axios.create({ - baseURL: API_BASE_URL + baseURL: API_BASE_URL }); /** * 添加请求拦截器 */ service.interceptors.request.use( - (config) => { - const token = getToken(); - // 添加 token 到 header - if (token && config.headers) { - config.headers.common[TOKEN_HEADER_NAME] = token; + (config) => { + const token = getToken(); + // 添加 token 到 header + if (token && config.headers) { + config.headers.common[TOKEN_HEADER_NAME] = token; + } + // 获取租户ID + if (config.headers) { + config.headers.common['TenantId'] = TENANT_ID; + // 解析二级域名获取租户ID + if (getDomainPart1()) { + config.headers.common['TenantId'] = getDomainPart1(); + } + // 附加企业ID + const companyId = localStorage.getItem('CompanyId'); + if (companyId) { + config.headers.common['CompanyId'] = companyId; + } + } + return config; + }, + (error) => { + return Promise.reject(error); } - // 从配置文件获取租户ID - if (config.headers) { - config.headers.common['TenantId'] = TENANT_ID; - // 解析二级域名获取租户ID - if (getDomainPart1()) { - config.headers.common['TenantId'] = getDomainPart1(); - } - } - return config; - }, - (error) => { - return Promise.reject(error); - } ); /** * 添加响应拦截器 */ service.interceptors.response.use( - (res: AxiosResponse>) => { - // 登录过期处理 - if (res.data?.code === 401) { - const currentPath = unref(router.currentRoute).path; - if (currentPath == LAYOUT_PATH) { - logout(true); - } else { - Modal.destroyAll(); - Modal.info({ - title: '系统提示', - content: '登录状态已过期, 请退出重新登录!', - okText: '重新登录', - onOk: () => { - logout(false, currentPath); - } - }); - } - return Promise.reject(new Error(res.data.message)); + (res: AxiosResponse>) => { + // 登录过期处理 + if (res.data?.code === 401) { + const currentPath = unref(router.currentRoute).path; + if (currentPath == LAYOUT_PATH) { + logout(true); + } else { + Modal.destroyAll(); + Modal.info({ + title: '系统提示', + content: '登录状态已过期, 请退出重新登录!', + okText: '重新登录', + onOk: () => { + logout(false, currentPath); + } + }); + } + return Promise.reject(new Error(res.data.message)); + } + // token 自动续期 + const token = res.headers[TOKEN_HEADER_NAME.toLowerCase()]; + if (token) { + setToken(token); + } + return res; + }, + (error) => { + return Promise.reject(error); } - // token 自动续期 - const token = res.headers[TOKEN_HEADER_NAME.toLowerCase()]; - if (token) { - setToken(token); - } - return res; - }, - (error) => { - return Promise.reject(error); - } ); export default service; diff --git a/src/views/article/components/photo-list.vue b/src/views/article/components/photo-list.vue new file mode 100644 index 0000000..f1df2b6 --- /dev/null +++ b/src/views/article/components/photo-list.vue @@ -0,0 +1,156 @@ + + + + diff --git a/src/views/article/index.vue b/src/views/article/index.vue index 0c2886c..dd4c738 100644 --- a/src/views/article/index.vue +++ b/src/views/article/index.vue @@ -1,7 +1,7 @@