feat(core): 初始化项目基础架构和CMS功能模块

- 添加Docker相关配置文件(.dockerignore, .env.example, .gitignore)
- 实现服务端API代理功能,支持文件、模块和服务器API转发
- 创建文章详情页、栏目文章列表页和单页内容展示页面
- 集成Ant Design Vue组件库并实现SSR样式提取功能
- 定义API响应数据结构类型和应用布局组件
- 开发开发者应用中心和文章管理页面
- 实现CMS导航菜单获取和多租户切换功能
This commit is contained in:
2026-01-27 00:14:08 +08:00
commit 775841eed3
315 changed files with 47072 additions and 0 deletions

View File

@@ -0,0 +1,153 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import type { Setting, SettingParam } from './model';
import { SERVER_API_URL } from '@/config/setting';
/**
* 分页查询设置
*/
export async function pageSetting(params: SettingParam) {
const res = await request.get<ApiResult<PageResult<Setting>>>(
SERVER_API_URL + '/system/setting/page',
{
params
}
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 查询设置列表
*/
export async function listSetting(params?: SettingParam) {
const res = await request.get<ApiResult<Setting[]>>(
SERVER_API_URL + '/system/setting',
{
params
}
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 根据id查询
*/
export async function getSetting(id: number) {
const res = await request.get<ApiResult<Setting>>(
SERVER_API_URL + '/system/setting/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 根据key查询
*/
export async function getSettingByKey(key: string) {
const res = await request.get<ApiResult<any>>(
SERVER_API_URL + '/system/setting/getByKey/' + key
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 添加设置
*/
export async function addSetting(data: Setting) {
const res = await request.post<ApiResult<unknown>>(
SERVER_API_URL + '/system/setting',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 修改设置
*/
export async function updateSetting(data: Setting) {
const res = await request.put<ApiResult<unknown>>(
SERVER_API_URL + '/system/setting',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 根据Key修改设置
*/
export async function updateSettingByKey(data: Setting) {
const res = await request.put<ApiResult<unknown>>(
SERVER_API_URL + '/system/setting/updateByKey',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 删除设置
*/
export async function removeSetting(id?: number) {
const res = await request.delete<ApiResult<unknown>>(
SERVER_API_URL + '/system/setting/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 批量删除设置
*/
export async function removeBatchSetting(data: (number | undefined)[]) {
const res = await request.delete<ApiResult<unknown>>(
SERVER_API_URL + '/system/setting/batch',
{
data
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 检查IP是否存在
*/
export async function checkExistence(
field: string,
value: string,
id?: number
) {
const res = await request.get<ApiResult<unknown>>(
SERVER_API_URL + '/system/setting/existence',
{
params: { field, value, id }
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -0,0 +1,127 @@
import type { PageParam } from '@/api';
/**
* 系统设置
*/
export interface Setting {
// 公共字段
settingId?: number;
settingKey?: string;
content?: string;
comments?: string;
tenantName?: string;
tenantId?: string | null;
// 设置信息
siteName?: string;
fullName?: string;
tenantCode?: string;
domain?: string;
remarks?: string;
icp?: string;
copyright?: string;
keyword?: string;
phone?: string;
company?: string;
address?: string;
email?: string;
support?: string;
logo?: string;
// 注册设置
roleId?: number;
openWxAuth?: number;
openWxBindPhone?: number;
openWxofficialAuth?: number;
openWxofficialBindPhone?: number;
tokenExpireTime?: number;
// 短信设置
type?: number;
accessKeyId?: string;
accessKeySecret?: string;
sign?: string;
isNoticeUser?: string;
userTemplateId?: string;
merchantTemplateId?: string;
isNoticeMerchant?: string;
merchantMobiles?: string;
// 支付设置
payMethod?: string;
signMode?: string;
alipayAppId?: string;
signType?: string;
appCertPublicKey?: string;
alipayCertPublicKey?: string;
alipayRootCert?: string;
alipayPublicKey?: string;
privateKey?: string;
decryptKey?: string;
balanceIsEnable?: boolean;
wechatIsEnable?: boolean;
alipayIsEnable?: boolean;
wechatType?: string;
mchId?: number;
wechatAppId?: string;
wechatApiKey?: string;
apiclientCert?: string;
apiclientKey?: string;
spAppId?: string;
spMchId?: string;
spApiKey?: string;
spSubAppId?: string;
spSubMchId?: string;
spApiclientCert?: string;
spApiclientKey?: string;
merchantSerialNumber?: string;
// 微信公众号/小程序设置
appId?: string;
appSecret?: string;
wxOfficialAccount?: string;
originalId?: string;
// 企业微信参数
suiteId?: string;
secret?: string;
corpId?: string;
token?: string;
encodingAESKey?: string;
// 打印设置
isOpenPrinter?: string;
printerType?: string;
printerStatus?: string;
printerUser?: string;
printerUserKey?: string;
printerCode?: string;
printerKey?: string;
printerTimes?: string;
// chatGPT
chatKey?: string;
// 清除缓存
clearCache?: string;
// 主题
theme?: string;
// 云存储
uploadMethod?: any;
fileUrl?: string;
bucketName?: string;
bucketEndpoint?: string;
bucketDomain?: string;
// accessKeyId?: string; 引用上面的
// accessKeySecret?: string; 引用上面的
}
/**
* 系统设置搜索条件
*/
export interface SettingParam extends PageParam {
settingId?: number;
settingKey?: string;
}