Browse Source

first

master
“wangzihua” 4 months ago
commit
10ca37140d
  1. 0
      README.en.md
  2. 0
      README.md
  3. 24
      index.html
  4. 17
      jsconfig.json
  5. 7194
      package-lock.json
  6. 64
      package.json
  7. 4
      postcss.config.cjs
  8. BIN
      public/favicon.ico
  9. 127
      src/App.vue
  10. 30
      src/api/business/category/category-api.js
  11. 41
      src/api/business/goods/goods-api.js
  12. 35
      src/api/business/letter/letter-api.js
  13. 11
      src/api/business/letter/letter-const.js
  14. 42
      src/api/business/oa/bank-api.js
  15. 69
      src/api/business/oa/enterprise-api.js
  16. 44
      src/api/business/oa/invoice-api.js
  17. 74
      src/api/business/oa/notice-api.js
  18. 74
      src/api/business/service-applications/service-applications-api.js
  19. 11
      src/api/business/service-applications/service-applications-const.js
  20. 40
      src/api/support/api-encrypt-api.js
  21. 25
      src/api/support/cache-api.js
  22. 45
      src/api/support/change-log-api.js
  23. 46
      src/api/support/code-generator-api.js
  24. 29
      src/api/support/config-api.js
  25. 17
      src/api/support/data-masking-api.js
  26. 18
      src/api/support/data-tracer-api.js
  27. 75
      src/api/support/dict-api.js
  28. 21
      src/api/support/feedback-api.js
  29. 45
      src/api/support/file-api.js
  30. 17
      src/api/support/heart-beat-api.js
  31. 59
      src/api/support/help-doc-api.js
  32. 32
      src/api/support/help-doc-catalog-api.js
  33. 42
      src/api/support/job-api.js
  34. 24
      src/api/support/level3-protect-api.js
  35. 26
      src/api/support/login-fail-api.js
  36. 21
      src/api/support/login-log-api.js
  37. 31
      src/api/support/message-api.js
  38. 25
      src/api/support/operate-log-api.js
  39. 25
      src/api/support/reload-api.js
  40. 25
      src/api/support/serial-number-api.js
  41. 26
      src/api/support/table-column-api.js
  42. 39
      src/api/system/department-api.js
  43. 93
      src/api/system/employee-api.js
  44. 19
      src/api/system/home-api.js
  45. 54
      src/api/system/login-api.js
  46. 54
      src/api/system/menu-api.js
  47. 55
      src/api/system/position-api.js
  48. 85
      src/api/system/role-api.js
  49. 24
      src/api/system/role-menu-api.js
  50. BIN
      src/assets/images/1024lab/1024lab-gzh.jpg
  51. BIN
      src/assets/images/1024lab/gzh.jpg
  52. BIN
      src/assets/images/1024lab/xiaozhen-gzh.jpg
  53. BIN
      src/assets/images/1024lab/zhuoda-wechat.jpg
  54. BIN
      src/assets/images/login/ali-icon.png
  55. BIN
      src/assets/images/login/blue-login-bg.png
  56. BIN
      src/assets/images/login/douyin-icon.png
  57. BIN
      src/assets/images/login/feishu-icon.png
  58. BIN
      src/assets/images/login/google-icon.png
  59. BIN
      src/assets/images/login/left-bg1.png
  60. BIN
      src/assets/images/login/left-bg2.png
  61. BIN
      src/assets/images/login/login-bg.png
  62. BIN
      src/assets/images/login/login-bg2.png
  63. BIN
      src/assets/images/login/login-bg3.png
  64. BIN
      src/assets/images/login/login-bg4 .png
  65. BIN
      src/assets/images/login/login-form-open-eyes-close.png
  66. BIN
      src/assets/images/login/login-form-open-eyes.png
  67. BIN
      src/assets/images/login/login-min.gif
  68. BIN
      src/assets/images/login/login-qr.png
  69. BIN
      src/assets/images/login/login.gif
  70. BIN
      src/assets/images/login/qq-icon.png
  71. BIN
      src/assets/images/login/wechat-icon.png
  72. BIN
      src/assets/images/login/weibo-icon.png
  73. BIN
      src/assets/images/logo/logo-min.png
  74. BIN
      src/assets/images/logo/logo.png
  75. BIN
      src/assets/images/logo/smart-admin-logo-white.png
  76. BIN
      src/assets/images/logo/smart-admin-logo.png
  77. 3
      src/assets/images/nav/active_bg2.svg
  78. 3
      src/assets/images/nav/active_bg2_default.svg
  79. BIN
      src/assets/images/notice/edit_icon.png
  80. BIN
      src/assets/images/notice/file_icon.png
  81. 86
      src/components/business/category-tree-select/index.vue
  82. 109
      src/components/business/oa/enterprise-bank-select/index.vue
  83. 108
      src/components/business/oa/enterprise-invoice-select/index.vue
  84. 85
      src/components/business/oa/enterprise-select/index.vue
  85. 87
      src/components/framework/area-cascader/index.vue
  86. 17546
      src/components/framework/area-cascader/province-city-district.js
  87. 1727
      src/components/framework/area-cascader/province-city.js
  88. 80
      src/components/framework/boolean-select/index.vue
  89. 133
      src/components/framework/icon-select/index.vue
  90. 18
      src/components/framework/iframe/iframe-index.vue
  91. 3
      src/components/framework/iframe/route-default-component.vue
  92. 38
      src/components/framework/smart-copy-icon/index.vue
  93. 75
      src/components/framework/smart-enum-checkbox/index.vue
  94. 88
      src/components/framework/smart-enum-radio/index.vue
  95. 88
      src/components/framework/smart-enum-select/index.vue
  96. 20
      src/components/framework/smart-loading/index.js
  97. 77
      src/components/framework/text-ellipsis/index.vue
  98. 118
      src/components/framework/wangeditor/index.vue
  99. 97
      src/components/support/data-tracer/data-tracer-table.vue
  100. 50
      src/components/support/data-tracer/data-tracer-timeline.vue

0
README.en.md

0
README.md

24
index.html

@ -0,0 +1,24 @@
<!--
* @Description: 首页
* @Author: zhuoda
* @Date: 2021-08-03
* @LastEditTime: 2022-06-23
* @LastEditors: zhuoda
-->
<!DOCTYPE html>
<html lang="en" id="htmlRoot">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="renderer" content="webkit"/>
<meta name="viewport"
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
/>
<title> %VITE_APP_TITLE%</title>
<link rel="icon" href="/favicon.ico"/>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

17
jsconfig.json

@ -0,0 +1,17 @@
{
"compilerOptions": {
"target": "ES6",
"jsx":"preserve",
"module": "commonjs",
"allowSyntheticDefaultImports": true,
"baseUrl": "./",
"paths": {
"/@/*": [
"src/*"
]
}
},
"exclude": [
"node_modules"
]
}

7194
package-lock.json

File diff suppressed because it is too large

64
package.json

@ -0,0 +1,64 @@
{
"name": "yun-admin",
"version": "3.0.0",
"license": "MIT",
"scripts": {
"localhost": "vite --mode localhost",
"dev": "vite",
"build:test": "vite build --base=/admin/ --mode test",
"build:pre": "vite build --mode pre",
"build:prod": "vite build --mode production"
},
"type": "module",
"dependencies": {
"@ant-design/icons-vue": "^7.0.1",
"@wangeditor-next/editor": "5.6.34",
"@wangeditor-next/editor-for-vue": "5.1.14",
"ant-design-vue": "4.2.5",
"axios": "1.6.8",
"clipboard": "2.0.11",
"crypto-js": "4.1.1",
"dayjs": "1.11.13",
"decimal.js": "10.3.1",
"diff": "5.2.0",
"diff2html": "3.4.47",
"echarts": "5.4.3",
"highlight.js": "11.8.0",
"lodash": "4.17.21",
"lunar-javascript": "1.6.12",
"mitt": "3.0.1",
"nprogress": "0.2.0",
"pinia": "2.1.7",
"sm-crypto": "0.3.13",
"sortablejs": "1.15.0",
"ua-parser-js": "1.0.35",
"uuid": "^11.1.0",
"v-viewer": "~1.6.4",
"vue": "3.4.27",
"vue-i18n": "9.13.1",
"vue-router": "4.3.2",
"vue3-json-viewer": "2.3.1"
},
"devDependencies": {
"@vitejs/plugin-vue": "5.0.4",
"@vue/compiler-sfc": "3.4.27",
"eslint": "^8.16.0",
"eslint-config-prettier": "~9.0.0",
"eslint-plugin-prettier": "~5.0.0",
"eslint-plugin-vue": "~9.17.0",
"less": "~4.2.0",
"less-loader": "~11.1.3",
"prettier": "~3.0.2",
"rimraf": "~5.0.1",
"stylelint": "~14.8.5",
"stylelint-config-prettier": "~9.0.3",
"stylelint-config-standard": "~25.0.0",
"stylelint-order": "~5.0.0",
"terser": "~5.29.2",
"vite": "5.2.12",
"vue-eslint-parser": "~9.4.2"
},
"engines": {
"node": ">=18"
}
}

4
postcss.config.cjs

@ -0,0 +1,4 @@
module.exports = {
plugins: {
},
};

BIN
public/favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

127
src/App.vue

