diff --git a/.env.dev b/.env.dev index cbe967efd351268942b4c73cadfc6549fca24b5c..b71f3f07ec4c17d591e4b62845c7b4df787646e0 100644 --- a/.env.dev +++ b/.env.dev @@ -5,16 +5,17 @@ ENV = 'development' VUE_APP_TITLE = 芋道管理系统 # 芋道管理系统/开发环境 -VUE_APP_BASE_API = 'http://localhost:48080' +# VUE_APP_BASE_API = 'http://localhost:48080' +VUE_APP_BASE_API = 'http://47.120.34.218:48080' # 路由懒加载 VUE_CLI_BABEL_TRANSPILE_MODULES = true # 多租户的开关 -VUE_APP_TENANT_ENABLE = true +VUE_APP_TENANT_ENABLE = false # 验证码的开关 -VUE_APP_CAPTCHA_ENABLE = true +VUE_APP_CAPTCHA_ENABLE = false # 文档的开关 VUE_APP_DOC_ENABLE = true diff --git a/.env.local b/.env.local index a2a1454be0e78145b0bd9fc2e345acd70c29c2df..50445134ce341d2bfb76c1e12b97742293387b72 100644 --- a/.env.local +++ b/.env.local @@ -1,19 +1,21 @@ # 基础配置 -VUE_APP_BASE_API = '/proxy-api' -VUE_APP_TITLE = '芋道管理系统' +#VUE_APP_BASE_API = 'http://127.0.0.1:48080' +VUE_APP_BASE_API = 'http://47.120.34.218:48080' +#VUE_APP_BASE_API = '/proxy-api' +VUE_APP_TITLE = '科研项目管理一体化管理' VUE_APP_APP_NAME = '/' # 租户功能 -VUE_APP_TENANT_ENABLE = true -VUE_APP_DOC_ENABLE = true +VUE_APP_TENANT_ENABLE = false +VUE_APP_DOC_ENABLE = false # 验证码的开关 -VUE_APP_CAPTCHA_ENABLE = true +VUE_APP_CAPTCHA_ENABLE = false # 默认的登录账号密码,方便你快速测试 -VUE_APP_DEFAULT_LOGIN_TENANT = 芋道源码 -VUE_APP_DEFAULT_LOGIN_USERNAME = admin -VUE_APP_DEFAULT_LOGIN_PASSWORD = admin123 +#VUE_APP_DEFAULT_LOGIN_TENANT = 芋道源码 +#VUE_APP_DEFAULT_LOGIN_USERNAME = admin +#VUE_APP_DEFAULT_LOGIN_PASSWORD = # API 加解密 VUE_APP_API_ENCRYPT_ENABLE = true diff --git a/.env.static b/.env.static index a06ba498207481b1014543cedb9236ac6dfb724a..ce86680a0bcaa302360af7ec9cfd9e4dc4bba71e 100644 --- a/.env.static +++ b/.env.static @@ -4,7 +4,7 @@ NODE_ENV = development ENV = 'staging' # 页面标题 -VUE_APP_TITLE = 芋道管理系统 +VUE_APP_TITLE = 科研项目管理一体化管理 # 芋道管理系统/测试环境 VUE_APP_BASE_API = 'http://127.0.0.1:48080' diff --git a/package.json b/package.json index 0a1e13d9fb9c0a18f7dd8d2e868f75326f63da76..9461efab3c8778f5a216bf3253ed6bbb341d27b0 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "axios": "0.27.2", "benz-amr-recorder": "^1.1.5", "bpmn-js-token-simulation": "0.10.0", + "chart.js": "^3.9.1", "clipboard": "2.0.8", "core-js": "^3.26.0", "crypto-js": "^4.0.0", @@ -55,6 +56,7 @@ "fuse.js": "6.6.2", "highlight.js": "9.18.5", "js-beautify": "1.13.0", + "js-cookie": "^3.0.5", "jsencrypt": "3.3.1", "min-dash": "3.5.2", "nprogress": "0.2.0", diff --git a/public/favicon.ico b/public/favicon.ico index e26376026420542212ed58d90d0ed34f554fa4ae..b0fe3e9b6baeeda37e42d1e8c50ece25215ad673 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/src/api/login.js b/src/api/login.js index efcfb1d831133e03c97b2d1d219fa871b051ecef..a9e7428cfe1900221d62fb6442850dfc16b734e7 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -23,6 +23,26 @@ export function login(username, password, captchaVerification, socialType, socia }) } +// 注册方法 +export function register(data) { + return request({ + url: '/register', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +//一体化登录 +export function loginProvice(id) { + return request({ + url: '/loginProvice?userid=' + id, + method: 'get' + }) +} + // 获取用户详细信息 export function getInfo() { return request({ @@ -72,6 +92,19 @@ export function sendSmsCode(mobile, scene) { }) } +// 获取验证码 +export function getCodeImg() { + return request({ + url: '/captchaImage', + headers: { + isToken: false + }, + method: 'get', + timeout: 20000 + }) +} + + // 短信验证码登录 export function smsLogin(mobile, code) { return request({ diff --git a/src/api/scientific/achive.js b/src/api/scientific/achive.js new file mode 100644 index 0000000000000000000000000000000000000000..70becdac3df115577cdde07b0f22f61331253ce8 --- /dev/null +++ b/src/api/scientific/achive.js @@ -0,0 +1,163 @@ +import request from '@/utils/request-ruoyi' + +// 获取民族列表 +export function getNationality() { + return request({ + url: '/nationality', + method: 'get' + }) +} + +// 获取学位列表 +export function getDegree() { + return request({ + url: '/degree', + method: 'get' + }) +} + +// 获取职称列表 +export function getTitle() { + return request({ + url: '/title', + method: 'get' + }) +} + +// 获取申请代码列表 +export function getApplicationCode() { + return request({ + url: '/code', + method: 'get' + }) +} + +// 获取用户信息 +export function getUserInfo(params) { + return request({ + url: '/project/userinfo', + method: 'get', + params: params + }) +} + +// 保存/修改项目信息 +export function insertProjectHttp(data) { + return request({ + url: '/declare/insert', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +export function updateContent(data) { + return request({ + url: '/declare/updateContent', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + + +// 获取项目详情 +export function getProjectDetail(id) { + return request({ + url: `/declare/details/${id}`, + method: 'get' + }) +} + +export function getBudget(id) { + return request({ + url: `/declare/getBudget/${id}`, + method: 'get' + }) +} + +export function saveBudget(data) { + return request({ + url: '/declare/saveBudget', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} +// 提交项目审核 +export function submitProject(data) { + return request({ + url: '/declare/submit', + method: 'post', + data: data + }) +} + +// 预览PDF +export function previewPdf(projectId) { + return request({ + url: '/declare/preview', + method: 'get', + params: { projectId: projectId }, + responseType: 'blob' + }) +} + +// 下载PDF +export function downloadPdf(projectId) { + return request({ + url: '/declare/download', + method: 'get', + params: { projectId: projectId }, + responseType: 'blob' + }) +} + +// 检查填写情况 + +// 获取申报列表 +export function list(params) { + return request({ + url: '/achieve/list', + method: 'get', + params: params + }) +} + +export function delet(data) { + return request({ + url: '/achieve/delete', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} +export function insert(data) { + return request({ + url: '/achieve/insert', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +export function update(data) { + return request({ + url: '/achieve/updateAchievementDiaplay', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} diff --git a/src/api/scientific/attachments.js b/src/api/scientific/attachments.js new file mode 100644 index 0000000000000000000000000000000000000000..e25baf3c10ba1ee16e50cf30fa6758aa6ba0bfa0 --- /dev/null +++ b/src/api/scientific/attachments.js @@ -0,0 +1,45 @@ + +// 保存/修改项目信息 +import request from "@/utils/request-ruoyi"; + +export function submit(data) { + return request({ + url: '/attachments/submit', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +export function updateOther(data) { + return request({ + url: '/attachments/updateOther', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +export function deleteOne(data) { + return request({ + url: '/attachments/delete', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + + +// 获取项目详情 +export function listAtta(id) { + return request({ + url: `/attachments/details/${id}`, + method: 'get' + }) +} diff --git a/src/api/scientific/checktime.js b/src/api/scientific/checktime.js new file mode 100644 index 0000000000000000000000000000000000000000..65db0735379fd9a81437cfdc033d415c170cb9b3 --- /dev/null +++ b/src/api/scientific/checktime.js @@ -0,0 +1,21 @@ +import request from '@/utils/request-ruoyi' + +// 保存申报时间设置 +export function saveCheckTime(data) { + return request({ + url: '/checktime/saveCheckTime', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 获取申报时间设置(如果需要的话) +export function getCheckTime() { + return request({ + url: '/checktime/getCheckTime', + method: 'get' + }) +} diff --git a/src/api/scientific/conclude.js b/src/api/scientific/conclude.js new file mode 100644 index 0000000000000000000000000000000000000000..95f19b8f04612c3ea5fede197bed104b203b1995 --- /dev/null +++ b/src/api/scientific/conclude.js @@ -0,0 +1,260 @@ +import request from '@/utils/request-ruoyi' + +/** + * 获取用户信息 + * @param {object} params - 查询参数,例如 { uintcode: 'xxx' } + */ +export function getUserInfo(params) { + return request({ + url: '/userinfo', + method: 'get', + params + }) +} + +/** + * 获取项目详情 + * @param {string} projectId - 项目ID + */ +export function getDeclareDetails(projectId) { + return request({ + url: `/declare/details/${projectId}`, + method: 'get' + }) +} + +/** + * 获取民族列表 + */ +export function getNationality() { + return request({ + url: '/nationality', + method: 'get' + }) +} + +/** + * 获取学位列表 + */ +export function getDegree() { + return request({ + url: '/degree', + method: 'get' + }) +} + +/** + * 获取职称列表 + */ +export function getTitle() { + return request({ + url: '/title', + method: 'get' + }) +} + +/** + * 获取申请代码列表 + */ +export function getApplicationCode() { + return request({ + url: '/code', + method: 'get' + }) +} + +/** + * 更新项目结题时间等信息 + * @param {object} data - 项目基础信息对象 + */ +export function updateConcludeTime(data) { + return request({ + url: '/declare/ProjectUpdateConcludeTime', + method: 'post', + data + }) +} + +export function updateScientificAchievement(data) { + return request({ + url: '/declare/updateProjectScientificAchievement', + method: 'post', + data + }) +} + +/** + * 提交结题 + * @param {string} projectId - 项目ID + * @param {string} unitCode - 单位代码 + */ +export function submitConclude(projectId, unitCode) { + // 原始代码调用了全局函数 getConcludeJson, 这里替换为一个标准的API请求 + return request({ + url: '/conclude/submit', + method: 'post', + data: { projectId, unitCode } + }) +} + + +export function updateProjectOutcome(data) { + return request({ + url: '/declare/updateProjectOutcome', + method: 'post', + data + }) +} + +export function updateProjectScientificAchievement(data) { + return request({ + url: '/declare/updateProjectScientificAchievement', + method: 'post', + data + }) +} + +/** + * 获取项目成员列表 + * @param {string} projectRecordId - 项目记录的主键ID + */ +export function getMemberList(projectRecordId) { + return request({ + url: '/member/list', + method: 'post', + data: { projectid: projectRecordId } + }) +} + +/** + * 更新/保存项目成员列表 + * @param {Array} memberList - 成员列表 + */ +export function updateMemberList(memberList) { + return request({ + url: '/member/insert', + method: 'post', + data: memberList + }) +} + +/** + * 删除项目成员 + * @param {string} memberId - 成员ID + */ +export function deleteMember(memberId) { + return request({ + url: '/member/delete', + method: 'post', + data: { id: memberId } + }) +} + + +export function updateAbstractContent(data) { + return request({ + url: '/declare/updateAbstractContent', + method: 'post', + data + }) +} + + + +/** + * 获取附件详情列表 + * @param {string} projectId - 项目ID + */ +export function getAttachments(projectId) { + return request({ + url: `/attachments/details/${projectId}`, + method: 'get' + }) +} + +/** + * 提交/更新附件列表 + * @param {Array} data - 附件对象数组 + */ +export function submitAttachments(data) { + return request({ + url: '/attachments/submit', + method: 'post', + data + }) +} + +/** + * 删除附件 + * @param {string} attachmentId - 附件ID + */ +export function deleteAttachment(attachmentId) { + return request({ + url: '/attachments/delete', + method: 'post', + data: { id: attachmentId } + }) +} + +/** + * 最终提交结题 + * (原 getConcludeJson) + * @param {string} projectId - 项目ID + * @param {string} unitCode - 单位代码 + */ +export function submitFinalConclude(projectId, unitCode) { + return request({ + url: '/conclude/finalSubmit', // Assuming a new endpoint for this action + method: 'post', + data: { projectId, unitCode } + }) +} + + +export function saveBudget(data) { + return request({ + url: '/declareTask/saveBudget', + method: 'post', + data + }) +} + + +export function getAchieveList(projectId) { + return request({ + url: `/achieve/list?project_id=${projectId}`, + method: 'get' + }) +} + +/** + * 更新“其他附件”列表(用于删除其中一项) + * @param {object} data - 附件对象 + */ +export function updateOtherAttachment(data) { + return request({ + url: '/attachments/updateOther', + method: 'post', + data + }) +} + +/** + * 预览结题书PDF + * @param {string} projectId - 项目ID + */ +export function previewConcludePdf(projectId) { + // This function should trigger a GET request that returns a file stream or a URL + // For simplicity, we assume it opens a new window to a preview URL. + const previewUrl = `/api/conclude/preview/${projectId}`; // Example API endpoint + window.open(previewUrl, '_blank'); +} + +/** + * 下载结题书PDF + * @param {string} projectId - 项目ID + */ +export function downloadConcludePdf(projectId) { + // This function should trigger a file download. + window.location.href = `/api/conclude/download/${projectId}`; // Example API endpoint +} diff --git a/src/api/scientific/delcare.js b/src/api/scientific/delcare.js new file mode 100644 index 0000000000000000000000000000000000000000..8af015c3ef7e2eedfec1eec49049f1892d6ccd9a --- /dev/null +++ b/src/api/scientific/delcare.js @@ -0,0 +1,204 @@ +import request from '@/utils/request-ruoyi' + +// 获取民族列表 +export function getNationality() { + return request({ + url: '/nationality', + method: 'get' + }) +} + +// 获取学位列表 +export function getDegree() { + return request({ + url: '/degree', + method: 'get' + }) +} + +// 获取职称列表 +export function getTitle() { + return request({ + url: '/title', + method: 'get' + }) +} + +// 获取申请代码列表 +export function getApplicationCode() { + return request({ + url: '/code', + //url: '/ExpertNew/getProjectApplicationCode', + method: 'get' + }) +} + +// 获取用户信息 +export function getUserInfo(params) { + return request({ + url: '/project/userinfo', + method: 'get', + params: params + }) +} + +// 保存/修改项目信息 +export function insertProjectHttp(data) { + return request({ + url: '/declare/insert', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +export function updateContent(data) { + return request({ + url: '/declare/updateContent', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} +// updateFormalityExamination +export function updateFormalityExamination(data) { + return request({ + url: '/declare/updateFormalityExamination', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} +// 获取项目详情 +export function getProjectDetail(id) { + return request({ + url: `/declare/details/${id}`, + method: 'get' + }) +} + +export function saveCooperation(params) { + return request({ + url: '/declareTask/saveProjectTalentCooperationList', + method: 'post', + params: params + }) +} + +export function saveProjectTalentTask(data) { + return request({ + url: '/declareTask/saveProjectTalentTask', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// getFormalityExamination + +export function getFormalityExamination(id) { + return request({ + url: `/declare/getFormalityExamination/${id}`, + method: 'get' + }) +} + +export function getBudget(id) { + return request({ + url: `/declare/getBudget/${id}`, + method: 'get' + }) +} + +export function saveBudget(data) { + return request({ + url: '/declare/saveBudget', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} +export function getPdfData(projectId) { + return request({ + url: '/declare/pdf', + method: 'get', + params: { projectId } + }) +} + +// 生成 PDF 文件 +export function generatePdfFile(data) { + return request({ + url: '/declare/downPDF', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 提交项目审核 +export function submitProject(data) { + return request({ + url: '/declare/submit', + method: 'post', + data: data + }) +} + +export function submitConclude(data) { + return request({ + url: '/declare/submitConclude', + method: 'post', + data: data + }) +} + +// 预览PDF +export function previewPdf(projectId) { + return request({ + url: '/declare/preview', + method: 'get', + params: { projectId: projectId }, + responseType: 'blob' + }) +} + +// 下载PDF +export function downloadPdf(projectId) { + return request({ + url: '/declare/download', + method: 'get', + params: { projectId: projectId }, + responseType: 'blob' + }) +} + +// 检查填写情况 +export function checkInput(projectId) { + return request({ + url: '/declare/check', + method: 'get', + params: { projectId: projectId } + }) +} + +// 获取申报列表 +export function getDeclareList(params) { + return request({ + url: '/declareList', + method: 'get', + params: params + }) +} diff --git a/src/api/scientific/expert.js b/src/api/scientific/expert.js new file mode 100644 index 0000000000000000000000000000000000000000..ac343f93da4f51dad50475d51e7ca925c9898e6c --- /dev/null +++ b/src/api/scientific/expert.js @@ -0,0 +1,662 @@ +import request from '@/utils/request-ruoyi'; + +// 获取专家申请列表 +export function getList(uid) { + return request({ + url: '/ExpertNew/getMyApplyList', + method: 'get' + , params: { uid } + }); +} + +// 删除专家信息 +export function delExpert(expertId) { + return request({ + url: '/ExpertNew/delExpertinfoById', + method: 'get', + params: { expertId } + }); +} + +// 提交专家信息 +export function submitExpert(expertId) { + return request({ + url: '/ExpertNew/submitExpert', + method: 'post', + data: { expertId } + }); +} + +// 获取民族列表数据(用于民族下拉框初始化) +export function getNationList() { + return request({ + url: '/ExpertNew/getNationList', + method: 'get' + }); +} + +// 保存专家信息(新增或编辑) +export function saveExpertInfo(data) { + return request({ + url: '/ExpertNew/expertUpdateNew', + method: 'post', + data + }); +} + +// 获取学科分类级联数据(用于学科选择器) +export function getDisciplineClass() { + return request({ + url: '/ExpertNew/getDisciplineClass', + method: 'get' + }); +} + +// 获取研究方向级联数据(用于研究方向选择器) +export function getResearchArea() { + return request({ + url: '/ExpertNew/getResearchArea', + method: 'get' + }); +} + +// 获取地区级联数据(用于银行地区选择器) +export function getAreaOptions() { + return request({ + url: '/ExpertNew/getAreaList', + method: 'get' + }); +} + +// 获取专家详情信息(用于编辑时回显) +export function getExpertDetail(expertId) { + return request({ + url: 'ExpertNew/getExpertinfoByIdOne', + params: { expertId } + }); +} + +// 获取申请代码列表 +export function getApplicationCode() { + return request({ + url: '/ExpertNew/getProjectApplicationCode', + method: 'get' + }) +} + +/** + * 根据专家ID获取附件列表 + * @param {number} expertId - 专家ID + * @returns {Promise} - 接口返回Promise对象 + */ +export function getAttachmentsByExpertId(expertId) { + return request({ + url: '/ExpertNew/getAttachmentsByExpertId', + method: 'get', + params: { expertId } + }) +} + +/** + * 上传附件 + * @param {FormData} formData - 包含文件的表单数据 + * FormData需包含: + * - file: 上传的文件对象 + * - allowType: 允许的文件类型(如"1,6") + * - expertId: 专家ID + * @returns {Promise} - 接口返回Promise对象 + */ +export function uploadAttach(formData) { + return request({ + url: '/ExpertNew/uploadAttach', + method: 'post', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' // 上传文件需指定该类型 + } + }) +} + +/** + * 添加或更新附件信息 + * @param {Object} data - 请求参数 + * @param {Array} data.listAttach - 附件列表数组 + * 数组元素结构: { + * filename: 文件名, + * file_url: 文件URL, + * type: 附件类型, + * created_at: 上传时间, + * expertId: 专家ID, + * sortOrder: 排序序号 + * } + * @param {number} data.expertId - 专家ID + * @returns {Promise} - 接口返回Promise对象 + */ +export function addOrUpdateAttachments(data) { + return request({ + url: '/ExpertNew/addOrUpdateAttachments', + method: 'post', + data + }) +} + +// /** +// * 提交专家信息(完成附件提交流程) +// * @param {number} expertId - 专家ID +// * @returns {Promise} - 接口返回Promise对象 +// */ +// export function submitExpert(expertId) { +// return request({ +// url: '/ExpertNew/submitExpert', +// method: 'post', +// data: { expertId } +// }) +// } + +export const classData = +[ + { + label: "180 生物学", + value: "180 生物学", + children: [ + { + label: "180.11 生物数学(包括生物统计学等)", + value: "180.11 生物数学(包括生物统计学等)" + }, + { + label: "180.14 生物物理学", + value: "180.14 生物物理学" + }, + { + label: "180.17 生物化学", + value: "180.17 生物化学" + }, + { + label: "180.21 细胞生物学", + value: "180.21 细胞生物学" + }, + { + label: "180.24 生理学", + value: "180.24 生理学" + }, + { + label: "180.27 发育生物学", + value: "180.27 发育生物学" + }, + { + label: "180.31 遗传学", + value: "180.31 遗传学" + }, + { + label: "180.34 放射生物学", + value: "180.34 放射生物学" + }, + { + label: "180.37 分子生物学", + value: "180.37 分子生物学" + }, + { + label: "180.41 生物进化论", + value: "180.41 生物进化论" + }, + { + label: "180.44 生态学", + value: "180.44 生态学" + }, + { + label: "180.47 神经生物学", + value: "180.47 神经生物学" + }, + { + label: "180.51 植物学", + value: "180.51 植物学" + }, + { + label: "180.54 昆虫学", + value: "180.54 昆虫学" + }, + { + label: "180.57 动物学", + value: "180.57 动物学" + }, + { + label: "180.61 微生物学", + value: "180.61 微生物学" + }, + { + label: "180.64 病毒学", + value: "180.64 病毒学" + }, + { + label: "180.67 人类学", + value: "180.67 人类学" + }, + { + label: "180.71 生物工程(亦称生物技术)", + value: "180.71 生物工程(亦称生物技术)" + }, + { + label: "180.74 心理学", + value: "180.74 心理学" + }, + { + label: "180.99 生物学其他学科", + value: "180.99 生物学其他学科" + } + ] + }, + { + label: "310 基础医学", + value: "310 基础医学", + children: [ + { + label: "310.11 医学生物化学", + value: "310.11 医学生物化学" + }, + { + label: "310.14 人体解剖学", + value: "310.14 人体解剖学" + }, + { + label: "310.17 医学细胞生物学", + value: "310.17 医学细胞生物学" + }, + { + label: "310.21 人体生理学", + value: "310.21 人体生理学" + }, + { + label: "310.24 人体组织胚胎学", + value: "310.24 人体组织胚胎学" + }, + { + label: "310.27 医学遗传学", + value: "310.27 医学遗传学" + }, + { + label: "310.31 放射医学", + value: "310.31 放射医学" + }, + { + label: "310.34 人体免疫学", + value: "310.34 人体免疫学" + }, + { + label: "310.37 医学寄生虫学", + value: "310.37 医学寄生虫学" + }, + { + label: "310.41 医学微生物学(包括医学病毒学等)", + value: "310.41 医学微生物学(包括医学病毒学等)" + }, + { + label: "310.44 病理学", + value: "310.44 病理学" + }, + { + label: "310.47 药理学", + value: "310.47 药理学" + }, + { + label: "310.51 医学实验动物学", + value: "310.51 医学实验动物学" + }, + { + label: "310.54 医学心理学", + value: "310.54 医学心理学" + }, + { + label: "310.57 医学统计学", + value: "310.57 医学统计学" + }, + { + label: "310.61 生物医学工程学", + value: "310.61 生物医学工程学" + }, + { + label: "310.99 基础医学其他学科", + value: "310.99 基础医学其他学科" + } + ], + }, + { + label: "320 临床医学", + value: "320 临床医学", + children: [ + { + label: "320.11 临床诊断学", + value: "320.11 临床诊断学" + }, + { + label: "320.14 保健医学", + value: "320.14 保健医学" + }, + { + label: "320.17 理疗学", + value: "320.17 理疗学" + }, + { + label: "320.21 麻醉学", + value: "320.21 麻醉学" + }, + { + label: "320.24 内科学", + value: "320.24 内科学" + }, + { + label: "320.27 外科学", + value: "320.27 外科学" + }, + { + label: "320.31 妇产科学", + value: "320.31 妇产科学" + }, + { + label: "320.34 儿科学", + value: "320.34 儿科学" + }, + { + label: "320.37 眼科学", + value: "320.37 眼科学" + }, + { + label: "320.41 耳鼻咽喉科学", + value: "320.41 耳鼻咽喉科学" + }, + { + label: "320.44 口腔医学", + value: "320.44 口腔医学" + }, + { + label: "320.47 皮肤病学", + value: "320.47 皮肤病学" + }, + { + label: "320.51 性医学", + value: "320.51 性医学" + }, + { + label: "320.54 神经病学", + value: "320.54 神经病学" + }, + { + label: "320.57 精神病学(包括精神卫生及行为医学等)", + value: "320.57 精神病学(包括精神卫生及行为医学等)" + }, + { + label: "320.61 急诊医学", + value: "320.61 急诊医学" + }, + { + label: "320.64 核医学", + value: "320.64 核医学" + }, + { + label: "320.67 肿瘤学", + value: "320.67 肿瘤学" + }, + { + label: "320.71 护理学", + value: "320.71 护理学" + }, + { + label: "320.99 临床医学其他学科", + value: "320.99 临床医学其他学科" + } + ] + }, + { + label: "330 预防医学与卫生学", + value: "330 预防医学与卫生学", + children: [ + { label: "330.11 营养学", value: "330.11 营养学" }, + { label: "330.14 毒理学", value: "330.14 毒理学" }, + { label: "330.17 消毒学", value: "330.17 消毒学" }, + { label: "330.21 流行病学", value: "330.21 流行病学" }, + { label: "330.24 传染病学", value: "330.24 传染病学" }, + { label: "330.27 媒介生物控制学", value: "330.27 媒介生物控制学" }, + { label: "330.31 环境医学", value: "330.31 环境医学" }, + { label: "330.34 职业病学", value: "330.34 职业病学" }, + { label: "330.37 地方病学", value: "330.37 地方病学" }, + { label: "330.41 社会医学", value: "330.41 社会医学" }, + { label: "330.44 卫生检验学", value: "330.44 卫生检验学" }, + { label: "330.47 食品卫生学", value: "330.47 食品卫生学" }, + { label: "330.51 儿少卫生学", value: "330.51 儿少卫生学" }, + { label: "330.54 妇幼卫生学", value: "330.54 妇幼卫生学" }, + { label: "330.57 环境卫生学", value: "330.57 环境卫生学" }, + { label: "330.61 劳动卫生学", value: "330.61 劳动卫生学" }, + { label: "330.64 放射卫生学", value: "330.64 放射卫生学" }, + { label: "330.67 卫生工程学", value: "330.67 卫生工程学" }, + { label: "330.71 卫生经济学", value: "330.71 卫生经济学" }, + { label: "330.74 优生学", value: "330.74 优生学" }, + { label: "330.77 健康教育学", value: "330.77 健康教育学" }, + { label: "330.81 卫生管理学", value: "330.81 卫生管理学" }, + { label: "330.99 预防医学与卫生学其他学科", value: "330.99 预防医学与卫生学其他学科" } + ] + }, + { + label: "340 军事医学与特种医学", + value: "340 军事医学与特种医学", + children: [ + { label: "340.10 军事医学", value: "340.10 军事医学" }, + { label: "340.20 特种医学", value: "340.20 特种医学" }, + { label: "340.99 军事医学与特种医学其他学科", value: "340.99 军事医学与特种医学其他学科" } + ] + }, + { + label: "350 药学", + value: "350 药学", + children: [ + { label: "350.10 药物化学(包括天然药物化学等)", value: "350.10 药物化学(包括天然药物化学等)" }, + { label: "350.20 生物药物学", value: "350.20 生物药物学" }, + { label: "350.25 微生物药物学", value: "350.25 微生物药物学" }, + { label: "350.30 放射性药物学", value: "350.30 放射性药物学" }, + { label: "350.35 药剂学", value: "350.35 药剂学" }, + { label: "350.40 药效学", value: "350.40 药效学" }, + { label: "350.45 药物管理学", value: "350.45 药物管理学" }, + { label: "350.50 药物统计学", value: "350.50 药物统计学" }, + { label: "350.99 药学其他学科", value: "350.99 药学其他学科" } + ] + }, + { + label: "360 中医学与中药学", + value: "360 中医学与中药学", + children: [ + { label: "360.10 中医", value: "360.10 中医" }, + { label: "360.20 民族医学", value: "360.20 民族医学" }, + { label: "360.30 中西医结合医学", value: "360.30 中西医结合医学" }, + { label: "360.40 中药学", value: "360.40 中药学" }, + { label: "360.99 中医学与中药学其他学科", value: "360.99 中医学与中药学其他学科" } + ] + }, + { + label: "490 核科学技术", + value: "490 核科学技术", + children: [ + { label: "490.10 辐射物理与技术", value: "490.10 辐射物理与技术" }, + { label: "490.15 核探测技术与核电子学", value: "490.15 核探测技术与核电子学" }, + { label: "490.20 放射性计量学", value: "490.20 放射性计量学" }, + { label: "490.25 核仪器、仪表", value: "490.25 核仪器、仪表" }, + { label: "490.30 核材料与工艺技术", value: "490.30 核材料与工艺技术" }, + { label: "490.35 粒子加速器", value: "490.35 粒子加速器" }, + { label: "490.40 裂变堆工程技术", value: "490.40 裂变堆工程技术" }, + { label: "490.45 核聚变工程技术", value: "490.45 核聚变工程技术" }, + { label: "490.50 核动力工程技术", value: "490.50 核动力工程技术" }, + { label: "490.55 同位素技术", value: "490.55 同位素技术" }, + { label: "490.60 核爆炸工程", value: "490.60 核爆炸工程" }, + { label: "490.65 核安全(包括核电站安全)", value: "490.65 核安全(包括核电站安全)" }, + { label: "490.70 乏燃料后处理技术", value: "490.70 乏燃料后处理技术" }, + { label: "490.75 辐射防护技术", value: "490.75 辐射防护技术" }, + { label: "490.80 核设施退役技术", value: "490.80 核设施退役技术" }, + { label: "490.85 放射性三废处理、处置技术", value: "490.85 放射性三废处理、处置技术" }, + { label: "490.99 核科学技术其他学科", value: "490.99 核科学技术其他学科" } + ] + }, + { + label: "520 计算机科学技术", + value: "520 计算机科学技术", + children: [ + { label: "520.10 计算机科学技术基础学科", value: "520.10 计算机科学技术基础学科" }, + { label: "520.20 人工智能", value: "520.20 人工智能" }, + { label: "520.30 计算机系统结构", value: "520.30 计算机系统结构" }, + { label: "520.40 计算机软件", value: "520.40 计算机软件" }, + { label: "520.50 计算机工程", value: "520.50 计算机工程" }, + { label: "520.60 计算机应用", value: "520.60 计算机应用" }, + { label: "520.99 计算机科学技术其他学科", value: "520.99 计算机科学技术其他学科" } + ] + }, + { + label: "840 社会学", + value: "840 社会学", + children: [ + { label: "840.11 社会学史", value: "840.11 社会学史" }, + { label: "840.14 社会学理论", value: "840.14 社会学理论" }, + { label: "840.17 社会学方法", value: "840.17 社会学方法" }, + { label: "840.21 实验社会学", value: "840.21 实验社会学" }, + { label: "840.24 数理社会学", value: "840.24 数理社会学" }, + { label: "840.27 应用社会学", value: "840.27 应用社会学" }, + { label: "840.31 比较社会学", value: "840.31 比较社会学" }, + { label: "840.34 社会地理学", value: "840.34 社会地理学" }, + { label: "840.37 文化社会学", value: "840.37 文化社会学" }, + { label: "840.41 历史社会学", value: "840.41 历史社会学" }, + { label: "840.44 经济社会学", value: "840.44 经济社会学" }, + { label: "840.47 军事社会学", value: "840.47 军事社会学" }, + { label: "840.51 社会心理学", value: "840.51 社会心理学" }, + { label: "840.54 公共关系学", value: "840.54 公共关系学" }, + { label: "840.57 社会人类学", value: "840.57 社会人类学" }, + { label: "840.61 组织社会学", value: "840.61 组织社会学" }, + { label: "840.64 发展社会学", value: "840.64 发展社会学" }, + { label: "840.67 福利社会学", value: "840.67 福利社会学" }, + { label: "840.71 人口学", value: "840.71 人口学" }, + { label: "840.99 社会学其他学科", value: "840.99 社会学其他学科" } + ] + }, + { + label: "880 教育学", + value: "880 教育学", + children: [ + { + label: "880.11 教育史(包括中国教育史、外国教育史等)", + value: "880.11 教育史(包括中国教育史、外国教育史等)" + }, + { + label: "880.14 教育学原理", + value: "880.14 教育学原理" + }, + { + label: "880.17 教学论", + value: "880.17 教学论" + }, + { + label: "880.21 德育原理", + value: "880.21 德育原理" + }, + { + label: "880.24 教育社会学", + value: "880.24 教育社会学" + }, + { + label: "880.27 教育心理学", + value: "880.27 教育心理学" + }, + { + label: "880.31 教育经济学", + value: "880.31 教育经济学" + }, + { + label: "880.34 教育管理学", + value: "880.34 教育管理学" + }, + { + label: "880.37 比较教育学", + value: "880.37 比较教育学" + }, + { + label: "880.41 教育技术学", + value: "880.41 教育技术学" + }, + { + label: "880.44 军事教育学", + value: "880.44 军事教育学" + }, + { + label: "880.47 学前教育学", + value: "880.47 学前教育学" + }, + { + label: "880.51 普通教育学(包括初等教育学、中等教育学等)", + value: "880.51 普通教育学(包括初等教育学、中等教育学等)" + }, + { + label: "880.54 高等教育学", + value: "880.54 高等教育学" + }, + { + label: "880.57 成人教育学", + value: "880.57 成人教育学" + }, + { + label: "880.61 职业技术教育学", + value: "880.61 职业技术教育学" + }, + { + label: "880.64 特殊教育学", + value: "880.64 特殊教育学" + }, + { + label: "880.99 教育学其他学科", + value: "880.99 教育学其他学科" + } + ] + }, + { + label: "910 统计学", + value: "910 统计学", + children: [ + { + label: "910.10 统计学史", + value: "910.10 统计学史" + }, + { + label: "910.15 理论统计学", + value: "910.15 理论统计学" + }, + { + label: "910.20 统计法学", + value: "910.20 统计法学" + }, + { + label: "910.25 描述统计学", + value: "910.25 描述统计学" + }, + { + label: "910.30 经济统计学", + value: "910.30 经济统计学" + }, + { + label: "910.35 科学技术统计学", + value: "910.35 科学技术统计学" + }, + { + label: "910.40 社会统计学", + value: "910.40 社会统计学" + }, + { + label: "910.45 人口统计学", + value: "910.45 人口统计学" + }, + { + label: "910.50 环境与生态统计学", + value: "910.50 环境与生态统计学" + }, + { + label: "910.55 国际统计学", + value: "910.55 国际统计学" + }, + { + label: "910.99 统计学其他学科", + value: "910.99 统计学其他学科" + } + ] + } +] diff --git a/src/api/scientific/expertNew.js b/src/api/scientific/expertNew.js new file mode 100644 index 0000000000000000000000000000000000000000..9974a542e24257abfe36d809b8bec9d56fa81dba --- /dev/null +++ b/src/api/scientific/expertNew.js @@ -0,0 +1,63 @@ +import request from '@/utils/request-ruoyi'; + +// 获取专家列表 +export function getExpertList(params) { + return request({ + url: '/ExpertNew/getExpertList', + method: 'get', + params: params // 参数包含name、applyYear、status、highestEducation等查询条件 + }); +} + +// 获取所有城市数据 +export function getAllCitys() { + return request({ + url: '/ExpertNew/getAllCitys', + method: 'post' + }); +} + +// 获取项目申请代码(研究方向相关) +export function getProjectApplicationCodeAll() { + return request({ + url: '/ExpertNew/getProjectApplicationCodeAll', + method: 'get' + }); +} + +// 专家审核通过 +export function passExpert(expertIds) { + return request({ + url: '/ExpertNew/passExpert', + method: 'post', + data: { expertIds } + }); +} + +// 专家退回修改 +export function sendBackExpert(expertIds) { + return request({ + url: '/ExpertNew/sendBackOpion', + method: 'get', + params: { expertIds } + }); +} + +// 查看审核流程 +export function checkFlow(unitid, expertId) { + return request({ + url: '/ExpertNew/checkFlow', + method: 'get', + params: { unitid, expertId } + }); +} + +// 导出Excel +export function expertExport(params) { + return request({ + url: '/ExpertNew/expertExport', + method: 'get', + params: params, + responseType: 'blob' // 导出文件需指定响应类型 + }); +} \ No newline at end of file diff --git a/src/api/scientific/expertselect/assignExpert.js b/src/api/scientific/expertselect/assignExpert.js new file mode 100644 index 0000000000000000000000000000000000000000..5108b4ab116b695f8536540831c7bfb893e10de1 --- /dev/null +++ b/src/api/scientific/expertselect/assignExpert.js @@ -0,0 +1,36 @@ +import request from '@/utils/request-ruoyi'; + +// 获取推荐单位列表 +export function getApplyerList() { + return request({ + url: '/unit/applyer', + method: 'get' + }); +} + +// 获取项目列表 +export function getProjectList(params) { + return request({ + url: '/review/assignExpert4Talent/list', + method: 'post', + data: params + }); +} + +// 自动分配专家 +export function autoAssignExperts(data) { + return request({ + url: '/project/updateAssignExperts', + method: 'post', + data: data + }); +} + +// 检查时间状态 +export function checkInChecktime(data) { + return request({ + url: '/checktime/isInChecktime', + method: 'post', + data: data + }); +} \ No newline at end of file diff --git a/src/api/scientific/expertselect/expert.js b/src/api/scientific/expertselect/expert.js new file mode 100644 index 0000000000000000000000000000000000000000..469d9ac87e39e7b75dfde7f97a68dd189ec9d791 --- /dev/null +++ b/src/api/scientific/expertselect/expert.js @@ -0,0 +1,28 @@ +import request from '@/utils/request-ruoyi'; + +// 获取专家列表 +export function getExpertList(params) { + return request({ + url: '/ExpertNew/allForSel', + method: 'post', + data: params + }); +} + +// 获取已分配专家 +export function getAssignedExperts(params) { + return request({ + url: '/review/assignedExpert', + method: 'get', + params: params + }); +} + +// 保存专家分配 +export function saveExpertAssignment(data) { + return request({ + url: '/review/updateExpert4Talent', + method: 'post', + data: data + }); +} \ No newline at end of file diff --git a/src/api/scientific/merber.js b/src/api/scientific/merber.js new file mode 100644 index 0000000000000000000000000000000000000000..eac7d7e53bdc639568c9baebe3f16ff2da7f1055 --- /dev/null +++ b/src/api/scientific/merber.js @@ -0,0 +1,39 @@ +import request from '@/utils/request-ruoyi' + +// 获取民族列表 +export function list(data) { + return request({ + url: '/member/list', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + + +// 保存/修改项目信息 +export function insert(data) { + return request({ + url: '/member/insert', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + + +export function remove(data) { + return request({ + url: '/member/delete', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + diff --git a/src/api/scientific/projectChange.js b/src/api/scientific/projectChange.js new file mode 100644 index 0000000000000000000000000000000000000000..082340f86f4c22692a7c842a6a9733f87ffbe026 --- /dev/null +++ b/src/api/scientific/projectChange.js @@ -0,0 +1,171 @@ +import request from '@/utils/request-ruoyi' + +// 获取用户信息 +export function getUserInfo(params) { + return request({ + url: '/userinfo', + method: 'get', + params + }) +} + +// 获取申请详情 +export function getDeclareDetails(id) { + return request({ + url: `/declare/details/${id}`, + method: 'get' + }) +} + +// 获取民族列表 +export function getNationality() { + return request({ + url: '/nationality', + method: 'get' + }) +} + +// 获取学位列表 +export function getDegree() { + return request({ + url: '/degree', + method: 'get' + }) +} + +// 获取职称列表 +export function getTitle() { + return request({ + url: '/title', + method: 'get' + }) +} + +// 获取申请代码列表 +export function getApplicationCode() { + return request({ + url: '/code', + method: 'get' + }) +} + +// 更新变更单位信息 +export function updateChangeUnit(data) { + return request({ + url: '/declareChange/updateChangeUnit', + method: 'post', + data + }) +} + +// 提交变更申请 +export function submitAlteration(data) { + return request({ + url: '/declareChange/submitAlteration', + method: 'post', + data + }) +} + +// 获取附件详情 +export function getAttachmentsDetails(projectId) { + return request({ + url: `/attachments/details/${projectId}`, + method: 'get' + }) +} + +// 提交附件 +export function submitAttachments(data) { + return request({ + url: '/attachments/submit', + method: 'post', + data + }) +} + +// 删除附件 +export function deleteAttachment(data) { + return request({ + url: '/attachments/delete', + method: 'post', + data + }) +} + +// 更新其他附件 +export function updateOtherAttachment(data) { + return request({ + url: '/attachments/updateOther', + method: 'post', + data + }) +} + +// 提交申请 +export function submitDeclare(data) { + return request({ + url: '/declare/submitAlteration', + method: 'post', + data + }) +} + + + + + + + +// 更新项目周期 +export function updateProjectCycle(data) { + return request({ + url: '/declareChange/UpdateProjectCycle', + method: 'post', + data + }) +} + +// 提交延期申请 +export function submitExtension(data) { + return request({ + url: '/declareChange/submitExtension', + method: 'post', + data + }) +} + + + + + +// 更新项目周期 + +// 提交延期申请 + +// 下载延期PDF +export function downloadExtensionPdf(projectId) { + return request({ + url: `/extension/download/${projectId}`, + method: 'get', + responseType: 'blob' + }) +} + +// 预览延期PDF +export function previewExtensionPdf(projectId) { + return request({ + url: `/extension/preview/${projectId}`, + method: 'get', + responseType: 'blob' + }) +} + +// 获取附件详情 + + +// 提交附件信息 + +// 删除附件 + + diff --git a/src/api/scientific/projectLeader.js b/src/api/scientific/projectLeader.js new file mode 100644 index 0000000000000000000000000000000000000000..261b4d12654f232f4545f34f8a67702ee660f029 --- /dev/null +++ b/src/api/scientific/projectLeader.js @@ -0,0 +1,147 @@ +import request from '@/utils/request-ruoyi' + +// 获取用户信息 +export function getUserInfo(params) { + return request({ + url: '/userinfo', + method: 'get', + params + }) +} + +// 获取申报详情 +export function getDeclareDetails(id) { + return request({ + url: `/declare/details/${id}`, + method: 'get' + }) +} + +// 获取民族列表 +export function getNationality() { + return request({ + url: '/nationality', + method: 'get' + }) +} + +// 获取学位列表 +export function getDegree() { + return request({ + url: '/degree', + method: 'get' + }) +} + +// 获取职称列表 +export function getTitle() { + return request({ + url: '/title', + method: 'get' + }) +} + +// 获取专业代码列表 +export function getApplicationCode() { + return request({ + url: '/code', + method: 'get' + }) +} + +// 更新项目负责人变更信息 +export function updateChangeProjectLeader(data) { + return request({ + url: '/declareChange/UpdateChangeProjectLeader', + method: 'post', + data + }) +} + +// 提交负责人变更申报 +export function submitLeader(data) { + return request({ + url: '/declareChange/submitLeader', + method: 'post', + data + }) +} + +// 下载负责人变更PDF +export function downloadLeaderPdf(projectId) { + // 这个需要根据你的实际下载方式实现 + // 如果是直接下载,可以这样: + window.open(`/api/downloadLeaderPdf?projectId=${projectId}`, '_blank') +} + +// 预览负责人变更PDF +export function previewLeaderPdf(projectId) { + // 这个需要根据你的实际预览方式实现 + // 如果是打开新窗口预览,可以这样: + window.open(`/api/previewLeaderPdf?projectId=${projectId}`, '_blank') +} + +// 获取附件详情 +export function getAttachmentsDetails(projectId) { + return request({ + url: `/attachments/details/${projectId}`, + method: 'get' + }) +} + +// 提交附件 +export function submitAttachments(data) { + return request({ + url: '/attachments/submit', + method: 'post', + data + }) +} + +// 删除附件 +export function deleteAttachment(data) { + return request({ + url: '/attachments/delete', + method: 'post', + data + }) +} + +// 更新其他附件 +export function updateOtherAttachment(data) { + return request({ + url: '/attachments/updateOther', + method: 'post', + data + }) +} + +// 文件上传(使用原生XMLHttpRequest) +export function uploadFile(formData) { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest() + + xhr.open('POST', 'https://obsupload.91huayi.com/obs/upload/mj', true) + + xhr.onreadystatechange = function() { + if (xhr.readyState === 4) { + if (xhr.status === 200) { + try { + const response = JSON.parse(xhr.responseText) + resolve(response) + } catch (e) { + reject(new Error('响应解析失败')) + } + } else { + reject(new Error('上传失败')) + } + } + } + + xhr.onerror = function() { + reject(new Error('网络错误')) + } + + xhr.send(formData) + }) +} diff --git a/src/api/scientific/review.js b/src/api/scientific/review.js new file mode 100644 index 0000000000000000000000000000000000000000..928e63ae9c206f4cfaddc4c57b7e65195e3d70d6 --- /dev/null +++ b/src/api/scientific/review.js @@ -0,0 +1,69 @@ +import request from '@/utils/request-ruoyi' + +// 获取项目人才计划审核列表 +export function reviewList(query) { + return request({ + url: '/reviewNew/list', + method: 'get', + params: query, + + }) +} + + +export function modify(data) { + return request({ + url: '/reviewNew/modify', + method: 'post', + data: data + }) +} + +// 专家分配列表接口 +export function expertList(query) { + return request({ + url: '/reviewNew/expertlist', + method: 'get', + params: query, + + }) +} + +export function bookCliam(query) { + return request({ + url: '/reviewNew/bookCliam', + method: 'get', + params: query, + }) +} + +export function prjectCliam(query) { + return request({ + url: '/reviewNew/projectCliamOne', + method: 'get', + params: query, + }) +} + +export function deleteOne(query) { + return request({ + url: '/reviewNew/delete', + method: 'get', + params: query, + }) +} +export function projectChange(query) { + return request({ + url: '/reviewNew/projectChangeClaim', + method: 'get', + params: query, + }) +} + +export function closingCliam(query) { + return request({ + url: '/reviewNew/closingCliam', + method: 'get', + params: query, + }) +} diff --git a/src/api/scientific/system/achievement.js b/src/api/scientific/system/achievement.js new file mode 100644 index 0000000000000000000000000000000000000000..511f422ae143773baf0af7002d5f55c992345090 --- /dev/null +++ b/src/api/scientific/system/achievement.js @@ -0,0 +1,44 @@ +import request from '@/utils/request-ruoyi' + +// 查询代性成果目录列表 +export function listAchievement(query) { + return request({ + url: '/system/achievement/list', + method: 'get', + params: query + }) +} + +// 查询代性成果目录详细 +export function getAchievement(id) { + return request({ + url: '/system/achievement/' + id, + method: 'get' + }) +} + +// 新增代性成果目录 +export function addAchievement(data) { + return request({ + url: '/system/achievement', + method: 'post', + data: data + }) +} + +// 修改代性成果目录 +export function updateAchievement(data) { + return request({ + url: '/system/achievement', + method: 'put', + data: data + }) +} + +// 删除代性成果目录 +export function delAchievement(id) { + return request({ + url: '/system/achievement/' + id, + method: 'delete' + }) +} diff --git a/src/api/scientific/system/applicant.js b/src/api/scientific/system/applicant.js new file mode 100644 index 0000000000000000000000000000000000000000..c35c081f429b0f020cc887e2d8a861a5224f51eb --- /dev/null +++ b/src/api/scientific/system/applicant.js @@ -0,0 +1,44 @@ +import request from '@/utils/request-ruoyi' + +// 查询项目申请人基本信息列表 +export function listApplicant(query) { + return request({ + url: '/system/applicant/list', + method: 'get', + params: query + }) +} + +// 查询项目申请人基本信息详细 +export function getApplicant(id) { + return request({ + url: '/system/applicant/' + id, + method: 'get' + }) +} + +// 新增项目申请人基本信息 +export function addApplicant(data) { + return request({ + url: '/system/applicant', + method: 'post', + data: data + }) +} + +// 修改项目申请人基本信息 +export function updateApplicant(data) { + return request({ + url: '/system/applicant', + method: 'put', + data: data + }) +} + +// 删除项目申请人基本信息 +export function delApplicant(id) { + return request({ + url: '/system/applicant/' + id, + method: 'delete' + }) +} diff --git a/src/api/scientific/system/blacklist.js b/src/api/scientific/system/blacklist.js new file mode 100644 index 0000000000000000000000000000000000000000..7a614ef8e9bdff85ea0fcec92aac1eef675d2be0 --- /dev/null +++ b/src/api/scientific/system/blacklist.js @@ -0,0 +1,64 @@ +import request from '@/utils/request-ruoyi' + +// 查询科研项目申报黑名单列表 +export function listBlacklist(query) { + return request({ + url: '/system/blacklist/list', + method: 'get', + params: query + }) +} + +// 查询可加入黑名单的用户列表 +export function listUnitInfo(query) { + return request({ + url: '/unit/getUnitInfoList', + method: 'get', + params: query + }) +} + +// 查询科研项目申报黑名单详细 +export function getBlacklist(id) { + return request({ + url: '/system/blacklist/' + id, + method: 'get' + }) +} + +// 新增科研项目申报黑名单 +export function addBlacklist(data) { + return request({ + url: '/unit/addBlacklist', + method: 'post', + data: data + }) +} + +// 修改科研项目申报黑名单 +export function updateBlacklist(data) { + return request({ + url: '/system/blacklist', + method: 'put', + data: data + }) +} + +// 移除黑名单 +export function removeBlacklist(idList) { + return request({ + url: '/unit/removeBlacklist', + method: 'post', + data: { idList: JSON.stringify(idList) } + }) +} + +// 导出黑名单Excel +export function exportBlacklist(query) { + return request({ + url: '/unit/ExcelUnitBlackList', + method: 'post', + params: query, + responseType: 'blob' + }) +} \ No newline at end of file diff --git a/src/api/scientific/system/declare.js b/src/api/scientific/system/declare.js new file mode 100644 index 0000000000000000000000000000000000000000..4e016fc87d0e5f4355569aec22c05cfc93d5bbbf --- /dev/null +++ b/src/api/scientific/system/declare.js @@ -0,0 +1,745 @@ +import request from '@/utils/request-ruoyi' + +export const projectStatusMap = { + 'adding': '填报中', + 'add_up': '待提交', + 'for_approve': '待审核', + 'approving': '审核中', + 'over': '结束', + 'edit': '返回修改', +} + +export const auditStatusMap = { + 'no_approve': '未审核', + 'one_approve_ok': '依托单位审核通过', + 'one_approve_refuse': '依托单位审核驳回', + 'two_approve_ok': '推荐单位审核通过', + 'two_approve_refuse': '推荐单位审核驳回', + 'three_approve_ok': '依托单位审核通过', + 'three_approve_refuse': '省单位审核驳回', +} + +// 列表1 +export function list1(data) { + return request({ + url: '/system/project/list', + method: 'get', + data: data + }) +} +export function add1(data) { + return request({ + url: '/system/project/addProject', + method: 'post', + data: data + }) +} + +export function look1(data) { + return request({ + url: '/system/project/'+data, + method: 'get', + }) +} +export function look2(data) { + return request({ + url: '/system/participant/list', + method: 'get', + params: data + }) +} +export function look3(data) { + return request({ + url: '/system/project/getInfo/' +data, + method: 'get', + }) +} +export function look5(data) { + return request({ + url: '/system/examine/' +data, + method: 'get', + }) +} +export function look6(data) { + return request({ + url: '/system/budget/' +data, + method: 'get', + }) +} +export function look7(data) { + return request({ + url: '/system/achievement/list', + method: 'get', + params: data + }) +} + +// 项目申报 1步 +export function declare1(data) { + return request({ + url: '/system/project/add', + method: 'post', + data: data + }) +} + +// 项目申报 2步 +export function declare2(data) { + return request({ + url: '/system/participant', + method: 'post', + data: data + }) +} +// 项目申报 2步 +export function declare3(data) { + return request({ + url: '/system/project', + method: 'put', + data: data + }) +} + +// 项目申报 5步 +export function declare5(data) { + return request({ + url: '/system/examine', + method: 'post', + data: data + }) +} +// 项目申报 6步 +export function declare6(data) { + return request({ + url: '/system/budget', + method: 'post', + data: data + }) +} +// 项目申报 7步 +export function declare7(data) { + return request({ + url: '/system/achievement', + method: 'post', + data: data + }) +} + + + +export function declare11(query) { + return request({ + url: '/system/user/list', + method: 'post', + params: query + }) +} + +// 审核的项目列表 +export function projectCheckList(data) { + return request({ + url: '/declare/list', + method: 'get', + params: data + }) +} + +// // 项目审核 +export function projectReviewSubmit(data) { + return request({ + url: '/system/check/add', + method: 'post', + data: data + }) +} +export function projectReviewSubmitAll(data) { + return request({ + url: '/system/check/batchProjectCheck', + method: 'post', + data: data + }) +} + +// 形式审查 +export function investigatexingshi(data) { + return request({ + url: '/system/examination/add', + method: 'post', + data: data + }) +} + +// 查专家用户信息 +export function lookSpecialistInfo() { + return request({ + url: '/system/info/getInfo' , + method: 'get', + }) +} +// 保存家用户信息 +export function saveSpecialistInfo(data) { + return request({ + url: '/system/info' , + method: 'post', + data: data + }) +} + +// 修改手机号 +export function updPhone(data) { + return request({ + url: '/system/user/changePhone' , + method: 'put', + data: data + }) +} +// 修改密码 +export function upPWD(data) { + return request({ + url: '/system/user/changePassword' , + method: 'put', + data: data + }) +} +// 专家列表 +export function specialistAll(data) { + return request({ + url: '/system/info/list' , + method: 'get', + params: data, + }) +} +// 审核 +export function specialAudit(data) { + return request({ + url: '/system/info/check ' , + method: 'post', + data: data + }) +} +// 专家组 管理 列表 +export function specialistAllgroup(data) { + return request({ + url: '/system/team/list' , + method: 'get', + params: data, + }) +} +// 专家组 管理 新增 +export function specialistAllgroupAdd(data) { + return request({ + url: '/system/team' , + method: 'post', + data: data, + }) +} +// 专家组 管理 修改 +export function specialistAllgroupUpd(data) { + return request({ + url: '/system/team' , + method: 'put', + data: data, + }) +} + +// 已选择的专家 +export function specialistSel(data) { + return request({ + url: '/system/team/expertList' , + method: 'get', + params: data, + }) +} + +// 专家组 维护 新增 +export function specialistWeihuAdd(data) { + return request({ + url: '/system/team/addRelation' , + method: 'post', + data: data, + }) +} +// 专家组 维护 设为组长 +export function specialistWeihuUpd(data) { + return request({ + url: '/system/team/editLeader' , + method: 'put', + data: data, + }) +} +// 专家组 维护 删除组员 +export function specialistWeihuDel(data) { + return request({ + url: '/system/team/deleteRelation' , + method: 'post', + data: data, + }) +} + +// 设置时间 +export function setTimeAlllist(data) { + return request({ + url: '/system/time/list' , + method: 'get', + params: data, + }) +} +export function setTimeAll(data) { + return request({ + url: '/system/time/add' , + method: 'post', + data: data, + }) +} + +// 评分 +export function scoreData(data) { + return request({ + url: '/system/expertScore/add' , + method: 'post', + data: data, + }) +} +// 查询 +export function reviewList(data) { + return request({ + url: '/system/project/expertCheckList' , + method: 'get', + params: data, + }) +} +// 分配专家 +export function fenpeizhuanjiaList(data) { + return request({ + url: '/system/project/forexpertList' , + method: 'get', + params: data, + }) +} +// 不分页专家 +export function bufenzhuanjia(data) { + return request({ + url: '/system/info/getListForProject' , + method: 'get', + params: data, + }) +} +// 绑定 项目的专家 +export function bangdingzhuanj(data) { + return request({ + url: '/system/expert/addTalentExpertList' , + method: 'post', + data: data, + }) +} +// 评审结果list +export function pingshenjieguo(data) { + return request({ + url: '/system/score/list' , + method: 'get', + params: data, + }) +} +// 形式审查结果 +export function xingshishencha(data) { + return request({ + url: '/system/examination/list' , + method: 'get', + params: data, + }) +} +// 立项管理list +export function lixiangList(data) { + return request({ + url: '/system/examination/list' , + method: 'get', + params: data, + }) +} + + +export function exportPDF(data) { + return request({ + url: '/system/pdf/ChageDownPdf' , + method: 'post', + data: data, + }) +} + +export function getApprovalList(data) { + return request({ + url: '/system/approval/list' , + method: 'get', + params: data, + }) +} + +export function getCheckList(data) { + return request({ + url: '/system/check/list' , + method: 'get', + params: data, + }) +} + + +export function exportApproval(data) { + return request({ + url: '/system/approval/export' , + method: 'post', + data: data, + }) +} + +export function deleteApproval(deptId) { + return request({ + url: '/system/approval/' + deptId, + method: 'delete' + }) +} + +export function exportCheck(data) { + return request({ + url: '/system/check/export' , + method: 'post', + data: data, + }) +} + +export function getBlackList(data) { + return request({ + url: '/system/blacklist/blacklist' , + method: 'get', + params: data, + }) +} + +export function getOptionListbyUnit(data) { + return request({ + url: '/system//project/optionListbyUnit' , + method: 'get', + params: data, + }) +} + +export function checkTime(data) { + return request({ + url: '/declare/time' , + method: 'get', + params: data, + }) +} + +export function insert(data) { + return request({ + url: '/declare/insert', + method: 'post', + data: data, + }) +} + +export function getCode(data) { + return request({ + url: '/code' , + method: 'get', + params: data, + }) +} + +export function getUserInfo(data) { + return request({ + url: '/userinfo' , + method: 'get', + params: data, + }) +} + +// 新增立项管理相关API +export function getApprovalProjectList(data) { + return request({ + url: '/projectCheck/getApprovalProjectList', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +export function batchUpdateApproval(ids) { + return request({ + url: '/projectCheck/batchUpdateApproval', + method: 'post', + data: { ids: ids } + }) +} + +export function addOrUpdateApproval(data) { + return request({ + url: '/projectCheck/addOrUpdateApproval', + method: 'post', + data: data + }) +} + +export function exportApprovalListMode(data) { + return request({ + url: '/projectCheck/exportApprovalListMode', + method: 'post', + data: data, + responseType: 'blob' + }) +} + +export function exportExpertScore(data) { + return request({ + url: '/projectCheck/exportExpertScore', + method: 'post', + data: data, + responseType: 'blob' + }) +} + +export function getProjectDetail(data) { + return request({ + url: '/projectCheck/getProjectDetail', + method: 'get', + params: data + }) +} + + +/** + * 获取项目列表 + */ +export function getProjectList(data) { + return request({ + url: '/projectCheck/getProjectList', + method: 'post', + data: data, + contentType: 'application/json' + }) +} + +/** + * 导出项目列表 + */ +export function exportProjectList(projectids) { + return request({ + url: '/projectCheck/exporScoretAsExpertListMode', + method: 'post', + data: { + fileName: '项目列表.xlsx', + projectids: JSON.stringify(projectids) + }, + responseType: 'blob' + }).then(response => { + const blob = new Blob([response.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }) + const url = window.URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = '项目列表.xlsx' + document.body.appendChild(a) + a.click() + window.URL.revokeObjectURL(url) + document.body.removeChild(a) + }) +} + +/** + * 导出评分表 + */ +export function exportScoreList(projectids) { + return request({ + url: '/projectCheck/exportExpertScore', + method: 'post', + data: { + fileName: '项目评分表.xlsx', + projectids: JSON.stringify(projectids) + }, + responseType: 'blob' + }).then(response => { + const blob = new Blob([response.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }) + const url = window.URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = '项目评分表.xlsx' + document.body.appendChild(a) + a.click() + window.URL.revokeObjectURL(url) + document.body.removeChild(a) + }) +} + +/** + * 导出单个项目 + */ +export function exportSingleProject(projectids) { + return exportScoreList(projectids) +} + + +/** + * 审核通过 + * @param {Array} projectIds 项目ID数组 + */ +export function checkProjectPass(projectIds) { + return request({ + url: '/project/GetProjectCheckAllByid', + method: 'post', + data: { + projectid: JSON.stringify(projectIds), + check_status: 1 + } + }) +} + +/** + * 审核不通过 + * @param {Array} projectIds 项目ID数组 + * @param {String} reason 不通过原因 + */ +export function checkProjectNoPass(projectIds, reason) { + return request({ + url: '/project/GetProjectCheckAllByid', + method: 'post', + data: { + projectid: JSON.stringify(projectIds), + option: reason, + check_status: 2 + } + }) +} + + + +/** + * 退回项目 + * @param {String} projectId 项目ID + * @param {String} reason 退回原因 + */ +export function projectBack(projectId, reason) { + return request({ + url: '/project/projectBack', + method: 'post', + data: { + projectid: projectId, + status: '0', + value: reason + } + }) +} + +/** + * 取消退回 + * @param {String} projectId 项目ID + */ +export function cancelProjectBack(projectId) { + return request({ + url: '/project/projectBack', + method: 'post', + data: { + projectid: projectId, + status: '1' + } + }) +} + +/** + * 导出形式审查结果 + * @param {Object} params 查询参数 + */ +// 在declare.js中修改exportProjectCheckResult方法 +export function exportProjectCheckResult(params) { + // 先获取列表数据并处理后再导出 + return projectCheckResultList(params) + .then(listResponse => { + // 过滤null值并映射正确字段 + const processedData = listResponse.data + .filter(item => item !== null) // 过滤null元素 + .map(item => ({ + // 确保Excel列与实际字段正确映射 + "项目编号": item.projectappcode || "", // 处理null/undefined + "申报年度": item.applyyearid || "", + "项目名称": item.projectname || "", + "申报专题": item.declareTopic || "", + "申报类型": item.projectType || "", + "推荐单位": item.unitname || "", + "项目负责人": item.leadername || "", + "审查结果": item.result === 1 ? "合格" : item.result === 0 ? "不合格" : "未审查" + })); + + // 调用导出接口时传入处理后的数据 + return request({ + url: '/project/ExcelProjectCheckResult', + method: 'post', + data: { + ...params, + exportData: processedData // 将处理后的数据传给后端 + }, + responseType: 'blob' + }); + }) + .then(response => { + const blob = new Blob([response.data], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = '形式审查结果.xlsx'; + document.body.appendChild(a); + a.click(); + window.URL.revokeObjectURL(url); + document.body.removeChild(a); + return Promise.resolve(); + }); +} + + +// 在原有declare.js基础上补充以下方法 + +/** + * 形式审查结果列表 + */ +export function projectCheckResultList(data) { + return request({ + url: '/project/projectCheckResultList', + method: 'get', + params: data + }) +} + +/** + * 检查是否在审核时间内 + */ +export function checkReviewTime(data) { + return request({ + url: '/checktime/isInChecktime', + method: 'post', + data: data + }) +} + +/** + * 批量审核项目 + */ +export function batchReviewProjects(data) { + return request({ + url: '/project/GetProjectCheckAllByid', + method: 'post', + data: data + }) +} + +/** + * 退回项目 + */ +export function returnProject(data) { + return request({ + url: '/project/projectBack', + method: 'post', + data: data + }) +} + diff --git a/src/api/scientific/system/examine.js b/src/api/scientific/system/examine.js new file mode 100644 index 0000000000000000000000000000000000000000..e31638828c29e5dc383f1fa6dc98d065ed40bc33 --- /dev/null +++ b/src/api/scientific/system/examine.js @@ -0,0 +1,44 @@ +import request from '@/utils/request-ruoyi' + +// 查询考核指标列表 +export function listExamine(query) { + return request({ + url: '/system/examine/list', + method: 'get', + params: query + }) +} + +// 查询考核指标详细 +export function getExamine(id) { + return request({ + url: '/system/examine/' + id, + method: 'get' + }) +} + +// 新增考核指标 +export function addExamine(data) { + return request({ + url: '/system/examine', + method: 'post', + data: data + }) +} + +// 修改考核指标 +export function updateExamine(data) { + return request({ + url: '/system/examine', + method: 'put', + data: data + }) +} + +// 删除考核指标 +export function delExamine(id) { + return request({ + url: '/system/examine/' + id, + method: 'delete' + }) +} diff --git a/src/api/scientific/system/participant.js b/src/api/scientific/system/participant.js new file mode 100644 index 0000000000000000000000000000000000000000..11fd0a744e35c397a75f9fbe456a6746b1835183 --- /dev/null +++ b/src/api/scientific/system/participant.js @@ -0,0 +1,44 @@ +import request from '@/utils/request-ruoyi' + +// 查询项目参与者列表 +export function listParticipant(query) { + return request({ + url: '/system/participant/list', + method: 'get', + params: query + }) +} + +// 查询项目参与者详细 +export function getParticipant(id) { + return request({ + url: '/system/participant/' + id, + method: 'get' + }) +} + +// 新增项目参与者 +export function addParticipant(data) { + return request({ + url: '/system/participant', + method: 'post', + data: data + }) +} + +// 修改项目参与者 +export function updateParticipant(data) { + return request({ + url: '/system/participant', + method: 'put', + data: data + }) +} + +// 删除项目参与者 +export function delParticipant(id) { + return request({ + url: '/system/participant/' + id, + method: 'delete' + }) +} diff --git a/src/api/scientific/system/permissions.js b/src/api/scientific/system/permissions.js new file mode 100644 index 0000000000000000000000000000000000000000..d3c0d05c898fde6aa601601878cb578f41df9ea5 --- /dev/null +++ b/src/api/scientific/system/permissions.js @@ -0,0 +1,117 @@ +import request from '@/utils/request-ruoyi' + +// 查询专家权限列列表 +export function listPermissions(query) { + return request({ + url: '/system/permissions/list', + method: 'get', + params: query + }) +} + +// 查询专家权限列详细 +export function getPermissions(id) { + return request({ + url: '/system/permissions/' + id, + method: 'get' + }) +} + +// 新增专家权限列 +export function addPermissions(data) { + return request({ + url: '/system/permissions', + method: 'post', + data: data + }) +} + +// 修改专家权限列 +export function updatePermissions(data) { + return request({ + url: '/system/permissions', + method: 'put', + data: data + }) +} + +// 删除专家权限列 +export function delPermissions(id) { + return request({ + url: '/system/permissions/' + id, + method: 'delete' + }) +} + +// 获取有专家权限的用户列表 +export function getExpertPermissions(query) { + return request({ + url: '/unit/getExpertPermissions', + method: 'get', + params: query + }) +} + +// 获取可添加专家权限的用户列表 +export function getUnitInfoList(query) { + return request({ + url: '/unit/getUnitInfoList', + method: 'get', + params: query + }) +} + +// 添加专家权限 +export function addExpertPermission(unitId) { + return request({ + url: '/unit/addExpertPermissions', + method: 'post', + data: { unitId } + }) +} + +// 移除专家权限 +export function removeExpertPermission(unitId) { + return request({ + url: '/unit/removeExpertPermissions', + method: 'post', + data: { idList: [unitId] } + }) +} + +// 批量移除专家权限 +export function batchRemoveExpertPermission(ids) { + return request({ + url: '/unit/removeBlacklist', + method: 'post', + data: { idList: ids } + }) +} + +// 导出专家权限列表 +export function exportExpertPermissions(query) { + return request({ + url: '/unit/ExcelUnitInfoExpertPermissions', + method: 'post', + params: query, + responseType: 'blob' + }) +} + +// 获取用户信息 +export function getUnitInfo(unitcode) { + return request({ + url: '/unit/getUnitInfo', + method: 'get', + params: { unitcode } + }) +} + +// 更新用户密码 +export function updateUnitPassword(data) { + return request({ + url: '/unit/updateUnitInfo', + method: 'post', + data: data + }) +} \ No newline at end of file diff --git a/src/api/scientific/system/project.js b/src/api/scientific/system/project.js new file mode 100644 index 0000000000000000000000000000000000000000..db8e803416d2b7d89815c570b4491f6288464d3c --- /dev/null +++ b/src/api/scientific/system/project.js @@ -0,0 +1,44 @@ +import request from '@/utils/request-ruoyi' + +// 查询项目基本信息列表 +export function listProject(query) { + return request({ + url: '/system/project/list', + method: 'get', + params: query + }) +} + +// 查询项目基本信息详细 +export function getProject(id) { + return request({ + url: '/system/project/' + id, + method: 'get' + }) +} + +// 新增项目基本信息 +export function addProject(data) { + return request({ + url: '/system/project', + method: 'post', + data: data + }) +} + +// 修改项目基本信息 +export function updateProject(data) { + return request({ + url: '/system/project', + method: 'put', + data: data + }) +} + +// 删除项目基本信息 +export function delProject(id) { + return request({ + url: '/system/project/' + id, + method: 'delete' + }) +} diff --git a/src/api/scientific/system/questionnaire.js b/src/api/scientific/system/questionnaire.js new file mode 100644 index 0000000000000000000000000000000000000000..50059f3d4b010f48cf2b9611515bc48fea8dcbba --- /dev/null +++ b/src/api/scientific/system/questionnaire.js @@ -0,0 +1,44 @@ +import request from '@/utils/request-ruoyi' + +// 查询系统满意度调查问卷列表 +export function listQuestionnaire(query) { + return request({ + url: '/system/questionnaire/list', + method: 'get', + params: query + }) +} + +// 查询系统满意度调查问卷详细 +export function getQuestionnaire(id) { + return request({ + url: '/system/questionnaire/' + id, + method: 'get' + }) +} + +// 新增系统满意度调查问卷 +export function addQuestionnaire(data) { + return request({ + url: '/system/questionnaire', + method: 'post', + data: data + }) +} + +// 修改系统满意度调查问卷 +export function updateQuestionnaire(data) { + return request({ + url: '/system/questionnaire', + method: 'put', + data: data + }) +} + +// 删除系统满意度调查问卷 +export function delQuestionnaire(id) { + return request({ + url: '/system/questionnaire/' + id, + method: 'delete' + }) +} diff --git a/src/api/scientific/system/tinfo.js b/src/api/scientific/system/tinfo.js new file mode 100644 index 0000000000000000000000000000000000000000..585e015b6568dd56c5272ade058e24eaa8e25b13 --- /dev/null +++ b/src/api/scientific/system/tinfo.js @@ -0,0 +1,45 @@ +import request from '@/utils/request-ruoyi' + +// 查询专家信息维护列表 +export function listTinfo(query) { + return request({ + + url: '/system/info/list', + method: 'get', + params: query + }) +} + +// 查询专家信息维护详细 +export function getTinfo(expertId) { + return request({ + url: '/system/info/getInfo' + expertId, + method: 'get' + }) +} + +// 新增专家信息维护 +export function addTinfo(data) { + return request({ + url: '/system/info', + method: 'post', + data: data + }) +} + +// 修改专家信息维护 +export function updateTinfo(data) { + return request({ + url: '/system/info/edit', + method: 'put', + data: data + }) +} + +// 删除专家信息维护 +export function delTinfo(expertId) { + return request({ + url: '/system/info/' + expertId, + method: 'delete' + }) +} diff --git a/src/api/scientific/system/unit.js b/src/api/scientific/system/unit.js new file mode 100644 index 0000000000000000000000000000000000000000..1ee95d24c9b3fe3ed27d3932cb0d18b384c6250a --- /dev/null +++ b/src/api/scientific/system/unit.js @@ -0,0 +1,44 @@ +import request from '@/utils/request-ruoyi' + +// 查询依托单位列表 +export function listUnit(query) { + return request({ + url: '/system/unit/list', + method: 'get', + params: query + }) +} + +// 查询依托单位详细 +export function getUnit(id) { + return request({ + url: '/system/unit/' + id, + method: 'get' + }) +} + +// 新增依托单位 +export function addUnit(data) { + return request({ + url: '/system/unit', + method: 'post', + data: data + }) +} + +// 修改依托单位 +export function updateUnit(data) { + return request({ + url: '/system/unit', + method: 'put', + data: data + }) +} + +// 删除依托单位 +export function delUnit(id) { + return request({ + url: '/system/unit/' + id, + method: 'delete' + }) +} diff --git a/src/api/scientific/taskbook.js b/src/api/scientific/taskbook.js new file mode 100644 index 0000000000000000000000000000000000000000..cf358943c80d19643ae65be338e5285be328c6e8 --- /dev/null +++ b/src/api/scientific/taskbook.js @@ -0,0 +1,421 @@ +import request from '@/utils/request-ruoyi' + + + +// 获取申请代码列表 +export function getApplicationCode() { + return request({ + url: '/code', + method: 'get' + }) +} + +// 获取项目详情 +export function getProjectDetail(id) { + return request({ + url: `/declareTask/details/${id}`, + method: 'get' + }) +} + +export function getProjectParticipants(projectId) { + return request({ + url: '/memberTask/list/', + method: 'post', + data: { projectid: projectId } + }) +} + +// 保存项目参与者 +export function saveProjectParticipants(data) { + return request({ + url: '/memberTask/insert', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 删除参与者 +export function deleteParticipant(id) { + return request({ + url: '/memberTask/delete', + method: 'post', + data: { id: id } + }) +} +// 保存/修改项目基本信息 +export function insertProjectHttp(data) { + return request({ + url: '/declareTask/saveProject', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 保存项目任务信息 +export function saveProjectTalentTask(data) { + return request({ + url: '/declareTask/saveProjectTalentTask', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 提交项目审核 +// export function submitProject(data) { +// return request({ +// url: '/declare/submit', +// method: 'post', +// data: data +// }) +// } +// 保存合作单位信息 +export function saveCooperation(params) { + return request({ + url: '/declareTask/saveProjectTalentCooperationList', + method: 'post', + params: params + }) +} + +// 提交项目审核 +export function submitProject(data) { + return request({ + url: '/declareTask/submit', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 获取预算信息 +export function getBudget(id) { + return request({ + url: `/declareTask/getBudget/${id}`, + method: 'get' + }) +} + +// 保存预算信息 + +// 获取预算详情 (新增方法) +export function getBudgetDetails(projectId) { + return request({ + url: `/declareTask/getBudget/${projectId}`, + method: 'get' + }) +} + +// 保存预算信息 (已存在,这里展示完整实现) +export function saveBudget(data) { + return request({ + url: '/declareTask/saveBudget', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} +export function getProjectTaskDetails(projectId) { + return request({ + url: `/declareTask/detailsTask/${projectId}`, + method: 'get' + }) +} + +// 获取PDF数据 +export function getPdfData(projectId) { + return request({ + url: '/declareTask/pdf', + method: 'get', + params: { projectId } + }) +} + +// 预览PDF +export function previewPdf(projectId) { + return request({ + url: '/declareTask/preview', + method: 'get', + params: { projectId: projectId }, + responseType: 'blob' + }) +} + +// 下载PDF +export function downloadPdf(projectId) { + return request({ + url: '/declareTask/download', + method: 'get', + params: { projectId: projectId }, + responseType: 'blob' + }) +} + +// 检查填写情况 +export function checkInput(projectId) { + return request({ + url: '/declareTask/check', + method: 'get', + params: { projectId: projectId } + }) +} + +// 获取申报列表 +export function getDeclareTaskList(params) { + return request({ + url: '/declareTaskList', + method: 'get', + params: params + }) +} + +// 获取项目参与者列表 + +// 保存项目参与者 + + +// 获取项目摘要 +export function getProjectAbstract(projectId) { + return request({ + url: `/declare/details/${projectId}`, + method: 'get' + }) +} + +// 保存项目摘要 +export function saveProjectAbstract(data) { + return request({ + url: '/declare/updateContent', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 获取项目目标 +export function getProjectGoal(projectId) { + return request({ + url: `/declare/details/${projectId}`, + method: 'get' + }) +} + +// 保存项目目标 +export function saveProjectGoal(data) { + return request({ + url: '/declare/updateContent', + method: 'post', + data: data + }) +} + +// 获取项目目标 + + +// 获取考核指标 +// 获取项目考核指标 +export function getProjectAssessment(baseId) { + return request({ + url: `/declareTask/details/${baseId}`, + method: 'get' + }) +} + +// 保存项目考核指标 +export function saveProjectAssessment(data) { + return request({ + url: '/declareTask/updateContent', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 获取权利义务信息 +export function getDeclarationOfRights(projectId) { + return request({ + url: `/declareTask/rights/${projectId}`, + method: 'get' + }) +} + +// 保存权利义务信息 +export function saveDeclarationOfRights(data) { + return request({ + url: '/declareTask/saveRights', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 获取签订单位信息 +export function getUnitInformation(projectId) { + return request({ + url: `/declareTask/unitInfo/${projectId}`, + method: 'get' + }) +} + +// 保存签订单位信息 +export function saveUnitInformation(data) { + return request({ + url: '/declareTask/saveUnitInfo', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 上传附件 +export function uploadAttachment(data) { + return request({ + url: '/declareTask/upload', + method: 'post', + data: data, + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} + +// 获取附件列表 +export function getAttachmentList(projectId) { + return request({ + url: `/declareTask/attachments/${projectId}`, + method: 'get' + }) +} + +// 删除附件 +export function deleteAttachment(attachmentId) { + return request({ + url: `/declareTask/attachment/${attachmentId}`, + method: 'delete' + }) +} + +// 获取项目统计信息 +export function getProjectStatistics(params) { + return request({ + url: '/declareTask/statistics', + method: 'get', + params: params + }) +} + +// 批量操作项目 +export function batchOperateProjects(data) { + return request({ + url: '/declareTask/batchOperate', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 导出项目数据 +export function exportProjectData(params) { + return request({ + url: '/declareTask/export', + method: 'get', + params: params, + responseType: 'blob' + }) +} + +// 项目审核相关接口 + +// 获取待审核项目列表 +export function getPendingReviewList(params) { + return request({ + url: '/declareTask/pendingReview', + method: 'get', + params: params + }) +} + +// 审核项目 +export function reviewProject(data) { + return request({ + url: '/declareTask/review', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} + +// 获取审核历史 +export function getReviewHistory(projectId) { + return request({ + url: `/declareTask/reviewHistory/${projectId}`, + method: 'get' + }) +} + +// 撤回项目 +export function withdrawProject(projectId) { + return request({ + url: `/declareTask/withdraw/${projectId}`, + method: 'post' + }) +} + +// 重新提交项目 +export function resubmitProject(projectId) { + return request({ + url: `/declareTask/resubmit/${projectId}`, + method: 'post' + }) +} + +export function taskAttachmentList(projectId) { + return request({ + url: `/taskAttachments/details/${projectId}`, + method: 'get' + }) +} + +export function getUpdateInfo(projectId) { + return request({ + url: `/memberTask/getUpdateInfor/?projectid=${projectId}`, + method: 'POST' + }) +} + +// axios.post('/taskAttachments/submit', newTableData) +export function submitTaskAttachments(data) { + return request({ + url: '/taskAttachments/submit', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json' + } + }) +} diff --git a/src/api/system/dept.js b/src/api/system/dept.js index 5f6f07bc55803d18f3a69032389a7bb3ce496394..626f0227eb7a42cf7ffab7511614f5e2ee3c5fd8 100644 --- a/src/api/system/dept.js +++ b/src/api/system/dept.js @@ -1,6 +1,6 @@ import request from '@/utils/request' -// 查询部门列表 +// 查询单位列表 export function listDept(query) { return request({ url: '/system/dept/list', @@ -9,7 +9,7 @@ export function listDept(query) { }) } -// 查询部门列表(排除节点) +// 查询单位列表(排除节点) export function listDeptExcludeChild(deptId) { return request({ url: '/system/dept/list/exclude/' + deptId, @@ -17,7 +17,7 @@ export function listDeptExcludeChild(deptId) { }) } -// 查询部门详细 +// 查询单位详细 export function getDept(deptId) { return request({ url: '/system/dept/get?id=' + deptId, @@ -25,7 +25,7 @@ export function getDept(deptId) { }) } -// 获取部门精简信息列表 +// 获取单位精简信息列表 export function listSimpleDepts() { return request({ url: '/system/dept/list-all-simple', @@ -33,7 +33,7 @@ export function listSimpleDepts() { }) } -// 新增部门 +// 新增单位 export function addDept(data) { return request({ url: '/system/dept/create', @@ -42,7 +42,7 @@ export function addDept(data) { }) } -// 修改部门 +// 修改单位 export function updateDept(data) { return request({ url: '/system/dept/update', @@ -51,7 +51,7 @@ export function updateDept(data) { }) } -// 删除部门 +// 删除单位 export function delDept(id) { return request({ url: '/system/dept/delete?id=' + id, @@ -59,7 +59,7 @@ export function delDept(id) { }) } -// 批量删除部门 +// 批量删除单位 export function delDeptList(ids) { return request({ url: `/system/dept/delete-batch?ids=${ids.join(',')}`, diff --git a/src/api/system/role.js b/src/api/system/role.js index 37409f05aa1a85e42d812fbf6bb9cd3a20fbe920..222c3fe813fc0a8269b4b7649414b7606544cc42 100644 --- a/src/api/system/role.js +++ b/src/api/system/role.js @@ -81,3 +81,56 @@ export function exportRole(query) { responseType: 'blob' }) } + +// 查询角色已授权用户列表 +export function allocatedUserList(query) { + return request({ + url: '/system/role/authUser/allocatedList', + method: 'get', + params: query + }) +} + +// 查询角色未授权用户列表 +export function unallocatedUserList(query) { + return request({ + url: '/system/role/authUser/unallocatedList', + method: 'get', + params: query + }) +} + +// 取消用户授权角色 +export function authUserCancel(data) { + return request({ + url: '/system/role/authUser/cancel', + method: 'put', + data: data + }) +} + +// 批量取消用户授权角色 +export function authUserCancelAll(data) { + return request({ + url: '/system/role/authUser/cancelAll', + method: 'put', + params: data + }) +} + +// 授权用户选择 +export function authUserSelectAll(data) { + return request({ + url: '/system/role/authUser/selectAll', + method: 'put', + params: data + }) +} + +// 根据角色ID查询单位树结构 +export function deptTreeSelect(roleId) { + return request({ + url: '/system/role/deptTree/' + roleId, + method: 'get' + }) +} diff --git a/src/assets/images/book.jpg b/src/assets/images/book.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0bf9d44b2be221bc5e90542634dfd9c8105ddd45 Binary files /dev/null and b/src/assets/images/book.jpg differ diff --git a/src/assets/images/declare.png b/src/assets/images/declare.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba8b0abea93f54dc7b322bfbd3c4ab739fd58bf Binary files /dev/null and b/src/assets/images/declare.png differ diff --git a/src/assets/images/login-background.jpg b/src/assets/images/login-background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a89eb8291d5cb7d9f37ec4f275deab911c9e28e Binary files /dev/null and b/src/assets/images/login-background.jpg differ diff --git a/src/assets/images/login_bg.png b/src/assets/images/login_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..661659df9f198d74a7c2f378a25714debd995a51 Binary files /dev/null and b/src/assets/images/login_bg.png differ diff --git a/src/assets/logo/logo.png b/src/assets/logo/logo.png index 7e1043f21e57ead95f41354f0f1b7d1166c07ebd..aa949559de09d7795772da6b215c70ce40ea6370 100644 Binary files a/src/assets/logo/logo.png and b/src/assets/logo/logo.png differ diff --git a/src/assets/menuback.png b/src/assets/menuback.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae922d2de57fef0261ac91781171579e728009b Binary files /dev/null and b/src/assets/menuback.png differ diff --git a/src/assets/sidebar-bottom.png b/src/assets/sidebar-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..17768a701e09df151e177403430954182a84c3d4 Binary files /dev/null and b/src/assets/sidebar-bottom.png differ diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index 96095ef6b3a52fca8dbbc65e59551594da02a477..53c72f534f6d77daecd26d27bffff1d20865dadc 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -181,6 +181,14 @@ aside { } } +.el-menu-item.is-active { + background-image: url('~@/assets/menuback.png') !important; + background-size: cover !important; + background-repeat: no-repeat !important; + background-position: center !important; + color: #000000 !important; +} + //refine vue-multiselect plugin .multiselect { line-height: 16px; diff --git a/src/assets/styles/login.scss b/src/assets/styles/login.scss index ba28fc828bd17120477fb8a2f8686aaeda0756f5..cb36c0352563b33a3466279ee483910a3c023a25 100644 --- a/src/assets/styles/login.scss +++ b/src/assets/styles/login.scss @@ -14,7 +14,7 @@ $containerBgImage: '../assets/images/bg.png'; // container-logo $logoWidth: 417px; $logoHeight: 64px; -$logoImage: '../assets/logo/login-logo.png'; +//$logoImage: '../assets/logo/login-logo.png'; // container-content $contentWidth: round($W / $H * 100) * 1vw; $contentHeight: round($picH / $W * 100) / 100 * $contentWidth; @@ -65,7 +65,7 @@ $buttonHeight: $buttonH * 1px; // 元素 width: $logoWidth; height: $logoHeight; - background-image: url($logoImage); + //background-image: url($logoImage); background-size: contain; // 定位 position: absolute; diff --git a/src/assets/styles/variables.scss b/src/assets/styles/variables.scss index 34484d47efc492182bd2c29331b90d1d1810524b..72f4cb99afda7c7c67d9b2cd34a3bcb6ba2e6916 100644 --- a/src/assets/styles/variables.scss +++ b/src/assets/styles/variables.scss @@ -36,7 +36,7 @@ $base-sub-menu-background:#000c17; $base-sub-menu-hover:#001528; */ -$base-sidebar-width: 200px; +$base-sidebar-width: 240px; // the :export directive is the magic sauce for webpack // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass diff --git a/src/components/DictData/index.js b/src/components/DictData/index.js new file mode 100644 index 0000000000000000000000000000000000000000..5ce3dce57bf9adead61605f335f3857136328857 --- /dev/null +++ b/src/components/DictData/index.js @@ -0,0 +1,49 @@ +import Vue from 'vue' +import store from '@/store' +import DataDict from '@/utils/dict' +import { getDicts } from "@/api/system/dict/data"; + +function searchDictByKey(dict, key) { + if (key == null && key == "") { + return null + } + try { + for (let i = 0; i < dict.length; i++) { + if (dict[i].key == key) { + return dict[i].value + } + } + } catch (e) { + return null + } +} + +function install() { + Vue.use(DataDict, { + metas: { + '*': { + labelField: 'dictLabel', + valueField: 'dictValue', + request(dictMeta) { + const storeDict = searchDictByKey(store.getters.dict, dictMeta.type) + if (storeDict) { + return new Promise(resolve => { resolve(storeDict) }) + } else { + return new Promise((resolve, reject) => { + getDicts(dictMeta.type).then(res => { + store.dispatch('dict/setDict', { key: dictMeta.type, value: res.data }) + resolve(res.data) + }).catch(error => { + reject(error) + }) + }) + } + }, + }, + }, + }) +} + +export default { + install, +} \ No newline at end of file diff --git a/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue b/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue index 2c6d839913f636b58a27bd4950fef6266a63fc53..6f99905902dfa1616d2a4e224495d7821c3df574 100644 --- a/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue +++ b/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue @@ -288,7 +288,7 @@ export default { `; // 默认值 if (element.type === 'bpmn:StartEvent' && this.processInstance) { html = `

