初始化版本,引入智慧食堂模块,第三方模块

This commit is contained in:
zjf committed 2024-12-06 18:48:18 +08:00
commit d22f88efd3
677 files changed
+69341

No files matched your search

+86
View File
@@ -0,0 +1,86 @@
<template>
<el-config-provider :size="getGlobalComponentSize" :locale="getGlobalI18n">
<router-view v-show="setLockScreen" />
<LockScreen v-if="themeConfig.isLockScreen" />
<Setings ref="settingsRef" v-show="themeConfig.lockScreenTime > 1" />
<CloseFull v-if="!themeConfig.isLockScreen" />
</el-config-provider>
</template>
<script setup lang="ts" name="app">
import { useI18n } from 'vue-i18n';
import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
import { useThemeConfig } from '/@/stores/themeConfig';
import other from '/@/utils/other';
import { Local, Session } from '/@/utils/storage';
import mittBus from '/@/utils/mitt';
import setIntroduction from '/@/utils/setIconfont';
// 引入组件
const LockScreen = defineAsyncComponent(() => import('/@/layout/lockScreen/index.vue'));
const Setings = defineAsyncComponent(() => import('/@/layout/navBars/breadcrumb/setings.vue'));
const CloseFull = defineAsyncComponent(() => import('/@/layout/navBars/breadcrumb/closeFull.vue'));
// 定义变量内容
const { messages, locale } = useI18n();
const settingsRef = ref();
const route = useRoute();
const stores = useTagsViewRoutes();
const storesThemeConfig = useThemeConfig();
const { themeConfig } = storeToRefs(storesThemeConfig);
// 设置锁屏时组件显示隐藏
const setLockScreen = computed(() => {
// 防止锁屏后,刷新出现不相关界面
// https://gitee.com/lyt-top/vue-next-admin/issues/I6AF8P
return themeConfig.value.isLockScreen ? themeConfig.value.lockScreenTime > 1 : themeConfig.value.lockScreenTime >= 0;
});
// 获取全局组件大小
const getGlobalComponentSize = computed(() => {
return other.globalComponentSize();
});
// 获取全局 i18n
const getGlobalI18n = computed(() => {
return messages.value[locale.value];
});
// 设置初始化,防止刷新时恢复默认
onBeforeMount(() => {
// 设置批量第三方 icon 图标
setIntroduction.cssCdn();
// 设置批量第三方 js
setIntroduction.jsCdn();
});
// 页面加载时
onMounted(() => {
nextTick(() => {
// 监听布局配'置弹窗点击打开
mittBus.on('openSetingsDrawer', () => {
settingsRef.value.openDrawer();
});
// 获取缓存中的布局配置
if (Local.get('themeConfig')) {
storesThemeConfig.setThemeConfig({ themeConfig: Local.get('themeConfig') });
document.documentElement.style.cssText = Local.get('themeConfigStyle');
}
// 获取缓存中的全屏配置
if (Session.get('isTagsViewCurrenFull')) {
stores.setCurrenFullscreen(Session.get('isTagsViewCurrenFull'));
}
});
});
// 页面销毁时,关闭监听布局配置/i18n监听
onUnmounted(() => {
mittBus.off('openSetingsDrawer', () => {});
});
// 监听路由的变化,设置网站标题
watch(
() => route.path,
() => {
other.useTitle();
},
{
deep: true,
}
);
</script>
+24
View File
@@ -0,0 +1,24 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/admin/audit/page',
method: 'get',
params: query,
});
}
export function getObj(id?: string) {
return request({
url: '/admin/audit/' + id,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/admin/audit/delete',
method: 'delete',
data: ids,
});
}
+68
View File
@@ -0,0 +1,68 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/admin/client/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/admin/client',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/admin/client/' + id,
method: 'get',
});
}
export function delObj(ids?: object) {
return request({
url: '/admin/client',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/admin/client',
method: 'put',
data: obj,
});
}
export function refreshCache() {
return request({
url: '/admin/client/sync',
method: 'put',
});
}
export function getDetails(obj: Object) {
return request({
url: '/admin/client/getClientDetailsById/' + obj,
method: 'get',
});
}
export function validateclientId(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getDetails(value).then((res) => {
const result = res.data;
if (result !== null) {
callback(new Error('编号已经存在'));
} else {
callback();
}
});
}
+64
View File
@@ -0,0 +1,64 @@
import request from "/@/utils/request"
export function fetchList(query?: Object) {
return request({
url: '/admin/system-config/page',
method: 'get',
params: query
})
}
export function addObj(obj?: Object) {
return request({
url: '/admin/system-config',
method: 'post',
data: obj
})
}
export function getObj(obj: Object) {
return request({
url: '/admin/system-config/details',
method: 'get',
params: obj
})
}
export function refreshObj() {
return request({
url: '/admin/system-config/refresh',
method: 'get'
})
}
export function delObjs(ids?: Object) {
return request({
url: '/admin/system-config',
method: 'delete',
data: ids
})
}
export function putObj(obj?: Object) {
return request({
url: '/admin/system-config',
method: 'put',
data: obj
})
}
export function validateExist(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObj({configKey: value}).then((response) => {
const result = response.data;
if (result !== null && result.length > 0) {
callback(new Error('数据已经存在'));
} else {
callback();
}
});
}
+83
View File
@@ -0,0 +1,83 @@
import request from '/@/utils/request';
export const deptTree = (params?: Object) => {
return request({
url: '/admin/dept/tree',
method: 'get',
params,
});
};
export const addObj = (obj: Object) => {
return request({
url: '/admin/dept',
method: 'post',
data: obj,
});
};
export const getObj = (id: string) => {
return request({
url: '/admin/dept/' + id,
method: 'get',
});
};
export const delObj = (id: string) => {
return request({
url: '/admin/dept/' + id,
method: 'delete',
});
};
export const putObj = (obj: Object) => {
return request({
url: '/admin/dept',
method: 'put',
data: obj,
});
};
export const syncUser = () => {
return request({
url: '/admin/connect/sync/ding/user',
method: 'post',
});
};
export const syncDept = () => {
return request({
url: '/admin/connect/sync/ding/dept',
method: 'post',
});
};
export const syncCpUser = () => {
return request({
url: '/admin/connect/sync/cp/user',
method: 'post',
});
};
export const syncCpDept = () => {
return request({
url: '/admin/connect/sync/cp/dept',
method: 'post',
});
};
export const orgTree = (type: String, deptId: Number) => {
return request({
url: '/admin/dept/org',
method: 'get',
params: {type: type, parentDeptId: deptId},
});
}
export const orgTreeSearcheUser = (param: Object) => {
return request({
url: '/admin/dept/org/user/search',
method: 'get',
params: param
});
}
+138
View File
@@ -0,0 +1,138 @@
import request from '/@/utils/request';
export const getDicts = (type: String) => {
return request({
url: `/admin/dict/type/${type}`,
method: 'get',
});
};
export function fetchList(query: any) {
return request({
url: '/admin/dict/list',
method: 'get',
params: query,
});
}
export function fetchItemList(query: any) {
return request({
url: '/admin/dict/item/page',
method: 'get',
params: query,
});
}
export function addItemObj(obj: any) {
return request({
url: '/admin/dict/item',
method: 'post',
data: obj,
});
}
export function getItemObj(id: string) {
return request({
url: '/admin/dict/item/details/' + id,
method: 'get',
});
}
export function getItemDetails(obj: object) {
return request({
url: '/admin/dict/item/details',
method: 'get',
params: obj,
});
}
export function delItemObj(id: string) {
return request({
url: '/admin/dict/item/' + id,
method: 'delete',
});
}
export function putItemObj(obj: any) {
return request({
url: '/admin/dict/item',
method: 'put',
data: obj,
});
}
export function addObj(obj: any) {
return request({
url: '/admin/dict',
method: 'post',
data: obj,
});
}
export function getObj(id: string) {
return request({
url: '/admin/dict/details/' + id,
method: 'get',
});
}
export function getObjDetails(obj: object) {
return request({
url: '/admin/dict/details',
method: 'get',
params: obj,
});
}
export function delObj(ids: Object) {
return request({
url: '/admin/dict',
method: 'delete',
data: ids,
});
}
export function putObj(obj: any) {
return request({
url: '/admin/dict',
method: 'put',
data: obj,
});
}
export function refreshCache() {
return request({
url: '/admin/dict/sync',
method: 'put',
});
}
export function validateDictType(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({ dictType: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('字典已经存在'));
} else {
callback();
}
});
}
export function validateDictItemLabel(rule: any, value: any, callback: any, type: string, isEdit: boolean) {
if (isEdit) {
return callback();
}
getItemDetails({ dictType: type, label: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('标签已经存在'));
} else {
callback();
}
});
}
+92
View File
@@ -0,0 +1,92 @@
import request from '/@/utils/request';
export function fileList(query?: Object) {
return request({
url: '/admin/sys-file/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/admin/sys-file',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/admin/sys-file/' + id,
method: 'get',
});
}
export function putObj(obj?: Object) {
return request({
url: '/admin/sys-file',
method: 'put',
data: obj,
});
}
export function fileGroupAdd(params: Record<string, any>) {
return request({
url: '/admin/sys-file/group/add',
method: 'post',
data: params,
});
}
export function fileGroupUpdate(params: Record<string, any>) {
return request({
url: '/admin/sys-file/group/update',
method: 'put',
data: params,
});
}
// 文件分类删除
export function fileGroupDelete(params: Record<string, any>) {
return request({
url: '/admin/sys-file/group/delete/' + params.id,
method: 'delete',
});
}
// 文件分类列表
export function fileCateLists(params: Record<string, any>) {
return request({
url: '/admin/sys-file/group/list',
method: 'get',
params: params,
});
}
// 文件删除
export function fileDelete(params: Record<string, any>) {
return request({
url: '/admin/sys-file',
method: 'delete',
data: params.ids,
});
}
// 文件移动
export function fileMove(params: Record<string, any>) {
return request({
url: '/admin/sys-file/group/move',
method: 'put',
data: params,
});
}
// 文件重命名
export function fileRename(params: { id: number; original: string }) {
return request({
url: '/admin/sys-file/rename',
method: 'put',
data: params,
});
}
+109
View File
@@ -0,0 +1,109 @@
import request from '/@/utils/request';
import axios from 'axios';
export function fetchList(query?: Object) {
return request({
url: '/admin/i18n/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/admin/i18n',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/admin/i18n/details/' + id,
method: 'get',
});
}
export function getObjDetails(obj?: object) {
return request({
url: '/admin/i18n/details',
method: 'get',
params: obj,
});
}
export function delObj(ids?: object) {
return request({
url: '/admin/i18n',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/admin/i18n',
method: 'put',
data: obj,
});
}
export function refreshCache() {
return request({
url: '/admin/i18n/sync',
method: 'put',
});
}
/**
* 注意这里使用原声axios对象进行操作,request 实例中依赖i18n 所以还没有初始化会报错
* @returns
*/
export function info() {
return axios.get(import.meta.env.VITE_API_URL + '/admin/i18n/info');
}
export function validateName(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({ name: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('国际化编码已经存在'));
} else {
callback();
}
});
}
export function validateZhCn(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({ zhCn: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('国际化中文已经存在'));
} else {
callback();
}
});
}
export function validateEn(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({ en: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('国际化英文已经存在'));
} else {
callback();
}
});
}
+26
View File
@@ -0,0 +1,26 @@
import request from '/@/utils/request';
export const pageList = (params?: Object) => {
return request({
url: '/admin/log/page',
method: 'get',
params,
});
};
export const delObj = (ids: object) => {
return request({
url: '/admin/log',
method: 'delete',
data: ids,
});
};
export const getSum = (params?: Object) => {
return request({
url: '/admin/log/sum',
method: 'get',
params,
});
};
+78
View File
@@ -0,0 +1,78 @@
import request from '/@/utils/request';
export const pageList = (params?: Object) => {
return request({
url: '/admin/menu/tree',
method: 'get',
params,
});
};
export const getObj = (obj: object) => {
return request({
url: `/admin/menu/details`,
method: 'get',
params: obj
});
};
export const save = (data: Object) => {
return request({
url: '/admin/menu',
method: 'post',
data: data,
});
};
export const putObj = (data: Object) => {
return request({
url: '/admin/menu',
method: 'put',
data: data,
});
};
export const addObj = (data: Object) => {
return request({
url: '/admin/menu',
method: 'post',
data: data,
});
};
export const delObj = (id: string) => {
return request({
url: '/admin/menu/' + id,
method: 'delete',
});
};
/**
* 后端控制路由,isRequestRoutes 为 true,则开启后端控制路由
* @method getAdminMenu 获取后端动态路由菜单(admin)
*/
export function useMenuApi() {
return {
getAdminMenu: (params?: object) => {
return request({
url: '/admin/menu',
method: 'get',
params,
});
},
};
}
export function validateExist(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObj({[rule.field]: value}).then((response) => {
const result = response.data;
if (result !== null && result.length > 0) {
callback(new Error('数据已经存在'));
} else {
callback();
}
});
}
+100
View File
@@ -0,0 +1,100 @@
import request from "/@/utils/request"
export function fetchUserMessageReadList(query?: Object) {
return request({
url: '/admin/sysMessage/user/read/page',
method: 'get',
params: query
})
}
export function readUserMessage(params?: object) {
return request({
url: '/admin/sysMessage/read',
method: 'post',
params: params
})
}
export function fetchUserMessageList(query?: Object) {
return request({
url: '/admin/sysMessage/user/page',
method: 'get',
params: query
})
}
export function fetchList(query?: Object) {
return request({
url: '/admin/sysMessage/page',
method: 'get',
params: query
})
}
export function addObj(obj?: Object) {
return request({
url: '/admin/sysMessage',
method: 'post',
data: obj
})
}
export function sendObj(params?: object) {
return request({
url: '/admin/sysMessage/send',
method: 'post',
params: params
})
}
export function getObj(id?: string) {
return request({
url: '/admin/sysMessage/' + id,
method: 'get'
})
}
export function delObjs(ids?: Object) {
return request({
url: '/admin/sysMessage',
method: 'delete',
data: ids
})
}
export function putObj(obj?: Object) {
return request({
url: '/admin/sysMessage',
method: 'put',
data: obj
})
}
export function sendSms(params?: object) {
return request({
url: '/admin/sysMessage/send/sms',
method: 'post',
data: params
})
}
export function sendEmail(params?: object) {
return request({
url: '/admin/sysMessage/send/email',
method: 'post',
data: params
})
}
export function sendHook(params?: object) {
return request({
url: '/admin/sysMessage/send/webhook',
method: 'post',
data: params
})
}
+92
View File
@@ -0,0 +1,92 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/admin/param/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/admin/param',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/admin/param/details/' + id,
method: 'get',
});
}
export function delObj(ids?: Object) {
return request({
url: '/admin/param',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/admin/param',
method: 'put',
data: obj,
});
}
export function refreshCache() {
return request({
url: '/admin/param/sync',
method: 'put',
});
}
export function getObjDetails(obj?: object) {
return request({
url: '/admin/param/details',
method: 'get',
params: obj,
});
}
export function getValue(key?: String) {
return request({
url: '/admin/param/publicValue/' + key,
method: 'get'
});
}
export function validateParamsCode(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({publicKey: value}).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('参数编码已经存在'));
} else {
callback();
}
});
}
export function validateParamsName(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({publicName: value}).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('参数名称已经存在'));
} else {
callback();
}
});
}
+86
View File
@@ -0,0 +1,86 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/admin/post/page',
method: 'get',
params: query,
});
}
export const list = (params?: Object) => {
return request({
url: '/admin/post/list',
method: 'get',
params,
});
};
export function addObj(obj?: Object) {
return request({
url: '/admin/post',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/admin/post/details/' + id,
method: 'get',
});
}
export function getObjDetails(obj?: object) {
return request({
url: '/admin/post/details',
method: 'get',
params: obj,
});
}
export function delObj(ids?: object) {
return request({
url: '/admin/post',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/admin/post',
method: 'put',
data: obj,
});
}
export function validatePostName(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({ postName: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('岗位名称已经存在'));
} else {
callback();
}
});
}
export function validatePostCode(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({ postCode: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('岗位编码已经存在'));
} else {
callback();
}
});
}
+111
View File
@@ -0,0 +1,111 @@
import request from '/@/utils/request';
export const list = (params?: Object) => {
return request({
url: '/admin/role/list',
method: 'get',
params,
});
};
export const pageList = (params?: Object) => {
return request({
url: '/admin/role/page',
method: 'get',
params,
});
};
export const deptRoleList = () => {
return request({
url: '/admin/role/list',
method: 'get',
});
};
export const getObj = (id: string) => {
return request({
url: '/admin/role/details/' + id,
method: 'get',
});
};
export const getObjDetails = (obj: object) => {
return request({
url: '/admin/role/details',
method: 'get',
params: obj,
});
};
export const addObj = (obj: Object) => {
return request({
url: '/admin/role',
method: 'post',
data: obj,
});
};
export const putObj = (obj: Object) => {
return request({
url: '/admin/role',
method: 'put',
data: obj,
});
};
export const delObj = (ids: Object) => {
return request({
url: '/admin/role',
method: 'delete',
data: ids,
});
};
export const permissionUpd = (roleId: string, menuIds: string) => {
return request({
url: '/admin/role/menu',
method: 'put',
data: {
roleId: roleId,
menuIds: menuIds,
},
});
};
export const fetchRoleTree = (roleId: string) => {
return request({
url: '/admin/menu/tree/' + roleId,
method: 'get',
});
};
export function validateRoleCode(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({ roleCode: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('角色标识已经存在'));
} else {
callback();
}
});
}
export function validateRoleName(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({ roleName: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('角色名称已经存在'));
} else {
callback();
}
});
}
+38
View File
@@ -0,0 +1,38 @@
import request from '/@/utils/request';
export const fetchList = (query?: Object) => {
return request({
url: '/admin/route',
method: 'get',
params: query,
});
};
export const addObj = (obj?: object) => {
return request({
url: '/admin/route',
method: 'post',
data: obj,
});
};
export const deleteObj = (routeId?: string) => {
return request({
url: '/admin/route/' + routeId,
method: 'delete'
});
};
export function validateExist(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
fetchList({[rule.field]: value}).then((response) => {
const result = response.data;
if (result !== null && result.length > 0) {
callback(new Error('数据已经存在'));
} else {
callback();
}
});
}
+48
View File
@@ -0,0 +1,48 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/admin/schedule/page',
method: 'get',
params: query,
});
}
export function list(query?: Object) {
return request({
url: '/admin/schedule/list',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/admin/schedule',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/admin/schedule/' + id,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/admin/schedule',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/admin/schedule',
method: 'put',
data: obj,
});
}
+71
View File
@@ -0,0 +1,71 @@
import request from "/@/utils/request"
export function fetchList(query?: Object) {
return request({
url: '/admin/sysSensitiveWord/page',
method: 'get',
params: query
})
}
export function addObj(obj?: Object) {
return request({
url: '/admin/sysSensitiveWord',
method: 'post',
data: obj
})
}
export function getObj(obj: Object) {
return request({
url: '/admin/sysSensitiveWord/details',
method: 'get',
params: obj
})
}
export function refreshObj() {
return request({
url: '/admin/sysSensitiveWord/refresh',
method: 'get'
})
}
export function delObjs(ids?: Object) {
return request({
url: '/admin/sysSensitiveWord',
method: 'delete',
data: ids
})
}
export function putObj(obj?: Object) {
return request({
url: '/admin/sysSensitiveWord',
method: 'put',
data: obj
})
}
export function testObj(obj?: Object) {
return request({
url: '/admin/sysSensitiveWord/match',
method: 'post',
data: obj
})
}
export function validateWord(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObj({ sensitiveWord: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('敏感词已经存在'));
} else {
callback();
}
});
}
+47
View File
@@ -0,0 +1,47 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/admin/social/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/admin/social',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/admin/social/getById/' + id,
method: 'get',
});
}
export function delObj(ids?: Object) {
return request({
url: '/admin/social',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/admin/social',
method: 'put',
data: obj,
});
}
export function getLoginAppList(id?: string) {
return request({
url: '/admin/social/getLoginAppList',
method: 'get',
});
}
+63
View File
@@ -0,0 +1,63 @@
import request from "/@/utils/request"
export function fetchTree(query?: Object) {
return request({
url: '/admin/sysArea/tree',
method: 'get',
params: query
})
}
export function fetchList(query?: Object) {
return request({
url: '/admin/sysArea/page',
method: 'get',
params: query
})
}
export function addObj(obj?: Object) {
return request({
url: '/admin/sysArea',
method: 'post',
data: obj
})
}
export function getObj(query?: Object,) {
return request({
url: '/admin/sysArea/details',
method: 'get',
params: query
})
}
export function delObjs(ids?: Object) {
return request({
url: '/admin/sysArea',
method: 'delete',
data: ids
})
}
export function putObj(obj?: Object) {
return request({
url: '/admin/sysArea',
method: 'put',
data: obj
})
}
export function validateExist(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObj({ [rule.field] : value }).then((response) => {
const result = response.data;
if (result !== null && result.length > 0) {
callback(new Error('数据已经存在'));
} else {
callback();
}
});
}
+9
View File
@@ -0,0 +1,9 @@
import request from '/@/utils/request';
// 系统缓存监控
export function systemCache() {
return request({
url: '/admin/system/cache',
method: 'get',
});
}
+93
View File
@@ -0,0 +1,93 @@
import request from '/@/utils/request';
export function fetchPage(query?: Object) {
return request({
url: '/admin/tenant/page',
method: 'get',
params: query,
});
}
export function fetchList(query?: object) {
return request({
url: '/admin/tenant/list',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/admin/tenant',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/admin/tenant/details/' + id,
method: 'get',
});
}
export function getObjDetails(obj?: object) {
return request({
url: '/admin/tenant/details',
method: 'get',
params: obj,
});
}
export function delObj(ids?: Object) {
return request({
url: '/admin/tenant',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/admin/tenant',
method: 'put',
data: obj,
});
}
export function validateTenantName(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({ name: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('租户名称已经存在'));
} else {
callback();
}
});
}
export function validateTenantCode(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({ code: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('租户编码已经存在'));
} else {
callback();
}
});
}
export function treemenu() {
return request({
url: '/admin/tenant/tree/menu',
method: 'get',
});
}
+17
View File
@@ -0,0 +1,17 @@
import request from '/@/utils/request';
export function fetchList(query: object) {
return request({
url: '/admin/sys-token/page',
method: 'post',
data: query,
});
}
export function delObj(accessTokens: string[]) {
return request({
url: '/admin/sys-token/delete',
method: 'delete',
data: accessTokens,
});
}
+145
View File
@@ -0,0 +1,145 @@
import request from '/@/utils/request';
export const list = () => {
return request({
url: '/admin/user/list',
method: 'get',
});
};
export const pageList = (params?: Object) => {
return request({
url: '/admin/user/page',
method: 'get',
params,
});
};
export const addObj = (obj: Object) => {
return request({
url: '/admin/user',
method: 'post',
data: obj,
});
};
export const getObj = (id: String) => {
return request({
url: '/admin/user/details/' + id,
method: 'get',
});
};
export const delObj = (ids: Object) => {
return request({
url: '/admin/user',
method: 'delete',
data: ids,
});
};
export const putObj = (obj: Object) => {
return request({
url: '/admin/user',
method: 'put',
data: obj,
});
};
export function getDetails(obj: Object) {
return request({
url: '/admin/user/details',
method: 'get',
params: obj,
});
}
// 更改个人信息
export function editInfo(obj: Object) {
return request({
url: '/admin/user/personal/edit',
method: 'put',
data: obj,
});
}
// 更改个人密码
export function password(obj: Object) {
return request({
url: '/admin/user/personal/password',
method: 'put',
data: obj,
});
}
export function unbindingUser(type) {
return request({
url: '/admin/user/unbinding',
method: 'post',
params: {
type,
},
});
}
export function checkPassword(password: string) {
return request({
url: '/admin/user/check',
method: 'post',
params: {
password,
},
});
}
/**
* 注册用户
*/
export const registerUser = (userInfo: object) => {
return request({
url: '/admin/register/user',
method: 'post',
data: userInfo,
});
};
export const resetUserPassword = (userInfo: object) => {
return request({
url: '/admin/register/password',
method: 'post',
data: userInfo,
});
};
export function validateUsername(rule: any, value: any, callback: any, isEdit: boolean) {
const flag = new RegExp(/^([a-z\d]+?)$/).test(value);
if (!flag) {
callback(new Error('用户名支持小写英文、数字'));
}
if (isEdit) {
return callback();
}
getDetails({ username: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('用户名已经存在'));
} else {
callback();
}
});
}
export function validatePhone(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getDetails({ phone: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('手机号已经存在'));
} else {
callback();
}
});
}
+40
View File
@@ -0,0 +1,40 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/app/appArticle/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/app/appArticle',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: `/app/appArticle/details/${id}/1`,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/app/appArticle',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/app/appArticle',
method: 'put',
data: obj,
});
}
+47
View File
@@ -0,0 +1,47 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/app/appArticleCategory/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/app/appArticleCategory',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/app/appArticleCategory/' + id,
method: 'get',
});
}
export function getObjList() {
return request({
url: '/app/appArticleCategory/list',
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/app/appArticleCategory',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/app/appArticleCategory',
method: 'put',
data: obj,
});
}
+113
View File
@@ -0,0 +1,113 @@
import request from '/@/utils/request';
export function fetchList(query: any) {
return request({
url: '/app/approle/page',
method: 'get',
params: query,
});
}
export function list() {
return request({
url: '/app/approle/list',
method: 'get',
});
}
export function addObj(obj: any) {
return request({
url: '/app/approle',
method: 'post',
data: obj,
});
}
export function getObj(id: string) {
return request({
url: '/app/approle/' + id,
method: 'get',
});
}
export function delObj(ids?: object) {
return request({
url: '/app/approle',
method: 'delete',
data: ids,
});
}
export function putObj(obj: any) {
return request({
url: '/app/approle',
method: 'put',
data: obj,
});
}
export function fetchRoleTree(roleId: string) {
return request({
url: '/app/appmenu/tree/' + roleId,
method: 'get',
});
}
export function permissionUpd(roleId: string, menuIds: string) {
return request({
url: '/app/approle/menu',
method: 'put',
data: {
roleId: roleId,
menuIds: menuIds,
},
});
}
export function getDetails(obj: Object) {
return request({
url: '/app/approle/details/' + obj,
method: 'get',
});
}
export function getDetailsByCode(obj: Object) {
return request({
url: '/app/approle/detailsByCode/' + obj,
method: 'get',
});
}
export function validateApproleName(rule: any, value: any, callback: any, isEdit: boolean) {
const flag = new RegExp(/^([a-z\u4e00-\u9fa5\d]+?)$/).test(value);
if (!flag) {
callback(new Error('用户名支持小写英文、数字、中文'));
}
if (isEdit) {
return callback();
}
getDetails(value).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('用户名已经存在'));
} else {
callback();
}
});
}
export function validateAppRoleCode(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getDetailsByCode(value).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('角色标识已经存在'));
} else {
callback();
}
});
}
+39
View File
@@ -0,0 +1,39 @@
import request from '/@/utils/request';
export function fetchList(query: any) {
return request({
url: '/app/approlemenu/page',
method: 'get',
params: query,
});
}
export function addObj(obj: any) {
return request({
url: '/app/approlemenu',
method: 'post',
data: obj,
});
}
export function getObj(id: string) {
return request({
url: '/app/approlemenu/' + id,
method: 'get',
});
}
export function delObj(id: string) {
return request({
url: '/app/approlemenu/' + id,
method: 'delete',
});
}
export function putObj(obj: string) {
return request({
url: '/app/approlemenu',
method: 'put',
data: obj,
});
}
+40
View File
@@ -0,0 +1,40 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/app/appsocial/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/app/appsocial',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/app/appsocial/' + id,
method: 'get',
});
}
export function delObj(ids?: object) {
return request({
url: '/app/appsocial',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/app/appsocial',
method: 'put',
data: obj,
});
}
+86
View File
@@ -0,0 +1,86 @@
import request from '/@/utils/request';
export function fetchList(query: any) {
return request({
url: '/app/appuser/page',
method: 'get',
params: query,
});
}
export function addObj(obj: any) {
return request({
url: '/app/appuser',
method: 'post',
data: obj,
});
}
export function getObj(id: string) {
return request({
url: '/app/appuser/details/' + id,
method: 'get',
});
}
export function delObj(ids?: object) {
return request({
url: '/app/appuser',
method: 'delete',
data: ids,
});
}
export function putObj(obj: any) {
return request({
url: '/app/appuser',
method: 'put',
data: obj,
});
}
export function getDetails(obj: Object) {
return request({
url: '/app/appuser/details',
method: 'get',
params: obj,
});
}
export function validateUsername(rule: any, value: any, callback: any, isEdit: boolean) {
const flag = new RegExp(/^([a-z\d]+?)$/).test(value);
if (!flag) {
callback(new Error('用户名支持小写英文、数字'));
}
if (isEdit) {
return callback();
}
getDetails({
username: value,
}).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('用户名已经存在'));
} else {
callback();
}
});
}
export function validatePhone(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getDetails({
phone: value,
}).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('手机号已经存在'));
} else {
callback();
}
});
}
+39
View File
@@ -0,0 +1,39 @@
import request from '/@/utils/request';
export function fetchList(query: any) {
return request({
url: '/app/appuserrole/page',
method: 'get',
params: query,
});
}
export function addObj(obj: any) {
return request({
url: '/app/appuserrole',
method: 'post',
data: obj,
});
}
export function getObj(id: string) {
return request({
url: '/app/appuserrole/' + id,
method: 'get',
});
}
export function delObj(id: string) {
return request({
url: '/app/appuserrole/' + id,
method: 'delete',
});
}
export function putObj(obj: any) {
return request({
url: '/app/appuserrole',
method: 'put',
data: obj,
});
}
+40
View File
@@ -0,0 +1,40 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/app/page/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/app/appPage',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/app/appPage/' + id,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/app/page',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/app/appPage',
method: 'put',
data: obj,
});
}
+40
View File
@@ -0,0 +1,40 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/app/appTabbar/list',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/app/appTabbar',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/app/appTabbar/' + id,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/app/appTabbar',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/app/appTabbar',
method: 'put',
data: obj,
});
}
+41
View File
@@ -0,0 +1,41 @@
import request from "/@/utils/request"
export function fetchList(query?: Object) {
return request({
url: '/canteen/canteenCategory/page',
method: 'get',
params: query
})
}
export function addObj(obj?: Object) {
return request({
url: '/canteen/canteenCategory',
method: 'post',
data: obj
})
}
export function getObj(id?: string) {
return request({
url: '/canteen/canteenCategory/' + id,
method: 'get'
})
}
export function delObjs(ids?: Object) {
return request({
url: '/canteen/canteenCategory',
method: 'delete',
data: ids
})
}
export function putObj(obj?: Object) {
return request({
url: '/canteen/canteenCategory',
method: 'put',
data: obj
})
}
+41
View File
@@ -0,0 +1,41 @@
import request from "/@/utils/request"
export function fetchList(query?: Object) {
return request({
url: '/canteen/canteenSpu/page',
method: 'get',
params: query
})
}
export function addObj(obj?: Object) {
return request({
url: '/canteen/canteenSpu',
method: 'post',
data: obj
})
}
export function getObj(id?: string) {
return request({
url: '/canteen/canteenSpu/' + id,
method: 'get'
})
}
export function delObjs(ids?: Object) {
return request({
url: '/canteen/canteenSpu',
method: 'delete',
data: ids
})
}
export function putObj(obj?: Object) {
return request({
url: '/canteen/canteenSpu',
method: 'put',
data: obj
})
}
+17
View File
@@ -0,0 +1,17 @@
import request from '/@/utils/request';
export function fetchList(query: any) {
return request({
url: '/job/sys-job-log/page',
method: 'get',
params: query,
});
}
export function delObjs(ids: object) {
return request({
url: '/job/sys-job-log',
method: 'delete',
data: ids,
});
}
+60
View File
@@ -0,0 +1,60 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/job/sys-job/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/job/sys-job',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/job/sys-job/' + id,
method: 'get',
});
}
export function delObj(id?: string) {
return request({
url: '/job/sys-job/' + id,
method: 'delete',
});
}
export function putObj(obj?: Object) {
return request({
url: '/job/sys-job',
method: 'put',
data: obj,
});
}
export function startJobRa(jobId: string) {
return request({
url: '/job/sys-job/start-job/' + jobId,
method: 'post',
});
}
export function runJobRa(jobId: string) {
return request({
url: '/job/sys-job/run-job/' + jobId,
method: 'post',
});
}
export function shutDownJobRa(jobId: string) {
return request({
url: '/job/sys-job/shutdown-job/' + jobId,
method: 'post',
});
}
+75
View File
@@ -0,0 +1,75 @@
import request from '/@/utils/request';
/**
* 创建流程
*
* @param data
*/
export function addFlow(data: any) {
return request({
url: '/task/process/create',
method: 'post',
data: data,
});
}
/**
* 获取流程详细信息
*
* @param data
*/
export function getFlowDetail(flowId: string) {
return request({
url: '/task/process/getDetail?flowId=' + flowId,
method: 'get',
});
}
/**
* 停用流程
*
* @param data
*/
export function disableFlow(flowId: string) {
return request({
url: '/task/process/update/' + flowId + '?type=stop',
method: 'put',
});
}
/**
* 删除流程
*
* @param data
*/
export function deleteFlow(flowId: string) {
return request({
url: '/task/process/update/' + flowId + '?type=delete',
method: 'put',
});
}
/**
* 启用流程
*
* @param data
*/
export function enableFlow(flowId: string) {
return request({
url: '/task/process/update/' + flowId + '?type=using',
method: 'put',
});
}
/**
* 发起流程
*
* @param data
*/
export function startFlow(obj: any) {
return request({
url: '/task/process-instance/startProcessInstance',
method: 'post',
data: obj,
});
}
+16
View File
@@ -0,0 +1,16 @@
/**
* 菜单视图对象类型
*/
export interface FlowVO {
stop?: boolean;
updated?: string;
/**
* 菜单ID
*/
formId?: string;
/**
* 菜单名称
*/
formName?: string;
}
+63
View File
@@ -0,0 +1,63 @@
import request from '/@/utils/request';
import { AxiosPromise } from 'axios';
import { Group, GroupVO } from './types';
/**
* 添加分组
*
* @param data
*/
export function addGroup(data: Group) {
return request({
url: '/task/processGroup/create',
method: 'post',
data: data,
});
}
/**
* 删除分组
*
* @param data
*/
export function delGroup(id: number) {
return request({
url: '/task/processGroup/delete/' + id,
method: 'delete',
});
}
/**
* 查询分组列表
*/
export function queryGroupList(): AxiosPromise<GroupVO[]> {
return request({
url: '/task/processGroup/list',
method: 'get',
});
}
/**
* 查询分组和流程列表
*/
export function queryGroupFlowList(params?: Object) {
return request({
url: '/task/combination/group/listGroupWithProcess',
method: 'get',
params: params,
});
}
/**
* 查询我可发起的组和流程
*/
export function queryMineStartGroupFlowList(hidden?: string): AxiosPromise<GroupVO[]> {
return request({
url: '/task/combination/group/listCurrentUserStartGroup',
method: 'get',
params: { hidden: hidden },
});
}
+27
View File
@@ -0,0 +1,27 @@
import { FlowVO } from '/@/api/flow/flow/types';
/**
* 菜单查询参数类型
*/
export interface Group {
groupName?: string;
}
/**
* 菜单视图对象类型
*/
export interface GroupVO {
/**
* 子菜单
*/
items?: FlowVO[];
/**
* 菜单ID
*/
id?: number;
/**
* 菜单名称
*/
name?: string;
}
+10
View File
@@ -0,0 +1,10 @@
import request from '/@/utils/request';
// 流程详情
export function detail(param: any) {
return request({
url: '/task/process-instance/detail',
method: 'get',
params: param,
});
}
+114
View File
@@ -0,0 +1,114 @@
import request from '/@/utils/request';
// 查询用户首页数据看板
export function queryTaskData() {
return request({
url: '/task/task/queryTaskData',
method: 'get',
});
}
// 查询抄送详细信息
export function queryMineCCDetail(param: any) {
return request({
url: '/task/processCopy/querySingleDetail',
method: 'get',
params: param,
});
}
/**
* 抄送给我的
*
* @param data
*/
export function queryMineCC(data: any) {
return request({
url: '/task/process-instance/queryMineCC',
method: 'post',
data: data,
});
}
/**
* 查询待办任务
*
* @param data
*/
export function queryMineTask(data: any) {
return request({
url: '/task/process-instance/queryMineTask',
method: 'post',
data: data,
});
}
// 结束流程
export function stopProcessInstance(param: any) {
return request({
url: '/task/task/stopProcessInstance',
method: 'post',
data: param,
});
}
/**
* 查询我发起的任务
*
* @param data
*/
export function queryMineStarted(data: any) {
return request({
url: '/task/process-instance/queryMineStarted',
method: 'post',
data: data,
});
}
// 查询当前用户已办任务
export function queryMineEndTask(param) {
return request({
url: '/task/process-instance/queryMineEndTask',
method: 'post',
data: param,
});
}
/**
* 查询任务详细信息
*
* @param data
*/
export function queryTask(taskId: string, view: boolean) {
return request({
url: '/task/task/queryTask?taskId=' + taskId + '&view=' + view,
method: 'get',
});
}
// 完成任务
export function completeTask(param: Object) {
return request({
url: '/task/task/completeTask',
method: 'post',
data: param,
});
}
// 完成任务
export function transferTask(param: Object) {
return request({
url: '/task/task/setAssignee',
method: 'post',
data: param,
});
}
// 格式化流程节点显示
export function formatStartNodeShow(param: Object) {
return request({
url: '/task/process-instance/formatStartNodeShow',
method: 'post',
data: param,
});
}
+55
View File
@@ -0,0 +1,55 @@
import request from "/@/utils/request"
export function fetchList(query?: Object) {
return request({
url: '/gen/create-table/page',
method: 'get',
params: query
})
}
export function addObj(obj?: Object) {
return request({
url: '/gen/create-table',
method: 'post',
data: obj
})
}
export function tempStore(obj: any) {
return request({
url: '/gen/create-table/temp-store',
method: 'post',
data: obj
})
}
export function getObj(id: any) {
return request({
url: '/gen/create-table/' + id,
method: 'get'
})
}
export function delObj(id: any) {
return request({
url: '/gen/create-table/' + id,
method: 'delete'
})
}
export function delObjs(ids?: Object) {
return request({
url: '/gen/create-table',
method: 'delete',
data: ids
})
}
export function putObj(obj?: Object) {
return request({
url: '/gen/create-table',
method: 'put',
data: obj
})
}
+56
View File
@@ -0,0 +1,56 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/gen/dsconf/page',
method: 'get',
params: query,
});
}
export function list(query?: Object) {
return request({
url: '/gen/dsconf/list',
method: 'get',
params: query,
});
}
export function listTable(query?: Object) {
return request({
url: '/gen/dsconf/table/list',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/gen/dsconf',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/gen/dsconf/' + id,
method: 'get',
});
}
export function delObj(ids?: Object) {
return request({
url: '/gen/dsconf',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/gen/dsconf',
method: 'put',
data: obj,
});
}
+71
View File
@@ -0,0 +1,71 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/gen/fieldtype/page',
method: 'get',
params: query,
});
}
export function list(query?: Object) {
return request({
url: '/gen/fieldtype/list',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/gen/fieldtype',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/gen/fieldtype/details/' + id,
method: 'get',
});
}
export function getObjDetails(obj?: object) {
return request({
url: '/gen/fieldtype/details',
method: 'get',
params: obj,
});
}
export function delObj(ids?: object) {
return request({
url: '/gen/fieldtype',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/gen/fieldtype',
method: 'put',
data: obj,
});
}
export function validateColumnType(rule: any, value: any, callback: any, isEdit: boolean) {
if (isEdit) {
return callback();
}
getObjDetails({ columnType: value }).then((response) => {
const result = response.data;
if (result !== null) {
callback(new Error('类型已经存在'));
} else {
callback();
}
});
}
+47
View File
@@ -0,0 +1,47 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/gen/group/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/gen/group',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/gen/group/' + id,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/gen/group',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/gen/group',
method: 'put',
data: obj,
});
}
export function list() {
return request({
url: '/gen/group/list',
method: 'get',
});
}
+128
View File
@@ -0,0 +1,128 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/gen/table/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/gen/table',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/gen/table/' + id,
method: 'get',
});
}
export function delObj(id?: string) {
return request({
url: '/gen/table/' + id,
method: 'delete',
});
}
export function putObj(obj?: Object) {
return request({
url: '/gen/table',
method: 'put',
data: obj,
});
}
export const useSyncTableApi = (dsName: string, tableName: string) => {
return request.get('/gen/table/sync/' + dsName + '/' + tableName);
};
export const useTableApi = (dsName: string, tableName: string) => {
return request.get('/gen/table/' + dsName + '/' + tableName);
};
export const useListTableApi = (dsName: string) => {
return request.get('/gen/table/list/' + dsName);
};
export const useListTableColumnApi = (dsName: string, tableName: string) => {
return request.get('/gen/table/column/' + dsName + '/' + tableName);
};
export const useTableFieldSubmitApi = (dsName: string, tableName: string, fieldList: any) => {
return request.put('/gen/table/field/' + dsName + '/' + tableName, fieldList);
};
export const useGeneratorCodeApi = (tableIds: any) => {
return request({
url: '/gen/generator/code',
method: 'get',
params: { tableIds: tableIds },
});
};
export const useGeneratorVFormApi = (dsName: any, tableName: any) => {
return request({
url: '/gen/generator/vform',
method: 'get',
params: { dsName: dsName, tableName: tableName },
});
};
export const useGeneratorVFormSfcApi = (id: string) => {
return request({
url: '/gen/generator/vform/sfc',
method: 'get',
params: { formId: id },
});
};
export const useGeneratorPreviewApi = (tableId: any) => {
return request({
url: '/gen/generator/preview',
method: 'get',
params: { tableId: tableId },
});
};
export function fetchDictList() {
return request({
url: '/admin/dict/list',
method: 'get',
});
}
export function useFormConfSaveApi(obj?: Object) {
return request({
url: '/gen/form',
method: 'post',
data: obj,
});
}
export function fetchFormList(query?: Object) {
return request({
url: '/gen/form/page',
method: 'get',
params: query,
});
}
export function fetchFormById(id?: string) {
return request({
url: '/gen/form/' + id,
method: 'get',
});
}
export function delFormObj(id?: string) {
return request({
url: '/gen/form/' + id,
method: 'delete',
});
}
+61
View File
@@ -0,0 +1,61 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/gen/template/page',
method: 'get',
params: query,
});
}
export function list() {
return request({
url: '/gen/template/list',
method: 'get',
});
}
export function online() {
return request({
url: '/gen/template/online',
method: 'get',
});
}
export function checkVersion() {
return request({
url: '/gen/template/checkVersion',
method: 'get',
});
}
export function addObj(obj?: Object) {
return request({
url: '/gen/template',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/gen/template/' + id,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/gen/template',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/gen/template',
method: 'put',
data: obj,
});
}
+171
View File
@@ -0,0 +1,171 @@
import request from '/@/utils/request';
import {Session} from '/@/utils/storage';
import {validateNull} from '/@/utils/validate';
import {useUserInfo} from '/@/stores/userInfo';
import other from '/@/utils/other';
/**
* https://www.ietf.org/rfc/rfc6749.txt
* OAuth 协议 4.3.1 要求格式为 form 而不是 JSON 注意!
*/
const FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded';
// 登录方式
export enum LoginTypeEnum {
PASSWORD,
MOBILE,
REGISTER,
EXPIRE
}
// 登录错误信息
export enum LoginErrorEnum {
CREDENTIALS_EXPIRED = 'credentials_expired'// 密码过期
}
/**
* 登录
* @param data
*/
export const login = (data: any) => {
const basicAuth = 'Basic ' + window.btoa(import.meta.env.VITE_OAUTH2_PASSWORD_CLIENT);
Session.set('basicAuth', basicAuth);
// 密码加密
const encPassword = other.encryption(data.password, import.meta.env.VITE_PWD_ENC_KEY);
const { username, randomStr, code, grant_type, scope } = data;
return request({
url: '/auth/oauth2/token',
method: 'post',
params: { username, randomStr, code, grant_type, scope },
data: { password: encPassword },
headers: {
skipToken: true,
Authorization: basicAuth,
'Content-Type': FORM_CONTENT_TYPE,
},
});
};
export const loginByMobile = (mobile: any, code: any) => {
const grant_type = 'mobile';
const scope = 'server';
const basicAuth = 'Basic ' + window.btoa(import.meta.env.VITE_OAUTH2_MOBILE_CLIENT);
Session.set('basicAuth', basicAuth);
return request({
url: '/auth/oauth2/token',
headers: {
skipToken: true,
Authorization: basicAuth,
'Content-Type': FORM_CONTENT_TYPE,
},
method: 'post',
params: { mobile: 'SMS@' + mobile, code: code, grant_type, scope },
});
};
export const loginBySocial = (state: string, code: string) => {
const grant_type = 'mobile';
const scope = 'server';
const basicAuth = 'Basic ' + window.btoa(import.meta.env.VITE_OAUTH2_SOCIAL_CLIENT);
Session.set('basicAuth', basicAuth);
return request({
url: '/auth/oauth2/token',
headers: {
skipToken: true,
Authorization: basicAuth,
'Content-Type': FORM_CONTENT_TYPE,
},
method: 'post',
params: { mobile: state + '@' + code, code: code, grant_type, scope },
});
};
export const sendMobileCode = (mobile: string) => {
return request({
url: '/admin/sysMessage/send/smsCode',
method: 'get',
params: { mobile }
});
};
export const refreshTokenApi = (refresh_token: string) => {
const grant_type = 'refresh_token';
const scope = 'server';
// 获取当前选中的 basic 认证信息
const basicAuth = Session.get('basicAuth');
return request({
url: '/auth/oauth2/token',
headers: {
skipToken: true,
Authorization: basicAuth,
'Content-Type': FORM_CONTENT_TYPE,
},
method: 'post',
params: { refresh_token, grant_type, scope },
});
};
/**
* 校验令牌,若有效期小于半小时自动续期
* @param refreshLock
*/
export const checkToken = (refreshTime: number, refreshLock: boolean) => {
const basicAuth = Session.get('basicAuth');
request({
url: '/auth/token/check_token',
headers: {
skipToken: true,
Authorization: basicAuth,
'Content-Type': FORM_CONTENT_TYPE,
},
method: 'get',
params: { token: Session.getToken() },
})
.then((response) => {
if (validateNull(response) || response.code === 1) {
clearInterval(refreshTime);
return;
}
const expire = Date.parse(response.data.expiresAt);
if (expire) {
const expiredPeriod = expire - new Date().getTime();
//小于半小时自动续约
if (expiredPeriod <= 30 * 60 * 1000) {
if (!refreshLock) {
refreshLock = true;
useUserInfo()
.refreshToken()
.catch(() => {
clearInterval(refreshTime);
});
refreshLock = false;
}
}
}
})
.catch(() => {
// 发生异常关闭定时器
clearInterval(refreshTime);
});
};
/**
* 获取用户信息
*/
export const getUserInfo = () => {
return request({
url: '/admin/user/info',
method: 'get',
});
};
export const logout = () => {
return request({
url: '/auth/token/logout',
method: 'delete',
});
};
+79
View File
@@ -0,0 +1,79 @@
/*
* Copyright (c) 2018-2025, pjcloud All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: pjcloud
*/
import request from '/@/utils/request';
export function fetchList(query) {
return request({
url: '/mp/wx-account-fans/page',
method: 'get',
params: query,
});
}
export function addObj(obj) {
return request({
url: '/mp/wx-account-fans',
method: 'post',
data: obj,
});
}
export function sync(appId) {
return request({
url: '/mp/wx-account-fans/sync/' + appId,
method: 'post',
});
}
export function getObj(id) {
return request({
url: '/mp/wx-account-fans/' + id,
method: 'get',
});
}
export function delObjs(id) {
return request({
url: '/mp/wx-account-fans/' + id,
method: 'delete',
});
}
export function putObj(obj) {
return request({
url: '/mp/wx-account-fans',
method: 'put',
data: obj,
});
}
export function black(obj, appid) {
return request({
url: '/mp/wx-account-fans/black/' + appid,
method: 'post',
data: obj,
});
}
export function unblack(obj, appid) {
return request({
url: '/mp/wx-account-fans/unblack/' + appid,
method: 'post',
data: obj,
});
}
+65
View File
@@ -0,0 +1,65 @@
/*
* Copyright (c) 2018-2025, pjcloud All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: pjcloud
*/
import request from '/@/utils/request';
export function getPage(query) {
return request({
url: '/mp/wx-account-tag/page',
method: 'get',
params: query,
});
}
export function addObj(obj) {
return request({
url: '/mp/wx-account-tag',
method: 'post',
data: obj,
});
}
export function delObjs(obj) {
return request({
url: '/mp/wx-account-tag',
method: 'delete',
data: obj,
});
}
export function putObj(obj) {
return request({
url: '/mp/wx-account-tag',
method: 'put',
data: obj,
});
}
export function sync(appId) {
return request({
url: '/mp/wx-account-tag/sync/' + appId,
method: 'post',
});
}
export function list(appId) {
return request({
url: '/mp/wx-account-tag/list',
method: 'get',
params: { wxAccountAppid: appId },
});
}
+86
View File
@@ -0,0 +1,86 @@
/*
* Copyright (c) 2018-2025, pjcloud All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: pjcloud
*/
import request from '/@/utils/request';
export function fetchList(query) {
return request({
url: '/mp/wx-account/page',
method: 'get',
params: query,
});
}
export function addObj(obj) {
return request({
url: '/mp/wx-account',
method: 'post',
data: obj,
});
}
export function getObj(id) {
return request({
url: '/mp/wx-account/' + id,
method: 'get',
});
}
export function generateQr(appid) {
return request({
url: '/mp/wx-account/qr/' + appid,
method: 'post',
});
}
export function clearQuota(appid) {
return request({
url: '/mp/wx-account/clear-quota/' + appid,
method: 'post',
});
}
export function delObjs(id) {
return request({
url: '/mp/wx-account/' + id,
method: 'delete',
});
}
export function putObj(obj) {
return request({
url: '/mp/wx-account',
method: 'put',
data: obj,
});
}
export function fetchAccountList(obj?: object) {
return request({
url: '/mp/wx-account/list',
method: 'get',
params: obj,
});
}
export function fetchStatistics(q) {
return request({
url: '/mp/wx-account/statistics',
method: 'get',
params: q,
});
}
+39
View File
@@ -0,0 +1,39 @@
import request from '/@/utils/request';
export function getPage(query) {
return request({
url: '/mp/wx-auto-reply/page',
method: 'get',
params: query,
});
}
export function addObj(obj) {
return request({
url: '/mp/wx-auto-reply',
method: 'post',
data: obj,
});
}
export function getObj(id) {
return request({
url: '/mp/wx-auto-reply/' + id,
method: 'get',
});
}
export function delObj(id) {
return request({
url: '/mp/wx-auto-reply/' + id,
method: 'delete',
});
}
export function putObj(obj) {
return request({
url: '/mp/wx-auto-reply',
method: 'put',
data: obj,
});
}
+79
View File
@@ -0,0 +1,79 @@
/*
* Copyright (c) 2018-2025, pjcloud All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: pjcloud
*/
import request from '/@/utils/request';
export function fetchList(query) {
return request({
url: '/mp/wx-fans-msg/page',
method: 'get',
params: query,
});
}
export function addObj(obj) {
return request({
url: '/mp/wx-fans-msg',
method: 'post',
data: obj,
});
}
export function getObj(id) {
return request({
url: '/mp/wxfansmsg/' + id,
method: 'get',
});
}
export function delObjs(id) {
return request({
url: '/mp/wxfansmsg/' + id,
method: 'delete',
});
}
export function putObj(obj) {
return request({
url: '/mp/wxfansmsg',
method: 'put',
data: obj,
});
}
export function fetchResList(query) {
return request({
url: '/mp/wx-fans-msg/page',
method: 'get',
params: query,
});
}
export function addResObj(obj) {
return request({
url: '/mp/wx-fans-msg',
method: 'post',
data: obj,
});
}
export function delResObj(id) {
return request({
url: '/mp/wx-fans-msg/' + id,
method: 'delete',
});
}
+74
View File
@@ -0,0 +1,74 @@
import request from '/@/utils/request';
export function getPage(query) {
return request({
url: '/mp/wx-material/page',
method: 'get',
params: query,
});
}
export function addObj(obj) {
return request({
url: '/mp/wx-material/materialNews',
method: 'post',
data: obj,
});
}
export function materialNewsUpdate(obj) {
return request({
url: '/mp/wx-material/materialNews',
method: 'put',
data: obj,
});
}
export function getObj(id) {
return request({
url: '/mp/wx-material/' + id,
method: 'get',
});
}
export function delObj(query) {
return request({
url: '/mp/wx-material',
method: 'delete',
params: query,
});
}
export function putObj(obj) {
return request({
url: '/mp/wx-material',
method: 'put',
data: obj,
});
}
export function getMaterialOther(query) {
return request({
url: '/mp/wx-material/materialOther',
method: 'get',
params: query,
responseType: 'blob',
});
}
export function getMaterialVideo(query) {
return request({
url: '/mp/wx-material/materialVideo',
method: 'get',
params: query,
});
}
export function getTempMaterialOther(query) {
return request({
url: '/mp/wx-material/tempMaterialOther',
method: 'get',
params: query,
responseType: 'blob',
});
}
+40
View File
@@ -0,0 +1,40 @@
/*
* Copyright (c) 2018-2025, pjcloud All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: pjcloud
*/
import request from '/@/utils/request';
export function getObj(id) {
return request({
url: '/mp/wx-menu/' + id,
method: 'get',
});
}
export function saveObj(appId, data) {
return request({
url: '/mp/wx-menu/' + appId,
method: 'post',
data: data,
});
}
export function publishObj(id) {
return request({
url: '/mp/wx-menu/' + id,
method: 'put',
});
}
+9
View File
@@ -0,0 +1,9 @@
import request from '/@/utils/request';
export function useBuyApi(amount?: any) {
return request({
url: '/pay/goods/merge/buy',
method: 'get',
params: { amount: amount },
});
}
+40
View File
@@ -0,0 +1,40 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/pay/channel/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/pay/channel',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/pay/channel/' + id,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/pay/channel',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/pay/channel',
method: 'put',
data: obj,
});
}
+40
View File
@@ -0,0 +1,40 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/pay/goods/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/pay/goods',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/pay/goods/' + id,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/pay/goods',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/pay/goods',
method: 'put',
data: obj,
});
}
+40
View File
@@ -0,0 +1,40 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/pay/notify/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/pay/notify',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/pay/notify/' + id,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/pay/notify',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/pay/notify',
method: 'put',
data: obj,
});
}
+40
View File
@@ -0,0 +1,40 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/pay/refund/page',
method: 'get',
params: query,
});
}
export function useRefundApi(obj?: Object) {
return request({
url: '/pay/refund',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/pay/refund/' + id,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/pay/refund',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/pay/refund',
method: 'put',
data: obj,
});
}
+40
View File
@@ -0,0 +1,40 @@
import request from '/@/utils/request';
export function fetchList(query?: Object) {
return request({
url: '/pay/trade/page',
method: 'get',
params: query,
});
}
export function addObj(obj?: Object) {
return request({
url: '/pay/trade',
method: 'post',
data: obj,
});
}
export function getObj(id?: string) {
return request({
url: '/pay/trade/' + id,
method: 'get',
});
}
export function delObjs(ids?: Object) {
return request({
url: '/pay/trade',
method: 'delete',
data: ids,
});
}
export function putObj(obj?: Object) {
return request({
url: '/pay/trade',
method: 'put',
data: obj,
});
}
+41
View File
@@ -0,0 +1,41 @@
import request from "/@/utils/request"
export function fetchList(query?: Object) {
return request({
url: '/thirdparty/thirdPartyDept/page',
method: 'get',
params: query
})
}
export function addObj(obj?: Object) {
return request({
url: '/thirdparty/thirdPartyDept',
method: 'post',
data: obj
})
}
export function getObj(id?: string) {
return request({
url: '/thirdparty/thirdPartyDept/' + id,
method: 'get'
})
}
export function delObjs(ids?: Object) {
return request({
url: '/thirdparty/thirdPartyDept',
method: 'delete',
data: ids
})
}
export function putObj(obj?: Object) {
return request({
url: '/thirdparty/thirdPartyDept',
method: 'put',
data: obj
})
}
+41
View File
@@ -0,0 +1,41 @@
import request from "/@/utils/request"
export function fetchList(query?: Object) {
return request({
url: '/thirdparty/thirdPartyUser/page',
method: 'get',
params: query
})
}
export function addObj(obj?: Object) {
return request({
url: '/thirdparty/thirdPartyUser',
method: 'post',
data: obj
})
}
export function getObj(id?: string) {
return request({
url: '/thirdparty/thirdPartyUser/' + id,
method: 'get'
})
}
export function delObjs(ids?: Object) {
return request({
url: '/thirdparty/thirdPartyUser',
method: 'delete',
data: ids
})
}
export function putObj(obj?: Object) {
return request({
url: '/thirdparty/thirdPartyUser',
method: 'put',
data: obj
})
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 B

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1680436859217" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12985" xmlns:xlink="http://www.w3.org/1999/xlink" width="45" height="45"><path d="M784.66 462.13V336.37l-168.79 95.52v160.12l168.79 96.49V562.74H927v-100.6H784.66zM615.87 851.55h109.47l1.49-122.18-110.96-65.05v187.23z m116.35-558.98L734.61 97H479.13l80.97 13.55 55.54 9.21 0.23 238.82 116.35-66.01zM106.16 851.55L548.53 927V172.46L97 97l9.16 754.55z" fill="#8a8a8a" p-id="12986"></path></svg>

After

Width:  |  Height:  |  Size: 642 B

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1680436627707" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4215" xmlns:xlink="http://www.w3.org/1999/xlink" width="45" height="45"><path d="M512 1024C230.4 1024 0 793.6 0 512S230.4 0 512 0s512 230.4 512 512-230.4 512-512 512z m259.2-569.6H480c-12.8 0-25.6 12.8-25.6 25.6v64c0 12.8 12.8 25.6 25.6 25.6h176c12.8 0 25.6 12.8 25.6 25.6v12.8c0 41.6-35.2 76.8-76.8 76.8h-240c-12.8 0-25.6-12.8-25.6-25.6V416c0-41.6 35.2-76.8 76.8-76.8h355.2c12.8 0 25.6-12.8 25.6-25.6v-64c0-12.8-12.8-25.6-25.6-25.6H416c-105.6 0-188.8 86.4-188.8 188.8V768c0 12.8 12.8 25.6 25.6 25.6h374.4c92.8 0 169.6-76.8 169.6-169.6v-144c0-12.8-12.8-25.6-25.6-25.6z" fill="#888888" p-id="4216"></path></svg>

After

Width:  |  Height:  |  Size: 860 B

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1680436662087" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5326" xmlns:xlink="http://www.w3.org/1999/xlink" width="45" height="45"><path d="M518.4 691.2c-99.2 0-182.4-64-185.6-185.6-6.4-112 92.8-188.8 188.8-192 108.8-3.2 176 121.6 176 121.6l281.6-102.4S864 32 547.2 32C252.8 35.2 48 236.8 48 512c0 243.2 192 489.6 489.6 476.8C867.2 976 979.2 688 979.2 688L688 592c3.2 3.2-57.6 99.2-169.6 99.2" fill="#8a8a8a" p-id="5327"></path></svg>

After

Width:  |  Height:  |  Size: 625 B

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1680436602191" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4038" xmlns:xlink="http://www.w3.org/1999/xlink" width="45" height="45"><path d="M824.8 613.2c-16-51.4-34.4-94.6-62.7-165.3C766.5 262.2 689.3 112 511.5 112 331.7 112 256.2 265.2 261 447.9c-28.4 70.8-46.7 113.7-62.7 165.3-34 109.5-23 154.8-14.6 155.8 18 2.2 70.1-82.4 70.1-82.4 0 49 25.2 112.9 79.8 159-26.4 8.1-85.7 29.9-71.6 53.8 11.4 19.3 196.2 12.3 249.5 6.3 53.3 6 238.1 13 249.5-6.3 14.1-23.8-45.3-45.7-71.6-53.8 54.6-46.2 79.8-110.1 79.8-159 0 0 52.1 84.6 70.1 82.4 8.5-1.1 19.5-46.4-14.5-155.8z" p-id="4039"></path></svg>

After

Width:  |  Height:  |  Size: 778 B

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1680436062848" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2406" width="24" height="24" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M188.8704 576.192a187.712 187.712 0 0 1 188.928 189.12 189.184 189.184 0 0 1-188.928 190.912A189.184 189.184 0 0 1 0.0064 765.312a187.712 187.712 0 0 1 188.864-189.12z m359.68 250.176v81.472h-61.44a40.128 40.128 0 0 1-39.296-34.688l-0.448-6.016c0-20.48 14.72-37.376 33.92-40.32l5.888-0.384 61.44-0.064z m-359.68-169.664c-60.288 0-109.376 46.848-109.376 108.608 0 61.76 49.088 110.144 109.44 110.144 60.288 0 109.312-48.384 109.312-110.08 0-61.824-49.024-108.672-109.376-108.672z m359.68-59.392v81.408h-61.44a40.128 40.128 0 0 1-39.296-34.624L447.3664 638.08c0-20.48 14.72-37.376 33.92-40.32l5.888-0.448h61.44zM188.8704 64C293.1264 64 377.7984 149.568 377.7984 256.256A188.032 188.032 0 0 1 188.8064 445.76 188.032 188.032 0 0 1 0.0064 256.256C0.0064 149.568 84.7424 64 188.8704 64zM984.3264 342.784a40.32 40.32 0 0 1 39.744 40.704c0 20.48-14.72 37.376-33.92 40.32l-5.824 0.448H487.1744a40.32 40.32 0 0 1-39.808-40.768c0-20.416 14.72-37.376 33.92-40.256l5.888-0.448h497.088zM188.8064 147.584c-60.288 0-109.376 46.912-109.376 108.608 0 61.76 49.088 108.16 109.44 108.16 60.288 0 109.312-46.4 109.312-108.16 0-61.696-49.024-108.608-109.376-108.608z m795.392-33.92a40.32 40.32 0 0 1 39.744 40.768c0 20.416-14.72 37.312-33.92 40.256l-5.824 0.448H487.1744a40.32 40.32 0 0 1-39.808-40.704c0-20.48 14.72-37.376 33.92-40.32l5.888-0.448h497.088zM816.2624 918.528V847.36c0-10.56-16.192-15.872-30.08-15.872-13.824 0-33.152 3.84-33.152 15.872v71.168c0 9.088-6.144 15.104-15.36 15.104h-97.152c-23.104 0-40.064-16.64-40.064-37.824V752c0-9.088 12.8-15.104 22.08-15.104 9.216 0 21.76 6.016 21.76 15.104v133.12c0 4.48 3.072 7.552 9.216 7.552h59.392v-45.312c0-35.456 43.968-56.32 73.28-56.32 29.312 0 72 20.864 72 56.32v45.312h63.168c4.608 0 7.68 0 7.68-9.088V752c0-9.088 12.16-15.104 21.44-15.104 9.28 0 21.44 6.016 21.44 15.104v143.808c-1.536 22.656-16.96 37.824-40.064 37.824h-100.16c-9.28 0-15.424-6.016-15.424-15.104zM582.4064 712.256c-6.08-6.528-9.216-27.904-3.136-32.768l178.88-157.696c16.64-13.056 40.96-13.056 56.064 0l178.88 156.096c6.08 4.864 6.08 27.84 0 34.368-6.016 6.464-27.2 6.464-33.28 0l-163.776-142.72a18.24 18.24 0 0 0-18.176 0L615.0464 716.416c-3.008 3.264-6.016 3.264-9.088 3.264-4.48 0-20.544-2.56-23.616-7.424z" fill="#707070" p-id="2407"></path></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1680436429435" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2757" width="45" height="45" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M405.333333 170.666667C228.693333 170.666667 85.333333 285.44 85.333333 426.666667c0 80.64 46.08 151.893333 118.613334 198.826666L170.666667 725.333333l106.666666-64c37.973333 13.226667 79.786667 21.333333 124.16 21.333334A222.72 222.72 0 0 1 384 597.333333c0-141.226667 133.546667-256 298.666667-256 8.106667 0 16.213333 0 23.893333 1.28C663.04 242.773333 545.28 170.666667 405.333333 170.666667m-128 106.666666c23.466667 0 42.666667 19.2 42.666667 42.666667s-19.2 42.666667-42.666667 42.666667-42.666667-19.2-42.666666-42.666667 19.2-42.666667 42.666666-42.666667m213.333334 0c23.466667 0 42.666667 19.2 42.666666 42.666667s-19.2 42.666667-42.666666 42.666667-42.666667-19.2-42.666667-42.666667 19.2-42.666667 42.666667-42.666667M682.666667 384c-141.226667 0-256 95.573333-256 213.333333s114.773333 213.333333 256 213.333334c28.586667 0 55.893333-3.413333 81.493333-10.666667L853.333333 853.333333l-26.453333-79.786666C893.866667 734.72 938.666667 670.293333 938.666667 597.333333c0-117.76-114.773333-213.333333-256-213.333333m-85.333334 106.666667c23.466667 0 42.666667 19.2 42.666667 42.666666s-19.2 42.666667-42.666667 42.666667-42.666667-19.2-42.666666-42.666667 19.2-42.666667 42.666666-42.666666m170.666667 0c23.466667 0 42.666667 19.2 42.666667 42.666666s-19.2 42.666667-42.666667 42.666667-42.666667-19.2-42.666667-42.666667 19.2-42.666667 42.666667-42.666666z" fill="#8a8a8a" p-id="2758"></path></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1677809803390" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2360" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M891.2 326.4l-121.6 69.6v-144c0-33.6-27.2-60.8-60.8-60.8h-560c-33.6 0-60.8 27.2-60.8 60.8v545.6c0 33.6 27.2 60.8 60.8 60.8h560.8c33.6 0 60.8-27.2 60.8-60.8v-144l121.6 69.6c20 12 45.6-3.2 45.6-26.4v-344c-0.8-23.2-25.6-37.6-46.4-26.4z m-188.8 464H156V260h545.6v530.4z m166.4-157.6L770.4 576V475.2l98.4-56.8v214.4z" p-id="2361"></path><path d="M426.4 600c-0.8 0.8-1.6 1.6-1.6 2.4-5.6 8-10.4 16.8-16.8 24.8-7.2 10.4-16 20.8-25.6 29.6-8 7.2-16.8 13.6-27.2 17.6-6.4 2.4-13.6 3.2-20.8 2.4-6.4-0.8-12-4-16.8-8.8-6.4-5.6-11.2-12.8-15.2-20.8-3.2-6.4-7.2-13.6-9.6-20-3.2-8-7.2-16.8-9.6-25.6-3.2-10.4-6.4-20-9.6-30.4-3.2-10.4-5.6-21.6-8-32-2.4-8.8-4-17.6-5.6-26.4-1.6-8-2.4-16-4-24-0.8-6.4-1.6-13.6-2.4-20 0-2.4 0-4-0.8-6.4-0.8-12-0.8-24 0-35.2 0.8-9.6 2.4-18.4 6.4-27.2s9.6-16 18.4-20.8c7.2-4 14.4-4.8 21.6-3.2 8.8 1.6 16.8 5.6 24.8 11.2 8.8 6.4 16 13.6 23.2 20.8 8 8.8 15.2 17.6 22.4 27.2 8 10.4 15.2 21.6 22.4 32.8 9.6 15.2 18.4 30.4 28 45.6 2.4 3.2 4 6.4 5.6 10.4 0 0.8 0.8 0.8 0.8 1.6 2.4-4 4.8-7.2 7.2-11.2 10.4-17.6 21.6-35.2 33.6-52.8 10.4-15.2 20.8-30.4 32.8-44.8 8-9.6 16-18.4 25.6-25.6 7.2-5.6 14.4-10.4 23.2-12.8 12-4 23.2-2.4 33.6 6.4 5.6 4.8 9.6 10.4 12 16.8 3.2 8 4.8 16 6.4 24 1.6 12 0.8 23.2 0 35.2-0.8 7.2-0.8 13.6-2.4 20.8-1.6 12-3.2 23.2-5.6 35.2-1.6 8-3.2 16.8-5.6 24.8l-7.2 28.8c-2.4 8.8-5.6 18.4-8.8 27.2-4 12.8-9.6 25.6-15.2 37.6-4 8-8 16-12.8 23.2-4 5.6-8.8 10.4-14.4 14.4-6.4 4.8-14.4 5.6-22.4 4.8-12-1.6-21.6-7.2-31.2-14.4-11.2-8.8-20.8-20-29.6-32-6.4-8.8-12.8-18.4-18.4-28 0.8-1.6 0-2.4-0.8-3.2z m139.2-156.8c-0.8-5.6-0.8-11.2-1.6-16.8l-2.4-9.6c-0.8-3.2-3.2-4-6.4-2.4-1.6 0.8-2.4 1.6-4 2.4-7.2 4.8-12.8 11.2-18.4 16.8-12.8 13.6-23.2 28.8-33.6 44-9.6 14.4-18.4 28.8-27.2 43.2-7.2 12-14.4 24-21.6 35.2-3.2 4.8-3.2 4.8 0 10.4 4.8 9.6 10.4 19.2 16.8 28.8 8 12.8 16.8 24.8 28 35.2 2.4 2.4 5.6 4.8 8.8 7.2 4 2.4 8 1.6 10.4-2.4 0-0.8 0.8-0.8 0.8-1.6 6.4-9.6 10.4-20.8 15.2-31.2l9.6-26.4c2.4-6.4 4-12.8 5.6-19.2 3.2-12.8 6.4-24.8 9.6-37.6 2.4-9.6 4-20 5.6-29.6 1.6-8 2.4-15.2 3.2-23.2 0.8-8 1.6-16 1.6-23.2z m-160 117.6c-0.8-0.8-0.8-2.4-1.6-3.2-4-6.4-7.2-12.8-11.2-19.2-8.8-14.4-17.6-29.6-26.4-44-8.8-14.4-18.4-28.8-28.8-42.4-8-11.2-16.8-21.6-27.2-31.2-3.2-3.2-6.4-5.6-9.6-8-3.2-2.4-6.4-1.6-8 2.4-0.8 1.6-1.6 3.2-1.6 4.8-0.8 4.8-1.6 10.4-1.6 15.2-0.8 10.4 0.8 21.6 1.6 32 0.8 8.8 2.4 17.6 4 27.2 1.6 10.4 4 20.8 6.4 31.2 2.4 9.6 4.8 20 7.2 29.6 3.2 10.4 6.4 20.8 9.6 32 4 12 8 23.2 13.6 34.4 2.4 4 4.8 8.8 7.2 12.8 1.6 3.2 5.6 4.8 9.6 2.4 3.2-2.4 7.2-4.8 10.4-8 10.4-9.6 18.4-20 25.6-32 5.6-8 10.4-16 15.2-24.8 1.6-2.4 3.2-6.4 5.6-11.2z" p-id="2362"></path></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1677809829053" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3364" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M873.066667 533.333333h-39.466667c-4.202667 0-8.256 0.576-12.266667 1.237334V433.066667C821.333333 264.853333 682.56 128 512 128S202.666667 264.853333 202.666667 433.066667v101.504A75.434667 75.434667 0 0 0 190.378667 533.333333H150.954667A76.373333 76.373333 0 0 0 74.666667 609.6v210.133333A76.373333 76.373333 0 0 0 150.954667 896h39.445333a76.373333 76.373333 0 0 0 76.288-76.266667V433.066667C266.666667 300.138667 376.725333 192 512 192s245.333333 108.138667 245.333333 241.066667v386.666666A76.352 76.352 0 0 0 833.6 896h39.466667a76.352 76.352 0 0 0 76.266666-76.266667v-210.133333A76.373333 76.373333 0 0 0 873.066667 533.333333zM202.666667 714.666667v105.066666a12.288 12.288 0 0 1-12.288 12.266667H150.954667a12.288 12.288 0 0 1-12.288-12.266667v-210.133333c0-6.762667 5.504-12.266667 12.288-12.266667h39.445333c6.762667 0 12.266667 5.504 12.266667 12.266667V714.666667z m682.666666 105.066666a12.288 12.288 0 0 1-12.266666 12.266667h-39.466667a12.288 12.288 0 0 1-12.266667-12.266667v-210.133333c0-6.762667 5.504-12.266667 12.266667-12.266667h39.466667c6.762667 0 12.266667 5.504 12.266666 12.266667v210.133333z" fill="#232323" p-id="3365"></path><path d="M682.666667 578.666667h-85.333334c-12.394667 0-23.658667 7.168-28.949333 18.368l-9.472 20.138666-52.501333-125.546666c-5.056-12.074667-17.642667-19.477333-30.101334-19.648a32.021333 32.021333 0 0 0-29.376 20.736l-32.362666 85.930666H341.333333a32 32 0 1 0 0 64h95.381334a32 32 0 0 0 29.952-20.736l11.776-31.274666 49.216 117.696c4.885333 11.669333 16.170667 19.349333 28.821333 19.648h0.704a32 32 0 0 0 28.949333-18.368l31.530667-66.965334H682.666667a32 32 0 0 0 0-63.978666z" fill="#232323" p-id="3366"></path></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

+19
View File
@@ -0,0 +1,19 @@
<svg width="100" height="969"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" shape-rendering="auto" preserveAspectRatio="none" class="layout-footer-waves">
<g id="Layer_1">
<title>Layer 1</title>
<g transform="rotate(2.18686 -4.09974 506.2)" stroke="null" id="svg_5">
<defs stroke="null" transform="translate(0.00121616 0.0635973) translate(-0.844727 0.185777) translate(-4.69751 0.0674522) translate(4.80739 0.470252) translate(4.47211 0.0666505) translate(-47.1425 4.28569) translate(7.74305 4.90188) translate(-28.5712 -22.857) translate(-0.219291 4.06319) translate(-1.32311 -4.516) translate(22.5706 18.2109) translate(-49.4342 -5.96675) translate(-0.909089 0) translate(0.909089 0) translate(-0.909089 0) translate(-0.909089 0) translate(-0.909089 0) translate(-3.33335 0) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(0 -3.33335) translate(-7.34665 -0.396492) translate(-1.66666 0) translate(-1.66666 0) translate(-0.12551 2.32567) translate(-0.707827 0.218105) translate(-1.66666 0) translate(1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-2.15731 0.0264734) translate(1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(0 -1.66666) translate(0 -1.66666) translate(1.66666 0) translate(0 -1.66666) translate(1.66666 0) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(1.66666 0) translate(1.66666 0) translate(1.66666 0) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(1.66666 0) translate(1.66666 0) translate(1.66666 0) translate(1.66666 0) translate(1.66666 0) translate(1.66666 0) translate(1.66666 0) translate(1.66666 0) translate(1.66666 0) translate(1.66666 0) translate(1.66666 0) translate(1.66666 0) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(0 -1.66666) translate(0 -1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(-1.66666 0) translate(0 1.66666) translate(-1.66666 0) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(0 -1.66666) translate(0 -1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(0 -1.66666) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.66666 0) translate(-1.56355 1.02885) translate(-7.50004 -25.0001) translate(-3.19245 0.846904) translate(5.00003 -97.5005) translate(-9.62431 -0.829817) translate(27.5002 -220.001) translate(-6.96615 1.62281) translate(1.10472 -2.23004) translate(-9.63847 0.899196) translate(7.04019 0.0560654) translate(-11.25 -16.25) translate(2.11523 2.02597) translate(-27.1193 -20.3394) translate(-10.8798 -0.397069) translate(-44.0688 -110.172) translate(-1.69495 5.08486) translate(-8.5Line truncated
<path stroke="null" id="svg_3" d="m-160,44c30,0 58,-18 88,-18s58,18 88,18s58,-18 88,-18s58,18 88,18l0,44l-352,0l0,-44z"/>
</defs>
<g stroke="null" id="svg_6">
<title stroke="null">Layer 1</title>
<g stroke="null" transform="matrix(-0.0217456 0.782606 -0.765199 -0.0222404 584.591 1129.22)" class="layout-footer-waves-g" id="svg_1">
<use stroke="null" href="#svg_3" x="-328.61098" y="405.36815" fill="rgba(211, 239, 255, 1)" id="svg_4" transform="matrix(3.69628 0 0 3.42743 381.903 -787.25)"/>
<use stroke="null" href="#svg_3" x="-333.61098" y="401.76815" fill="rgba(211, 239, 255, 0.5)" id="svg_2" transform="matrix(3.69628 0 0 3.42743 381.903 -787.25)"/>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" width="698.28353" height="608.57869" viewBox="0 0 698.28353 608.57869" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M577.64736,743.9862a1.2164,1.2164,0,0,0,.88158-2.10832l-.08335-.33136.03312-.07954a3.26655,3.26655,0,0,1,6.02554.02239c.98551,2.37356,2.24024,4.75117,2.54918,7.26082a9.66368,9.66368,0,0,1-.16964,3.32354,38.74392,38.74392,0,0,0,3.52438-16.09157,37.39507,37.39507,0,0,0-.232-4.17178q-.19217-1.70334-.53318-3.38243a39.19271,39.19271,0,0,0-7.77227-16.61089,10.4303,10.4303,0,0,1-4.33795-4.50066,7.95618,7.95618,0,0,1-.72357-2.17417,9.81874,9.81874,0,0,0,.637-3.3859c.29431-.44659.82106-.66859,1.14248-1.10437,1.59857-2.16733,3.801-1.78891,4.95075,1.15632,2.45615,1.23962,2.47992,3.29545.97284,5.27269-.95881,1.25793-1.09055,2.96005-1.93184,4.30676.08657.1108.17658.21813.26313.32893a39.44636,39.44636,0,0,1,4.11715,6.52255,16.39792,16.39792,0,0,1,.979-7.61655c.937-2.26055,2.69342-4.16438,4.24012-6.11862a3.36575,3.36575,0,0,1,5.99479,1.65271l.00928.0864q-.34461.1944-.67465.41269a1.65,1.65,0,0,0,.66523,3.00262l.03365.00518a16.41681,16.41681,0,0,1-.43275,2.45462c1.98421,7.67347-2.29956,10.46831-8.41622,10.59386-.135.06923-.26661.13846-.40163.20427a40.26319,40.26319,0,0,1,2.16725,10.19917,38.18792,38.18792,0,0,1-.0277,6.1659l.01039-.07269a10.09082,10.09082,0,0,1,3.44475-5.82663c2.65092-2.17763,6.39617-2.97954,9.25605-4.72993a1.89376,1.89376,0,0,1,2.90049,1.84232l-.0117.07644a11.0834,11.0834,0,0,0-1.24286.59891q-.34461.19444-.67465.41269a1.65,1.65,0,0,0,.66523,3.00265l.03367.00517.06921.01041a16.43129,16.43129,0,0,1-3.02234,4.7326c-1.24068,6.69864-6.56942,7.33419-12.2695,5.38348h-.00348a40.25033,40.25033,0,0,1-2.70387,7.89347h-9.65908c-.03465-.10732-.06579-.21812-.097-.32546a10.97505,10.97505,0,0,0,2.67273-.1592c-.71665-.87938-1.43328-1.76569-2.14994-2.645a.60048.60048,0,0,1-.045-.05193c-.36351-.45-.73049-.89666-1.094-1.34671l-.00019-.00055a16.075,16.075,0,0,1,.471-4.09507Z" transform="translate(-250.85824 -145.71065)" fill="#f2f2f2"/><path d="M336.98262,743.9862a1.2164,1.2164,0,0,1-.88157-2.10832l.08335-.33136-.03312-.07954a3.26656,3.26656,0,0,0-6.02555.02239c-.98551,2.37356-2.24023,4.75117-2.54918,7.26082a9.66393,9.66393,0,0,0,.16964,3.32354,38.74391,38.74391,0,0,1-3.52437-16.09157,37.39507,37.39507,0,0,1,.232-4.17178q.19215-1.70334.53317-3.38243a39.19285,39.19285,0,0,1,7.77228-16.61089,10.43034,10.43034,0,0,0,4.33794-4.50066,7.95618,7.95618,0,0,0,.72357-2.17417,9.819,9.819,0,0,1-.637-3.3859c-.2943-.44659-.82105-.66859-1.14248-1.10437-1.59857-2.16733-3.801-1.78891-4.95074,1.15632-2.45615,1.23962-2.47992,3.29545-.97284,5.27269.95881,1.25793,1.09055,2.96005,1.93184,4.30676-.08657.1108-.17659.21813-.26313.32893a39.4457,39.4457,0,0,0-4.11715,6.52255,16.39805,16.39805,0,0,0-.979-7.61655c-.93706-2.26055-2.69343-4.16438-4.24012-6.11862a3.36576,3.36576,0,0,0-5.9948,1.65271l-.00927.0864q.34459.1944.67464.41269a1.65,1.65,0,0,1-.66523,3.00262l-.03364.00518a16.41681,16.41681,0,0,0,.43275,2.45462c-1.98422,7.67347,2.29956,10.46831,8.41622,10.59386.135.06923.2666.13846.40163.20427a40.262,40.262,0,0,0-2.16725,10.19917,38.18677,38.18677,0,0,0,.0277,6.1659l-.0104-.07269a10.09082,10.09082,0,0,0-3.44475-5.82663c-2.65092-2.17763-6.39617-2.97954-9.256-4.72993a1.89376,1.89376,0,0,0-2.90049,1.84232l.0117.07644a11.08424,11.08424,0,0,1,1.24286.59891q.3446.19444.67465.41269a1.65,1.65,0,0,1-.66524,3.00265l-.03367.00517-.0692.01041a16.43108,16.43108,0,0,0,3.02234,4.7326c1.24068,6.69864,6.56941,7.33419,12.2695,5.38348h.00347a40.251,40.251,0,0,0,2.70387,7.89347h9.65909c.03464-.10732.06579-.21812.097-.32546a10.97508,10.97508,0,0,1-2.67273-.1592c.71666-.87938,1.43329-1.76569,2.14994-2.645a.59875.59875,0,0,0,.045-.05193c.36351-.45.73049-.89666,1.094-1.34671l.0002-.00055a16.07543,16.07543,0,0,0-.471-4.09507Z" transform="translate(-250.85824 -145.71065)" fill="#f2f2f2"/><path d="M482.96471,224.97808c1.95416-3.93451,5.0777-7.20117,6.98822-11.1571,1.91059-3.95587,2.28211-9.25055-.90088-12.27844-2.70269-2.571-6.936-2.607-10.16809-4.46924-8.23425-4.74439-8.22467-19.81372-17.6383-21.11579-4.57758-.63317-8.71942,2.79969-11.48615,6.501-2.76678,3.70136-4.97131,8.02039-8.80841,10.59552-4.34363,2.9151-9.95929,3.04187-14.78265,5.06665-9.24787,3.88208-14.09632,13.8645-18.15027,23.03839-2.61157,5.90985-5.283,12.28412-4.07129,18.63068-2.63385,1.63885-1.46,6.04675,1.16907,7.69318s5.93066,1.60986,8.94964,2.323c6.345,1.4989,11.54041,6.54975,14.00336,12.58619,1.91968,4.70489,2.31219,9.87066,2.68262,14.93859q.964,13.19084,1.928,26.3816c.286,3.91241.66113,8.07019,3.04248,11.1875,2.38141,3.11731,7.53833,4.42358,10.21533,1.55615,2.55835-2.74036,1.40607-7.07874,1.35425-10.82733-.05176-3.7486,3.33685-8.41645,6.532-6.45539l1.12677-2.55664a40.33337,40.33337,0,0,0,26.60254-34.6817C482.36938,249.49053,477.4171,236.14733,482.96471,224.97808Z" transform="translate(-250.85824 -145.71065)" fill="#e6e6e6"/><path d="M490.42248,303.88989a5.07894,5.07894,0,0,0-2.9137-8.74274l.01208.42236a8.73331,8.73331,0,0,1-4.53Line truncated

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="64px" height="64px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
<g><path style="opacity:0.996" fill="#80bb58" d="M 63.5,35.5 C 63.5,37.8333 63.5,40.1667 63.5,42.5C 62.0168,46.1468 59.3501,48.6468 55.5,50C 43.1211,50.186 30.7877,50.686 18.5,51.5C 9.28752,51.7428 2.95418,47.7428 -0.5,39.5C -0.5,37.5 -0.5,35.5 -0.5,33.5C 1.21619,26.6281 5.71619,22.6281 13,21.5C 20.6091,11.8561 29.7758,10.0227 40.5,16C 44.3698,19.3546 46.7031,23.5212 47.5,28.5C 54.366,27.6047 59.6994,29.9381 63.5,35.5 Z M 25.5,17.5 C 36.8229,16.822 42.8229,22.1553 43.5,33.5C 47.5138,33.3345 51.5138,33.5012 55.5,34C 59.5,37.6667 59.5,41.3333 55.5,45C 44.4272,45.9308 33.4272,45.5975 22.5,44C 12.5525,33.8629 13.5525,25.0296 25.5,17.5 Z"/></g>
<g><path style="opacity:0.991" fill="#86be5f" d="M 39.5,33.5 C 43.0131,34.0282 44.0131,35.8615 42.5,39C 37.2894,39.5464 36.2894,37.713 39.5,33.5 Z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

+65
View File
@@ -0,0 +1,65 @@
// base color
$blue: #324157;
$light-blue: #3a71a8;
$red: #c03639;
$pink: #e65d6e;
$green: #30b08f;
$tiffany: #4ab7bd;
$yellow: #fec171;
$panGreen: #30b08f;
// 默认菜单主题风格
$base-menu-color: #bfcbd9;
$base-menu-color-active: #f4f4f5;
$base-menu-background: #304156;
$base-logo-title-color: #ffffff;
$base-menu-light-color: rgba(0, 0, 0, 0.7);
$base-menu-light-background: #ffffff;
$base-logo-light-title-color: #001529;
$base-sub-menu-background: #1f2d3d;
$base-sub-menu-hover: #001528;
// 自定义暗色菜单风格
/**
$base-menu-color:hsla(0,0%,100%,.65);
$base-menu-color-active:#fff;
$base-menu-background:#001529;
$base-logo-title-color: #ffffff;
$base-menu-light-color:rgba(0,0,0,.70);
$base-menu-light-background:#ffffff;
$base-logo-light-title-color: #001529;
$base-sub-menu-background:#000c17;
$base-sub-menu-hover:#001528;
*/
$--color-primary: #409eff;
$--color-success: #67c23a;
$--color-warning: #e6a23c;
$--color-danger: #f56c6c;
$--color-info: #909399;
$base-sidebar-width: 200px;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
menuColor: $base-menu-color;
menuLightColor: $base-menu-light-color;
menuColorActive: $base-menu-color-active;
menuBackground: $base-menu-background;
menuLightBackground: $base-menu-light-background;
subMenuBackground: $base-sub-menu-background;
subMenuHover: $base-sub-menu-hover;
sideBarWidth: $base-sidebar-width;
logoTitleColor: $base-logo-title-color;
logoLightTitleColor: $base-logo-light-title-color;
primaryColor: $--color-primary;
successColor: $--color-success;
dangerColor: $--color-danger;
infoColor: $--color-info;
warningColor: $--color-warning;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

+9
View File
@@ -0,0 +1,9 @@
import request from "/@/utils/request";
export const turbo = (content: string) => {
return request({
url: '/admin/chat/msg',
method: 'post',
data: {content: content},
});
};
+6
View File
@@ -0,0 +1,6 @@
export default {
chat: {
send: 'Send',
inputPlaceholder: 'Type a message...'
}
};
+6
View File
@@ -0,0 +1,6 @@
export default {
chat: {
send: '发送',
inputPlaceholder: '请输入消息...'
},
};
+108
View File
@@ -0,0 +1,108 @@
<template>
<div class="z-[1000]" v-if="getThemeConfig.isChat">
<button id="open-chat"
@click="chatContainer = !chatContainer"
class="fixed mb-16 mr-4 bottom-4 right-4 inline-flex bg-primary items-center justify-center text-sm font-medium disabled:pointer-events-none disabled:opacity-50 border rounded-full w-16 h-16 hover:bg-gray-700 m-0 cursor-pointer border-gray-200 bg-none p-0 normal-case leading-5 hover:text-gray-900"
type="button" aria-haspopup="dialog" aria-expanded="false" data-state="closed">
<svg xmlns=" http://www.w3.org/2000/svg" width="30" height="40" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="text-white block border-gray-200 align-middle">
<path d="m3 21 1.9-5.7a8.5 8.5 0 1 1 3.8 3.8z" class="border-gray-200">
</path>
</svg>
</button>
<div v-show="chatContainer" class="fixed bottom-24 right-4 w-96 mb-12">
<div class="bg-gray-100 shadow-md rounded-lg max-w-lg w-full">
<div class="p-4 border-b bg-primary text-white rounded-t-lg flex justify-between items-center">
<p class="text-lg font-semibold">AI 助手</p>
<button @click="chatContainer = false"
class="text-gray-300 hover:text-gray-400 focus:outline-none focus:text-gray-400">
<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6" fill="none" viewBox="0 0 24 24"
stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
</svg>
</button>
</div>
<div ref="chatboxRef" class="p-4 h-96 overflow-y-auto">
<!-- Chat messages will be displayed here -->
<div v-for="message in messageList">
<div class="mb-2 text-right" v-if="message.inputMessage">
<p class="bg-blue-500 text-white rounded-lg py-2 px-4 inline-block">{{ message.inputMessage }}</p>
</div>
<div class="mb-2" v-if="message.botMessage">
<p class="bg-gray-200 text-gray-700 rounded-lg py-2 px-4 inline-block">{{ message.botMessage }}</p>
</div>
</div>
</div>
<div class="p-4 border-t flex">
<input v-model="userInput" ref="userInputRef" type="text" :placeholder="$t('chat.inputPlaceholder')"
:readonly="readonly"
class="w-full px-3 py-2 border rounded-l-md focus:outline-none focus:ring-2 focus:ring-blue-500">
<button @click="sendMessage"
class="bg-blue-500 text-white px-4 py-2 rounded-r-md hover:bg-blue-600 transition duration-300">{{ $t('chat.send') }}
</button>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts" name="chat">
import {onKeyStroke} from '@vueuse/core'
import {turbo} from "/@/components/Chat/chat";
import {useThemeConfig} from "/@/stores/themeConfig";
import {AxiosResponse} from "axios";
// 定义变量内容
const storesThemeConfig = useThemeConfig();
const {themeConfig} = storeToRefs(storesThemeConfig);
// 获取布局配置信息
const getThemeConfig = computed(() => {
return themeConfig.value;
});
interface Message {
inputMessage?: string;
botMessage?: string;
}
const messageList = ref<Message[]>([{botMessage: '您好!我是通用大模型,请问有什么可以帮助您?'}]);
const chatContainer = ref(false)
const userInput = ref("")
const userInputRef = ref()
const chatboxRef = ref()
const readonly = ref(false)
// watch 判断 messageList 长度是否变化
watch(() => messageList.value.length, (newLength, oldLength) => {
if (newLength !== oldLength) {
setTimeout(() => {
chatboxRef.value.scrollTop = chatboxRef.value.scrollHeight;
}, 500);
}
});
// 发送消息
const sendMessage = () => {
const userMessage = userInput.value;
if (userMessage.trim() !== "") {
readonly.value = true
messageList.value.push({inputMessage: userMessage, botMessage: "正在处理,请等待..."});
turbo(userInput.value).then((response: any) => {
if (response) {
messageList.value[messageList.value.length - 1].botMessage = response
} else {
messageList.value[messageList.value.length - 1].botMessage = "输出数据可能包含不适当内容"
}
}).finally(() => {
readonly.value = false
})
userInput.value = "";
}
};
// 监听回车键事件
onKeyStroke('Enter', (e) => {
sendMessage()
}, {target: userInputRef})
</script>
+19
View File
@@ -0,0 +1,19 @@
<template>
<div></div>
</template>
<script setup lang="ts" name="check-token">
import { checkToken } from '/@/api/login';
const refreshLock = ref(false);
const refreshTime = ref();
onMounted(() => {
refreshToken();
});
const refreshToken = () => {
refreshTime.value = setInterval(() => {
checkToken(refreshTime.value, refreshLock.value);
}, 60000);
};
</script>
+95
View File
@@ -0,0 +1,95 @@
<template>
<el-cascader :options="areas" :disabled="disabled" :props="optionProps" v-model="selectedOptions"
filterable
@change="handleChange">
<template #default="{ node, data }">
<span>{{ data.name }}</span>
<!-- 图标 -->
<svg v-if="data.hot === '1'" t="1708145002710" class="icon ml-4" viewBox="0 0 1024 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="6040" width="12" height="12">
<path
d="M760.591059 332.739765L681.682824 409.6s0-307.2-263.107765-409.539765c0 0-26.262588 281.6-157.816471 383.939765-131.553882 102.460235-394.721882 409.6 131.433412 639.939765 0 0-263.168-281.6 78.908235-486.27953 0 0-26.322824 102.339765 105.231059 204.8 131.614118 102.4 0 281.6 0 281.6s631.506824-153.6 184.32-691.260235z"
fill="#EA322B" p-id="6041"></path>
</svg>
</template>
</el-cascader>
</template>
<script lang="ts" setup>
import {fetchTree} from "/@/api/admin/sysArea";
import {CascaderProps, Resolve} from "element-plus";
const emit = defineEmits(['update:modelValue', 'change']);
// 定义props
const props = defineProps({
// 当前的值
modelValue: String,
// 层级
type: {
type: Number,
default: () => 4,
},
// 是否禁用
disabled: {
type: Boolean,
default: () => false,
},
// 子级是否必选
plus: {
type: Boolean,
default: () => false,
},
// lazy
lazy: {
type: Boolean,
default: () => true,
},
});
// 定义optionProps
const optionProps: CascaderProps = {
checkStrictly: props.plus,
label: 'name',
value: 'adcode',
lazy: props.lazy,
lazyLoad: async (node: Node, resolve: Resolve) => {
// 初始化数据
const {level} = node
if (level < props.type) {
const {data} = await fetchTree({pid: node.data.id || 100000})
resolve(data)
} else {
resolve([])
}
}
}
// 所有省市区的数据
let areas = ref()
// 计算属性selectedOptions
const selectedOptions = computed({
get: () => {
return props.modelValue?.split(',');
},
set: (val) => {
emit('update:modelValue', val?.join(','));
},
});
// 处理change事件的函数
const handleChange = (value: String[]) => {
emit('change', value?.join(','));
};
// 初始化数据
onMounted(async () => {
if (!props.lazy) {
const {data} = await fetchTree({type: props.type})
areas.value = data
}
})
</script>
+121
View File
@@ -0,0 +1,121 @@
<!--
* @Descripttion: 代码编辑器
* @version: 1.0
* @Author: sakuya
* @Date: 2022年5月20日21:46:29
* @LastEditors:
* @LastEditTime:
-->
<template>
<div class="code-editor" :style="{ height: _height }">
<textarea ref="textarea" v-model="contentValue"></textarea>
</div>
</template>
<script>
import { markRaw } from 'vue';
//框架
import CodeMirror from 'codemirror';
import 'codemirror/lib/codemirror.css';
//主题
import 'codemirror/theme/idea.css';
import 'codemirror/theme/darcula.css';
//功能
import 'codemirror/addon/selection/active-line';
//语言
import 'codemirror/mode/velocity/velocity';
import 'codemirror/mode/go/go';
export default {
props: {
modelValue: {
type: String,
default: '',
},
mode: {
type: String,
default: 'go',
},
height: {
type: [String, Number],
default: 300,
},
options: {
type: Object,
default: () => {},
},
theme: {
type: String,
default: 'idea',
},
readOnly: {
type: Boolean,
default: false,
},
},
data() {
return {
contentValue: this.modelValue,
coder: null,
opt: {
theme: this.theme, //主题
styleActiveLine: true, //高亮当前行
lineNumbers: true, //行号
lineWrapping: false, //自动换行
tabSize: 4, //Tab缩进
indentUnit: 4, //缩进单位
indentWithTabs: true, //自动缩进
mode: this.mode, //语言
readOnly: this.readOnly, //只读
...this.options,
},
};
},
computed: {
_height() {
return Number(this.height) ? Number(this.height) + 'px' : this.height;
},
},
watch: {
modelValue(val) {
this.contentValue = val;
if (val !== this.coder.getValue()) {
this.coder.setValue(val);
}
},
},
mounted() {
this.init();
//获取挂载的所有modes
//console.log(CodeMirror.modes)
},
methods: {
init() {
this.coder = markRaw(CodeMirror.fromTextArea(this.$refs.textarea, this.opt));
this.coder.on('change', (coder) => {
this.contentValue = coder.getValue();
this.$emit('update:modelValue', this.contentValue);
});
},
formatStrInJson(strValue) {
return JSON.stringify(JSON.parse(strValue), null, 4);
},
},
};
</script>
<style scoped>
.code-editor {
font-size: 14px;
border: 1px solid #ddd;
line-height: 150%;
}
.code-editor:deep(.CodeMirror) {
height: 100%;
}
</style>
+33
View File
@@ -0,0 +1,33 @@
<template>
<div class="color-picker flex flex-1">
<el-color-picker v-model="color" :predefine="predefineColors" />
<el-input v-model="color" class="mx-[10px] flex-1" type="text" readonly />
<el-button type="text" @click="reset">重置</el-button>
</div>
</template>
<script lang="ts" setup>
const props = defineProps({
modelValue: {
type: String,
},
defaultColor: {
type: String,
},
});
const emit = defineEmits<{
(event: 'update:modelValue', value: any): void;
}>();
const color = computed({
get() {
return props.modelValue;
},
set(value) {
emit('update:modelValue', value);
},
});
const predefineColors = ['#409EFF', '#28C76F', '#EA5455', '#FF9F43', '#01CFE8', '#4A5DFF'];
const reset = () => {
color.value = props.defaultColor;
};
</script>
+806
View File
@@ -0,0 +1,806 @@
<!--
* @Descripttion: cron规则生成器
* @version: 1.0
* @Author: sakuya
* @Date: 2023年05月23日13:04:12
* @LastEditors:
* @LastEditTime:
-->
<template>
<el-input v-model="defaultValue" v-bind="$attrs">
<template #append>
<el-dropdown size="medium" @command="handleShortcuts">
<el-button icon="el-icon-arrow-down"></el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="0 * * * * ?">每分钟</el-dropdown-item>
<el-dropdown-item command="0 0 * * * ?">每小时</el-dropdown-item>
<el-dropdown-item command="0 0 0 * * ?">每天零点</el-dropdown-item>
<el-dropdown-item command="0 0 0 1 * ?">每月一号零点</el-dropdown-item>
<el-dropdown-item command="0 0 0 L * ?">每月最后一天零点</el-dropdown-item>
<el-dropdown-item command="0 0 0 ? * 1">每周星期日零点</el-dropdown-item>
<el-dropdown-item v-for="(item, index) in shortcuts" :key="item.value" :divided="index == 0" :command="item.value">{{
item.text
}}</el-dropdown-item>
<el-dropdown-item icon="el-icon-plus" divided command="custom">自定义</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
</el-input>
<el-dialog title="cron规则生成器" v-model="dialogVisible" :width="580" destroy-on-close append-to-body>
<div class="sc-cron">
<el-tabs>
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2>秒</h2>
<h4>{{ value_second }}</h4>
</div>
</template>
<el-form>
<el-form-item label="类型">
<el-radio-group v-model="value.second.type">
<el-radio-button label="0">任意值</el-radio-button>
<el-radio-button label="1">范围</el-radio-button>
<el-radio-button label="2">间隔</el-radio-button>
<el-radio-button label="3">指定</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="范围" v-if="value.second.type == 1">
<el-input-number v-model="value.second.range.start" :min="0" :max="59" controls-position="right"></el-input-number>
<span style="padding: 0 15px">-</span>
<el-input-number v-model="value.second.range.end" :min="0" :max="59" controls-position="right"></el-input-number>
</el-form-item>
<el-form-item label="间隔" v-if="value.second.type == 2">
<el-input-number v-model="value.second.loop.start" :min="0" :max="59" controls-position="right"></el-input-number>
秒开始,每
<el-input-number v-model="value.second.loop.end" :min="0" :max="59" controls-position="right"></el-input-number>
秒执行一次
</el-form-item>
<el-form-item label="指定" v-if="value.second.type == 3">
<el-select v-model="value.second.appoint" multiple style="width: 100%">
<el-option v-for="(item, index) in data.second" :key="index" :label="item" :value="item"></el-option>
</el-select>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2>分钟</h2>
<h4>{{ value_minute }}</h4>
</div>
</template>
<el-form>
<el-form-item label="类型">
<el-radio-group v-model="value.minute.type">
<el-radio-button label="0">任意值</el-radio-button>
<el-radio-button label="1">范围</el-radio-button>
<el-radio-button label="2">间隔</el-radio-button>
<el-radio-button label="3">指定</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="范围" v-if="value.minute.type == 1">
<el-input-number v-model="value.minute.range.start" :min="0" :max="59" controls-position="right"></el-input-number>
<span style="padding: 0 15px">-</span>
<el-input-number v-model="value.minute.range.end" :min="0" :max="59" controls-position="right"></el-input-number>
</el-form-item>
<el-form-item label="间隔" v-if="value.minute.type == 2">
<el-input-number v-model="value.minute.loop.start" :min="0" :max="59" controls-position="right"></el-input-number>
分钟开始,每
<el-input-number v-model="value.minute.loop.end" :min="0" :max="59" controls-position="right"></el-input-number>
分钟执行一次
</el-form-item>
<el-form-item label="指定" v-if="value.minute.type == 3">
<el-select v-model="value.minute.appoint" multiple style="width: 100%">
<el-option v-for="(item, index) in data.minute" :key="index" :label="item" :value="item"></el-option>
</el-select>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2>小时</h2>
<h4>{{ value_hour }}</h4>
</div>
</template>
<el-form>
<el-form-item label="类型">
<el-radio-group v-model="value.hour.type">
<el-radio-button label="0">任意值</el-radio-button>
<el-radio-button label="1">范围</el-radio-button>
<el-radio-button label="2">间隔</el-radio-button>
<el-radio-button label="3">指定</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="范围" v-if="value.hour.type == 1">
<el-input-number v-model="value.hour.range.start" :min="0" :max="23" controls-position="right"></el-input-number>
<span style="padding: 0 15px">-</span>
<el-input-number v-model="value.hour.range.end" :min="0" :max="23" controls-position="right"></el-input-number>
</el-form-item>
<el-form-item label="间隔" v-if="value.hour.type == 2">
<el-input-number v-model="value.hour.loop.start" :min="0" :max="23" controls-position="right"></el-input-number>
小时开始,每
<el-input-number v-model="value.hour.loop.end" :min="0" :max="23" controls-position="right"></el-input-number>
小时执行一次
</el-form-item>
<el-form-item label="指定" v-if="value.hour.type == 3">
<el-select v-model="value.hour.appoint" multiple style="width: 100%">
<el-option v-for="(item, index) in data.hour" :key="index" :label="item" :value="item"></el-option>
</el-select>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2>日</h2>
<h4>{{ value_day }}</h4>
</div>
</template>
<el-form>
<el-form-item label="类型">
<el-radio-group v-model="value.day.type">
<el-radio-button label="0">任意值</el-radio-button>
<el-radio-button label="1">范围</el-radio-button>
<el-radio-button label="2">间隔</el-radio-button>
<el-radio-button label="3">指定</el-radio-button>
<el-radio-button label="4">本月最后一天</el-radio-button>
<el-radio-button label="5">不指定</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="范围" v-if="value.day.type == 1">
<el-input-number v-model="value.day.range.start" :min="1" :max="31" controls-position="right"></el-input-number>
<span style="padding: 0 15px">-</span>
<el-input-number v-model="value.day.range.end" :min="1" :max="31" controls-position="right"></el-input-number>
</el-form-item>
<el-form-item label="间隔" v-if="value.day.type == 2">
<el-input-number v-model="value.day.loop.start" :min="1" :max="31" controls-position="right"></el-input-number>
号开始,每
<el-input-number v-model="value.day.loop.end" :min="1" :max="31" controls-position="right"></el-input-number>
天执行一次
</el-form-item>
<el-form-item label="指定" v-if="value.day.type == 3">
<el-select v-model="value.day.appoint" multiple style="width: 100%">
<el-option v-for="(item, index) in data.day" :key="index" :label="item" :value="item"></el-option>
</el-select>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2>月</h2>
<h4>{{ value_month }}</h4>
</div>
</template>
<el-form>
<el-form-item label="类型">
<el-radio-group v-model="value.month.type">
<el-radio-button label="0">任意值</el-radio-button>
<el-radio-button label="1">范围</el-radio-button>
<el-radio-button label="2">间隔</el-radio-button>
<el-radio-button label="3">指定</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="范围" v-if="value.month.type == 1">
<el-input-number v-model="value.month.range.start" :min="1" :max="12" controls-position="right"></el-input-number>
<span style="padding: 0 15px">-</span>
<el-input-number v-model="value.month.range.end" :min="1" :max="12" controls-position="right"></el-input-number>
</el-form-item>
<el-form-item label="间隔" v-if="value.month.type == 2">
<el-input-number v-model="value.month.loop.start" :min="1" :max="12" controls-position="right"></el-input-number>
月开始,每
<el-input-number v-model="value.month.loop.end" :min="1" :max="12" controls-position="right"></el-input-number>
月执行一次
</el-form-item>
<el-form-item label="指定" v-if="value.month.type == 3">
<el-select v-model="value.month.appoint" multiple style="width: 100%">
<el-option v-for="(item, index) in data.month" :key="index" :label="item" :value="item"></el-option>
</el-select>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2>周</h2>
<h4>{{ value_week }}</h4>
</div>
</template>
<el-form>
<el-form>
<el-form-item label="类型">
<el-radio-group v-model="value.week.type">
<el-radio-button label="0">任意值</el-radio-button>
<el-radio-button label="1">范围</el-radio-button>
<el-radio-button label="2">间隔</el-radio-button>
<el-radio-button label="3">指定</el-radio-button>
<el-radio-button label="4">本月最后一周</el-radio-button>
<el-radio-button label="5">不指定</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="范围" v-if="value.week.type == 1">
<el-select v-model="value.week.range.start">
<el-option v-for="(item, index) in data.week" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
<span style="padding: 0 15px">-</span>
<el-select v-model="value.week.range.end">
<el-option v-for="(item, index) in data.week" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="间隔" v-if="value.week.type == 2">
第
<el-input-number v-model="value.week.loop.start" :min="1" :max="4" controls-position="right"></el-input-number>
周的星期
<el-select v-model="value.week.loop.end">
<el-option v-for="(item, index) in data.week" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
执行一次
</el-form-item>
<el-form-item label="指定" v-if="value.week.type == 3">
<el-select v-model="value.week.appoint" multiple style="width: 100%">
<el-option v-for="(item, index) in data.week" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="最后一周" v-if="value.week.type == 4">
<el-select v-model="value.week.last">
<el-option v-for="(item, index) in data.week" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-form>
</el-form>
</el-tab-pane>
<el-tab-pane>
<template #label>
<div class="sc-cron-num">
<h2>年</h2>
<h4>{{ value_year }}</h4>
</div>
</template>
<el-form>
<el-form-item label="类型">
<el-radio-group v-model="value.year.type">
<el-radio-button label="-1">忽略</el-radio-button>
<el-radio-button label="0">任意值</el-radio-button>
<el-radio-button label="1">范围</el-radio-button>
<el-radio-button label="2">间隔</el-radio-button>
<el-radio-button label="3">指定</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="范围" v-if="value.year.type == 1">
<el-input-number v-model="value.year.range.start" controls-position="right"></el-input-number>
<span style="padding: 0 15px">-</span>
<el-input-number v-model="value.year.range.end" controls-position="right"></el-input-number>
</el-form-item>
<el-form-item label="间隔" v-if="value.year.type == 2">
<el-input-number v-model="value.year.loop.start" controls-position="right"></el-input-number>
年开始,每
<el-input-number v-model="value.year.loop.end" :min="1" controls-position="right"></el-input-number>
年执行一次
</el-form-item>
<el-form-item label="指定" v-if="value.year.type == 3">
<el-select v-model="value.year.appoint" multiple style="width: 100%">
<el-option v-for="(item, index) in data.year" :key="index" :label="item" :value="item"></el-option>
</el-select>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
</div>
<template #footer>
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="submit()">确 认</el-button>
</template>
</el-dialog>
</template>
<script>
export default {
props: {
modelValue: { type: String, default: '* * * * * ?' },
shortcuts: { type: Array, default: () => [] },
},
data() {
return {
type: '0',
defaultValue: '',
dialogVisible: false,
value: {
second: {
type: '0',
range: {
start: 1,
end: 2,
},
loop: {
start: 0,
end: 1,
},
appoint: [],
},
minute: {
type: '0',
range: {
start: 1,
end: 2,
},
loop: {
start: 0,
end: 1,
},
appoint: [],
},
hour: {
type: '0',
range: {
start: 1,
end: 2,
},
loop: {
start: 0,
end: 1,
},
appoint: [],
},
day: {
type: '0',
range: {
start: 1,
end: 2,
},
loop: {
start: 1,
end: 1,
},
appoint: [],
},
month: {
type: '0',
range: {
start: 1,
end: 2,
},
loop: {
start: 1,
end: 1,
},
appoint: [],
},
week: {
type: '5',
range: {
start: '2',
end: '3',
},
loop: {
start: 0,
end: '2',
},
last: '2',
appoint: [],
},
year: {
type: '-1',
range: {
start: this.getYear()[0],
end: this.getYear()[1],
},
loop: {
start: this.getYear()[0],
end: 1,
},
appoint: [],
},
},
data: {
second: ['0', '5', '15', '20', '25', '30', '35', '40', '45', '50', '55', '59'],
minute: ['0', '5', '15', '20', '25', '30', '35', '40', '45', '50', '55', '59'],
hour: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23'],
day: [
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'10',
'11',
'12',
'13',
'14',
'15',
'16',
'17',
'18',
'19',
'20',
'21',
'22',
'23',
'24',
'25',
'26',
'27',
'28',
'29',
'30',
'31',
],
month: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
week: [
{
value: '1',
label: '周日',
},
{
value: '2',
label: '周一',
},
{
value: '3',
label: '周二',
},
{
value: '4',
label: '周三',
},
{
value: '5',
label: '周四',
},
{
value: '6',
label: '周五',
},
{
value: '7',
label: '周六',
},
],
year: this.getYear(),
},
};
},
watch: {
'value.week.type'(val) {
if (val != '5') {
this.value.day.type = '5';
}
},
'value.day.type'(val) {
if (val != '5') {
this.value.week.type = '5';
}
},
modelValue() {
this.defaultValue = this.modelValue;
},
},
computed: {
value_second() {
let v = this.value.second;
if (v.type == 0) {
return '*';
} else if (v.type == 1) {
return v.range.start + '-' + v.range.end;
} else if (v.type == 2) {
return v.loop.start + '/' + v.loop.end;
} else if (v.type == 3) {
return v.appoint.length > 0 ? v.appoint.join(',') : '*';
} else {
return '*';
}
},
value_minute() {
let v = this.value.minute;
if (v.type == 0) {
return '*';
} else if (v.type == 1) {
return v.range.start + '-' + v.range.end;
} else if (v.type == 2) {
return v.loop.start + '/' + v.loop.end;
} else if (v.type == 3) {
return v.appoint.length > 0 ? v.appoint.join(',') : '*';
} else {
return '*';
}
},
value_hour() {
let v = this.value.hour;
if (v.type == 0) {
return '*';
} else if (v.type == 1) {
return v.range.start + '-' + v.range.end;
} else if (v.type == 2) {
return v.loop.start + '/' + v.loop.end;
} else if (v.type == 3) {
return v.appoint.length > 0 ? v.appoint.join(',') : '*';
} else {
return '*';
}
},
value_day() {
let v = this.value.day;
if (v.type == 0) {
return '*';
} else if (v.type == 1) {
return v.range.start + '-' + v.range.end;
} else if (v.type == 2) {
return v.loop.start + '/' + v.loop.end;
} else if (v.type == 3) {
return v.appoint.length > 0 ? v.appoint.join(',') : '*';
} else if (v.type == 4) {
return 'L';
} else if (v.type == 5) {
return '?';
} else {
return '*';
}
},
value_month() {
let v = this.value.month;
if (v.type == 0) {
return '*';
} else if (v.type == 1) {
return v.range.start + '-' + v.range.end;
} else if (v.type == 2) {
return v.loop.start + '/' + v.loop.end;
} else if (v.type == 3) {
return v.appoint.length > 0 ? v.appoint.join(',') : '*';
} else {
return '*';
}
},
value_week() {
let v = this.value.week;
if (v.type == 0) {
return '*';
} else if (v.type == 1) {
return v.range.start + '-' + v.range.end;
} else if (v.type == 2) {
return v.loop.end + '#' + v.loop.start;
} else if (v.type == 3) {
return v.appoint.length > 0 ? v.appoint.join(',') : '*';
} else if (v.type == 4) {
return v.last + 'L';
} else if (v.type == 5) {
return '?';
} else {
return '*';
}
},
value_year() {
let v = this.value.year;
if (v.type == -1) {
return '';
} else if (v.type == 0) {
return '*';
} else if (v.type == 1) {
return v.range.start + '-' + v.range.end;
} else if (v.type == 2) {
return v.loop.start + '/' + v.loop.end;
} else if (v.type == 3) {
return v.appoint.length > 0 ? v.appoint.join(',') : '';
} else {
return '';
}
},
},
mounted() {
this.defaultValue = this.modelValue;
},
methods: {
handleShortcuts(command) {
if (command == 'custom') {
this.open();
} else {
this.defaultValue = command;
this.$emit('update:modelValue', this.defaultValue);
}
},
open() {
this.set();
this.dialogVisible = true;
},
set() {
this.defaultValue = this.modelValue;
let arr = (this.modelValue || '* * * * * ?').split(' ');
//简单检查
if (arr.length < 6) {
this.$message.warning('cron表达式错误,已转换为默认表达式');
arr = '* * * * * ?'.split(' ');
}
//秒
if (arr[0] == '*') {
this.value.second.type = '0';
} else if (arr[0].includes('-')) {
this.value.second.type = '1';
this.value.second.range.start = Number(arr[0].split('-')[0]);
this.value.second.range.end = Number(arr[0].split('-')[1]);
} else if (arr[0].includes('/')) {
this.value.second.type = '2';
this.value.second.loop.start = Number(arr[0].split('/')[0]);
this.value.second.loop.end = Number(arr[0].split('/')[1]);
} else {
this.value.second.type = '3';
this.value.second.appoint = arr[0].split(',');
}
//分
if (arr[1] == '*') {
this.value.minute.type = '0';
} else if (arr[1].includes('-')) {
this.value.minute.type = '1';
this.value.minute.range.start = Number(arr[1].split('-')[0]);
this.value.minute.range.end = Number(arr[1].split('-')[1]);
} else if (arr[1].includes('/')) {
this.value.minute.type = '2';
this.value.minute.loop.start = Number(arr[1].split('/')[0]);
this.value.minute.loop.end = Number(arr[1].split('/')[1]);
} else {
this.value.minute.type = '3';
this.value.minute.appoint = arr[1].split(',');
}
//小时
if (arr[2] == '*') {
this.value.hour.type = '0';
} else if (arr[2].includes('-')) {
this.value.hour.type = '1';
this.value.hour.range.start = Number(arr[2].split('-')[0]);
this.value.hour.range.end = Number(arr[2].split('-')[1]);
} else if (arr[2].includes('/')) {
this.value.hour.type = '2';
this.value.hour.loop.start = Number(arr[2].split('/')[0]);
this.value.hour.loop.end = Number(arr[2].split('/')[1]);
} else {
this.value.hour.type = '3';
this.value.hour.appoint = arr[2].split(',');
}
//日
if (arr[3] == '*') {
this.value.day.type = '0';
} else if (arr[3] == 'L') {
this.value.day.type = '4';
} else if (arr[3] == '?') {
this.value.day.type = '5';
} else if (arr[3].includes('-')) {
this.value.day.type = '1';
this.value.day.range.start = Number(arr[3].split('-')[0]);
this.value.day.range.end = Number(arr[3].split('-')[1]);
} else if (arr[3].includes('/')) {
this.value.day.type = '2';
this.value.day.loop.start = Number(arr[3].split('/')[0]);
this.value.day.loop.end = Number(arr[3].split('/')[1]);
} else {
this.value.day.type = '3';
this.value.day.appoint = arr[3].split(',');
}
//月
if (arr[4] == '*') {
this.value.month.type = '0';
} else if (arr[4].includes('-')) {
this.value.month.type = '1';
this.value.month.range.start = Number(arr[4].split('-')[0]);
this.value.month.range.end = Number(arr[4].split('-')[1]);
} else if (arr[4].includes('/')) {
this.value.month.type = '2';
this.value.month.loop.start = Number(arr[4].split('/')[0]);
this.value.month.loop.end = Number(arr[4].split('/')[1]);
} else {
this.value.month.type = '3';
this.value.month.appoint = arr[4].split(',');
}
//周
if (arr[5] == '*') {
this.value.week.type = '0';
} else if (arr[5] == '?') {
this.value.week.type = '5';
} else if (arr[5].includes('-')) {
this.value.week.type = '1';
this.value.week.range.start = arr[5].split('-')[0];
this.value.week.range.end = arr[5].split('-')[1];
} else if (arr[5].includes('#')) {
this.value.week.type = '2';
this.value.week.loop.start = Number(arr[5].split('#')[1]);
this.value.week.loop.end = arr[5].split('#')[0];
} else if (arr[5].includes('L')) {
this.value.week.type = '4';
this.value.week.last = arr[5].split('L')[0];
} else {
this.value.week.type = '3';
this.value.week.appoint = arr[5].split(',');
}
//年
if (!arr[6]) {
this.value.year.type = '-1';
} else if (arr[6] == '*') {
this.value.year.type = '0';
} else if (arr[6].includes('-')) {
this.value.year.type = '1';
this.value.year.range.start = Number(arr[6].split('-')[0]);
this.value.year.range.end = Number(arr[6].split('-')[1]);
} else if (arr[6].includes('/')) {
this.value.year.type = '2';
this.value.year.loop.start = Number(arr[6].split('/')[1]);
this.value.year.loop.end = Number(arr[6].split('/')[0]);
} else {
this.value.year.type = '3';
this.value.year.appoint = arr[6].split(',');
}
},
getYear() {
let v = [];
let y = new Date().getFullYear();
for (let i = 0; i < 11; i++) {
v.push(y + i);
}
return v;
},
submit() {
let year = this.value_year ? ' ' + this.value_year : '';
this.defaultValue =
this.value_second +
' ' +
this.value_minute +
' ' +
this.value_hour +
' ' +
this.value_day +
' ' +
this.value_month +
' ' +
this.value_week +
year;
this.$emit('update:modelValue', this.defaultValue);
this.dialogVisible = false;
},
},
};
</script>
<style scoped>
.sc-cron:deep(.el-tabs__item) {
height: auto;
line-height: 1;
padding: 0 7px;
vertical-align: bottom;
}
.sc-cron-num {
text-align: center;
margin-bottom: 15px;
width: 100%;
}
.sc-cron-num h2 {
font-size: 12px;
margin-bottom: 15px;
font-weight: normal;
}
.sc-cron-num h4 {
display: block;
height: 32px;
line-height: 30px;
width: 100%;
font-size: 12px;
padding: 0 15px;
background: var(--el-color-primary-light-9);
border-radius: 4px;
}
.sc-cron:deep(.el-tabs__item.is-active) .sc-cron-num h4 {
background: var(--el-color-primary);
color: #fff;
}
[data-theme='dark'] .sc-cron-num h4 {
background: var(--el-color-white);
}
</style>
+51
View File
@@ -0,0 +1,51 @@
<template>
<div class="del-wrap">
<slot></slot>
<div v-if="showClose" class="icon-close" @click.stop="handleClose">
<el-icon><CloseBold /></el-icon>
</div>
</div>
</template>
<script lang="ts">
export default defineComponent({
props: {
showClose: {
type: Boolean,
default: true,
},
},
emits: ['close'],
setup(props, { emit }) {
const handleClose = () => {
emit('close');
};
return {
handleClose,
};
},
});
</script>
<style scoped lang="scss">
.del-wrap {
position: relative;
&:hover > .icon-close {
display: flex;
}
.icon-close {
display: none;
position: absolute;
top: -8px;
right: -8px;
width: 16px;
height: 16px;
background-color: rgba(0, 0, 0, 0.3);
justify-content: center;
align-items: center;
border-radius: 50%;
color: #fff;
cursor: pointer;
}
}
</style>
+48
View File
@@ -0,0 +1,48 @@
<template>
<div>
<template v-for="(item, index) in props.options">
<template v-if="values.includes(item.value || item)">
<span v-if="item.elTagType == 'default' || item.elTagType == ''" :key="index" :index="index" :class="item.elTagClass">{{
item.label || item
}}</span>
<el-tag
v-else
:disable-transitions="true"
:key="index * 2"
:index="index"
:type="item.elTagType === 'primary' ? '' : item.elTagType"
:class="item.elTagClass"
>{{ item.label || item }}</el-tag
>
</template>
</template>
</div>
</template>
<script setup lang="ts" name="dict-tag">
import { computed } from 'vue';
const props = defineProps({
// 数据
options: {
type: Array as any,
default: null,
},
// 当前的值
value: [Number, String, Array],
});
const values = computed(() => {
if (props.value !== null && typeof props.value !== 'undefined') {
return Array.isArray(props.value) ? props.value : [String(props.value)];
} else {
return [];
}
});
</script>
<style scoped>
.el-tag + .el-tag {
margin-left: 10px;
}
</style>
+141
View File
@@ -0,0 +1,141 @@
<template>
<div class="flex flex-col border border-br" :style="styles">
<Toolbar class="border-b border-br" :editor="editorRef" :mode="mode" />
<Editor
class="flex-1 overflow-y-auto"
:mode="mode"
:defaultConfig="state.editorConfig"
v-model="state.editorVal"
@onCreated="handleCreated"
@onChange="handleChange"
/>
</div>
</template>
<script setup lang="ts" name="wngEditor">
import '@wangeditor/editor/dist/css/style.css';
import { reactive, shallowRef, watch, onBeforeUnmount, CSSProperties } from 'vue';
// @ts-ignore
import { IDomEditor } from '@wangeditor/editor';
import { Toolbar, Editor } from '@wangeditor/editor-for-vue';
import { Session } from '/@/utils/storage';
import other from '/@/utils/other';
const { proxy } = getCurrentInstance();
// 定义父组件传过来的值
const props = defineProps({
// 是否禁用
disable: {
type: Boolean,
default: () => false,
},
// 内容框默认 placeholder
placeholder: {
type: String,
default: () => '请输入内容...',
},
// https://www.wangeditor.com/v5/getting-started.html#mode-%E6%A8%A1%E5%BC%8F
// 模式,可选 <default|simple>,默认 default
mode: {
type: String,
default: () => 'default',
},
// 高度
height: {
type: String,
default: () => '310',
},
// 宽度
width: {
type: String,
default: () => 'auto',
},
// 双向绑定,用于获取 editor.getHtml()
getHtml: String,
// 双向绑定,用于获取 editor.getText()
getText: String,
uploadFileUrl: {
type: String,
default: `/admin/sys-file/upload`,
},
});
// 定义子组件向父组件传值/事件
const emit = defineEmits(['update:getHtml', 'update:getText']);
// 定义上传需要的请求头信息
const headers = computed(() => {
return {
Authorization: 'Bearer ' + Session.get('token'),
'TENANT-ID': Session.getTenant(),
};
});
// 定义上传需要的字段信息
const uploadAttr = reactive({
fieldName: 'file',
server: proxy.baseURL + props.uploadFileUrl,
headers: headers,
customInsert(res, insertFn) {
insertFn(proxy.baseURL + res.data.url);
},
});
const editorRef = shallowRef();
const state = reactive({
editorConfig: {
placeholder: props.placeholder,
MENU_CONF: {
uploadImage: uploadAttr,
uploadVideo: uploadAttr,
},
},
editorVal: props.getHtml,
});
const styles = computed<CSSProperties>(() => ({
height: other.addUnit(props.height),
width: other.addUnit(props.width),
'z-index': 1000,
}));
// 编辑器回调函数
const handleCreated = (editor: IDomEditor) => {
editorRef.value = editor;
};
// 编辑器内容改变时
const handleChange = (editor: IDomEditor) => {
emit('update:getHtml', editor.getHtml());
emit('update:getText', editor.getText());
};
// 页面销毁时
onBeforeUnmount(() => {
const editor = editorRef.value;
if (editor == null) return;
emit('update:getHtml', '');
emit('update:getText', '');
editor.destroy();
});
// 监听是否禁用改变
onMounted(() =>{
nextTick(()=>{
const editor = editorRef.value;
if (editor == null) return;
props.disable ? editor.disable() : editor.enable();
})
})
// 监听双向绑定值改变,用于回显
watch(
() => props.getHtml,
(val) => {
state.editorVal = val;
},
{
deep: true,
}
);
</script>
+210
View File
@@ -0,0 +1,210 @@
<template>
<div class="form-table" ref="scFormTable">
<el-table
:data="data"
ref="table"
border
stripe
:cell-style="{ textAlign: 'center' }"
:header-cell-style="{
textAlign: 'center',
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)',
}"
>
<el-table-column type="index" width="50" fixed="left">
<template #header>
<el-button v-if="!hideAdd" type="primary" icon="el-icon-plus" size="small" circle @click="rowAdd"></el-button>
<el-tooltip v-else content="序号" placement="top"> # </el-tooltip>
</template>
<template #default="scope">
<div :class="['form-table-handle', { 'form-table-handle-delete': !hideDelete }]">
<span>{{ scope.$index + 1 }}</span>
<el-button
v-if="!hideDelete"
type="danger"
icon="el-icon-delete"
size="small"
plain
circle
@click="rowDel(scope.row, scope.$index)"
></el-button>
</div>
</template>
</el-table-column>
<el-table-column label="" width="50" v-if="dragSort">
<template #header>
<el-icon>
<el-tooltip content="拖动排序" placement="top">
<WarningFilled />
</el-tooltip>
</el-icon>
</template>
<template #default>
<div class="move" style="cursor: move">
<el-icon>
<Sort />
</el-icon>
</div>
</template>
</el-table-column>
<slot></slot>
<template #empty>
{{ placeholder }}
</template>
</el-table>
</div>
</template>
<script>
import Sortable from 'sortablejs';
export default {
props: {
/**
* 表格数据
*/
modelValue: { type: Array, default: () => [] },
/**
* 新增行模板
*/
addTemplate: { type: Object, default: () => {} },
/**
* 无数据时的提示语
*/
placeholder: { type: String, default: '暂无数据' },
/**
* 是否启用拖拽排序
*/
dragSort: { type: Boolean, default: false },
/**
* 是否隐藏新增按钮
*/
hideAdd: { type: Boolean, default: false },
/**
* 是否隐藏删除按钮
*/
hideDelete: { type: Boolean, default: false },
},
data() {
return {
/**
* 表格数据
*/
data: [],
};
},
mounted() {
this.data = this.modelValue;
if (this.dragSort) {
this.rowDrop();
}
},
watch: {
modelValue() {
this.data = this.modelValue;
},
data: {
handler() {
/**
* 更新表格数据
* @event update:modelValue
* @type {Array}
*/
this.$emit('update:modelValue', this.data);
},
deep: true,
},
},
methods: {
/**
* 启用表格行拖拽排序
*/
rowDrop() {
const _this = this;
const tbody = this.$refs.table.$el.querySelector('.el-table__body-wrapper tbody');
Sortable.create(tbody, {
handle: '.move',
animation: 300,
ghostClass: 'ghost',
onEnd({ newIndex, oldIndex }) {
_this.data.splice(newIndex, 0, _this.data.splice(oldIndex, 1)[0]);
const newArray = _this.data.slice(0);
const tmpHeight = _this.$refs.scFormTable.offsetHeight;
_this.$refs.scFormTable.style.setProperty('height', tmpHeight + 'px');
_this.data = [];
_this.$nextTick(() => {
_this.data = newArray;
_this.$nextTick(() => {
_this.$refs.scFormTable.style.removeProperty('height');
});
});
},
});
},
/**
* 新增一行
*/
rowAdd() {
const temp = JSON.parse(JSON.stringify(this.addTemplate));
this.data.push(temp);
},
/**
* 删除一行
* @param {Object} row - 要删除的行数据
* @param {number} index - 要删除的行的索引
*/
rowDel(row, index) {
this.data.splice(index, 1);
this.$emit('delete', row);
},
/**
* 插入一行
* @param {Object} row - 要插入的行数据,默认为新增行模板
*/
pushRow(row) {
const temp = row || JSON.parse(JSON.stringify(this.addTemplate));
this.data.push(temp);
},
/**
* 根据索引删除一行
* @param {number} index - 要删除的行的索引
*/
deleteRow(index) {
this.data.splice(index, 1);
},
},
};
</script>
<style scoped>
.form-table {
width: 100%;
}
.form-table .form-table-handle {
text-align: center;
}
.form-table .form-table-handle span {
display: inline-block;
}
.form-table .form-table-handle button {
display: none;
}
.form-table .hover-row .form-table-handle-delete span {
display: none;
}
.form-table .hover-row .form-table-handle-delete button {
display: inline-block;
}
.form-table .move {
text-align: center;
font-size: 14px;
margin-top: 3px;
}
</style>
+71
View File
@@ -0,0 +1,71 @@
import { readFileSync, readdirSync } from 'fs';
let idPerfix = '';
const iconNames: string[] = [];
const svgTitle = /<svg([^>+].*?)>/;
const clearHeightWidth = /(width|height)="([^>+].*?)"/g;
const hasViewBox = /(viewBox="[^>+].*?")/g;
const clearReturn = /(\r)|(\n)/g;
// 清理 svg 的 fill
const clearFill = /(fill="[^>+].*?")/g;
function findSvgFile(dir: string): string[] {
const svgRes = [] as any;
const dirents = readdirSync(dir, {
withFileTypes: true,
});
for (const dirent of dirents) {
iconNames.push(`${idPerfix}-${dirent.name.replace('.svg', '')}`);
if (dirent.isDirectory()) {
svgRes.push(...findSvgFile(dir + dirent.name + '/'));
} else {
const svg = readFileSync(dir + dirent.name)
.toString()
.replace(clearReturn, '')
.replace(clearFill, 'fill=""')
.replace(svgTitle, ($1, $2) => {
let width = 0;
let height = 0;
let content = $2.replace(clearHeightWidth, (s1: string, s2: string, s3: number) => {
if (s2 === 'width') {
width = s3;
} else if (s2 === 'height') {
height = s3;
}
return '';
});
if (!hasViewBox.test($2)) {
content += `viewBox="0 0 ${width} ${height}"`;
}
return `<symbol id="${idPerfix}-${dirent.name.replace('.svg', '')}" ${content}>`;
})
.replace('</svg>', '</symbol>');
svgRes.push(svg);
}
}
return svgRes;
}
export const svgBuilder = (path: string, perfix = 'local') => {
if (path === '') return;
idPerfix = perfix;
const res = findSvgFile(path);
return {
name: 'svg-transform',
transformIndexHtml(html: string) {
/* eslint-disable */
return html.replace(
'<body>',
`
<body>
<svg id="local-icon" data-icon-name="${iconNames.join(
','
)}" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0">
${res.join('')}
</svg>
`
);
/* eslint-enable */
},
};
};
Loaded 100 of 677 files, more files were not shown because too many files have changed in this diff. Show more