@ -0,0 +1,127 @@
<!--
* 主应用页面
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-12 23:46:47
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
-->
<template>
<a-config-provider
:locale="antdLocale"
:theme="{
algorithm: themeAlgorithm,
token: {
colorPrimary: themeColors[colorIndex].primaryColor,
colorLink: themeColors[colorIndex].primaryColor,
colorLinkActive: themeColors[colorIndex].activeColor,
colorLinkHover: themeColors[colorIndex].hoverColor,
colorIcon: themeColors[colorIndex].primaryColor,
borderRadius: borderRadius,
},
components: {
Button: {
colorLink: themeColors[colorIndex].primaryColor,
colorLinkActive: themeColors[colorIndex].activeColor,
colorLinkHover: themeColors[colorIndex].hoverColor,
},
Icon: {
colorIcon: themeColors[colorIndex].primaryColor,
},
},
}"
:transformCellText="transformCellText"
>
<!---全局loading--->
<a-spin :spinning="spinning" tip="稍等片刻,我在拼命加载中..." size="large">
<!--- 路由 -->
<RouterView />
</a-spin>
</a-config-provider>
</template>
<script setup>
import dayjs from 'dayjs';
import { computed, h, useSlots } from 'vue';
import { messages } from '/@/i18n';
import { useAppConfigStore } from '/@/store/modules/system/app-config';
import { useSpinStore } from '/@/store/modules/system/spin';
import { Popover, theme } from 'ant-design-vue';
import { themeColors } from '/@/theme/color.js';
import SmartCopyIcon from '/@/components/framework/smart-copy-icon/index.vue';
const antdLocale = computed(() => messages[useAppConfigStore().language].antdLocale);
const dayjsLocale = computed(() => messages[useAppConfigStore().language].dayjsLocale);
dayjs.locale(dayjsLocale);
// loading
let spinStore = useSpinStore();
const spinning = computed(() => spinStore.loading);
//
const colorIndex = computed(() => {
return useAppConfigStore().colorIndex;
});
//
const themeAlgorithm = computed(() => {
let themeArray = [];
themeArray.push(useAppConfigStore().darkModeFlag ? theme.darkAlgorithm : theme.defaultAlgorithm);
if (useAppConfigStore().compactFlag) {
themeArray.push(theme.compactAlgorithm);
}
return themeArray;
});
//
const borderRadius = computed(() => {
return useAppConfigStore().borderRadius;
});
function transformCellText({ text, column, record, index }) {
if (column && column.textEllipsisFlag === true) {
return h(
Popover,
{ placement: 'bottom' },
{
default: () =>
h(
'div',
{
style: { whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' },
id: `${column.dataIndex}${index}`,
},
text
),
content: () =>
h('div', { style: { display: 'flex' } }, [
h('div', text),
h(SmartCopyIcon, { value: document.getElementById(`${column.dataIndex}${index}`).innerText }),
]),
}
);
} else {
return text;
}
}
const { useToken } = theme;
const { token } = useToken();
</script>
<style lang="less">
@color-bg-container: v-bind('token.colorBgContainer');
:deep(.ant-table-column-sorters) {
align-items: flex-start !important;
}
.smart-query-form {
background-color: @color-bg-container;
padding: 5px 10px;
margin-bottom: 10px;
}
.smart-detail-header {
background-color: @color-bg-container;
padding: 10px;
}
</style>

30
src/api/business/category/category-api.js

@ -0,0 +1,30 @@
/*
* 类目api
*
* @Author: 卓大
* @Date: 2022-09-03 21:35:00
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { getRequest, postRequest } from '/@/lib/axios';
export const categoryApi = {
// 添加类目 @author 卓大
addCategory: (param) => {
return postRequest('/category/add', param);
},
// GET
// 删除类目 @author 卓大
deleteCategoryById: (categoryId) => {
return getRequest(`/category/delete/${categoryId}`);
},
// 查询类目层级树 @author 卓大
queryCategoryTree: (param) => {
return postRequest('/category/tree', param);
},
// 更新类目 @author 卓大
updateCategory: (param) => {
return postRequest('/category/update', param);
},
};

41
src/api/business/goods/goods-api.js

@ -0,0 +1,41 @@
/*
* @Description:
* @Author: zhuoda
* @Date: 2021-11-05
* @LastEditTime: 2022-06-23
* @LastEditors: zhuoda
*/
import {postRequest, getRequest, getDownload} from '/@/lib/axios';
export const goodsApi = {
// 添加商品 @author zhuoda
addGoods: (param) => {
return postRequest('/goods/add', param);
},
// 删除 @author zhuoda
deleteGoods: (goodsId) => {
return getRequest(`/goods/delete/${goodsId}`);
},
// 批量 @author zhuoda
batchDelete: (goodsIdList) => {
return postRequest('/goods/batchDelete', goodsIdList);
},
// 分页查询 @author zhuoda
queryGoodsList: (param) => {
return postRequest('/goods/query', param);
},
// 更新商品 @author zhuoda
updateGoods: (param) => {
return postRequest('/goods/update', param);
},
// 导入 @author 卓大
importGoods : (file) =>{
return postRequest('/goods/importGoods',file);
},
// 导出 @author 卓大
exportGoods : () =>{
return getDownload('/goods/exportGoods');
}
};

35
src/api/business/letter/letter-api.js

@ -0,0 +1,35 @@
/**
* 承诺书签订表 api 封装
*
* @Author: wzh
* @Date: 2025-12-22 17:43:06
* @Copyright 1
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const letterApi = {
/**
* 分页查询 @author wzh
*/
queryPage : (param) => {
return postRequest('/letter/queryPage', param);
},
/**
* 增加 @author wzh
*/
add: (param) => {
return postRequest('/letter/add', param);
},
/**
* 修改 @author wzh
*/
update: (param) => {
return postRequest('/letter/update', param);
},
};

11
src/api/business/letter/letter-const.js

@ -0,0 +1,11 @@
/**
* 承诺书签订表 枚举
*
* @Author: wzh
* @Date: 2025-12-22 17:43:06
* @Copyright 1
*/
export default {
};

42
src/api/business/oa/bank-api.js

@ -0,0 +1,42 @@
/*
* 银行卡
*
* @Author: 善逸
* @Date: 2022-09-03 21:42:08
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const bankApi = {
// 新建银行信息 @author 善逸
create: (param) => {
return postRequest('/oa/bank/create', param);
},
// 删除银行信息 @author 善逸
delete: (bankId) => {
return getRequest(`/oa/bank/delete/${bankId}`);
},
// 查询银行信息详情 @author 善逸
detail: (bankId) => {
return getRequest(`/oa/bank/get/${bankId}`);
},
// 分页查询银行信息 @author 善逸
pageQuery: (param) => {
return postRequest('/oa/bank/page/query', param);
},
// 编辑银行信息 @author 善逸
update: (param) => {
return postRequest('/oa/bank/update', param);
},
// 根据企业ID查询不分页的银行列表 @author 善逸
queryList: (enterpriseId) => {
return getRequest(`/oa/bank/query/list/${enterpriseId}`);
},
};

69
src/api/business/oa/enterprise-api.js

@ -0,0 +1,69 @@
/*
* 企业信息
*
* @Author: 开云
* @Date: 2022-09-03 21:47:28
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import {postRequest, getRequest, postDownload} from '/@/lib/axios';
export const enterpriseApi = {
// 新建企业 @author 开云
create: (param) => {
return postRequest('/oa/enterprise/create', param);
},
// 删除企业 @author 开云
delete: (enterpriseId) => {
return getRequest(`/oa/enterprise/delete/${enterpriseId}`);
},
// 查询企业详情 @author 开云
detail: (enterpriseId) => {
return getRequest(`/oa/enterprise/get/${enterpriseId}`);
},
// 分页查询企业模块 @author 开云
pageQuery: (param) => {
return postRequest('/oa/enterprise/page/query', param);
},
// 导出企业数据excel @author 卓大
exportExcel: (param) => {
return postDownload('/oa/enterprise/exportExcel', param);
},
//企业列表查询 含数据范围 @author 开云
queryList: (type) => {
let query = '';
if (type) {
query = `?type=${type}`;
}
return getRequest(`/oa/enterprise/query/list${query}`);
},
// 编辑企业 @author 开云
update: (param) => {
return postRequest('/oa/enterprise/update', param);
},
// 企业全部员工List @author yandy
employeeList: (param) => {
return postRequest('/oa/enterprise/employee/list', param);
},
// 分页查询企业员工List @author 卓大
queryPageEmployeeList: (param) => {
return postRequest('/oa/enterprise/employee/queryPage', param);
},
// 添加员工 @author yandy
addEmployee: (param) => {
return postRequest('/oa/enterprise/employee/add', param);
},
// 删除员工 @author yandy
deleteEmployee: (param) => {
return postRequest('/oa/enterprise/employee/delete', param);
},
};

44
src/api/business/oa/invoice-api.js

@ -0,0 +1,44 @@
/*
* OA发票信息
*
* @Author: 善逸
* @Date: 2022-09-03 21:48:54
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const invoiceApi = {
// 新建发票信息 @author 善逸
create: (param) => {
return postRequest('/oa/invoice/create', param);
},
// 删除发票信息 @author 善逸
delete: (bankId) => {
return getRequest(`/oa/invoice/delete/${bankId}`);
},
// 查询发票信息详情 @author 善逸
detail: (bankId) => {
return getRequest(`//oa/invoice/get/${bankId}`);
},
// 分页查询发票信息 @author 善逸
pageQuery: (param) => {
return postRequest('/oa/invoice/page/query', param);
},
// 编辑发票信息 @author 善逸
update: (param) => {
return postRequest('/oa/invoice/update', param);
},
// 查询发票列表 @author 善逸
queryList: (enterpriseId) => {
return getRequest(`/oa/invoice/query/list/${enterpriseId}`);
},
};

74
src/api/business/oa/notice-api.js

@ -0,0 +1,74 @@
/*
* @Description: 公告信息企业动态
* @version:
* @Author: zhuoda
* @Date: 2022-08-16 20:34:36
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const noticeApi = {
// ---------------- 通知公告类型 -----------------------
// 通知公告类型-获取全部 @author zhuoda
getAllNoticeTypeList() {
return getRequest('/oa/noticeType/getAll');
},
// 通知公告类型-添加 @author zhuoda
addNoticeType(name) {
return getRequest(`/oa/noticeType/add/${name}`);
},
// 通知公告类型-修改 @author zhuoda
updateNoticeType(noticeTypeId, name) {
return getRequest(`/oa/noticeType/update/${noticeTypeId}/${name}`);
},
// 通知公告类型-删除 @author zhuoda
deleteNoticeType(noticeTypeId) {
return getRequest(`/oa/noticeType/delete/${noticeTypeId}`);
},
// ---------------- 通知公告管理 -----------------------
// 通知公告-分页查询 @author zhuoda
queryNotice(param) {
return postRequest('/oa/notice/query', param);
},
// 通知公告-添加 @author zhuoda
addNotice(param) {
return postRequest('/oa/notice/add', param);
},
// 通知公告-更新 @author zhuoda
updateNotice(param) {
return postRequest('/oa/notice/update', param);
},
// 通知公告-删除 @author zhuoda
deleteNotice(noticeId) {
return getRequest(`/oa/notice/delete/${noticeId}`);
},
// 通知公告-更新详情 @author zhuoda
getUpdateNoticeInfo(noticeId) {
return getRequest(`/oa/notice/getUpdateVO/${noticeId}`);
},
// --------------------- 【员工】查看 通知公告 -------------------------
// 通知公告-员工-查看详情 @author zhuoda
view(noticeId) {
return getRequest(`/oa/notice/employee/view/${noticeId}`);
},
// 通知公告-员工-查询 @author zhuoda
queryEmployeeNotice(param) {
return postRequest('/oa/notice/employee/query', param);
},
// 【员工】通知公告-查询 查看记录 @author zhuoda
queryViewRecord(param) {
return postRequest('/oa/notice/employee/queryViewRecord', param);
},
};

74
src/api/business/service-applications/service-applications-api.js

@ -0,0 +1,74 @@
/**
* 服务申报表 api 封装
*
* @Author: wzh
* @Date: 2025-12-20 14:44:06
* @Copyright 1.0
*/
import { postRequest, getRequest, getDownload } from '/@/lib/axios';
export const serviceApplicationsApi = {
/**
* 分页查询 @author wzh
*/
queryPage : (param) => {
return postRequest('/serviceApplications/queryPage', param);
},
/**
* 增加 @author wzh
*/
add: (param) => {
return postRequest('/serviceApplications/add', param);
},
/**
* 修改 @author wzh
*/
update: (param) => {
return postRequest('/serviceApplications/update', param);
},
/**
* 提交 @author wzh
*/
submit: (id) => {
return postRequest(`/serviceApplications/submit/${id}`);
},
/**
* 批量提交 @author wzh
*/
batchSubmit: (param) => {
return postRequest('/serviceApplications/batchSubmit', param);
},
/**
* 删除 @author wzh
*/
delete: (id) => {
return getRequest(`/serviceApplications/delete/${id}`);
},
/**
* 批量删除 @author wzh
*/
batchDelete: (idList) => {
return postRequest('/serviceApplications/batchDelete', idList);
},
/**
* 下载模板 @author wzh
*/
downloadTemplate: () => {
return getDownload('/serviceApplications/downloadTemplate');
},
/**
* 导入服务申报 @author wzh
*/
importServiceApplications: (formData) => {
return postRequest('/serviceApplications/importService', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
});
},
};