发起人:${this.processInstance.startUser.nickname}

-

部门:${this.processInstance.startUser.deptName}

+

单位:${this.processInstance.startUser.deptName}

创建时间:${this.parseTime(this.processInstance.createTime)}`; } else if (element.type === 'bpmn:UserTask') { // debugger @@ -297,7 +297,7 @@ export default { return; } html = `

审批人:${task.assigneeUser.nickname}

-

部门:${task.assigneeUser.deptName}

+

单位:${task.assigneeUser.deptName}

结果:${this.getDictDataLabel(this.DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT, task.result)}

创建时间:${this.parseTime(task.createTime)}

`; if (task.endTime) { diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index ae07e0c040c2adf6302e425600bc6acad41c547b..646d98c12efe350047c4132872e8cdf606bfda7d 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -16,14 +16,6 @@ - - - - - - - - diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue index 5a0cb5d855ef77d8f04736e9227a0ce0cb0e0438..1113e7efe6a87898bdd9556df984bcfa7210e748 100644 --- a/src/layout/components/Sidebar/Logo.vue +++ b/src/layout/components/Sidebar/Logo.vue @@ -14,7 +14,7 @@ + + + diff --git a/src/main.js b/src/main.js index 2e5e210154e37fdc4ab26353968146a0789ae2c1..ecdf5ec9f01907b15029d4313c2ce0b1c4fb3c79 100644 --- a/src/main.js +++ b/src/main.js @@ -25,6 +25,8 @@ import RightToolbar from "@/components/RightToolbar" // import hljs from 'highlight.js' // import 'highlight.js/styles/github-gist.css' import { DICT_TYPE, getDictDataLabel, getDictDatas, getDictDatas2 } from "@/utils/dict"; +// 字典数据组件 +import DictData from '@/components/DictData' // 全局方法挂载 Vue.prototype.getDicts = getDicts @@ -54,6 +56,8 @@ import VueMeta from 'vue-meta' Vue.use(directive) Vue.use(plugins) Vue.use(VueMeta) +DictData.install() + // Vue.use(hljs.vuePlugin); // bpmnProcessDesigner 需要引入 diff --git a/src/router/index.js b/src/router/index.js index 2dee463c5373f74a46bd0c0f6c441d8c3244fa4b..5bd6609b8f627f94ee6806737f33071c6a38fa1d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -127,115 +127,6 @@ export const constantRoutes = [ meta: {title: '修改生成配置', activeMenu: '/infra/codegen'} } ] - }, - { - path: '/bpm', - component: Layout, - hidden: true, - redirect: 'noredirect', - children: [{ - path: 'oa/leave/create', - component: (resolve) => require(['@/views/bpm/oa/leave/create'], resolve), - name: 'BpmOALeaveCreate', - meta: {title: '发起 OA 请假', icon: 'form', activeMenu: '/bpm/oa/leave'} - }, { - path: 'oa/leave/detail', - component: (resolve) => require(['@/views/bpm/oa/leave/detail'], resolve), - name: 'BpmOALeaveDetail', - meta: {title: '查看 OA 请假', icon: 'view', activeMenu: '/bpm/oa/leave'} - } - ] - }, - { - path: '/bpm', - component: Layout, - hidden: true, - children: [{ - path: 'manager/form/edit', - component: (resolve) => require(['@/views/bpm/form/formEditor'], resolve), - name: 'BpmFormEditor', - meta: {title: '流程表单-编辑', activeMenu: '/bpm/manager/form'} - }, { - path: 'manager/definition', - component: (resolve) => require(['@/views/bpm/definition/index'], resolve), - name: 'BpmProcessDefinition', - meta: {title: '流程定义', activeMenu: '/bpm/manager/model'} - }, { - path: 'manager/model/design', - component: (resolve) => require(['@/views/bpm/model/modelEditor'], resolve), - name: 'BpmModelEditor', - meta: {title: '设计流程', activeMenu: '/bpm/manager/model'} - }, { - path: 'process-instance/create', - component: (resolve) => require(['@/views/bpm/processInstance/create/index'], resolve), - name: 'BpmProcessInstanceCreate', - meta: {title: '发起流程', activeMenu: '/bpm/task/my'} - }, { - path: 'process-instance/detail', - component: (resolve) => require(['@/views/bpm/processInstance/detail'], resolve), - name: 'BpmProcessInstanceDetail', - meta: {title: '流程详情', activeMenu: '/bpm/task/my'} - } - ] - }, - { - path: '/property', - component: Layout, - hidden: true, - children: [{ - path: 'value/:propertyId(\\d+)', - component: (resolve) => require(['@/views/mall/product/property/value'], resolve), - name: 'ProductPropertyValue', - meta: {title: '商品属性值', icon: '', activeMenu: '/product/property'} - } - ] - }, - { - path: '/spu', - component: Layout, - hidden: true, - children: [{ - path: 'edit/:spuId(\\d+)', - component: (resolve) => require(['@/views/mall/product/spu/save'], resolve), - name: 'ProductSpuUpdate', - meta: {title: '修改商品', activeMenu: '/product/spu'} - }, - { - path: 'add', - component: (resolve) => require(['@/views/mall/product/spu/save'], resolve), - name: 'ProductSpuCreate', - meta: {title: '添加商品', activeMenu: '/product/spu'} - } - ] - }, - { - path: '/trade/order', - component: Layout, - hidden: true, - children: [ - { - path: 'detail', - name: 'TradeOrderDetail', - hidden: true, - meta: { title: '订单详情' }, - component: (resolve) => require(['@/views/mall/trade/order/detail'], resolve) - } - ] - }, - { - path: '/pay', - component: Layout, - hidden: true, - children: [{ - path: 'cashier', - name: 'PayCashier', - hidden: true, - meta: { - title: '收银台', - noCache: true - }, - component: (resolve) => require(['@/views/pay/cashier'], resolve) - }] } ] @@ -247,7 +138,7 @@ Router.prototype.push = function push(location) { export default new Router({ base: process.env.VUE_APP_APP_NAME ? process.env.VUE_APP_APP_NAME : "/", - mode: 'history', // 去掉url中的# + mode: 'hash', // 去掉url中的# scrollBehavior: () => ({y: 0}), routes: constantRoutes }) diff --git a/src/settings.js b/src/settings.js index 045f5eb3f43973b9072cbf476ff2a2d620364429..305cbfe8f08bb4d78bcad6db45030982b22d71e1 100644 --- a/src/settings.js +++ b/src/settings.js @@ -3,7 +3,7 @@ module.exports = { /** * 侧边栏主题 深色主题theme-dark,浅色主题theme-light */ - sideTheme: 'theme-dark', + sideTheme: 'theme-light', /** * 是否系统布局配置 diff --git a/src/utils/auth.js b/src/utils/auth.js index 60678653d80817f1066fe55436d6ff8122cf8911..79edf92974340b9e3cdbedd39d6ba310f77876f3 100644 --- a/src/utils/auth.js +++ b/src/utils/auth.js @@ -13,6 +13,10 @@ export function getRefreshToken() { return localStorage.getItem(RefreshTokenKey) } +export function getToken() { + return getAccessToken() +} + export function setToken(token) { localStorage.setItem(AccessTokenKey, token.accessToken) localStorage.setItem(RefreshTokenKey, token.refreshToken) diff --git a/src/utils/const.js b/src/utils/const.js new file mode 100644 index 0000000000000000000000000000000000000000..3a8a1a7ace6aff0cc7bdc57b0b04987349fcb95d --- /dev/null +++ b/src/utils/const.js @@ -0,0 +1,14 @@ +export const projectTypes = [ + { + name: "湖南省卫生健康高层次人才重大科研专项", + value: '1' + }, + { + name: "国家临床重点专科重大科研专项", + value: '2' + }, + { + name: "卫生健康科研课题", + value: '3' + } +] diff --git a/src/utils/constants.js b/src/utils/constants.js index 2ce6d00415c11244ee7a985c3863d3a13e0c2a00..da50ad43dd9d19e5ed27c00433106f78c148aea9 100644 --- a/src/utils/constants.js +++ b/src/utils/constants.js @@ -65,9 +65,9 @@ export const SystemRoleTypeEnum = { */ export const SystemDataScopeEnum = { ALL: 1, // 全部数据权限 - DEPT_CUSTOM: 2, // 指定部门数据权限 - DEPT_ONLY: 3, // 部门数据权限 - DEPT_AND_CHILD: 4, // 部门及以下数据权限 + DEPT_CUSTOM: 2, // 指定单位数据权限 + DEPT_ONLY: 3, // 单位数据权限 + DEPT_AND_CHILD: 4, // 单位及以下数据权限 DEPT_SELF: 5 // 仅本人数据权限 } @@ -98,23 +98,23 @@ export const InfraApiErrorLogProcessStatusEnum = { IGNORE: 2, // 已忽略 } -/** - * 用户的社交平台的类型枚举 - */ -export const SystemUserSocialTypeEnum = { - DINGTALK: { - title: "钉钉", - type: 20, - source: "dingtalk", - img: "https://s1.ax1x.com/2022/05/22/OzMDRs.png", - }, - WECHAT_ENTERPRISE: { - title: "企业微信", - type: 30, - source: "wechat_enterprise", - img: "https://s1.ax1x.com/2022/05/22/OzMrzn.png", - } -} +// /** +// * 用户的社交平台的类型枚举 +// */ +// export const SystemUserSocialTypeEnum = { +// DINGTALK: { +// title: "钉钉", +// type: 20, +// source: "dingtalk", +// img: "https://s1.ax1x.com/2022/05/22/OzMDRs.png", +// }, +// WECHAT_ENTERPRISE: { +// title: "企业微信", +// type: 30, +// source: "wechat_enterprise", +// img: "https://s1.ax1x.com/2022/05/22/OzMrzn.png", +// } +// } /** * 支付渠道枚举 diff --git a/src/utils/date.js b/src/utils/date.js new file mode 100644 index 0000000000000000000000000000000000000000..da726840d9df20e50ec402a43889102b11469f11 --- /dev/null +++ b/src/utils/date.js @@ -0,0 +1,182 @@ +/** + * 日期时间工具类 + * 提供常用的日期格式化、解析、比较等功能 + */ +const dateUtils = { + /** + * 格式化日期 + * @param {Date|String|Number} date - 日期对象、日期字符串或时间戳 + * @param {String} format - 格式化字符串,例如:'yyyy-MM-dd HH:mm:ss' + * @returns {String} 格式化后的日期字符串 + */ + format(date, format = 'yyyy-MM-dd HH:mm:ss') { + if (!date) return ''; + + // 处理不同类型的日期输入 + if (typeof date === 'string') { + date = new Date(date.replace(/-/g, '/')); // 处理iOS兼容性问题 + } else if (typeof date === 'number') { + date = new Date(date); + } + + if (!(date instanceof Date) || isNaN(date.getTime())) { + console.error('Invalid date:', date); + return ''; + } + + const o = { + 'M+': date.getMonth() + 1, // 月份 + 'd+': date.getDate(), // 日 + 'H+': date.getHours(), // 小时 + 'm+': date.getMinutes(), // 分 + 's+': date.getSeconds(), // 秒 + 'q+': Math.floor((date.getMonth() + 3) / 3), // 季度 + 'S': date.getMilliseconds() // 毫秒 + }; + + // 处理年份 + if (/(y+)/.test(format)) { + format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); + } + + // 处理其他格式 + for (const k in o) { + if (new RegExp('(' + k + ')').test(format)) { + format = format.replace( + RegExp.$1, + RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length) + ); + } + } + + return format; + }, + + /** + * 解析日期字符串为Date对象 + * @param {String} dateStr - 日期字符串 + * @param {String} format - 日期字符串的格式,例如:'yyyy-MM-dd' + * @returns {Date|null} 解析后的Date对象,解析失败返回null + */ + parse(dateStr, format = 'yyyy-MM-dd') { + if (!dateStr) return null; + + const formatMap = { + y: 'getFullYear', + M: 'getMonth', + d: 'getDate', + H: 'getHours', + m: 'getMinutes', + s: 'getSeconds' + }; + + const parts = {}; + let formatIndex = 0; + let strIndex = 0; + + while (formatIndex < format.length && strIndex < dateStr.length) { + if (format[formatIndex] === dateStr[strIndex]) { + formatIndex++; + strIndex++; + } else { + const key = format[formatIndex]; + if (!formatMap[key]) { + return null; + } + let value = ''; + while (strIndex < dateStr.length && format[formatIndex] === key) { + value += dateStr[strIndex]; + strIndex++; + formatIndex++; + } + parts[key] = parseInt(value, 10) || 0; + } + } + + // 处理月份(月份是从0开始的) + if (parts.M !== undefined) { + parts.M -= 1; + } + + const date = new Date( + parts.y || new Date().getFullYear(), + parts.M || 0, + parts.d || 1, + parts.H || 0, + parts.m || 0, + parts.s || 0 + ); + + return isNaN(date.getTime()) ? null : date; + }, + + /** + * 获取当前日期时间 + * @param {Boolean} isTimestamp - 是否返回时间戳 + * @returns {Date|Number} 当前日期对象或时间戳 + */ + now(isTimestamp = false) { + return isTimestamp ? Date.now() : new Date(); + }, + + /** + * 计算两个日期之间的差值 + * @param {Date|String|Number} date1 - 第一个日期 + * @param {Date|String|Number} date2 - 第二个日期 + * @param {String} unit - 单位:'day'|'hour'|'minute'|'second' + * @returns {Number} 差值 + */ + diff(date1, date2, unit = 'day') { + const d1 = this.parse(date1) || new Date(date1); + const d2 = this.parse(date2) || new Date(date2); + const diffMs = Math.abs(d1.getTime() - d2.getTime()); + + const units = { + day: 86400000, + hour: 3600000, + minute: 60000, + second: 1000 + }; + + return Math.floor(diffMs / (units[unit] || units.day)); + }, + + /** + * 给日期增加指定时间 + * @param {Date|String|Number} date - 基础日期 + * @param {Number} value - 增加的值 + * @param {String} unit - 单位:'day'|'hour'|'minute'|'second' + * @returns {Date} 增加后的日期 + */ + add(date, value, unit = 'day') { + const d = this.parse(date) || new Date(date); + if (!d) return null; + + const units = { + day: 86400000, + hour: 3600000, + minute: 60000, + second: 1000 + }; + + d.setTime(d.getTime() + value * (units[unit] || units.day)); + return d; + }, + + /** + * 判断日期是否为今天 + * @param {Date|String|Number} date - 要判断的日期 + * @returns {Boolean} 是否为今天 + */ + isToday(date) { + const d = this.parse(date) || new Date(date); + const today = new Date(); + return ( + d.getFullYear() === today.getFullYear() && + d.getMonth() === today.getMonth() && + d.getDate() === today.getDate() + ); + } +}; + +export default dateUtils; \ No newline at end of file diff --git a/src/utils/dict.js b/src/utils/dict.js deleted file mode 100644 index 29b05f788e62a1f4d3f3063523e1e931c0b4e984..0000000000000000000000000000000000000000 --- a/src/utils/dict.js +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Created by 芋道源码 - * - * 数据字典工具类 - */ -import store from '@/store' - -export const DICT_TYPE = { - USER_TYPE: 'user_type', - COMMON_STATUS: 'common_status', - TERMINAL: 'terminal', - - // ========== SYSTEM 模块 ========== - SYSTEM_USER_SEX: 'system_user_sex', - SYSTEM_MENU_TYPE: 'system_menu_type', - SYSTEM_ROLE_TYPE: 'system_role_type', - SYSTEM_DATA_SCOPE: 'system_data_scope', - SYSTEM_NOTICE_TYPE: 'system_notice_type', - SYSTEM_LOGIN_TYPE: 'system_login_type', - SYSTEM_LOGIN_RESULT: 'system_login_result', - SYSTEM_SMS_CHANNEL_CODE: 'system_sms_channel_code', - SYSTEM_SMS_TEMPLATE_TYPE: 'system_sms_template_type', - SYSTEM_SMS_SEND_STATUS: 'system_sms_send_status', - SYSTEM_SMS_RECEIVE_STATUS: 'system_sms_receive_status', - SYSTEM_ERROR_CODE_TYPE: 'system_error_code_type', - SYSTEM_OAUTH2_GRANT_TYPE: 'system_oauth2_grant_type', - SYSTEM_MAIL_SEND_STATUS: 'system_mail_send_status', - SYSTEM_NOTIFY_TEMPLATE_TYPE: 'system_notify_template_type', - - // ========== INFRA 模块 ========== - INFRA_BOOLEAN_STRING: 'infra_boolean_string', - INFRA_REDIS_TIMEOUT_TYPE: 'infra_redis_timeout_type', - INFRA_JOB_STATUS: 'infra_job_status', - INFRA_JOB_LOG_STATUS: 'infra_job_log_status', - INFRA_API_ERROR_LOG_PROCESS_STATUS: 'infra_api_error_log_process_status', - INFRA_CONFIG_TYPE: 'infra_config_type', - INFRA_CODEGEN_TEMPLATE_TYPE: 'infra_codegen_template_type', - INFRA_CODEGEN_FRONT_TYPE: 'infra_codegen_front_type', - INFRA_CODEGEN_SCENE: 'infra_codegen_scene', - INFRA_FILE_STORAGE: 'infra_file_storage', - INFRA_OPERATE_TYPE: 'infra_operate_type', - - // ========== BPM 模块 ========== - BPM_MODEL_CATEGORY: 'bpm_model_category', - BPM_MODEL_FORM_TYPE: 'bpm_model_form_type', - BPM_TASK_ASSIGN_RULE_TYPE: 'bpm_task_assign_rule_type', - BPM_PROCESS_INSTANCE_STATUS: 'bpm_process_instance_status', - BPM_PROCESS_INSTANCE_RESULT: 'bpm_process_instance_result', - BPM_TASK_ASSIGN_SCRIPT: 'bpm_task_assign_script', - BPM_OA_LEAVE_TYPE: 'bpm_oa_leave_type', - - // ========== PAY 模块 ========== - PAY_CHANNEL_WECHAT_VERSION: 'pay_channel_wechat_version', // 微信渠道版本 - - PAY_CHANNEL_CODE: 'pay_channel_code', // 支付渠道编码类型 - PAY_ORDER_STATUS: 'pay_order_status', // 商户支付订单状态 - PAY_REFUND_STATUS: 'pay_refund_status', // 退款订单状态 - PAY_NOTIFY_STATUS: 'pay_notify_status', // 商户支付回调状态 - PAY_NOTIFY_TYPE: 'pay_notify_type', // 商户支付回调状态 - - // ========== MP 模块 ========== - MP_AUTO_REPLY_REQUEST_MATCH: 'mp_auto_reply_request_match', // 自动回复请求匹配类型 - MP_MESSAGE_TYPE: 'mp_message_type', // 消息类型 - - // ========== MALL - PRODUCT 模块 ========== - PRODUCT_SPU_STATUS: 'product_spu_status', // 商品 SPU 状态 - - // ========== MALL - ORDER 模块 ========== - TRADE_AFTER_SALE_STATUS: 'trade_after_sale_status', // 售后 - 状态 - TRADE_AFTER_SALE_WAY: 'trade_after_sale_way', // 售后 - 方式 - TRADE_AFTER_SALE_TYPE: 'trade_after_sale_type', // 售后 - 类型 - TRADE_ORDER_TYPE: 'trade_order_type', // 订单 - 类型 - TRADE_ORDER_STATUS: 'trade_order_status', // 订单 - 状态 - TRADE_ORDER_ITEM_AFTER_SALE_STATUS: 'trade_order_item_after_sale_status', // 订单项 - 售后状态 - - // ========== MALL - PROMOTION 模块 ========== - PROMOTION_DISCOUNT_TYPE: 'promotion_discount_type', // 优惠类型 - PROMOTION_PRODUCT_SCOPE: 'promotion_product_scope', // 营销的商品范围 - PROMOTION_COUPON_TEMPLATE_VALIDITY_TYPE: 'promotion_coupon_template_validity_type', // 优惠劵模板的有限期类型 - PROMOTION_COUPON_STATUS: 'promotion_coupon_status', // 优惠劵的状态 - PROMOTION_COUPON_TAKE_TYPE: 'promotion_coupon_take_type', // 优惠劵的领取方式 - PROMOTION_ACTIVITY_STATUS: 'promotion_activity_status', // 优惠活动的状态 - PROMOTION_CONDITION_TYPE: 'promotion_condition_type', // 营销的条件类型枚举 -} - -/** - * 获取 dictType 对应的数据字典数组 - * - * @param dictType 数据类型 - * @returns {*|Array} 数据字典数组 - */ -export function getDictDatas(dictType) { - return store.getters.dict_datas[dictType] || [] -} - -/** - * 获取 dictType 对应的数据字典数组 - * - * @param dictType 数据类型 - * @param values 数组、单个元素 - * @returns {*|Array} 数据字典数组 - */ -export function getDictDatas2(dictType, values) { - if (values === undefined) { - return []; - } - // 如果是单个元素,则转换成数组 - if (!Array.isArray(values)) { - values = [this.value]; - } - // 获得字典数据 - const results = []; - for (const value of values) { - const dict = getDictData(dictType, value); - if (dict) { - results.push(dict); - } - } - return results; -} - -export function getDictData(dictType, value) { - // 获取 dictType 对应的数据字典数组 - const dictDatas = getDictDatas(dictType) - if (!dictDatas || dictDatas.length === 0) { - return '' - } - // 获取 value 对应的展示名 - value = value + '' // 强制转换成字符串,因为 DictData 小类数值,是字符串 - for (const dictData of dictDatas) { - if (dictData.value === value) { - return dictData; - } - } - return undefined -} - -export function getDictDataLabel(dictType, value) { - const dict = getDictData(dictType, value); - return dict ? dict.label : ''; -} diff --git a/src/utils/dict/Dict.js b/src/utils/dict/Dict.js new file mode 100644 index 0000000000000000000000000000000000000000..104bd6e72cdc184c6478291e485a1c8489291167 --- /dev/null +++ b/src/utils/dict/Dict.js @@ -0,0 +1,82 @@ +import Vue from 'vue' +import { mergeRecursive } from "@/utils/ruoyi"; +import DictMeta from './DictMeta' +import DictData from './DictData' + +const DEFAULT_DICT_OPTIONS = { + types: [], +} + +/** + * @classdesc 字典 + * @property {Object} label 标签对象,内部属性名为字典类型名称 + * @property {Object} dict 字段数组,内部属性名为字典类型名称 + * @property {Array.} _dictMetas 字典元数据数组 + */ +export default class Dict { + constructor() { + this.owner = null + this.label = {} + this.type = {} + } + + init(options) { + if (options instanceof Array) { + options = { types: options } + } + const opts = mergeRecursive(DEFAULT_DICT_OPTIONS, options) + if (opts.types === undefined) { + throw new Error('need dict types') + } + const ps = [] + this._dictMetas = opts.types.map(t => DictMeta.parse(t)) + this._dictMetas.forEach(dictMeta => { + const type = dictMeta.type + Vue.set(this.label, type, {}) + Vue.set(this.type, type, []) + if (dictMeta.lazy) { + return + } + ps.push(loadDict(this, dictMeta)) + }) + return Promise.all(ps) + } + + /** + * 重新加载字典 + * @param {String} type 字典类型 + */ + reloadDict(type) { + const dictMeta = this._dictMetas.find(e => e.type === type) + if (dictMeta === undefined) { + return Promise.reject(`the dict meta of ${type} was not found`) + } + return loadDict(this, dictMeta) + } +} + +/** + * 加载字典 + * @param {Dict} dict 字典 + * @param {DictMeta} dictMeta 字典元数据 + * @returns {Promise} + */ +function loadDict(dict, dictMeta) { + return dictMeta.request(dictMeta) + .then(response => { + const type = dictMeta.type + let dicts = dictMeta.responseConverter(response, dictMeta) + if (!(dicts instanceof Array)) { + console.error('the return of responseConverter must be Array.') + dicts = [] + } else if (dicts.filter(d => d instanceof DictData).length !== dicts.length) { + console.error('the type of elements in dicts must be DictData') + dicts = [] + } + dict.type[type].splice(0, Number.MAX_SAFE_INTEGER, ...dicts) + dicts.forEach(d => { + Vue.set(dict.label[type], d.value, d.label) + }) + return dicts + }) +} diff --git a/src/utils/dict/DictConverter.js b/src/utils/dict/DictConverter.js new file mode 100644 index 0000000000000000000000000000000000000000..0cf5df8636449bb8d5be54d7850aae2aab1a8520 --- /dev/null +++ b/src/utils/dict/DictConverter.js @@ -0,0 +1,17 @@ +import DictOptions from './DictOptions' +import DictData from './DictData' + +export default function(dict, dictMeta) { + const label = determineDictField(dict, dictMeta.labelField, ...DictOptions.DEFAULT_LABEL_FIELDS) + const value = determineDictField(dict, dictMeta.valueField, ...DictOptions.DEFAULT_VALUE_FIELDS) + return new DictData(dict[label], dict[value], dict) +} + +/** + * 确定字典字段 + * @param {DictData} dict + * @param {...String} fields + */ +function determineDictField(dict, ...fields) { + return fields.find(f => Object.prototype.hasOwnProperty.call(dict, f)) +} diff --git a/src/utils/dict/DictData.js b/src/utils/dict/DictData.js new file mode 100644 index 0000000000000000000000000000000000000000..afc763e8017f76226b5c281ad3b1bbdb82d3da84 --- /dev/null +++ b/src/utils/dict/DictData.js @@ -0,0 +1,13 @@ +/** + * @classdesc 字典数据 + * @property {String} label 标签 + * @property {*} value 标签 + * @property {Object} raw 原始数据 + */ +export default class DictData { + constructor(label, value, raw) { + this.label = label + this.value = value + this.raw = raw + } +} diff --git a/src/utils/dict/DictMeta.js b/src/utils/dict/DictMeta.js new file mode 100644 index 0000000000000000000000000000000000000000..9779daa43fe3b676c3c4a843ec0cff6441730f38 --- /dev/null +++ b/src/utils/dict/DictMeta.js @@ -0,0 +1,38 @@ +import { mergeRecursive } from "@/utils/ruoyi"; +import DictOptions from './DictOptions' + +/** + * @classdesc 字典元数据 + * @property {String} type 类型 + * @property {Function} request 请求 + * @property {String} label 标签字段 + * @property {String} value 值字段 + */ +export default class DictMeta { + constructor(options) { + this.type = options.type + this.request = options.request + this.responseConverter = options.responseConverter + this.labelField = options.labelField + this.valueField = options.valueField + this.lazy = options.lazy === true + } +} + + +/** + * 解析字典元数据 + * @param {Object} options + * @returns {DictMeta} + */ +DictMeta.parse= function(options) { + let opts = null + if (typeof options === 'string') { + opts = DictOptions.metas[options] || {} + opts.type = options + } else if (typeof options === 'object') { + opts = options + } + opts = mergeRecursive(DictOptions.metas['*'], opts) + return new DictMeta(opts) +} diff --git a/src/utils/dict/DictOptions.js b/src/utils/dict/DictOptions.js new file mode 100644 index 0000000000000000000000000000000000000000..338a94e1a8bcc5b4e88606a1d7153c3b8f24e039 --- /dev/null +++ b/src/utils/dict/DictOptions.js @@ -0,0 +1,51 @@ +import { mergeRecursive } from "@/utils/ruoyi"; +import dictConverter from './DictConverter' + +export const options = { + metas: { + '*': { + /** + * 字典请求,方法签名为function(dictMeta: DictMeta): Promise + */ + request: (dictMeta) => { + console.log(`load dict ${dictMeta.type}`) + return Promise.resolve([]) + }, + /** + * 字典响应数据转换器,方法签名为function(response: Object, dictMeta: DictMeta): DictData + */ + responseConverter, + labelField: 'label', + valueField: 'value', + }, + }, + /** + * 默认标签字段 + */ + DEFAULT_LABEL_FIELDS: ['label', 'name', 'title'], + /** + * 默认值字段 + */ + DEFAULT_VALUE_FIELDS: ['value', 'id', 'uid', 'key'], +} + +/** + * 映射字典 + * @param {Object} response 字典数据 + * @param {DictMeta} dictMeta 字典元数据 + * @returns {DictData} + */ +function responseConverter(response, dictMeta) { + const dicts = response.content instanceof Array ? response.content : response + if (dicts === undefined) { + console.warn(`no dict data of "${dictMeta.type}" found in the response`) + return [] + } + return dicts.map(d => dictConverter(d, dictMeta)) +} + +export function mergeOptions(src) { + mergeRecursive(options, src) +} + +export default options diff --git a/src/utils/dict/index.js b/src/utils/dict/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d95e4811eecd23a71530d8882f39296148dfd9de --- /dev/null +++ b/src/utils/dict/index.js @@ -0,0 +1,183 @@ +import Dict from "./Dict"; +import { mergeOptions } from "./DictOptions"; + +export default function (Vue, options) { + mergeOptions(options); + Vue.mixin({ + data() { + if ( + this.$options === undefined || + this.$options.dicts === undefined || + this.$options.dicts === null + ) { + return {}; + } + const dict = new Dict(); + dict.owner = this; + return { + dict, + }; + }, + created() { + if (!(this.dict instanceof Dict)) { + return; + } + options.onCreated && options.onCreated(this.dict); + this.dict.init(this.$options.dicts).then(() => { + options.onReady && options.onReady(this.dict); + this.$nextTick(() => { + this.$emit("dictReady", this.dict); + if ( + this.$options.methods && + this.$options.methods.onDictReady instanceof Function + ) { + this.$options.methods.onDictReady.call(this, this.dict); + } + }); + }); + }, + }); +} + +/** + * Created by 芋道源码 + * + * 数据字典工具类 + */ +import store from "@/store"; + +export const DICT_TYPE = { + USER_TYPE: "user_type", + COMMON_STATUS: "common_status", + TERMINAL: "terminal", + + // ========== SYSTEM 模块 ========== + SYSTEM_USER_SEX: "system_user_sex", + SYSTEM_MENU_TYPE: "system_menu_type", + SYSTEM_ROLE_TYPE: "system_role_type", + SYSTEM_DATA_SCOPE: "system_data_scope", + SYSTEM_NOTICE_TYPE: "system_notice_type", + SYSTEM_LOGIN_TYPE: "system_login_type", + SYSTEM_LOGIN_RESULT: "system_login_result", + SYSTEM_SMS_CHANNEL_CODE: "system_sms_channel_code", + SYSTEM_SMS_TEMPLATE_TYPE: "system_sms_template_type", + SYSTEM_SMS_SEND_STATUS: "system_sms_send_status", + SYSTEM_SMS_RECEIVE_STATUS: "system_sms_receive_status", + SYSTEM_ERROR_CODE_TYPE: "system_error_code_type", + SYSTEM_OAUTH2_GRANT_TYPE: "system_oauth2_grant_type", + SYSTEM_MAIL_SEND_STATUS: "system_mail_send_status", + SYSTEM_NOTIFY_TEMPLATE_TYPE: "system_notify_template_type", + + // ========== INFRA 模块 ========== + INFRA_BOOLEAN_STRING: "infra_boolean_string", + INFRA_REDIS_TIMEOUT_TYPE: "infra_redis_timeout_type", + INFRA_JOB_STATUS: "infra_job_status", + INFRA_JOB_LOG_STATUS: "infra_job_log_status", + INFRA_API_ERROR_LOG_PROCESS_STATUS: "infra_api_error_log_process_status", + INFRA_CONFIG_TYPE: "infra_config_type", + INFRA_CODEGEN_TEMPLATE_TYPE: "infra_codegen_template_type", + INFRA_CODEGEN_FRONT_TYPE: "infra_codegen_front_type", + INFRA_CODEGEN_SCENE: "infra_codegen_scene", + INFRA_FILE_STORAGE: "infra_file_storage", + INFRA_OPERATE_TYPE: "infra_operate_type", + + // ========== BPM 模块 ========== + BPM_MODEL_CATEGORY: "bpm_model_category", + BPM_MODEL_FORM_TYPE: "bpm_model_form_type", + BPM_TASK_ASSIGN_RULE_TYPE: "bpm_task_assign_rule_type", + BPM_PROCESS_INSTANCE_STATUS: "bpm_process_instance_status", + BPM_PROCESS_INSTANCE_RESULT: "bpm_process_instance_result", + BPM_TASK_ASSIGN_SCRIPT: "bpm_task_assign_script", + BPM_OA_LEAVE_TYPE: "bpm_oa_leave_type", + + // ========== PAY 模块 ========== + PAY_CHANNEL_WECHAT_VERSION: "pay_channel_wechat_version", // 微信渠道版本 + + PAY_CHANNEL_CODE: "pay_channel_code", // 支付渠道编码类型 + PAY_ORDER_STATUS: "pay_order_status", // 商户支付订单状态 + PAY_REFUND_STATUS: "pay_refund_status", // 退款订单状态 + PAY_NOTIFY_STATUS: "pay_notify_status", // 商户支付回调状态 + PAY_NOTIFY_TYPE: "pay_notify_type", // 商户支付回调状态 + + // ========== MP 模块 ========== + MP_AUTO_REPLY_REQUEST_MATCH: "mp_auto_reply_request_match", // 自动回复请求匹配类型 + MP_MESSAGE_TYPE: "mp_message_type", // 消息类型 + + // ========== MALL - PRODUCT 模块 ========== + PRODUCT_SPU_STATUS: "product_spu_status", // 商品 SPU 状态 + + // ========== MALL - ORDER 模块 ========== + TRADE_AFTER_SALE_STATUS: "trade_after_sale_status", // 售后 - 状态 + TRADE_AFTER_SALE_WAY: "trade_after_sale_way", // 售后 - 方式 + TRADE_AFTER_SALE_TYPE: "trade_after_sale_type", // 售后 - 类型 + TRADE_ORDER_TYPE: "trade_order_type", // 订单 - 类型 + TRADE_ORDER_STATUS: "trade_order_status", // 订单 - 状态 + TRADE_ORDER_ITEM_AFTER_SALE_STATUS: "trade_order_item_after_sale_status", // 订单项 - 售后状态 + + // ========== MALL - PROMOTION 模块 ========== + PROMOTION_DISCOUNT_TYPE: "promotion_discount_type", // 优惠类型 + PROMOTION_PRODUCT_SCOPE: "promotion_product_scope", // 营销的商品范围 + PROMOTION_COUPON_TEMPLATE_VALIDITY_TYPE: + "promotion_coupon_template_validity_type", // 优惠劵模板的有限期类型 + PROMOTION_COUPON_STATUS: "promotion_coupon_status", // 优惠劵的状态 + PROMOTION_COUPON_TAKE_TYPE: "promotion_coupon_take_type", // 优惠劵的领取方式 + PROMOTION_ACTIVITY_STATUS: "promotion_activity_status", // 优惠活动的状态 + PROMOTION_CONDITION_TYPE: "promotion_condition_type", // 营销的条件类型枚举 +}; + +/** + * 获取 dictType 对应的数据字典数组 + * + * @param dictType 数据类型 + * @returns {*|Array} 数据字典数组 + */ +export function getDictDatas(dictType) { + return store.getters.dict_datas[dictType] || []; +} + +/** + * 获取 dictType 对应的数据字典数组 + * + * @param dictType 数据类型 + * @param values 数组、单个元素 + * @returns {*|Array} 数据字典数组 + */ +export function getDictDatas2(dictType, values) { + if (values === undefined) { + return []; + } + // 如果是单个元素,则转换成数组 + if (!Array.isArray(values)) { + values = [this.value]; + } + // 获得字典数据 + const results = []; + for (const value of values) { + const dict = getDictData(dictType, value); + if (dict) { + results.push(dict); + } + } + return results; +} + +export function getDictData(dictType, value) { + // 获取 dictType 对应的数据字典数组 + const dictDatas = getDictDatas(dictType); + if (!dictDatas || dictDatas.length === 0) { + return ""; + } + // 获取 value 对应的展示名 + value = value + ""; // 强制转换成字符串,因为 DictData 小类数值,是字符串 + for (const dictData of dictDatas) { + if (dictData.value === value) { + return dictData; + } + } + return undefined; +} + +export function getDictDataLabel(dictType, value) { + const dict = getDictData(dictType, value); + return dict ? dict.label : ""; +} diff --git a/src/utils/file-utils.js b/src/utils/file-utils.js new file mode 100644 index 0000000000000000000000000000000000000000..2af4489674b914029bd1c98f5d9c262fcf3f3c40 --- /dev/null +++ b/src/utils/file-utils.js @@ -0,0 +1,51 @@ +// @/utils/file-utils.js + +/** + * 获取文件浏览的基础URL + * 用于构建文件预览、下载的完整路径 + * @returns {string} 文件浏览服务的基础URL + */ +export function getFileBrowseUrl() { + // 可以根据环境变量或配置文件动态获取 + // 这里使用默认的文件浏览服务路径,实际项目中应根据部署情况调整 + const baseUrl = process.env.VUE_APP_FILE_BROWSE_URL || '/FileBrowse' + + // 确保URL不以斜杠结尾,避免拼接时出现双斜杠 + return baseUrl.replace(/\/$/, '') +} + +/** + * 构建完整的文件预览URL + * @param {string} fileUrl - 文件的相对路径或完整URL + * @returns {string} 可直接用于预览的完整URL + */ +export function buildFilePreviewUrl(fileUrl) { + if (!fileUrl) return '' + + // 如果已经是完整URL,则直接返回 + if (/^https?:\/\//.test(fileUrl)) { + return fileUrl + } + + // 否则拼接基础浏览URL + const browseUrl = getFileBrowseUrl() + return `${browseUrl}?url=${encodeURIComponent(fileUrl)}` +} + +/** + * 构建文件下载URL + * @param {string} fileUrl - 文件的相对路径或完整URL + * @returns {string} 可用于下载文件的URL + */ +export function buildFileDownloadUrl(fileUrl) { + if (!fileUrl) return '' + + // 如果已经是完整URL,则直接返回 + if (/^https?:\/\//.test(fileUrl)) { + return fileUrl + } + + // 拼接下载路径,假设下载接口与预览接口类似,通过参数区分 + const browseUrl = getFileBrowseUrl() + return `${browseUrl}?url=${encodeURIComponent(fileUrl)}&download=1` +} \ No newline at end of file diff --git a/src/utils/request-ruoyi.js b/src/utils/request-ruoyi.js new file mode 100644 index 0000000000000000000000000000000000000000..7a486a2d08900aa02ae7fcc15b49b43e32565831 --- /dev/null +++ b/src/utils/request-ruoyi.js @@ -0,0 +1,256 @@ +import axios from 'axios' +import {Message, MessageBox, Notification} from 'element-ui' +import store from '@/store' +import {getAccessToken, getRefreshToken, getTenantId, setToken, getVisitTenantId} from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import {getPath, getTenantEnable} from "@/utils/ruoyi"; +import {refreshToken} from "@/api/login"; +import { ApiEncrypt } from '@/utils/encrypt' + +// 需要忽略的提示。忽略后,自动 Promise.reject('error') +const ignoreMsgs = [ + "无效的刷新令牌", // 刷新令牌被删除时,不用提示 + "刷新令牌已过期" // 使用刷新令牌,刷新获取新的访问令牌时,结果因为过期失败,此时需要忽略。否则,会导致继续 401,无法跳转到登出界面 +] + +// 是否显示重新登录 +export let isRelogin = { show: false }; +// Axios 无感知刷新令牌,参考 https://www.dashingdog.cn/article/11 与 https://segmentfault.com/a/1190000020210980 实现 +// 请求队列 +let requestList = [] +// 是否正在刷新中 +let isRefreshToken = false + +axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' +// 创建axios实例 +const service = axios.create({ + // axios中请求配置有baseURL选项,表示请求URL公共部分 + baseURL: process.env.VUE_APP_BASE_API, // 此处的 /admin-api/ 地址,原因是后端的基础路径为 /admin-api/ + // 超时 + timeout: 30000, + // 禁用 Cookie 等信息 + withCredentials: false, +}) +// request拦截器 +service.interceptors.request.use(config => { + // 是否需要设置 token + const isToken = (config.headers || {}).isToken === false + if (getAccessToken() && !isToken) { + config.headers['Authorization'] = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token 请根据实际情况自行修改 + } + // 设置租户 + if (getTenantEnable()) { + const tenantId = getTenantId(); + if (tenantId) { + config.headers['tenant-id'] = tenantId; + } + // 只有登录时,才设置 visit-tenant-id 访问租户 + const visitTenantId = getVisitTenantId() + if (config.headers.Authorization && visitTenantId) { + config.headers['visit-tenant-id'] = visitTenantId + } + } + // get请求映射params参数 + if (config.method === 'get' && config.params) { + let url = config.url + '?'; + for (const propName of Object.keys(config.params)) { + const value = config.params[propName]; + const part = encodeURIComponent(propName) + '=' + if (value !== null && typeof(value) !== "undefined") { + if (typeof value === 'object') { + for (const key of Object.keys(value)) { + let params = propName + '[' + key + ']'; + const subPart = encodeURIComponent(params) + '=' + url += subPart + encodeURIComponent(value[key]) + "&"; + } + } else { + url += part + encodeURIComponent(value) + "&"; + } + } + } + url = url.slice(0, -1); + config.params = {}; + config.url = url; + } + // 是否 API 加密 + if ((config.headers || {}).isEncrypt) { + try { + // 加密请求数据 + if (config.data) { + config.data = ApiEncrypt.encryptRequest(config.data) + // 设置加密标识头 + config.headers[ApiEncrypt.getEncryptHeader()] = 'true' + } + } catch (error) { + console.error('请求数据加密失败:', error) + throw error + } + } + return config +}, error => { + console.log(error) + Promise.reject(error) +}) + +// 响应拦截器 +service.interceptors.response.use(async res => { + let { data } = res + // 未设置状态码则默认成功状态 + // 二进制数据则直接返回,例如说 Excel 导出 + if ( + res.request.responseType === 'blob' || + res.request.responseType === 'arraybuffer' + ) { + // 注意:如果导出的响应为 json,说明可能失败了,不直接返回进行下载 + if (res.data.type !== 'application/json') { + return res.data + } + data = await new Response(res.data).json() + } + + // 检查是否需要解密响应数据 + const encryptHeader = ApiEncrypt.getEncryptHeader() + const isEncryptResponse = + res.headers[encryptHeader] === 'true' || + res.headers[encryptHeader.toLowerCase()] === 'true' + if (isEncryptResponse && typeof data === 'string') { + try { + // 解密响应数据 + data = ApiEncrypt.decryptResponse(data) + res.data = data; + } catch (error) { + console.error('响应数据解密失败:', error) + throw new Error('响应数据解密失败: ' + error.message) + } + } + + const code = data.code || 200; + // 获取错误信息 + const msg = data.msg || errorCode[code] || errorCode['default'] + + if (ignoreMsgs.indexOf(msg) !== -1) { // 如果是忽略的错误码,直接返回 msg 异常 + return Promise.reject(msg) + } else if (code === 401) { + // 如果未认证,并且未进行刷新令牌,说明可能是访问令牌过期了 + if (!isRefreshToken) { + isRefreshToken = true; + // 1. 如果获取不到刷新令牌,则只能执行登出操作 + if (!getRefreshToken()) { + return handleAuthorized(); + } + // 2. 进行刷新访问令牌 + try { + const refreshTokenRes = await refreshToken() + // 2.1 刷新成功,则回放队列的请求 + 当前请求 + setToken(refreshTokenRes.data) + requestList.forEach(cb => cb()) + return service(res.config) + } catch (e) {// 为什么需要 catch 异常呢?刷新失败时,请求因为 Promise.reject 触发异常。 + // 2.2 刷新失败,只回放队列的请求 + requestList.forEach(cb => cb()) + // 提示是否要登出。即不回放当前请求!不然会形成递归 + return handleAuthorized(); + } finally { + requestList = [] + isRefreshToken = false + } + } else { + // 添加到队列,等待刷新获取到新的令牌 + return new Promise(resolve => { + requestList.push(() => { + res.config.headers['Authorization'] = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token 请根据实际情况自行修改 + resolve(service(res.config)) + }) + }) + } + } else if (code === 500) { + Message({ + message: msg, + type: 'error' + }) + return Promise.reject(new Error(msg)) + } else if (code === 501) { + Message({ + type: 'error', + duration: 0, + message: msg + }) + return Promise.reject(new Error(msg)) + } else if (code === 901) { + Message({ + type: 'error', + duration: 0, + dangerouslyUseHTMLString: true, + message: '
演示模式,无法进行写操作
' + + '
 
' + + '
参考 https://doc.iocoder.cn/ 教程
' + + '
 
' + + '
5 分钟搭建本地环境
', + }) + return Promise.reject(new Error(msg)) + } else if (code !== 200) { + if (msg === '无效的刷新令牌') { // hard coding:忽略这个提示,直接登出 + console.log(msg) + } else { + Notification.error({ + title: msg + }) + } + return Promise.reject('error') + } else { + return res.data + } +}, error => { + console.log('err' + error) + let {message} = error; + if (message === "Network Error") { + message = "后端接口连接异常"; + } else if (message.includes("timeout")) { + message = "系统接口请求超时"; + } else if (message.includes("Request failed with status code")) { + message = "系统接口" + message.substr(message.length - 3) + "异常"; + } + Message({ + message: message, + type: 'error', + duration: 5 * 1000 + }) + return Promise.reject(error) + } +) + +export function getBaseHeader() { + const headers = { + 'Authorization': "Bearer " + getAccessToken(), + 'tenant-id': getTenantId(), + } + // 如果已登录且存在访问租户ID,添加 visit-tenant-id 请求头 + const visitTenantId = getVisitTenantId() + if (getAccessToken() && visitTenantId) { + headers['visit-tenant-id'] = visitTenantId + } + + return headers +} + +function handleAuthorized() { + if (!isRelogin.show) { + isRelogin.show = true; + MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { + confirmButtonText: '重新登录', + cancelButtonText: '取消', + type: 'warning' + } + ).then(() => { + isRelogin.show = false; + store.dispatch('LogOut').then(() => { + location.href = getPath('/index'); + }) + }).catch(() => { + isRelogin.show = false; + }); + } + return Promise.reject('无效的会话,或者会话已过期,请重新登录。') +} + +export default service diff --git a/src/utils/ruoyi.js b/src/utils/ruoyi.js index fd5d1095072f15f0910d99ca06d6ac2853511d8c..1894638640ab9eb2de3c50dea9215d8593d30c6a 100644 --- a/src/utils/ruoyi.js +++ b/src/utils/ruoyi.js @@ -251,3 +251,19 @@ export function getPath(path) { } return Math.floor(divisor/dividend*100)/100; } + +// 数据合并 +export function mergeRecursive(source, target) { + for (var p in target) { + try { + if (target[p].constructor == Object) { + source[p] = mergeRecursive(source[p], target[p]); + } else { + source[p] = target[p]; + } + } catch (e) { + source[p] = target[p]; + } + } + return source; +}; \ No newline at end of file diff --git a/src/utils/validate.js b/src/utils/validate.js index 60f9cb1f36ae082e1d6d416ba725a2770b6d42f9..61423602e6c4cf795c3a2b1dd3a7336ed111b083 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -79,3 +79,30 @@ export function isArray(arg) { } return Array.isArray(arg) } + +/** + * 身份证验证 + * @param idCard 身份证号码 + */ +export function validateIDCard(idCard) { + const reg = /(^([1-9]\d{7}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}|[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx])$)/; + return reg.test(idCard); +} + +/** + * 邮箱验证 + * @param email 邮箱地址 + */ +export function validateEmail(email) { + const reg = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return reg.test(email); +} + +/** + * 手机号验证 + * @param phoneNumber 手机号 + */ +export function validateChinesePhoneNumber(phoneNumber) { + const pattern = /^1[3-9]\d{9}$/; + return pattern.test(phoneNumber); +} diff --git a/src/utils/zhichen.js b/src/utils/zhichen.js new file mode 100644 index 0000000000000000000000000000000000000000..70cc429c25de6c76791f0d708ed07a02cd69c6ab --- /dev/null +++ b/src/utils/zhichen.js @@ -0,0 +1,84 @@ +export const options1 = [ + { + value: 1005, + label: '正高级', + children: [ + { value: 22, label: '主任医师' }, + { value: 23, label: '主任护师' }, + { value: 24, label: '主任药师' }, + { value: 25, label: '主任技师' }, + { value: 26, label: '研究员' }, + { value: 27, label: '教授' }, + { value: 28, label: '高级政工师(正高级)' }, + { value: 35, label: '正高级实验师' } + ] + }, + { + value: 1004, + label: '副高级', + children: [ + { value: 15, label: '副主任医师' }, + { value: 16, label: '副主任护师' }, + { value: 17, label: '副主任药师' }, + { value: 18, label: '副主任技师' }, + { value: 19, label: '副研究员' }, + { value: 20, label: '副教授' }, + { value: 21, label: '高级政工师(副高级)' }, + { value: 34, label: '高级实验师' } + ] + }, + { + value: 1003, + label: '中级', + children: [ + { value: 8, label: '主治医师' }, + { value: 9, label: '主管护师' }, + { value: 10, label: '主管药师' }, + { value: 11, label: '主管技师' }, + { value: 12, label: '助理研究员' }, + { value: 13, label: '讲师' }, + { value: 14, label: '政工师' }, + { value: 33, label: '实验师' } + ] + }, + { + value: 1002, + label: '初级', + children: [ + { value: 1, label: '住院医师' }, + { value: 2, label: '护士/护师' }, + { value: 3, label: '药士/药师' }, + { value: 4, label: '技士/技师' }, + { value: 5, label: '研究实习员' }, + { value: 6, label: '助教' }, + { value: 7, label: '助理政工师' }, + { value: 32, label: '助理实验师' } + ] + }, + { + value: 1001, + label: '其他', + children: [ + { value: 29, label: '博士后' }, + { value: 30, label: '博士生' }, + { value: 31, label: '硕士生' }, + { value: 36, label: '本科生' }, + { value: 37, label: '未取得' } + ] + } +]; +export function findPathByValue(options, targetValue) { + const targetStr = String(targetValue); // 统一成字符串比较 + for (const option of options) { + if (String(option.value) === targetStr) { + return [option.value]; // 保留原来的类型 + } + if (option.children) { + const childPath = findPathByValue(option.children, targetValue); + if (childPath.length) { + return [option.value, ...childPath]; + } + } + } + return []; +} diff --git a/src/views/ai/chat/index/index.vue b/src/views/ai/chat/index/index.vue deleted file mode 100644 index 82ae7be5ae21bc3e4cdc8cabb9adb44fca342001..0000000000000000000000000000000000000000 --- a/src/views/ai/chat/index/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/ai/chat/manager/index.vue b/src/views/ai/chat/manager/index.vue deleted file mode 100644 index f04d57d330e72436f7cd43aee210eef429f4f9d3..0000000000000000000000000000000000000000 --- a/src/views/ai/chat/manager/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/ai/image/index/index.vue b/src/views/ai/image/index/index.vue deleted file mode 100644 index 5f70f6db32a6c013f3ca2ae83848f3668cd078e5..0000000000000000000000000000000000000000 --- a/src/views/ai/image/index/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/ai/image/manager/index.vue b/src/views/ai/image/manager/index.vue deleted file mode 100644 index 0acb5150ae34afd34beeae05779fc7da4c84baeb..0000000000000000000000000000000000000000 --- a/src/views/ai/image/manager/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/ai/image/square/index.vue b/src/views/ai/image/square/index.vue deleted file mode 100644 index 2149b7d3f889bb23b9a2d545fdf93df932eac1da..0000000000000000000000000000000000000000 --- a/src/views/ai/image/square/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/ai/model/apiKey/index.vue b/src/views/ai/model/apiKey/index.vue deleted file mode 100644 index af023ec741acecee4e9b03266115e7871cf7ad5e..0000000000000000000000000000000000000000 --- a/src/views/ai/model/apiKey/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/ai/model/chatModel/index.vue b/src/views/ai/model/chatModel/index.vue deleted file mode 100644 index 48d5a5dc9561907e0943e14090334ae89bf8e8d1..0000000000000000000000000000000000000000 --- a/src/views/ai/model/chatModel/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/ai/model/chatRole/index.vue b/src/views/ai/model/chatRole/index.vue deleted file mode 100644 index 8713b9c3ebb7e228412e0e7eaede37a25d6ed694..0000000000000000000000000000000000000000 --- a/src/views/ai/model/chatRole/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/ai/music/index/index.vue b/src/views/ai/music/index/index.vue deleted file mode 100644 index 3e27c43f424586378084f3b3da7a023459bd6821..0000000000000000000000000000000000000000 --- a/src/views/ai/music/index/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/ai/music/manager/index.vue b/src/views/ai/music/manager/index.vue deleted file mode 100644 index eb58ff06f48475fd4979efbf727ea64f365831c4..0000000000000000000000000000000000000000 --- a/src/views/ai/music/manager/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/ai/write/index/index.vue b/src/views/ai/write/index/index.vue deleted file mode 100644 index d54bf7d0d399a5ae8df4bca52e38accba92f82f4..0000000000000000000000000000000000000000 --- a/src/views/ai/write/index/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/ai/write/manager/index.vue b/src/views/ai/write/manager/index.vue deleted file mode 100644 index 366efe3d51356a96a1cccc50964cbe4d56b5b19b..0000000000000000000000000000000000000000 --- a/src/views/ai/write/manager/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/bpm/category/index.vue b/src/views/bpm/category/index.vue deleted file mode 100644 index 467c7f7fdde5837a12a3362b0f2e09c736343931..0000000000000000000000000000000000000000 --- a/src/views/bpm/category/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/bpm/definition/index.vue b/src/views/bpm/definition/index.vue deleted file mode 100644 index dc992545fb3d7c19d57896374389476336d91134..0000000000000000000000000000000000000000 --- a/src/views/bpm/definition/index.vue +++ /dev/null @@ -1,174 +0,0 @@ - - - - - diff --git a/src/views/bpm/form/formEditor.vue b/src/views/bpm/form/formEditor.vue deleted file mode 100644 index c387ca3d2588d5ffde3c01f0be67374e11b44d75..0000000000000000000000000000000000000000 --- a/src/views/bpm/form/formEditor.vue +++ /dev/null @@ -1,567 +0,0 @@ - - - - - diff --git a/src/views/bpm/form/index.vue b/src/views/bpm/form/index.vue deleted file mode 100644 index 546c5211431a2ab3af4cf3d9276da4872fe0e584..0000000000000000000000000000000000000000 --- a/src/views/bpm/form/index.vue +++ /dev/null @@ -1,161 +0,0 @@ - - - diff --git a/src/views/bpm/group/index.vue b/src/views/bpm/group/index.vue deleted file mode 100644 index 6c23a947f8f22695d0defe3976359e2af1739876..0000000000000000000000000000000000000000 --- a/src/views/bpm/group/index.vue +++ /dev/null @@ -1,246 +0,0 @@ - - - diff --git a/src/views/bpm/model/index.vue b/src/views/bpm/model/index.vue deleted file mode 100644 index c9192411485321fed2b06ec126a4191f6b24c48c..0000000000000000000000000000000000000000 --- a/src/views/bpm/model/index.vue +++ /dev/null @@ -1,554 +0,0 @@ - - - - - diff --git a/src/views/bpm/model/modelEditor.vue b/src/views/bpm/model/modelEditor.vue deleted file mode 100644 index 78e78d317f2c5adc819732a80bd8648600e8f9d0..0000000000000000000000000000000000000000 --- a/src/views/bpm/model/modelEditor.vue +++ /dev/null @@ -1,170 +0,0 @@ - - - - - diff --git a/src/views/bpm/oa/leave/create.vue b/src/views/bpm/oa/leave/create.vue deleted file mode 100644 index 3ac54173c1368c24504baab89f5cf244e59dbf33..0000000000000000000000000000000000000000 --- a/src/views/bpm/oa/leave/create.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - diff --git a/src/views/bpm/oa/leave/detail.vue b/src/views/bpm/oa/leave/detail.vue deleted file mode 100644 index 00890a5c2c712a61557433e2be19cb8dbc7f32c4..0000000000000000000000000000000000000000 --- a/src/views/bpm/oa/leave/detail.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - diff --git a/src/views/bpm/oa/leave/index.vue b/src/views/bpm/oa/leave/index.vue deleted file mode 100644 index 49d5d21f00e0ae8cc6fb0a3a6754ba0e614efe6a..0000000000000000000000000000000000000000 --- a/src/views/bpm/oa/leave/index.vue +++ /dev/null @@ -1,173 +0,0 @@ - - - diff --git a/src/views/bpm/processExpression/index.vue b/src/views/bpm/processExpression/index.vue deleted file mode 100644 index 6cb41df30c0b8534bb852ed435115412019e666e..0000000000000000000000000000000000000000 --- a/src/views/bpm/processExpression/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/bpm/processInstance/create/index.vue b/src/views/bpm/processInstance/create/index.vue deleted file mode 100644 index a632cb51eba78a96aea8995435fd897c4ce7bcc1..0000000000000000000000000000000000000000 --- a/src/views/bpm/processInstance/create/index.vue +++ /dev/null @@ -1,170 +0,0 @@ - - - - - diff --git a/src/views/bpm/processInstance/detail.vue b/src/views/bpm/processInstance/detail.vue deleted file mode 100644 index aad82e0d953237e14618ed26724ccc892bd777de..0000000000000000000000000000000000000000 --- a/src/views/bpm/processInstance/detail.vue +++ /dev/null @@ -1,536 +0,0 @@ - - - - - diff --git a/src/views/bpm/processInstance/index.vue b/src/views/bpm/processInstance/index.vue deleted file mode 100644 index e3b82060a77a34dae312cb86b711d5082224babe..0000000000000000000000000000000000000000 --- a/src/views/bpm/processInstance/index.vue +++ /dev/null @@ -1,185 +0,0 @@ - - - diff --git a/src/views/bpm/processInstance/manager/index.vue b/src/views/bpm/processInstance/manager/index.vue deleted file mode 100644 index d4ae287e9fe4240abf6c0c797cb0e22f4fefed0b..0000000000000000000000000000000000000000 --- a/src/views/bpm/processInstance/manager/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/bpm/processListener/index.vue b/src/views/bpm/processListener/index.vue deleted file mode 100644 index 44a0b9bf39047cdfdc2c6e5933b4520ec35466bb..0000000000000000000000000000000000000000 --- a/src/views/bpm/processListener/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/bpm/task/copy/index.vue b/src/views/bpm/task/copy/index.vue deleted file mode 100644 index 1175821c4a5a11d43e663c6694f6a8085a9afdb5..0000000000000000000000000000000000000000 --- a/src/views/bpm/task/copy/index.vue +++ /dev/null @@ -1,18 +0,0 @@ - - diff --git a/src/views/bpm/task/done/index.vue b/src/views/bpm/task/done/index.vue deleted file mode 100644 index 9d522bec5684d3a809845392e09ee01c8d4b721a..0000000000000000000000000000000000000000 --- a/src/views/bpm/task/done/index.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - diff --git a/src/views/bpm/task/manager/index.vue b/src/views/bpm/task/manager/index.vue deleted file mode 100644 index 895dc94d447cd6c5e6512657ea155472cac2c220..0000000000000000000000000000000000000000 --- a/src/views/bpm/task/manager/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/bpm/task/todo/index.vue b/src/views/bpm/task/todo/index.vue deleted file mode 100644 index a14dc5644f8b824c2695a7017018d5560ff51c4e..0000000000000000000000000000000000000000 --- a/src/views/bpm/task/todo/index.vue +++ /dev/null @@ -1,107 +0,0 @@ - - - diff --git a/src/views/bpm/taskAssignRule/taskAssignRuleDialog.vue b/src/views/bpm/taskAssignRule/taskAssignRuleDialog.vue deleted file mode 100644 index ec503b40eed5a284e710579c2e5f17fa05a6fb5c..0000000000000000000000000000000000000000 --- a/src/views/bpm/taskAssignRule/taskAssignRuleDialog.vue +++ /dev/null @@ -1,337 +0,0 @@ - - - diff --git a/src/views/crm/backlog/index.vue b/src/views/crm/backlog/index.vue deleted file mode 100644 index 8a2b6f51b33ecc88682c5b0f870809cd404fc939..0000000000000000000000000000000000000000 --- a/src/views/crm/backlog/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/crm/business/index.vue b/src/views/crm/business/index.vue deleted file mode 100644 index fd312c3ce54932b74bc975796be82350975bf5f6..0000000000000000000000000000000000000000 --- a/src/views/crm/business/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/business/status/index.vue b/src/views/crm/business/status/index.vue deleted file mode 100644 index 6e0ebcead28e5dd052e910e434bbd1955db9dcaf..0000000000000000000000000000000000000000 --- a/src/views/crm/business/status/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/clue/index.vue b/src/views/crm/clue/index.vue deleted file mode 100644 index 52b4a9db61e7e7c110cfb0f53f3c54bd7c97f14d..0000000000000000000000000000000000000000 --- a/src/views/crm/clue/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/contact/index.vue b/src/views/crm/contact/index.vue deleted file mode 100644 index ee21867c018937425549d10cd8f42730fd1cbc9d..0000000000000000000000000000000000000000 --- a/src/views/crm/contact/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/contract/config/index.vue b/src/views/crm/contract/config/index.vue deleted file mode 100644 index 13cb40de89ae965b080f276a12f5787242c97751..0000000000000000000000000000000000000000 --- a/src/views/crm/contract/config/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/contract/index.vue b/src/views/crm/contract/index.vue deleted file mode 100644 index 07cb8cbd12cc1a82bf2951e6f1d219cf69fa2615..0000000000000000000000000000000000000000 --- a/src/views/crm/contract/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/customer/index.vue b/src/views/crm/customer/index.vue deleted file mode 100644 index d1741fbfe37f62bf805a6ccce94362fdc91ba17c..0000000000000000000000000000000000000000 --- a/src/views/crm/customer/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/customer/limitConfig/index.vue b/src/views/crm/customer/limitConfig/index.vue deleted file mode 100644 index 8e5c77ee8e7f0eea3886ebe72df75929035456da..0000000000000000000000000000000000000000 --- a/src/views/crm/customer/limitConfig/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/customer/pool/index.vue b/src/views/crm/customer/pool/index.vue deleted file mode 100644 index 0657a09274e56b78410f5fcbfa7c40c9e6345703..0000000000000000000000000000000000000000 --- a/src/views/crm/customer/pool/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/customer/poolConfig/index.vue b/src/views/crm/customer/poolConfig/index.vue deleted file mode 100644 index 324d33bf3cc8b253457ded2c28d87be0e0910c0d..0000000000000000000000000000000000000000 --- a/src/views/crm/customer/poolConfig/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/product/category/index.vue b/src/views/crm/product/category/index.vue deleted file mode 100644 index d893449b4f7247d012d81a1b33c3f340fe865fcd..0000000000000000000000000000000000000000 --- a/src/views/crm/product/category/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/crm/product/index.vue b/src/views/crm/product/index.vue deleted file mode 100644 index 86143a6be2f33b6a3876b6cd81f246895662ff87..0000000000000000000000000000000000000000 --- a/src/views/crm/product/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/crm/receivable/index.vue b/src/views/crm/receivable/index.vue deleted file mode 100644 index f4e6e5aa2c9f60c06fc204cd87300e487d5f2639..0000000000000000000000000000000000000000 --- a/src/views/crm/receivable/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/receivable/plan/index.vue b/src/views/crm/receivable/plan/index.vue deleted file mode 100644 index 4b2d3f0a5ed54da7811cfe451ef1c62326a5a8dd..0000000000000000000000000000000000000000 --- a/src/views/crm/receivable/plan/index.vue +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/src/views/crm/statistics/rank/index.vue b/src/views/crm/statistics/rank/index.vue deleted file mode 100644 index 9de19eca1e018f3ea1d454c1319b12b40bea700c..0000000000000000000000000000000000000000 --- a/src/views/crm/statistics/rank/index.vue +++ /dev/null @@ -1,13 +0,0 @@ - - diff --git a/src/views/erp/finance/account/index.vue b/src/views/erp/finance/account/index.vue deleted file mode 100644 index 218eb7f80f15c7d83d18065f0aba06fb082c3052..0000000000000000000000000000000000000000 --- a/src/views/erp/finance/account/index.vue +++ /dev/null @@ -1,18 +0,0 @@ - - diff --git a/src/views/erp/finance/payment/index.vue b/src/views/erp/finance/payment/index.vue deleted file mode 100644 index 880eec56c2e684b217216fb974945da493b8bad0..0000000000000000000000000000000000000000 --- a/src/views/erp/finance/payment/index.vue +++ /dev/null @@ -1,18 +0,0 @@ - - diff --git a/src/views/erp/finance/receipt/index.vue b/src/views/erp/finance/receipt/index.vue deleted file mode 100644 index c04b6dd235226ac8d91d212064385b81a062498e..0000000000000000000000000000000000000000 --- a/src/views/erp/finance/receipt/index.vue +++ /dev/null @@ -1,18 +0,0 @@ - - diff --git a/src/views/erp/home/index.vue b/src/views/erp/home/index.vue deleted file mode 100644 index 2b462df86d6af9841a1b21e33d2571b004d1a79a..0000000000000000000000000000000000000000 --- a/src/views/erp/home/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/product/category/index.vue b/src/views/erp/product/category/index.vue deleted file mode 100644 index 5397e654f4d322250a68e9c97f5eb297e21b38e0..0000000000000000000000000000000000000000 --- a/src/views/erp/product/category/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/product/product/index.vue b/src/views/erp/product/product/index.vue deleted file mode 100644 index bc77771ba0925388b9109414102b0debe877a293..0000000000000000000000000000000000000000 --- a/src/views/erp/product/product/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/product/unit/index.vue b/src/views/erp/product/unit/index.vue deleted file mode 100644 index a387cf9563fcac49eaabdef4486b60929f3d1195..0000000000000000000000000000000000000000 --- a/src/views/erp/product/unit/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/purchase/in/index.vue b/src/views/erp/purchase/in/index.vue deleted file mode 100644 index 236a1f362ac2d46e441e392a5b60a00c1e681ae4..0000000000000000000000000000000000000000 --- a/src/views/erp/purchase/in/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/purchase/order/index.vue b/src/views/erp/purchase/order/index.vue deleted file mode 100644 index fc200c224eee492aeac234681fef5337b4b55b21..0000000000000000000000000000000000000000 --- a/src/views/erp/purchase/order/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/purchase/return/index.vue b/src/views/erp/purchase/return/index.vue deleted file mode 100644 index 28f6f8864964d1617f4d7a35d3c2216ccf87aabc..0000000000000000000000000000000000000000 --- a/src/views/erp/purchase/return/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/purchase/supplier/index.vue b/src/views/erp/purchase/supplier/index.vue deleted file mode 100644 index 98869d6a1c5983f3a01d02fdd5700446321d5fef..0000000000000000000000000000000000000000 --- a/src/views/erp/purchase/supplier/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/sale/customer/index.vue b/src/views/erp/sale/customer/index.vue deleted file mode 100644 index 7a10ffc561e77289a5f6e33de6ecae33694c3147..0000000000000000000000000000000000000000 --- a/src/views/erp/sale/customer/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/sale/order/index.vue b/src/views/erp/sale/order/index.vue deleted file mode 100644 index 6fc4b173be3df68312438d72cd57e433b4b5c5ec..0000000000000000000000000000000000000000 --- a/src/views/erp/sale/order/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/sale/out/index.vue b/src/views/erp/sale/out/index.vue deleted file mode 100644 index 846d3b42eefe87afd135c9f9cd4e3129afa9938a..0000000000000000000000000000000000000000 --- a/src/views/erp/sale/out/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/sale/return/index.vue b/src/views/erp/sale/return/index.vue deleted file mode 100644 index e33ce15d0fe28cb83c30e35b645b9e42ac6a7d50..0000000000000000000000000000000000000000 --- a/src/views/erp/sale/return/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/stock/check/index.vue b/src/views/erp/stock/check/index.vue deleted file mode 100644 index 80655b0775bd587db184cbe7b436e4159b3da973..0000000000000000000000000000000000000000 --- a/src/views/erp/stock/check/index.vue +++ /dev/null @@ -1,18 +0,0 @@ - - diff --git a/src/views/erp/stock/in/index.vue b/src/views/erp/stock/in/index.vue deleted file mode 100644 index df4945c23f99b3f8968db2d1ed48649ba9b39f03..0000000000000000000000000000000000000000 --- a/src/views/erp/stock/in/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/stock/move/index.vue b/src/views/erp/stock/move/index.vue deleted file mode 100644 index 055f39d089541d1289021978054de17510afe13d..0000000000000000000000000000000000000000 --- a/src/views/erp/stock/move/index.vue +++ /dev/null @@ -1,18 +0,0 @@ - - diff --git a/src/views/erp/stock/out/index.vue b/src/views/erp/stock/out/index.vue deleted file mode 100644 index 9ca3e55dd50d36ab1a8d692698126179dc2578c0..0000000000000000000000000000000000000000 --- a/src/views/erp/stock/out/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/stock/record/index.vue b/src/views/erp/stock/record/index.vue deleted file mode 100644 index 87decad741cdde002a231e2479bcca54cb5895bf..0000000000000000000000000000000000000000 --- a/src/views/erp/stock/record/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/stock/stock/index.vue b/src/views/erp/stock/stock/index.vue deleted file mode 100644 index bf811b69a5385a9846ac6622e905ea5c67e7f168..0000000000000000000000000000000000000000 --- a/src/views/erp/stock/stock/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/erp/stock/warehouse/index.vue b/src/views/erp/stock/warehouse/index.vue deleted file mode 100644 index 6797bba0670ff6302bb32fcfa8429bc1173d25a5..0000000000000000000000000000000000000000 --- a/src/views/erp/stock/warehouse/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/src/views/index.vue b/src/views/index.vue index d2d2ec6338745de5d954e54103264e9844f1e842..b6ee7059df912aaa3a5f6359a358a70accceb6ff 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -1,98 +1,1141 @@ - diff --git a/src/views/infra/apiAccessLog/index.vue b/src/views/infra/apiAccessLog/index.vue index 528c060393536a9c94518c323e067a1d3900e3cc..95cd74f2437978e600e249ecda4870d36644286c 100644 --- a/src/views/infra/apiAccessLog/index.vue +++ b/src/views/infra/apiAccessLog/index.vue @@ -1,6 +1,5 @@