项目初始化

This commit is contained in:
2026-03-18 15:54:43 +08:00
commit dfcd762e23
601 changed files with 57883 additions and 0 deletions

378
web/src/api/common.ts Normal file
View File

@@ -0,0 +1,378 @@
import createAxios from '/@/utils/axios'
import { isAdminApp, checkFileMimetype } from '/@/utils/common'
import { getUrl } from '/@/utils/axios'
import { useAdminInfo } from '/@/stores/adminInfo'
import { useUserInfo } from '/@/stores/userInfo'
import { ElNotification, type UploadRawFile } from 'element-plus'
import { useSiteConfig } from '/@/stores/siteConfig'
import { state as uploadExpandState, fileUpload as uploadExpand } from '/@/components/mixins/baUpload'
import type { AxiosRequestConfig } from 'axios'
import { uuid } from '/@/utils/random'
import { i18n } from '../lang'
import { adminBaseRoutePath } from '/@/router/static/adminBase'
import { SYSTEM_ZINDEX } from '/@/stores/constant/common'
/*
* 公共请求函数和Url定义
*/
// Admin模块
export const adminUploadUrl = '/admin/ajax/upload'
export const adminBuildSuffixSvgUrl = adminBaseRoutePath + '/ajax/buildSuffixSvg'
export const adminAreaUrl = '/admin/ajax/area'
export const getTablePkUrl = '/admin/ajax/getTablePk'
export const getTableListUrl = '/admin/ajax/getTableList'
export const getTableFieldListUrl = '/admin/ajax/getTableFieldList'
export const getDatabaseConnectionListUrl = '/admin/ajax/getDatabaseConnectionList'
export const terminalUrl = adminBaseRoutePath + '/ajax/terminal'
export const changeTerminalConfigUrl = '/admin/ajax/changeTerminalConfig'
export const clearCacheUrl = '/admin/ajax/clearCache'
// 公共
export const captchaUrl = '/api/common/captcha'
export const clickCaptchaUrl = '/api/common/clickCaptcha'
export const checkClickCaptchaUrl = '/api/common/checkClickCaptcha'
export const refreshTokenUrl = '/api/common/refreshToken'
// api模块(前台)
export const apiUploadUrl = '/api/ajax/upload'
export const apiBuildSuffixSvgUrl = '/api/ajax/buildSuffixSvg'
export const apiAreaUrl = '/api/ajax/area'
export const apiSendSms = '/api/Sms/send'
export const apiSendEms = '/api/Ems/send'
/**
* 上传文件
*/
export function fileUpload(fd: FormData, params: anyObj = {}, forceLocal = false, config: AxiosRequestConfig = {}): ApiPromise {
let errorMsg = ''
const file = fd.get('file') as UploadRawFile
const siteConfig = useSiteConfig()
if (!file.name || typeof file.size == 'undefined') {
errorMsg = i18n.global.t('utils.The data of the uploaded file is incomplete!')
} else if (!checkFileMimetype(file.name, file.type)) {
errorMsg = i18n.global.t('utils.The type of uploaded file is not allowed!')
} else if (file.size > siteConfig.upload.maxSize) {
errorMsg = i18n.global.t('utils.The size of the uploaded file exceeds the allowed range!')
}
if (errorMsg) {
return new Promise((resolve, reject) => {
ElNotification({
type: 'error',
message: errorMsg,
zIndex: SYSTEM_ZINDEX,
})
reject(errorMsg)
})
}
if (!forceLocal && uploadExpandState() == 'enable') {
return uploadExpand(fd, params, config)
}
return createAxios({
url: isAdminApp() ? adminUploadUrl : apiUploadUrl,
method: 'POST',
data: fd,
params: params,
timeout: 0,
...config,
})
}
/**
* 生成文件后缀icon的svg图片
* @param suffix 后缀名
* @param background 背景色,如:rgb(255,255,255)
*/
export function buildSuffixSvgUrl(suffix: string, background = '') {
const adminInfo = useAdminInfo()
return (
getUrl() +
(isAdminApp() ? adminBuildSuffixSvgUrl : apiBuildSuffixSvgUrl) +
'?batoken=' +
adminInfo.getToken() +
'&suffix=' +
suffix +
(background ? '&background=' + background : '') +
'&server=1'
)
}
/**
* 获取地区数据
*/
export function getArea(values: number[]) {
const params: { province?: number; city?: number; uuid?: string } = {}
if (values[0]) {
params.province = values[0]
}
if (values[1]) {
params.city = values[1]
}
params.uuid = uuid()
return createAxios({
url: isAdminApp() ? adminAreaUrl : apiAreaUrl,
method: 'GET',
params: params,
})
}
/**
* 发送短信
*/
export function sendSms(mobile: string, templateCode: string, extend: anyObj = {}) {
return createAxios(
{
url: apiSendSms,
method: 'POST',
data: {
mobile: mobile,
template_code: templateCode,
...extend,
},
},
{
showSuccessMessage: true,
}
)
}
/**
* 发送邮件
*/
export function sendEms(email: string, event: string, extend: anyObj = {}) {
return createAxios(
{
url: apiSendEms,
method: 'POST',
data: {
email: email,
event: event,
...extend,
},
},
{
showSuccessMessage: true,
}
)
}
/**
* 缓存清理接口
*/
export function postClearCache(type: string) {
return createAxios(
{
url: clearCacheUrl,
method: 'POST',
data: {
type: type,
},
},
{
showSuccessMessage: true,
}
)
}
/**
* 构建命令执行窗口url
*/
export function buildTerminalUrl(commandKey: string, uuid: string, extend: string) {
const adminInfo = useAdminInfo()
return (
getUrl() + terminalUrl + '?command=' + commandKey + '&uuid=' + uuid + '&extend=' + extend + '&batoken=' + adminInfo.getToken() + '&server=1'
)
}
/**
* 请求修改终端配置
*/
export function postChangeTerminalConfig(data: { manager?: string; port?: string }) {
return createAxios({
url: changeTerminalConfigUrl,
method: 'POST',
data: data,
})
}
/**
* 远程下拉框数据获取
*/
export function getSelectData(remoteUrl: string, q: string, params: anyObj = {}) {
return createAxios({
url: remoteUrl,
method: 'get',
params: {
select: true,
quickSearch: q,
...params,
},
})
}
export function buildCaptchaUrl() {
return getUrl() + captchaUrl + '?server=1'
}
export function getCaptchaData(id: string, apiBaseURL: string) {
return createAxios({
url: apiBaseURL + clickCaptchaUrl,
method: 'get',
params: {
id,
},
})
}
export function checkClickCaptcha(id: string, info: string, unset: boolean, apiBaseURL: string) {
return createAxios(
{
url: apiBaseURL + checkClickCaptchaUrl,
method: 'post',
data: {
id,
info,
unset,
},
},
{
showCodeMessage: false,
}
)
}
export function getTablePk(table: string, connection = '') {
return createAxios({
url: getTablePkUrl,
method: 'get',
params: {
table: table,
connection: connection,
},
})
}
/**
* 获取数据表的字段
* @param table 数据表名
* @param clean 只要干净的字段注释(只要字段标题)
*/
export function getTableFieldList(table: string, clean = true, connection = '') {
return createAxios({
url: getTableFieldListUrl,
method: 'get',
params: {
table: table,
clean: clean ? 1 : 0,
connection: connection,
},
})
}
export function refreshToken() {
const adminInfo = useAdminInfo()
const userInfo = useUserInfo()
return createAxios({
url: refreshTokenUrl,
method: 'POST',
data: {
refreshToken: isAdminApp() ? adminInfo.getToken('refresh') : userInfo.getToken('refresh'),
},
})
}
/**
* 快速生成一个控制器的 增、删、改、查、排序 接口的请求方法
* 本 class 实例通常直接传递给 baTable 使用,开发者可重写本类的方法,亦可直接向 baTable 传递自定义的 API 请求类
* 表格相关网络请求无需局限于本类,开发者可于 /src/api/ 目录创建自定义的接口请求函数,并于需要的地方导入使用即可
*/
export class baTableApi {
private controllerUrl
public actionUrl
constructor(controllerUrl: string) {
this.controllerUrl = controllerUrl
this.actionUrl = new Map([
['index', controllerUrl + 'index'],
['add', controllerUrl + 'add'],
['edit', controllerUrl + 'edit'],
['del', controllerUrl + 'del'],
['sortable', controllerUrl + 'sortable'],
])
}
/**
* 表格查看接口的请求方法
* @param filter 数据过滤条件
*/
index(filter: BaTable['filter'] = {}) {
return createAxios<TableDefaultData>({
url: this.actionUrl.get('index'),
method: 'get',
params: filter,
})
}
/**
* 获取被编辑行数据
* @param params 被编辑行主键等
*/
edit(params: anyObj) {
return createAxios({
url: this.actionUrl.get('edit'),
method: 'get',
params,
})
}
/**
* 表格删除接口的请求方法
* @param ids 被删除数据的主键数组
*/
del(ids: string[]) {
return createAxios(
{
url: this.actionUrl.get('del'),
method: 'DELETE',
params: {
ids,
},
},
{
showSuccessMessage: true,
}
)
}
/**
* 向指定接口 POST 数据,本方法虽然较为通用,但请不要局限于此,开发者可于 /src/api/ 目录创建自定义的接口请求函数,并于需要的地方导入使用即可
* @param action 请求的接口,比如 add、edit
* @param data 要 POST 的数据
*/
postData(action: string, data: anyObj) {
return createAxios(
{
url: this.actionUrl.has(action) ? this.actionUrl.get(action) : this.controllerUrl + action,
method: 'post',
data,
},
{
showSuccessMessage: true,
}
)
}
/**
* 表格行排序接口的请求方法
*/
sortable(data: anyObj) {
return createAxios({
url: this.actionUrl.get('sortable'),
method: 'post',
data,
})
}
}