11
src/api/business/service-applications/service-applications-const.js

@ -0,0 +1,11 @@
/**
* 服务申报表 枚举
*
* @Author: wzh
* @Date: 2025-12-20 14:44:06
* @Copyright 1.0
*/
export default {
};

40
src/api/support/api-encrypt-api.js

@ -0,0 +1,40 @@
/**
* 接口加密解密
*
* @Author: 1024创新实验室-主任-卓大
* @Date: 2023-10-17 20:02:37
* @Copyright 1024创新实验室
*/
import { postRequest, postEncryptRequest } from '/@/lib/axios';
export const encryptApi = {
/**
* 测试 请求加密 @author 1024创新实验室-主任-卓大
*/
testRequestEncrypt: (param) => {
return postEncryptRequest('/support/apiEncrypt/testRequestEncrypt', param);
},
/**
* 测试 返回加密 @author 1024创新实验室-主任-卓大
*/
testResponseEncrypt: (param) => {
return postRequest('/support/apiEncrypt/testResponseEncrypt', param);
},
/**
* 测试 请求参数加密和解密返回数据加密和解密 @author 1024创新实验室-主任-卓大
*/
testDecryptAndEncrypt: (param) => {
return postEncryptRequest('/support/apiEncrypt/testDecryptAndEncrypt', param);
},
/**
* 测试 数组加解密 @author 1024创新实验室-主任-卓大
*/
testArray : (param) => {
return postEncryptRequest('/support/apiEncrypt/testArray', param);
},
};

25
src/api/support/cache-api.js

@ -0,0 +1,25 @@
/*
* 缓存
*
* @Author: 罗伊
* @Date: 2022-09-03 21:51:34
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import {getRequest} from '/@/lib/axios';
export const cacheApi = {
// 获取某个缓存的所有key @author 罗伊
getKeys: (cacheName) => {
return getRequest(`/support/cache/keys/${cacheName}`);
},
// 移除某个缓存 @author 罗伊
remove: (cacheName) => {
return getRequest(`/support/cache/remove/${cacheName}`);
},
// 获取所有缓存 @author 罗伊
getAllCacheNames: () => {
return getRequest('/support/cache/names');
},
};

45
src/api/support/change-log-api.js

@ -0,0 +1,45 @@
/**
* 系统更新日志 api 封装
*
* @Author: 卓大
* @Date: 2022-09-26 14:53:50
* @Copyright 1024创新实验室
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const changeLogApi = {
/**
* 分页查询 @author 卓大
*/
queryPage: (param) => {
return postRequest('/support/changeLog/queryPage', param);
},
/**
* 增加 @author 卓大
*/
add: (param) => {
return postRequest('/support/changeLog/add', param);
},
/**
* 修改 @author 卓大
*/
update: (param) => {
return postRequest('/support/changeLog/update', param);
},
/**
* 删除 @author 卓大
*/
delete: (id) => {
return getRequest(`/support/changeLog/delete/${id}`);
},
/**
* 批量删除 @author 卓大
*/
batchDelete: (idList) => {
return postRequest('/support/changeLog/batchDelete', idList);
},
};

46
src/api/support/code-generator-api.js

@ -0,0 +1,46 @@
/*
* 代码生成器
*
* @Author: 卓大
* @Date: 2022-09-03 21:51:54
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { getRequest, postRequest, getDownload } from '/@/lib/axios';
export const codeGeneratorApi = {
// 查询数据库的表 @author 卓大
queryTableList: (param) => {
return postRequest('/support/codeGenerator/table/queryTableList', param);
},
// 查询表的列 @author 卓大
getTableColumns: (table) => {
return getRequest(`/support/codeGenerator/table/getTableColumns/${table}`);
},
// ------------------- 配置 -------------------
// 获取表的配置信息 @author 卓大
getConfig: (table) => {
return getRequest(`/support/codeGenerator/table/getConfig/${table}`);
},
// 更新配置信息 @author 卓大
updateConfig: (param) => {
return postRequest('/support/codeGenerator/table/updateConfig', param);
},
// ------------------- 生成 -------------------
// 预览代码 @author 卓大
preview: (param) => {
return postRequest('/support/codeGenerator/code/preview', param);
},
// 下载代码 @author 卓大
downloadCode: (tableName) => {
return getDownload(`/support/codeGenerator/code/download/${tableName}`);
},
};

29
src/api/support/config-api.js

@ -0,0 +1,29 @@
/*
* 配置
*
* @Author: 卓大
* @Date: 2022-09-03 21:51:54
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const configApi = {
// 分页查询 @author 卓大
queryList: (param) => {
return postRequest('/support/config/query', param);
},
// 添加配置参数 @author 卓大
addConfig: (param) => {
return postRequest('/support/config/add', param);
},
// 修改配置参数 @author 卓大
updateConfig: (param) => {
return postRequest('/support/config/update', param);
},
// 查询配置详情 @author 卓大
queryByKey: (param) => {
return getRequest(`/support/config/queryByKey?configKey=${param}`);
},
};

17
src/api/support/data-masking-api.js

@ -0,0 +1,17 @@
/**
* 数据脱敏api
*
* @Author: 1024创新实验室-主任-卓大
* @Date: 2024-07-31 21:02:37
* @Copyright 1024创新实验室
*/
import { getRequest } from '/@/lib/axios';
export const dataMaskingApi = {
/**
* 查询脱敏数据
*/
query: () => {
return getRequest('/support/dataMasking/demo/query');
},
};

18
src/api/support/data-tracer-api.js

@ -0,0 +1,18 @@
/*
* 数据变动
*
* @Author: 卓大
* @Date: 2022-09-03 21:51:54
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest } from '/@/lib/axios';
export const dataTracerApi = {
// 分页查询业务操作日志 - @author 卓大
queryList: (param) => {
return postRequest('/support/dataTracer/query', param);
},
};

75
src/api/support/dict-api.js

@ -0,0 +1,75 @@
/*
* 字典
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 21:55:25
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const dictApi = {
// 获取所有字典code @author 1024创新实验室-主任-卓大
getAllDict: () => {
return getRequest('/support/dict/getAllDict');
},
// 获取全部字典数据 @author 1024创新实验室-主任-卓大
getAllDictData: () => {
return getRequest('/support/dict/getAllDictData');
},
// 分页查询 @author 1024创新实验室-主任-卓大
queryDict: (param) => {
return postRequest('/support/dict/queryPage', param);
},
// 添加 @author 1024创新实验室-主任-卓大
addDict: (param) => {
return postRequest('/support/dict/add', param);
},
// 更新 @author 1024创新实验室-主任-卓大
updateDict: (param) => {
return postRequest('/support/dict/update', param);
},
// 字典-删除- @author 卓大
batchDeleteDict: (dictIdList) => {
return postRequest('/support/dict/batchDelete', dictIdList);
},
// 字典 启用 禁用 @author 1024创新实验室-主任-卓大
updateDisabled: (dictId) => {
return getRequest(`/support/dict/updateDisabled/${dictId}`);
},
// ------------- 查询字典数据 -------------
// 字典数据 分页查询 @author 1024创新实验室-主任-卓大
queryDictData: (dictId) => {
return getRequest(`/support/dict/dictData/queryDictData/${dictId}`);
},
// 字典数据 添加 - @author 卓大
addDictData: (param) => {
return postRequest('/support/dict/dictData/add', param);
},
// 字典数据 更新- @author 卓大
updateDictData: (param) => {
return postRequest('/support/dict/dictData/update', param);
},
// 字典数据-删除- @author 卓大
batchDeleteDictData: (dictDataIdList) => {
return postRequest('/support/dict/dictData/batchDelete', dictDataIdList);
},
// 字典数据 启用 禁用 @author 1024创新实验室-主任-卓大
updateDictDataDisabled: (dictDataId) => {
return getRequest(`/support/dict/dictData/updateDisabled/${dictDataId}`);
},
};

21
src/api/support/feedback-api.js

@ -0,0 +1,21 @@
/*
* 意见反馈
*
* @Author: 1024创新实验室开云
* @Date: 2022-09-03 21:56:31
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest } from '/@/lib/axios';
export const feedbackApi = {
// 意见反馈-新增
addFeedback: (params) => {
return postRequest('/support/feedback/add', params);
},
// 意见反馈-分页查询
queryFeedback: (params) => {
return postRequest('/support/feedback/query', params);
},
};

45
src/api/support/file-api.js

@ -0,0 +1,45 @@
/*
* 文件上传
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 21:55:25
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest, getRequest, getDownload } from '/@/lib/axios';
export const fileApi = {
// 文件上传 @author 卓大
uploadUrl: '/support/file/upload',
uploadFile: (param, folder) => {
return postRequest(`/support/file/upload?folder=${folder}`, param);
},
/**
* 分页查询 @author 卓大
*/
queryPage: (param) => {
return postRequest('/support/file/queryPage', param);
},
/**
* 获取文件URL根据fileKey @author 胡克
*/
getUrl: (fileKey) => {
return getRequest(`/support/file/getFileUrl?fileKey=${fileKey}`);
},
/**
* 下载文件流根据fileKey @author 胡克
*/
downLoadFile: (fileKey) => {
return getDownload('/support/file/downLoad', { fileKey });
},
/**
* 根据文件ID列表获取文件信息 @author 系统
*/
getFileList: (fileIds) => {
return getRequest(`/support/file/getFileList?fileIds=${fileIds}`);
},
};

17
src/api/support/heart-beat-api.js

@ -0,0 +1,17 @@
/*
* 心跳
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 21:55:47
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest } from '/@/lib/axios';
export const heartBeatApi = {
// 分页查询 @author 卓大
queryList: (param) => {
return postRequest('/support/heartBeat/query', param);
},
};

59
src/api/support/help-doc-api.js

@ -0,0 +1,59 @@
/*
* 帮助文档
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 21:56:31
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const helpDocApi = {
// 【管理】帮助文档-分页查询 @author zhuoda
query: (param) => {
return postRequest('/support/helpDoc/query', param);
},
//【管理】帮助文档-更新 @author zhuoda
update: (param) => {
return postRequest('/support/helpDoc/update', param);
},
// 【管理】帮助文档-添加 @author zhuoda
add: (param) => {
return postRequest('/support/helpDoc/add', param);
},
//【管理】帮助文档-删除 @author zhuoda
delete: (helpDocId) => {
return getRequest(`/support/helpDoc/delete/${helpDocId}`);
},
//【管理】帮助文档-获取详情 @author zhuoda
getDetail: (helpDocId) => {
return getRequest(`/support/helpDoc/getDetail/${helpDocId}`);
},
//【管理】帮助文档-根据关联id查询 @author zhuoda
queryHelpDocByRelationId: (relationId) => {
return getRequest(`/support/helpDoc/queryHelpDocByRelationId/${relationId}`);
},
//----------------------- 用户相关 --------------------------------
//【用户】帮助文档-查询全部 @author zhuoda
getAllHelpDocList() {
return getRequest('/support/helpDoc/user/queryAllHelpDocList');
},
//【用户】帮助文档-查询全部 @author zhuoda
view(helpDocId) {
return getRequest(`/support/helpDoc/user/view/${helpDocId}`);
},
//【用户】帮助文档-查询 查看记录 @author zhuoda
queryViewRecord(param) {
return postRequest('/support/helpDoc/user/queryViewRecord', param);
},
};

32
src/api/support/help-doc-catalog-api.js

@ -0,0 +1,32 @@
/*
* 帮助文档 目录
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 21:56:31
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const helpDocCatalogApi = {
//帮助文档目录-获取全部 @author zhuoda
getAll: () => {
return getRequest('/support/helpDoc/helpDocCatalog/getAll');
},
//帮助文档目录-添加 @author zhuoda
add: (param) => {
return postRequest('/support/helpDoc/helpDocCatalog/add', param);
},
//帮助文档目录-更新 @author zhuoda
update: (param) => {
return postRequest('/support/helpDoc/helpDocCatalog/update', param);
},
//帮助文档目录-删除 @author zhuoda
delete: (helpDocCatalogId) => {
return getRequest(`/support/helpDoc/helpDocCatalog/delete/${helpDocCatalogId}`);
},
};

42
src/api/support/job-api.js

@ -0,0 +1,42 @@
/*
* job api
*
* @Author: huke
* @Date: 2024/06/25
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const jobApi = {
// 分页查询 @huke
queryJob: (param) => {
return postRequest('/support/job/query', param);
},
// 定时任务-查询详情 @huke
queryJobInfo: (param) => {
return getRequest(`/support/job/${param}`);
},
// 执行任务 @huke
executeJob: (param) => {
return postRequest('/support/job/execute', param);
},
// 定时任务-新增-任务信息 @huke
addJob: (param) => {
return postRequest('/support/job/add', param);
},
// 定时任务-更新-任务信息 @huke
updateJob: (param) => {
return postRequest('/support/job/update', param);
},
// 定时任务-更新-开启状态 @huke
updateJobEnabled: (param) => {
return postRequest('/support/job/update/enabled', param);
},
// 定时任务-执行记录-分页查询 @huke
queryJobLog: (param) => {
return postRequest('/support/job/log/query', param);
},
// 定时任务-删除 @zhuoda
deleteJob: (param) => {
return getRequest(`/support/job/delete?jobId=${param}`);
},
};

24
src/api/support/level3-protect-api.js

@ -0,0 +1,24 @@
/**
* 三级等保 api 封装
*
* @Author: 1024创新实验室-主任-卓大
* @Date: 2024-07-31 21:02:37
* @Copyright 1024创新实验室
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const level3ProtectApi = {
/**
* 查询 三级等保配置 @author 1024创新实验室-主任-卓大
*/
getConfig: () => {
return getRequest('/support/protect/level3protect/getConfig');
},
/**
* 更新三级等保配置 @author 1024创新实验室-主任-卓大
*/
updateConfig: (form) => {
return postRequest('/support/protect/level3protect/updateConfig', form);
},
};

26
src/api/support/login-fail-api.js

@ -0,0 +1,26 @@
/**
* 登录锁定 api 封装
*
* @Author: 1024创新实验室-主任-卓大
* @Date: 2023-10-17 18:02:37
* @Copyright 1024创新实验室
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const loginFailApi = {
/**
* 分页查询 @author 1024创新实验室-主任-卓大
*/
queryPage : (param) => {
return postRequest('/support/protect/loginFail/queryPage', param);
},
/**
* 批量删除 @author 1024创新实验室-主任-卓大
*/
batchDelete: (idList) => {
return postRequest('/support/protect/loginFail/batchDelete', idList);
},
};

21
src/api/support/login-log-api.js

@ -0,0 +1,21 @@
/*
* 登录日志
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 21:56:31
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const loginLogApi = {
// 分页查询 @author 卓大
queryList: (param) => {
return postRequest('/support/loginLog/page/query', param);
},
// 分页查询当前登录人信息 @author 善逸
queryListLogin: (param) => {
return postRequest('/support/loginLog/page/query/login', param);
},
};

31
src/api/support/message-api.js

@ -0,0 +1,31 @@
import { getRequest, postRequest } from '/@/lib/axios';
export const messageApi = {
// 通知消息-分页查询
queryMessage: (param) => {
return postRequest('/support/message/queryMyMessage', param);
},
// 通知消息-查询未读消息数
queryUnreadCount: () => {
return getRequest('/support/message/getUnreadCount');
},
// 通知消息-标记已读
updateReadFlag: (messageId) => {
return getRequest(`/support/message/read/${messageId}`);
},
//通知消息-分页查询 @author 卓大
queryAdminMessage: (param) => {
return postRequest('/message/query', param);
},
//通知消息-新建 @author 卓大
sendMessages: (param) => {
return postRequest('/message/sendMessages', param);
},
//通知消息-删除 @author 卓大
deleteMessage: (messageId) => {
return getRequest(`/message/delete/${messageId}`);
},
};

25
src/api/support/operate-log-api.js

@ -0,0 +1,25 @@
/*
* 操作日志
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 21:56:45
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const operateLogApi = {
// 分页查询 @author 卓大
queryList: (param) => {
return postRequest('/support/operateLog/page/query', param);
},
// 详情 @author 卓大
detail: (id) => {
return getRequest(`/support/operateLog/detail/${id}`);
},
// 分页查询当前登录人信息 @author 善逸
queryListLogin: (param) => {
return postRequest('/support/operateLog/page/query/login', param);
},
};

25
src/api/support/reload-api.js

@ -0,0 +1,25 @@
/*
* reload (内存热加载钩子等)
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 21:57:19
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const reloadApi = {
// 查询reload列表 @author 卓大
queryList: () => {
return getRequest('/support/reload/query');
},
// 获取reload result @author 卓大
queryReloadResult: (tag) => {
return getRequest(`/support/reload/result/${tag}`);
},
// 执行reload @author 卓大
reload: (reloadForm) => {
return postRequest('/support/reload/update', reloadForm);
},
};

25
src/api/support/serial-number-api.js

@ -0,0 +1,25 @@
/*
* 单据序列号
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 21:57:52
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const serialNumberApi = {
// 生成单号 @author 卓大
generate: (generateForm) => {
return postRequest('/support/serialNumber/generate', generateForm);
},
// 获取所有单号定义 @author 卓大
getAll: () => {
return getRequest('/support/serialNumber/all');
},
// 获取生成记录 @author 卓大
queryRecord: (form) => {
return postRequest('/support/serialNumber/queryRecord', form);
},
};

26
src/api/support/table-column-api.js

@ -0,0 +1,26 @@
/*
* @Description:表格自定义列
* @version:
* @Author: zhuoda
* @Date: 2022-08-17 23:32:36
* @LastEditors: zhuoda
* @LastEditTime: 2022-08-21
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const tableColumnApi = {
// 修改表格列 @author zhuoda
updateTableColumn: (param) => {
return postRequest('/support/tableColumn/update', param);
},
// 查询表格列 @author zhuoda
getColumns: (tableId) => {
return getRequest(`/support/tableColumn/getColumns/${tableId}`);
},
// 删除表格列 @author zhuoda
deleteColumns: (tableId) => {
return getRequest(`/support/tableColumn/delete/${tableId}`);
},
};

39
src/api/system/department-api.js

@ -0,0 +1,39 @@
/*
* 部门
*/
import { getRequest, postRequest } from '/@/lib/axios';
export const departmentApi = {
/**
* 查询部门列表
*/
queryAllDepartment: () => {
return getRequest('/department/listAll');
},
/**
* 查询部门树形列表
*/
queryDepartmentTree: () => {
return getRequest('/department/treeList');
},
/**
* 添加部门
*/
addDepartment: (param) => {
return postRequest('/department/add', param);
},
/**
* 更新部门信息
*/
updateDepartment: (param) => {
return postRequest('/department/update', param);
},
/**
* 删除
*/
deleteDepartment: (departmentId) => {
return getRequest(`/department/delete/${departmentId}`);
},
};

93
src/api/system/employee-api.js

@ -0,0 +1,93 @@
/*
* 员工
*/
import { getRequest, postEncryptRequest, postRequest } from '/@/lib/axios';
export const employeeApi = {
/**
* 查询所有员工
*/
queryAll: () => {
return getRequest('/employee/queryAll');
},
/**
* 员工管理查询
*/
queryEmployee: (params) => {
return postRequest('/employee/query', params);
},
/**
* 添加员工
*/
addEmployee: (params) => {
return postRequest('/employee/add', params);
},
/**
* 更新员工信息
*/
updateEmployee: (params) => {
return postRequest('/employee/update', params);
},
/**
* 更新员工个人中心信息
*/
updateCenter: (params) => {
return postRequest('/employee/update/center', params);
},
/**
* 更新登录人头像
*/
updateAvatar: (params) => {
return postRequest('/employee/update/avatar', params);
},
/**
* 删除员工
*/
deleteEmployee: (employeeId) => {
return getRequest(`/employee/delete/${employeeId}`);
},
/**
* 批量删除员工
*/
batchDeleteEmployee: (employeeIdList) => {
return postRequest('/employee/update/batch/delete', employeeIdList);
},
/**
* 批量调整员工部门
*/
batchUpdateDepartmentEmployee: (updateParam) => {
return postRequest('/employee/update/batch/department', updateParam);
},
/**
* 重置员工密码
*/
resetPassword: (employeeId) => {
return getRequest(`/employee/update/password/reset/${employeeId}`);
},
/**
* 修改密码
*/
updateEmployeePassword: (param) => {
return postEncryptRequest('/employee/update/password', param);
},
/**
* 获取密码复杂度
*/
getPasswordComplexityEnabled: () => {
return getRequest('/employee/getPasswordComplexityEnabled');
},
/**
* 更新员工禁用状态
*/
updateDisabled: (employeeId) => {
return getRequest(`/employee/update/disabled/${employeeId}`);
},
/**
* 查询员工-根据部门id
*/
queryEmployeeByDeptId: (departmentId) => {
return getRequest(`/employee/getAllEmployeeByDepartmentId/${departmentId}`);
},
};

19
src/api/system/home-api.js

@ -0,0 +1,19 @@
/*
* 首页api
*/
import { getRequest } from '/@/lib/axios';
export const homeApi = {
/**
* @description: 首页-金额统计业绩收款订单数等
*/
homeAmountStatistics: () => {
return getRequest('/home/amount/statistics');
},
/**
* @description: 首页-待办信息
*/
homeWaitHandle: () => {
return getRequest('home/wait/handle');
},
};

54
src/api/system/login-api.js

@ -0,0 +1,54 @@
/*
* 登录
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 21:59:58
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { getRequest, postRequest } from '/@/lib/axios';
export const loginApi = {
/**
* 登录 @author 卓大
*/
login: (param) => {
return postRequest('/login', param);
},
/**
* 退出登录 @author 卓大
*/
logout: () => {
return getRequest('/login/logout');
},
/**
* 获取验证码 @author 卓大
*/
getCaptcha: () => {
return getRequest('/login/getCaptcha');
},
/**
* 获取登录信息 @author 卓大
*/
getLoginInfo: () => {
return getRequest('/login/getLoginInfo');
},
/**
* 获取邮箱登录验证码 @author 卓大
*/
sendLoginEmailCode: (loginName) => {
return getRequest(`/login/sendEmailCode/${loginName}`);
},
/**
* 获取双因子登录标识 @author 卓大
*/
getTwoFactorLoginFlag: () => {
return getRequest('/login/getTwoFactorLoginFlag');
},
};

54
src/api/system/menu-api.js

@ -0,0 +1,54 @@
/*
* 菜单
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 22:00:32
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { getRequest, postRequest } from '/@/lib/axios';
export const menuApi = {
/**
* 添加菜单
*/
addMenu: (param) => {
return postRequest('/menu/add', param);
},
/**
* 更新菜单
*/
updateMenu: (param) => {
return postRequest('/menu/update', param);
},
/**
* 批量删除菜单
*/
batchDeleteMenu: (menuIdList) => {
return getRequest(`/menu/batchDelete?menuIdList=${menuIdList}`);
},
/**
* 查询所有菜单列表
*/
queryMenu: () => {
return getRequest('/menu/query');
},
/**
* 查询菜单树
*/
queryMenuTree: (onlyMenu) => {
return getRequest(`/menu/tree?onlyMenu=${onlyMenu}`);
},
/**
* 获取所有请求路径
*/
getAuthUrl: () => {
return getRequest('/menu/auth/url');
},
};

55
src/api/system/position-api.js

@ -0,0 +1,55 @@
/**
* 职务表 api 封装
*
* @Author: kaiyun
* @Date: 2024-06-23 23:31:38
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const positionApi = {
/**
* 分页查询 @author kaiyun
*/
queryPage : (param) => {
return postRequest('/position/queryPage', param);
},
/**
* 增加 @author kaiyun
*/
add: (param) => {
return postRequest('/position/add', param);
},
/**
* 修改 @author kaiyun
*/
update: (param) => {
return postRequest('/position/update', param);
},
/**
* 删除 @author kaiyun
*/
delete: (id) => {
return getRequest(`/position/delete/${id}`);
},
/**
* 批量删除 @author kaiyun
*/
batchDelete: (idList) => {
return postRequest('/position/batchDelete', idList);
},
/**
* 查询列表 @author kaiyun
*/
queryList: () => {
return getRequest('/position/queryList');
},
};

85
src/api/system/role-api.js

@ -0,0 +1,85 @@
/*
* 角色
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 22:00:41
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { getRequest, postRequest } from '/@/lib/axios';
export const roleApi = {
/**
* @description: 获取所有角色
*/
queryAll: () => {
return getRequest('/role/getAll');
},
/**
* @description:添加角色
*/
addRole: (data) => {
return postRequest('/role/add', data);
},
/**
* @description:更新角色
*/
updateRole: (data) => {
return postRequest('/role/update', data);
},
/**
* @description: 删除角色
*/
deleteRole: (roleId) => {
return getRequest(`/role/delete/${roleId}`);
},
/**
* @description: 批量设置某角色数据范围
*/
updateDataScope: (data) => {
return postRequest('/role/dataScope/updateRoleDataScopeList', data);
},
/**
* @description: 获取当前系统所配置的所有数据范围
*/
getDataScopeList: () => {
return getRequest('/dataScope/list');
},
/**
* @description: 获取某角色所设置的数据范围
*/
getDataScopeByRoleId: (roleId) => {
return getRequest(`/role/dataScope/getRoleDataScopeList/${roleId}`);
},
/**
* @description: 获取角色成员-员工列表
*/
queryRoleEmployee: (params) => {
return postRequest('/role/employee/queryEmployee', params);
},
/**
* @description: 从角色成员列表中移除员工
*/
deleteEmployeeRole: (employeeId, roleId) => {
return getRequest('/role/employee/removeEmployee?employeeId=' + employeeId + '&roleId=' + roleId);
},
/**
* @description: 从角色成员列表中批量移除员工
*/
batchRemoveRoleEmployee: (data) => {
return postRequest('/role/employee/batchRemoveRoleEmployee', data);
},
/**
* @description: 根据角色id获取角色员工列表(无分页)
*/
getRoleAllEmployee: (roleId) => {
return getRequest(`/role/employee/getAllEmployeeByRoleId/${roleId}`);
},
/**
* @description: 角色成员列表中批量添加员工
*/
batchAddRoleEmployee: (data) => {
return postRequest('/role/employee/batchAddRoleEmployee', data);
},
};

24
src/api/system/role-menu-api.js

@ -0,0 +1,24 @@
/*
* 角色菜单
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-03 22:00:49
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { getRequest, postRequest } from '/@/lib/axios';
export const roleMenuApi = {
/**
* @description: 获取角色关联菜单权限
*/
getRoleSelectedMenu: (roleId) => {
return getRequest(`role/menu/getRoleSelectedMenu/${roleId}`);
},
/**
* @description: 更新角色权限
*/
updateRoleMenu: (data) => {
return postRequest('role/menu/updateRoleMenu', data);
},
};

BIN
src/assets/images/1024lab/1024lab-gzh.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
src/assets/images/1024lab/gzh.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
src/assets/images/1024lab/xiaozhen-gzh.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

BIN
src/assets/images/1024lab/zhuoda-wechat.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
src/assets/images/login/ali-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
src/assets/images/login/blue-login-bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

BIN
src/assets/images/login/douyin-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
src/assets/images/login/feishu-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
src/assets/images/login/google-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
src/assets/images/login/left-bg1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

BIN
src/assets/images/login/left-bg2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

BIN
src/assets/images/login/login-bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

BIN
src/assets/images/login/login-bg2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

BIN
src/assets/images/login/login-bg3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

BIN
src/assets/images/login/login-bg4 .png

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

BIN
src/assets/images/login/login-form-open-eyes-close.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
src/assets/images/login/login-form-open-eyes.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
src/assets/images/login/login-min.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
src/assets/images/login/login-qr.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
src/assets/images/login/login.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

BIN
src/assets/images/login/qq-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
src/assets/images/login/wechat-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
src/assets/images/login/weibo-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
src/assets/images/logo/logo-min.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
src/assets/images/logo/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
src/assets/images/logo/smart-admin-logo-white.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
src/assets/images/logo/smart-admin-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

3
src/assets/images/nav/active_bg2.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="120" height="35" viewBox="0 0 120 35">
<path id="bg" data-name="bg" d="M13.444,35H1.272v0A12.461,12.461,0,0,0,13.444,22.845V8a8,8,0,0,1,8-8H70V35ZM0,34.961v0Z" fill="#e9efff"/>
</svg>

After

Width:  |  Height:  |  Size: 233 B

3
src/assets/images/nav/active_bg2_default.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="120" height="35" viewBox="0 0 120 35">
<path id="bg_default" data-name="bg_default" d="M13.444,35H1.272v0A12.461,12.461,0,0,0,13.444,22.845V8a8,8,0,0,1,8-8H70V35ZM0,34.961v0Z" fill="#DEE1E6"/>
</svg>

After

Width:  |  Height:  |  Size: 249 B

BIN
src/assets/images/notice/edit_icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 B

BIN
src/assets/images/notice/file_icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

86
src/components/business/category-tree-select/index.vue

@ -0,0 +1,86 @@
<!--
* 目录 树形选择组件
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-08-12 21:01:52
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<a-tree-select
v-model:value="selectValue"
:style="`width:${width}`"
:dropdown-style="{ maxHeight: '400px', overflowX: 'auto' }"
:tree-data="categoryTreeData"
:placeholder="placeholder"
:allowClear="true"
tree-default-expand-all
@change="onChange"
/>
</template>
<script setup>
import { ref, watch, onMounted } from 'vue';
import { categoryApi } from '/@/api/business/category/category-api';
import { smartSentry } from '/@/lib/smart-sentry';
const props = defineProps({
value: Number,
placeholder: {
type: String,
default: '请选择',
},
categoryType: Number,
width: {
type: String,
default: '100%',
},
});
const emit = defineEmits(['update:value', 'change']);
// ----------------- -----------------
const categoryTreeData = ref([]);
async function queryCategoryTree() {
if (!props.categoryType) {
categoryTreeData.value = [];
return;
}
try {
let param = {
categoryType: props.categoryType,
};
let resp = await categoryApi.queryCategoryTree(param);
categoryTreeData.value = resp.data;
} catch (e) {
smartSentry.captureError(e);
}
}
// ----------------- -----------------
const selectValue = ref(props.value);
// value
watch(
() => props.value,
(newValue) => {
selectValue.value = newValue;
}
);
//
watch(
() => props.categoryType,
() => {
queryCategoryTree();
}
);
function onChange(value) {
emit('update:value', value);
emit('change', value);
}
onMounted(queryCategoryTree);
</script>

109
src/components/business/oa/enterprise-bank-select/index.vue

@ -0,0 +1,109 @@
<!--
* 公司银行 下拉选择框
*
* @Author: 1024创新实验室开云
* @Date: 2022-09-02 22:12:20
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<a-select
v-model:value="selectValue"
:style="`width: ${width}`"
:placeholder="props.placeholder"
:showSearch="true"
:allowClear="true"
:size="size"
@change="handleChange"
:disabled="disabled"
:mode="multiple ? 'multiple' : ''"
optionFilterProp="label"
>
<a-select-option v-for="item in dataList" :key="item.bankId" :label="item.bankName">
{{ item.bankName }}({{ starAccountNumber(item.accountNumber) }})
</a-select-option>
</a-select>
</template>
<script setup>
import { onMounted, ref, watch } from 'vue';
import { bankApi } from '/@/api/business/oa/bank-api';
import _ from 'lodash';
const props = defineProps({
value: [Number, String, Object],
width: {
type: String,
default: '200px',
},
placeholder: {
type: String,
default: '请选择',
},
size: {
type: String,
default: 'default',
},
disabled: {
type: Boolean,
default: false,
},
multiple: {
type: Boolean,
default: false,
},
enterpriseId: {
type: Number,
},
});
// ------------------------ ------------------------
const emit = defineEmits(['update:value', 'change']);
const selectValue = ref(props.value);
// value
watch(
() => props.value,
(newValue) => {
selectValue.value = newValue;
}
);
// ID
watch(
() => props.enterpriseId,
(newValue) => {
queryData();
}
);
function handleChange(value) {
emit('update:value', value);
emit('change', value);
}
// ------------------------ ------------------------
const dataList = ref([]);
async function queryData() {
if (!props.enterpriseId) {
return;
}
let res = await bankApi.queryList(props.enterpriseId);
dataList.value = res.data;
if (!props.value && !_.isEmpty(dataList.value)) {
selectValue.value = res.data[0].invoiceId;
handleChange(res.data[0].invoiceId);
}
}
//
function starAccountNumber(accountNumber) {
if (accountNumber.length < 7) {
return accountNumber;
}
return accountNumber.substr(0, 3) + '**' + accountNumber.substring(accountNumber.length - 3);
}
onMounted(queryData);
</script>

108
src/components/business/oa/enterprise-invoice-select/index.vue

@ -0,0 +1,108 @@
<!--
* 公司的开票信息 下拉选择框
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-01 23:14:49
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
-->
<template>
<a-select
v-model:value="selectValue"
:style="`width: ${width}`"
:placeholder="props.placeholder"
:showSearch="true"
:allowClear="true"
:size="size"
@change="handleChange"
:disabled="disabled"
:mode="multiple ? 'multiple' : ''"
optionFilterProp="label"
>
<a-select-option v-for="item in dataList" :key="item.invoiceId" :label="item.invoiceHeads">
{{ item.invoiceHeads }}
</a-select-option>
</a-select>
</template>
<script setup>
import { onMounted, ref, watch } from 'vue';
import { invoiceApi } from '/@/api/business/oa/invoice-api';
import _ from 'lodash';
const props = defineProps({
value: [Number, String, Object],
width: {
type: String,
default: '200px',
},
placeholder: {
type: String,
default: '请选择',
},
size: {
type: String,
default: 'default',
},
disabled: {
type: Boolean,
default: false,
},
multiple: {
type: Boolean,
default: false,
},
enterpriseId: {
type: Number,
},
});
// ------------------------ ------------------------
const emit = defineEmits(['update:value', 'change']);
const selectValue = ref(props.value);
// value
watch(
() => props.value,
(newValue) => {
selectValue.value = newValue;
}
);
// ID
watch(
() => props.enterpriseId,
(newValue) => {
queryData();
}
);
function handleChange(value) {
emit('update:value', value);
emit(
'change',
value,
dataList.value.find((e) => e.invoiceId == value)
);
}
// ------------------------ ------------------------
const dataList = ref([]);
async function queryData() {
if (!props.enterpriseId) {
return;
}
let res = await invoiceApi.queryList(props.enterpriseId);
dataList.value = res.data;
if (!props.value && !_.isEmpty(dataList.value)) {
selectValue.value = res.data[0].invoiceId;
handleChange(res.data[0].invoiceId);
}
}
onMounted(queryData);
</script>

85
src/components/business/oa/enterprise-select/index.vue

@ -0,0 +1,85 @@
<!--
* 企业列表 下拉选择框
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-08-26 19:16:24
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<a-select
v-model:value="selectValue"
:style="`width: ${width}`"
:placeholder="props.placeholder"
:showSearch="true"
:allowClear="true"
:size="size"
@change="handleChange"
:disabled="disabled"
:mode="multiple ? 'multiple' : ''"
optionFilterProp="label"
>
<a-select-option v-for="item in dataList" :key="item.enterpriseId" :label="item.enterpriseName">
{{ item.enterpriseName }}
</a-select-option>
</a-select>
</template>
<script setup>
import { onMounted, ref, watch } from 'vue';
import { enterpriseApi } from '/@/api/business/oa/enterprise-api';
const props = defineProps({
value: [Number, String, Object],
width: {
type: String,
default: '200px',
},
placeholder: {
type: String,
default: '请选择',
},
size: {
type: String,
default: 'default',
},
disabled: {
type: Boolean,
default: false,
},
multiple: {
type: Boolean,
default: false,
},
// ENTERPRISE_TYPE_ENUM
type: {
type: Number,
},
});
const emit = defineEmits(['update:value', 'change']);
const selectValue = ref(props.value);
// value
watch(
() => props.value,
(newValue) => {
selectValue.value = newValue;
}
);
function handleChange(value) {
emit('update:value', value);
emit('change', value);
}
const dataList = ref([]);
async function queryData() {
let res = await enterpriseApi.queryList(props.type);
dataList.value = res.data;
}
onMounted(queryData);
</script>

87
src/components/framework/area-cascader/index.vue

@ -0,0 +1,87 @@
<!--
* 地区选择框
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-12 15:22:45
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<a-cascader
:style="`width:${width}`"
v-model:value="areaValue"
:show-search="{ filter }"
:options="areaOptionData"
:placeholder="placeholder"
:size="size"
@change="handleChange"
/>
</template>
<script setup>
import { PROVINCE_CITY_DISTRICT } from './province-city-district';
import { PROVINCE_CITY } from './province-city';
import { ref, toRaw, watch } from 'vue';
// ============ ============
const TYPE_PROVINCE_CITY_DISTRICT = 'province_city_district';
const props = defineProps({
type: String,
value: [Number, Array],
width: {
type: String,
default: '200px',
},
placeholder: {
type: String,
default: '请选择地区',
},
size: {
type: String,
default: 'default',
},
disabled: {
type: Boolean,
default: false,
},
});
const emit = defineEmits(['update:value', 'change']);
// ============ ============
const areaOptionData = props.type === TYPE_PROVINCE_CITY_DISTRICT ? PROVINCE_CITY_DISTRICT : PROVINCE_CITY;
//
const areaValue = ref([]);
// value
watch(
() => props.value,
(newValue) => {
if (newValue) {
let array = [];
for (let index = 0; index < 3; index++) {
if (newValue[index]) {
array.push(newValue[index].value);
}
}
areaValue.value = array;
} else {
areaValue.value = [];
}
}
);
function handleChange(value, selectedOptions) {
emit('update:value', toRaw(selectedOptions));
emit('change', value, toRaw(selectedOptions));
}
const filter = (inputValue, path) => {
return path.some((option) => option.label.toLowerCase().indexOf(inputValue.toLowerCase()) > -1);
};
</script>

17546
src/components/framework/area-cascader/province-city-district.js

File diff suppressed because it is too large

1727
src/components/framework/area-cascader/province-city.js

File diff suppressed because it is too large

80
src/components/framework/boolean-select/index.vue

@ -0,0 +1,80 @@
<!--
* 布尔 树形选择组件
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-08-12 21:01:52
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<a-select
v-model:value="selectValue"
:style="`width: ${width}px`"
:placeholder="placeholder"
:showSearch="true"
:allowClear="true"
:size="size"
@change="handleChange"
>
<a-select-option v-for="item in $smartEnumPlugin.getValueDescList('FLAG_NUMBER_ENUM')" :key="item.value" :value="item.value">
{{ item.desc }}
</a-select-option>
</a-select>
</template>
<script setup>
import _ from 'lodash';
import { ref, watch } from 'vue';
const props = defineProps({
value: Boolean,
width: {
type: Number,
default: 100,
},
placeholder: {
type: String,
default: '请选择',
},
size: {
type: String,
default: 'default',
},
disabled: {
type: Boolean,
default: false,
},
});
const emit = defineEmits(['update:value', 'change']);
function convertBoolean2number(value) {
let result = null;
if (_.isNaN(value) || _.isNull(value) || _.isUndefined(value)) {
result = null;
} else {
result = value ? 1 : 0;
}
return result;
}
// value
const selectValue = ref(convertBoolean2number(props.value));
watch(
() => props.value,
(newValue) => {
selectValue.value = convertBoolean2number(newValue);
}
);
const handleChange = (value) => {
console.log('boolean enum select', value);
let booleanResult = null;
if (!_.isUndefined(value)) {
booleanResult = value === 1;
}
emit('update:value', booleanResult);
emit('change', booleanResult);
};
</script>

133
src/components/framework/icon-select/index.vue

@ -0,0 +1,133 @@
<!--
* 图标 选择
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-01 23:14:49
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
-->
<template>
<div>
<a-popover v-model:open="visible" placement="bottomLeft" trigger="click">
<template #title>
<a-form-item>
<a-radio-group @change="updateSelectIconArray" v-model:value="iconStyle" style="margin: 8px">
<a-radio-button value="outlined">线框风格</a-radio-button>
<a-radio-button value="filled">实底风格</a-radio-button>
<a-radio-button value="twoTone">双色风格</a-radio-button>
</a-radio-group>
</a-form-item>
<a-form-item>
<a-input-search v-model:value="searchValue" placeholder="输入英文关键词进行搜索" @change="updateSelectIconArray" />
</a-form-item>
</template>
<template #content>
<div class="icon-box">
<div v-for="item in iconLoopArray" :key="item" @click="handleClick(item)" class="icon-content">
<component :is="$antIcons[item]" />
</div>
<div v-show="showMoreIndex > 0">
<a-button type="link" @click="showMore">点击展开更多图标因图标较多可能会卡一小会</a-button>
</div>
</div>
</template>
<slot name="iconSelect"></slot>
</a-popover>
</div>
</template>
<script setup>
import * as VueIcon from '@ant-design/icons-vue';
import { computed, ref, watch } from 'vue';
import _ from 'lodash';
//线
const outlinedIconArray = Object.keys(VueIcon).filter((e) => _.endsWith(e.toLowerCase(), 'outlined'));
//
const filledIconArray = Object.keys(VueIcon).filter((e) => _.endsWith(e.toLowerCase(), 'filled'));
//
const twoToneIconArray = Object.keys(VueIcon).filter((e) => _.endsWith(e.toLowerCase(), 'twotone'));
// ------------ / ------------
const visible = ref(false);
// ------------ ------------
const SHOW_MORE_LENGTH = 35;
const showMoreIndex = ref(SHOW_MORE_LENGTH);
function showMore() {
showMoreIndex.value = -1;
}
// ------------ ------------
const iconStyle = ref('outlined');
const selectIconArray = ref([...outlinedIconArray]);
const iconLoopArray = computed(() => {
return _.slice(selectIconArray.value, 0, showMoreIndex.value);
});
watch(iconStyle, (newValue, oldValue) => {
updateSelectIconArray();
});
let searchValue = ref('');
function updateSelectIconArray() {
let tempArray = null;
if (iconStyle.value === 'outlined') {
tempArray = outlinedIconArray;
} else if (iconStyle.value === 'filled') {
tempArray = filledIconArray;
} else {
tempArray = twoToneIconArray;
}
if (!searchValue.value) {
selectIconArray.value = tempArray;
} else {
selectIconArray.value = tempArray.filter((e) => e.toLowerCase().includes(searchValue.value.toLowerCase()));
}
if (selectIconArray.value.length > SHOW_MORE_LENGTH) {
showMoreIndex.value = SHOW_MORE_LENGTH;
}
}
// ------------ ------------
const emit = defineEmits(['updateIcon']);
function handleClick(icon) {
visible.value = false;
emit('updateIcon', icon);
}
</script>
<style scoped lang="less">
.icon-box {
overflow: auto;
font-size: 20px;
width: 410px;
height: 300px;
display: flex;
flex-wrap: wrap;
flex-direction: row;
align-content: flex-start;
}
.icon-content {
width: 45px;
height: 40px;
margin: 5px;
cursor: pointer;
text-align: center;
border-radius: 6px;
border: 1px solid #ccc;
.more-icon {
font-size: 14px;
margin: 5px;
}
}
.icon-content:hover {
background: #1890ff;
}
</style>

18
src/components/framework/iframe/iframe-index.vue

@ -0,0 +1,18 @@
<!--
* iframe 组件
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-01 23:14:49
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
-->
<template>
<iframe :id="name" :src="url" frameborder="0" height="800" scrolling="yes" width="100%"></iframe>
</template>
<script setup>
let props = defineProps({
name: String,
url: String,
});
</script>

3
src/components/framework/iframe/route-default-component.vue

@ -0,0 +1,3 @@
<template>
<div></div>
</template>

38
src/components/framework/smart-copy-icon/index.vue

@ -0,0 +1,38 @@
<template>
<CopyOutlined
@click="copy"
:style="{
color: `${color}`,
}"
class="icon"
/>
</template>
<script setup>
import { message } from 'ant-design-vue';
const props = defineProps({
value: {
type: [String, Number],
default: '',
},
color: {
type: String,
default: '#1890ff',
},
});
function copy() {
const textarea = document.createElement('textarea');
textarea.value = props.value;
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
message.success('复制成功');
}
</script>
<style scoped lang="less">
.icon {
margin: 0 10px;
}
</style>

75
src/components/framework/smart-enum-checkbox/index.vue

@ -0,0 +1,75 @@
<!--
* 枚举 多选框
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-08-08 20:32:30
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<a-checkbox-group :style="`width: ${width}`" v-model:value="selectValue" @change="handleChange" :disabled="disabled">
<a-checkbox v-for="item in valueDescList" :key="item.value" :value="item.value" :disabled="disabledOption.includes(item.value)">
{{ item.desc }}
</a-checkbox>
</a-checkbox-group>
</template>
<script setup>
import { ref, watch, getCurrentInstance, onMounted } from 'vue';
const props = defineProps({
enumName: String,
value: Array,
width: {
type: String,
default: '200px',
},
//
disabled: {
type: Boolean,
default: false,
},
//
disabledOption: {
type: Array,
default: () => [],
},
//
hiddenOption: {
type: Array,
default: () => [],
},
});
// ------------ ------------
const valueDescList = ref([]);
onMounted(() => {
const internalInstance = getCurrentInstance(); //
const smartEnumPlugin = internalInstance.appContext.config.globalProperties.$smartEnumPlugin;
valueDescList.value = smartEnumPlugin.getValueDescList(props.enumName).filter((item) => !props.hiddenOption.includes(item.value));
});
// ------------ ------------
const selectValue = ref(props.value);
watch(
() => props.value,
(newValue) => {
//
selectValue.value = newValue.filter((item) => !props.hiddenOption.includes(item) && !props.disabledOption.includes(item));
},
{ immediate: true }
);
const emit = defineEmits(['update:value', 'change']);
function handleChange(value) {
emit('update:value', value);
emit('change', value);
}
</script>

88
src/components/framework/smart-enum-radio/index.vue

@ -0,0 +1,88 @@
<!--
* 枚举 radio
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-08-08 20:32:30
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<template v-if="isButton">
<a-radio-group v-model:value="selectValue" @change="handleChange" button-style="solid" :disabled="disabled">
<a-radio-button v-for="item in valueDescList" :key="item.value" :value="item.value" :disabled="disabledOption.includes(item.value)">
{{ item.desc }}
</a-radio-button>
</a-radio-group>
</template>
<template v-else>
<a-radio-group v-model:value="selectValue" @change="handleChange" :disabled="disabled">
<a-radio v-for="item in valueDescList" :key="item.value" :value="item.value" :disabled="disabledOption.includes(item.value)">
{{ item.desc }}
</a-radio>
</a-radio-group>
</template>
</template>
<script setup>
import { ref, watch, onMounted, getCurrentInstance } from 'vue';
const props = defineProps({
enumName: String,
value: [Number, String],
width: {
type: String,
default: '100%',
},
size: {
type: String,
default: 'default',
},
isButton: {
type: Boolean,
default: false,
},
//
disabled: {
type: Boolean,
default: false,
},
//
disabledOption: {
type: Array,
default: () => [],
},
//
hiddenOption: {
type: Array,
default: () => [],
},
});
const valueDescList = ref([]);
onMounted(() => {
const internalInstance = getCurrentInstance(); //
const smartEnumPlugin = internalInstance.appContext.config.globalProperties.$smartEnumPlugin;
valueDescList.value = smartEnumPlugin.getValueDescList(props.enumName).filter((item) => !props.hiddenOption.includes(item.value));
});
const selectValue = ref(props.value);
watch(
() => props.value,
(newValue) => {
//
selectValue.value = props.disabledOption.includes(newValue) || props.hiddenOption.includes(newValue) ? undefined : newValue;
},
{ immediate: true }
);
const emit = defineEmits(['update:value', 'change']);
function handleChange(e) {
emit('update:value', e.target.value);
emit('change', e.target.value);
}
</script>

88
src/components/framework/smart-enum-select/index.vue

@ -0,0 +1,88 @@
<!--
* 枚举 下拉框
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-08-08 20:32:30
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<a-select
v-model:value="selectValue"
:style="`width: ${width}`"
:placeholder="props.placeholder"
:showSearch="true"
:allowClear="true"
:size="size"
@change="handleChange"
:disabled="disabled"
>
<a-select-option v-for="item in valueDescList" :key="item.value" :value="item.value" :disabled="disabledOption.includes(item.value)">
{{ item.desc }}
</a-select-option>
</a-select>
</template>
<script setup>
import { ref, watch, onMounted, getCurrentInstance } from 'vue';
const props = defineProps({
enumName: String,
value: [Number, String],
width: {
type: String,
default: '100%',
},
placeholder: {
type: String,
default: '请选择',
},
size: {
type: String,
default: 'default',
},
//
disabled: {
type: Boolean,
default: false,
},
//
disabledOption: {
type: Array,
default: () => [],
},
//
hiddenOption: {
type: Array,
default: () => [],
},
});
const valueDescList = ref([]);
onMounted(() => {
const internalInstance = getCurrentInstance(); //
const smartEnumPlugin = internalInstance.appContext.config.globalProperties.$smartEnumPlugin;
valueDescList.value = smartEnumPlugin.getValueDescList(props.enumName).filter((item) => !props.hiddenOption.includes(item.value));
});
const selectValue = ref(props.value);
watch(
() => props.value,
(newValue) => {
//
selectValue.value = props.disabledOption.includes(newValue) || props.hiddenOption.includes(newValue) ? undefined : newValue;
},
{ immediate: true }
);
const emit = defineEmits(['update:value', 'change']);
function handleChange(value) {
emit('update:value', value);
emit('change', value);
}
</script>

20
src/components/framework/smart-loading/index.js

@ -0,0 +1,20 @@
/*
* loading 组件
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-07-22 20:33:41
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net ),Since 2012
*/
import { useSpinStore } from "/@/store/modules/system/spin";
export const SmartLoading = {
show: () => {
useSpinStore().show();
},
hide: () => {
useSpinStore().hide();
},
};

77
src/components/framework/text-ellipsis/index.vue

@ -0,0 +1,77 @@
<template>
<div :class="className">
<div v-if="overflow" class="ellipsis-box">
<a-popover>
<template #content>
{{ text }}
<SmartCopyIcon :value="text" />
</template>
<div>
<slot>
{{ text }}
</slot>
</div>
</a-popover>
</div>
<div v-else>
<slot>
{{ text }}
</slot>
</div>
</div>
</template>
<script setup>
import { onMounted, ref, nextTick } from 'vue';
import { Modal } from 'ant-design-vue';
import { v4 as uuid } from 'uuid';
import SmartCopyIcon from '/@/components/framework/smart-copy-icon/index.vue';
const props = defineProps({
text: {
type: String,
default: '',
},
classKey: {
type: String,
default: '',
},
});
const overflow = ref(false);
const className = ref();
onMounted(() => {
className.value = props.classKey + uuid();
nextTick(() => {
let doc = document.querySelector(`.${className.value}`);
let fontSize = window.getComputedStyle(doc).fontSize.replace('px', '');
let clientWidth = doc.clientWidth;
let span = document.createElement('span');
document.body.appendChild(span);
span.style.fontSize = `${fontSize}px`;
span.innerText = props.text;
let width = span.offsetWidth;
document.body.removeChild(span);
overflow.value = width > clientWidth;
});
});
function showModel() {
Modal.info({
content: props.text,
icon: '',
okText: '关闭',
});
}
</script>
<style lang="less" scoped>
.ellipsis-box {
display: flex;
align-items: center;
div {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
}
}
</style>

118
src/components/framework/wangeditor/index.vue

@ -0,0 +1,118 @@
<!--
* 编辑器
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-09-12 15:34:33
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<div style="border: 1px solid #ccc">
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" />
<Editor
style="overflow-y: hidden"
:style="{ height: `${height}px` }"
v-model="editorHtml"
:defaultConfig="editorConfig"
@onCreated="handleCreated"
@onChange="handleChange"
/>
</div>
</template>
<script setup>
import { shallowRef, onBeforeUnmount, watch, ref } from 'vue';
import { FILE_FOLDER_TYPE_ENUM } from '/@/constants/support/file-const';
import { fileApi } from '/@/api/support/file-api';
import '@wangeditor-next/editor/dist/css/style.css';
import { Editor, Toolbar } from '@wangeditor-next/editor-for-vue';
import { smartSentry } from '/@/lib/smart-sentry';
//
const editorConfig = { MENU_CONF: {} };
//
let customUpload = {
async customUpload(file, insertFn) {
try {
const formData = new FormData();
formData.append('file', file);
let res = await fileApi.uploadFile(formData, FILE_FOLDER_TYPE_ENUM.COMMON.value);
let data = res.data;
insertFn(data.fileUrl);
} catch (error) {
smartSentry.captureError(error);
}
},
};
editorConfig.MENU_CONF['uploadImage'] = customUpload;
editorConfig.MENU_CONF['uploadVideo'] = customUpload;
// ----------------------- emits props ----------------
const editorHtml = ref();
let props = defineProps({
modelValue: String,
height: {
type: Number,
default: 500,
},
});
watch(
() => props.modelValue,
(nVal) => {
editorHtml.value = nVal;
},
{
immediate: true,
deep: true,
}
);
// html
const emit = defineEmits(['update:modelValue']);
const editorRef = shallowRef();
const handleCreated = (editor) => {
editorRef.value = editor;
};
const handleChange = (editor) => {
emit('update:modelValue', editorHtml.value);
};
function getHtml() {
const htmlContent = editorRef.value.getHtml();
return htmlContent === '<p><br></p>' ? '' : htmlContent;
}
function getText() {
return editorRef.value.getText();
}
//
onBeforeUnmount(() => {
const editor = editorRef.value;
if (editor == null) return;
editor.destroy();
});
defineExpose({
editorRef,
getHtml,
getText,
});
</script>
<style scoped>
.w-e-full-screen-container {
z-index: 9999 !important;
}
</style>
<!-- 解决弹窗高度警告信息显示 -->
<style>
::v-deep .w-e-text-container {
height: 420px !important;
}
.w-e-text-container .w-e-scroll {
height: 500px !important;
-webkit-overflow-scrolling: touch;
}
</style>

97
src/components/support/data-tracer/data-tracer-table.vue

@ -0,0 +1,97 @@
<!--
* 数据变更记录以table形式显示
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-08-12 21:01:52
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
-->
<template>
<a-table size="small" :dataSource="tableData" :columns="columns" rowKey="dataTracerId" :pagination="false" bordered>
<template #bodyCell="{ record, index, column }">
<template v-if="column.dataIndex === 'dataTracerId'">
<div>{{ index + 1 }}</div>
</template>
<template v-if="column.dataIndex === 'userName'">
<div>{{ record.userName }} ({{ $smartEnumPlugin.getDescByValue('USER_TYPE_ENUM', record.userType) }})</div>
</template>
<template v-if="column.dataIndex === 'userAgent'">
<div>{{ record.browser }} / {{ record.os }} / {{ record.device }}</div>
</template>
<template v-if="column.dataIndex === 'content'">
<div class="operate-content" v-html="record.content"></div>
</template>
<template v-else-if="column.dataIndex === 'action'">
<a-button v-if="record.diffOld || record.diffNew" @click="showDetail(record)" type="link">详情 </a-button>
</template>
</template>
</a-table>
</template>
<script setup>
import { reactive } from 'vue';
const props = defineProps({
tableData: {
type: Array,
},
});
const emit = defineEmits(['showDetail']);
function showDetail(record) {
emit('showDetail', record);
}
const columns = reactive([
{
title: '序号',
dataIndex: 'dataTracerId',
width: 50,
},
{
title: '操作时间',
dataIndex: 'createTime',
width: 150,
},
{
title: '操作人',
dataIndex: 'userName',
width: 100,
ellipsis: true,
},
{
title: 'IP',
dataIndex: 'ip',
ellipsis: true,
width: 100,
},
{
title: 'IP地区',
dataIndex: 'ipRegion',
ellipsis: true,
width: 100,
},
{
title: '客户端',
dataIndex: 'userAgent',
ellipsis: true,
width: 150,
},
{
title: '操作内容',
dataIndex: 'content',
},
{
title: '操作',
dataIndex: 'action',
fixed: 'right',
width: 80,
},
]);
</script>
<style scoped lang="less">
.operate-content {
font-size: 14px;
display: inline;
}
</style>

50
src/components/support/data-tracer/data-tracer-timeline.vue

@ -0,0 +1,50 @@
<!--
* 数据变更记录 timeline 形式显示
*
* @Author: 1024创新实验室-主任卓大
* @Date: 2022-08-12 21:01:52
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
-->
<template>
<a-timeline>
<a-timeline-item v-for="record in tableData" :key="record.dataTracerId">
<div class="trace-div">
<div>
<!-- <div class="operate-content" >{{ record.content }}</div> -->
<div class="operate-content" v-html="record.content"></div>
<a href="javascript:void(0)" v-if="record.diffOld || record.diffNew" @click="showDetail(record)">查看修改</a>
</div>
<div class="ip-font">
{{ record.createTime }} | {{ record.userName }} | {{ record.ipRegion }} | {{ record.ip }} | {{ record.browser }} | {{ record.os }}
</div>
</div>
</a-timeline-item>
</a-timeline>
</template>
<script setup>
const props = defineProps({
tableData: {
type: Array,
},
});
const emit = defineEmits(['showDetail']);
function showDetail(record) {
emit('showDetail', record);
}
</script>
<style scoped lang="less">
.operate-content {
font-size: 14px;
display: inline;
}
.ip-font {
margin-top: 5px;
font-size: 12px;
color: #999;
display: block;
}
</style>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save