From d0520e7872f6734683ece19e86355d3603183129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= Date: Mon, 13 Oct 2025 17:51:27 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=AD=E5=BF=83=E5=92=8C?= =?UTF-8?q?=E9=87=87=E8=B4=AD=E8=AE=A1=E5=88=92=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/oa/finance/exchangeRate.js | 10 + api/oa/finance/finance.js | 194 +++ api/oa/post.js | 44 + api/oa/role.js | 127 ++ api/oa/workflow/category.js | 53 + api/oa/workflow/deploy.js | 51 + api/oa/workflow/finished.js | 10 + api/oa/workflow/form.js | 52 + api/oa/workflow/instance.js | 10 + api/oa/workflow/model.js | 84 ++ api/oa/workflow/process.js | 132 ++ api/oa/workflow/task.js | 71 + components/MyAvatar/index.vue | 3 - components/oa/oa-schema-form/index.vue | 91 ++ pages.json | 64 + pages/workbench/cost/components/Bar.vue | 48 + pages/workbench/cost/components/Line.vue | 102 ++ pages/workbench/cost/components/Pie.vue | 59 + .../cost/components/RecentRecords.vue | 179 +++ .../cost/components/SummaryCards.vue | 106 ++ pages/workbench/cost/cost.vue | 289 ++++ pages/workbench/index/index.vue | 30 + pages/workbench/process/process.vue | 22 + pages/workbench/user/user.vue | 664 +++++++++ pages/workbench/wms/out.vue | 14 +- pages/workbench/wms/purchase.vue | 1214 +++++++++-------- pages/workbench/workflow/apply/apply.vue | 563 ++++++++ pages/workbench/workflow/detail/detail.vue | 22 + .../workbench/workflow/finished/finished.vue | 22 + pages/workbench/workflow/start/start.vue | 33 + pages/workbench/workflow/todo/todo.vue | 22 + static/images/apply.png | Bin 0 -> 3093 bytes static/images/cost.png | Bin 0 -> 3842 bytes static/images/finished.png | Bin 0 -> 5781 bytes static/images/todo.png | Bin 0 -> 5616 bytes static/images/user.png | Bin 0 -> 8057 bytes store/modules/conversation.js | 2 +- uni_modules/uni-data-select/changelog.md | 8 + .../uni-data-select/uni-data-select.vue | 415 +++++- uni_modules/uni-data-select/package.json | 102 +- uni_modules/uni-fab/changelog.md | 25 + .../uni-fab/components/uni-fab/uni-fab.vue | 491 +++++++ uni_modules/uni-fab/package.json | 85 ++ uni_modules/uni-fab/readme.md | 9 + uni_modules/uni-icons/changelog.md | 2 + .../components/uni-icons/uni-icons.uvue | 10 +- uni_modules/uni-icons/package.json | 4 +- version.md | 8 +- 48 files changed, 4833 insertions(+), 713 deletions(-) create mode 100644 api/oa/finance/exchangeRate.js create mode 100644 api/oa/finance/finance.js create mode 100644 api/oa/post.js create mode 100644 api/oa/role.js create mode 100644 api/oa/workflow/category.js create mode 100644 api/oa/workflow/deploy.js create mode 100644 api/oa/workflow/finished.js create mode 100644 api/oa/workflow/form.js create mode 100644 api/oa/workflow/instance.js create mode 100644 api/oa/workflow/model.js create mode 100644 api/oa/workflow/process.js create mode 100644 api/oa/workflow/task.js create mode 100644 components/oa/oa-schema-form/index.vue create mode 100644 pages/workbench/cost/components/Bar.vue create mode 100644 pages/workbench/cost/components/Line.vue create mode 100644 pages/workbench/cost/components/Pie.vue create mode 100644 pages/workbench/cost/components/RecentRecords.vue create mode 100644 pages/workbench/cost/components/SummaryCards.vue create mode 100644 pages/workbench/cost/cost.vue create mode 100644 pages/workbench/process/process.vue create mode 100644 pages/workbench/user/user.vue create mode 100644 pages/workbench/workflow/apply/apply.vue create mode 100644 pages/workbench/workflow/detail/detail.vue create mode 100644 pages/workbench/workflow/finished/finished.vue create mode 100644 pages/workbench/workflow/start/start.vue create mode 100644 pages/workbench/workflow/todo/todo.vue create mode 100644 static/images/apply.png create mode 100644 static/images/cost.png create mode 100644 static/images/finished.png create mode 100644 static/images/todo.png create mode 100644 static/images/user.png create mode 100644 uni_modules/uni-fab/changelog.md create mode 100644 uni_modules/uni-fab/components/uni-fab/uni-fab.vue create mode 100644 uni_modules/uni-fab/package.json create mode 100644 uni_modules/uni-fab/readme.md diff --git a/api/oa/finance/exchangeRate.js b/api/oa/finance/exchangeRate.js new file mode 100644 index 0000000..3deb7e9 --- /dev/null +++ b/api/oa/finance/exchangeRate.js @@ -0,0 +1,10 @@ +// 汇率API,直接请求第三方服务 +import request from "@/util/oaRequest" + +// 获取美元兑人民币汇率(dateStr可选,便于后续扩展) +export async function getExchangeRate(dateStr) { + return request({ + url: '/oa/exchangeRate/usd2cny', + date: dateStr + }) +} \ No newline at end of file diff --git a/api/oa/finance/finance.js b/api/oa/finance/finance.js new file mode 100644 index 0000000..0e48726 --- /dev/null +++ b/api/oa/finance/finance.js @@ -0,0 +1,194 @@ +import request from "@/util/oaRequest" + +// 查询进出账管理列表 +export function listFinance(query) { + return request({ + url: '/oa/finance/list', + method: 'get', + params: query + }) +} +// // 查询进出账管理列表 +// export function barData(query) { +// return request({ +// url: '/oa/finance/barData', +// method: 'get', +// params: query +// }) +// } + +// 查询进项目出账管理列表 +export function listFinancePro(query) { + return request({ + url: '/oa/finance/listPro', + method: 'get', + params: query + }) +} + +// 查询进出账管理详细 +export function getFinance(financeId) { + return request({ + url: '/oa/finance/' + financeId, + method: 'get' + }) +} + +export function getFinancePro(financeId) { + return request({ + url: '/oa/finance/financePro' + financeId, + method: 'get' + }) +} + + +// 根据时间范围查询列表 +export function findFinance(params) { + return request({ + url: '/oa/finance/getFinanceByTime', + method: 'get', + params:params + }) +} + +// 项目资金管理,根据时间范围查询列表 +export function findProjectFinance(query) { + return request({ + url: '/oa/finance/findFinanceByTimeAndProjectId', + method: 'get', + params:query + }) +} + +// 最近6个月核算列表 +export function findFinanceList(query) { + return request({ + url: '/oa/finance/findFinanceByMonth/', + method: 'get', + params:query + }) +} + +// 新增进出账管理 +export function addFinance(data) { + return request({ + url: '/oa/finance', + method: 'post', + data: data + }) +} + +// 修改进出账管理 +export function updateFinance(data) { + return request({ + url: '/oa/finance', + method: 'put', + data: data + }) +} + +// 删除进出账管理 +export function delFinance(financeId) { + return request({ + url: '/oa/finance/' + financeId, + method: 'delete' + }) +} + +/** + * + * @returns 获取进出账管理列表 + */ +export function getCostDetailList(query) { + return request({ + url: '/oa/cost/list', + method: 'get', + params:query + }) +} + +/** + * @param costId 进出账管理id + * @returns 根据id获取进出账管理详情 + * */ +export function getCostDetailById(costId) { + return request({ + url: `/oa/cost/${costId}`, + method: 'get' + }) +} + +/** + * + * @param {*} data 创建成本详情 + * @returns + */ +export function createCostDetail(data) { + return request({ + url: '/oa/cost/add', + method: 'post', + data: data + }) +} + +/** + * + * @param {*} costId 删除成本详情 + * @returns + */ +export function deleteCostDetail(costId) { + return request({ + url: `/oa/cost/${costId}`, + method: 'delete' + }) +} + +/** + * 获取月度收支对比数据 + * @param {{ projectId?: number, financeType?: string }} params + */ +export function barData(params) { + return request({ + url: '/oa/finance/barData', + method: 'get', + params + }); +} + +/** + * 获取明细列表(含币种区分) + * @param {{ projectId?: number, financeType?: string }} params + */ +export function findFinanceList2(params) { + return request({ + url: '/oa/finance/findFinanceList', + method: 'get', + params + }); +} + +// 新增进出账管理withBalance +export function addFinanceWithBalance(data) { + return request({ + url: '/oa/finance/addBalance', + method: 'post', + data: data + }) +} + +// 修改进出账管理withBalance +export function updateFinanceWithBalance(data) { + return request({ + url: '/oa/finance/editBalance', + method: 'put', + data: data + }) +} + +// 删除进出账管理withBalance +export function delFinanceWithBalance(financeId) { + return request({ + url: '/oa/finance/removeDataBalance/' + financeId, + method: 'delete' + }) +} diff --git a/api/oa/post.js b/api/oa/post.js new file mode 100644 index 0000000..1a8e9ca --- /dev/null +++ b/api/oa/post.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询岗位列表 +export function listPost(query) { + return request({ + url: '/system/post/list', + method: 'get', + params: query + }) +} + +// 查询岗位详细 +export function getPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'get' + }) +} + +// 新增岗位 +export function addPost(data) { + return request({ + url: '/system/post', + method: 'post', + data: data + }) +} + +// 修改岗位 +export function updatePost(data) { + return request({ + url: '/system/post', + method: 'put', + data: data + }) +} + +// 删除岗位 +export function delPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'delete' + }) +} diff --git a/api/oa/role.js b/api/oa/role.js new file mode 100644 index 0000000..441c527 --- /dev/null +++ b/api/oa/role.js @@ -0,0 +1,127 @@ +import request from "@/utils/request"; + +// 查询角色列表 +export function listRole(query) { + return request({ + url: "/system/role/list", + method: "get", + params: query, + }); +} + +// 查询角色详细 +export function getRole(roleId) { + return request({ + url: "/system/role/" + roleId, + method: "get", + }); +} + +// 查询角色详细 +export function currentRole() { + return request({ + url: "/system/role/currentRole", + method: "get", + }); +} + +// 新增角色 +export function addRole(data) { + return request({ + url: "/system/role", + method: "post", + data: data, + }); +} + +// 修改角色 +export function updateRole(data) { + return request({ + url: "/system/role", + method: "put", + data: data, + }); +} + +// 角色数据权限 +export function dataScope(data) { + return request({ + url: "/system/role/dataScope", + method: "put", + data: data, + }); +} + +// 角色状态修改 +export function changeRoleStatus(roleId, status) { + const data = { + roleId, + status, + }; + return request({ + url: "/system/role/changeStatus", + method: "put", + data: data, + }); +} + +// 删除角色 +export function delRole(roleId) { + return request({ + url: "/system/role/" + roleId, + method: "delete", + }); +} + +// 查询角色已授权用户列表 +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/api/oa/workflow/category.js b/api/oa/workflow/category.js new file mode 100644 index 0000000..ffe46b5 --- /dev/null +++ b/api/oa/workflow/category.js @@ -0,0 +1,53 @@ +import request from "@/util/oaRequest" + +// 查询流程分类列表 +export function listCategory(query) { + return request({ + url: '/workflow/category/list', + method: 'get', + params: query + }) +} + +// 查询流程分类列表 +export function listAllCategory(query) { + return request({ + url: '/workflow/category/listAll', + method: 'get', + params: query + }) +} + +// 查询流程分类详细 +export function getCategory(categoryId) { + return request({ + url: '/workflow/category/' + categoryId, + method: 'get' + }) +} + +// 新增流程分类 +export function addCategory(data) { + return request({ + url: '/workflow/category', + method: 'post', + data: data + }) +} + +// 修改流程分类 +export function updateCategory(data) { + return request({ + url: '/workflow/category', + method: 'put', + data: data + }) +} + +// 删除流程分类 +export function delCategory(categoryId) { + return request({ + url: '/workflow/category/' + categoryId, + method: 'delete' + }) +} diff --git a/api/oa/workflow/deploy.js b/api/oa/workflow/deploy.js new file mode 100644 index 0000000..8062f57 --- /dev/null +++ b/api/oa/workflow/deploy.js @@ -0,0 +1,51 @@ +import request from "@/util/oaRequest" + +// 查询流程部署列表 +export function listDeploy(query) { + return request({ + url: '/workflow/deploy/list', + method: 'get', + params: query + }) +} + +export function listPublish(query) { + return request({ + url: '/workflow/deploy/publishList', + method: 'get', + params: query + }) +} + +// 获取流程模型流程图 +export function getBpmnXml(definitionId) { + return request({ + url: '/workflow/deploy/bpmnXml/' + definitionId, + method: 'get' + }) +} + +// 修改流程状态 +export function changeState(params) { + return request({ + url: '/workflow/deploy/changeState', + method: 'put', + params: params + }) +} + +// 删除流程部署 +export function delDeploy(deployIds) { + return request({ + url: '/workflow/deploy/' + deployIds, + method: 'delete' + }) +} + +// 查询流程部署关联表单信息 +export function getFormByDeployId(deployId) { + return request({ + url: '/workflow/deploy/form/' + deployId, + method: 'get', + }) +} diff --git a/api/oa/workflow/finished.js b/api/oa/workflow/finished.js new file mode 100644 index 0000000..5b43dfa --- /dev/null +++ b/api/oa/workflow/finished.js @@ -0,0 +1,10 @@ +import request from "@/util/oaRequest" + +// 撤回任务 +export function revokeProcess(data) { + return request({ + url: '/workflow/task/revokeProcess', + method: 'post', + data: data + }) +} diff --git a/api/oa/workflow/form.js b/api/oa/workflow/form.js new file mode 100644 index 0000000..27acdad --- /dev/null +++ b/api/oa/workflow/form.js @@ -0,0 +1,52 @@ +import request from "@/util/oaRequest" + +// 查询流程表单列表 +export function listForm(query) { + return request({ + url: '/workflow/form/list', + method: 'get', + params: query + }) +} + +// 查询流程表单详细 +export function getForm(formId) { + return request({ + url: '/workflow/form/' + formId, + method: 'get' + }) +} + +// 新增流程表单 +export function addForm(data) { + return request({ + url: '/workflow/form', + method: 'post', + data: data + }) +} + +// 修改流程表单 +export function updateForm(data) { + return request({ + url: '/workflow/form', + method: 'put', + data: data + }) +} +// 挂载表单 +export function addDeployForm(data) { + return request({ + url: '/workflow/form/addDeployForm', + method: 'post', + data: data + }) +} + +// 删除流程表单 +export function delForm(formId) { + return request({ + url: '/workflow/form/' + formId, + method: 'delete' + }) +} diff --git a/api/oa/workflow/instance.js b/api/oa/workflow/instance.js new file mode 100644 index 0000000..ffff3d4 --- /dev/null +++ b/api/oa/workflow/instance.js @@ -0,0 +1,10 @@ +import request from "@/util/oaRequest" + +// 查询流程实例详情信息 +export function getDetailInstance(query) { + return request({ + url: '/workflow/instance/detail', + method: 'get', + params: query + }) +} diff --git a/api/oa/workflow/model.js b/api/oa/workflow/model.js new file mode 100644 index 0000000..58897c4 --- /dev/null +++ b/api/oa/workflow/model.js @@ -0,0 +1,84 @@ +import request from "@/util/oaRequest" + +// 查询流程模型信息 +export function listModel(query) { + return request({ + url: '/workflow/model/list', + method: 'get', + params: query + }) +} + +// 查询流程模型信息 +export function historyModel(query) { + return request({ + url: '/workflow/model/historyList', + method: 'get', + params: query + }) +} + +export function getModel(modelId) { + return request({ + url: '/workflow/model/' + modelId, + method: 'get' + }) +} + +// 新增模型信息 +export function addModel(data) { + return request({ + url: '/workflow/model', + method: 'post', + data: data + }) +} + +// 修改模型信息 +export function updateModel(data) { + return request({ + url: '/workflow/model', + method: 'put', + data: data + }) +} + +// 保存流程模型 +export function saveModel(data) { + return request({ + url: '/workflow/model/save', + method: 'post', + data: data + }) +} + +export function latestModel(params) { + return request({ + url: '/workflow/model/latest', + method: 'post', + params: params + }) +} + +export function delModel(modelIds) { + return request({ + url: '/workflow/model/' + modelIds, + method: 'delete' + }) +} + +export function deployModel(params) { + return request({ + url: '/workflow/model/deploy', + method: 'post', + params: params + }) +} + +// 获取流程模型流程图 +export function getBpmnXml(modelId) { + return request({ + url: '/workflow/model/bpmnXml/' + modelId, + method: 'get' + }) +} diff --git a/api/oa/workflow/process.js b/api/oa/workflow/process.js new file mode 100644 index 0000000..39601df --- /dev/null +++ b/api/oa/workflow/process.js @@ -0,0 +1,132 @@ +import request from "@/util/oaRequest" + +// 查询流程列表 +export function listProcess(query) { + return request({ + url: '/workflow/process/list', + method: 'get', + params: query + }) +} + +// 查询流程列表 +export function getProcessForm(query) { + return request({ + url: '/workflow/process/getProcessForm', + method: 'get', + params: query + }) +} + +// 部署流程实例 +export function startProcess(processDefId, data) { + return request({ + url: '/workflow/process/start/' + processDefId, + method: 'post', + data: data + }) +} + +// 部署流程实例 +export function startClaim(data) { + return request({ + url: '/workflow/process/startClaim', + method: 'post', + data: data + }) +} +// 部署流程实例 +export function startMoney(data) { + return request({ + url: '/workflow/process/startMoney', + method: 'post', + data: data + }) +} + +// 删除流程实例 +export function delProcess(ids) { + return request({ + url: '/workflow/process/instance/' + ids, + method: 'delete' + }) +} + +// 获取流程图 +export function getBpmnXml(processDefId) { + return request({ + url: '/workflow/process/bpmnXml/' + processDefId, + method: 'get' + }) +} + +export function detailProcess(query) { + return request({ + url: '/workflow/process/detail', + method: 'get', + params: query + }) +} + +// 我的发起的流程 +export function listOwnProcess(query) { + return request({ + url: '/workflow/process/ownList', + method: 'get', + params: query + }) +} + +// 我的发起的流程 +export function listTripAndAbsence(query) { + return request({ + url: '/workflow/process/trip-absence', + method: 'get', + params: query + }) +} + +// 我待办的流程 +export function listTodoProcess(query) { + return request({ + url: '/workflow/process/todoList', + method: 'get', + params: query + }) +} + +// 我待签的流程 +export function listClaimProcess(query) { + return request({ + url: '/workflow/process/claimList', + method: 'get', + params: query + }) +} + +// 我已办的流程 +export function listFinishedProcess(query) { + return request({ + url: '/workflow/process/finishedList', + method: 'get', + params: query + }) +} + +// 查询流程抄送列表 +export function listCopyProcess(query) { + return request({ + url: '/workflow/process/copyList', + method: 'get', + params: query + }) +} + +// 取消申请 +export function stopProcess(data) { + return request({ + url: '/workflow/task/stopProcess', + method: 'post', + data: data + }) +} diff --git a/api/oa/workflow/task.js b/api/oa/workflow/task.js new file mode 100644 index 0000000..b069fa0 --- /dev/null +++ b/api/oa/workflow/task.js @@ -0,0 +1,71 @@ +import request from "@/util/oaRequest" + +// 完成任务 +export function complete(data) { + return request({ + url: '/workflow/task/complete', + method: 'post', + data: data + }) +} + +// 委派任务 +export function delegate(data) { + return request({ + url: '/workflow/task/delegate', + method: 'post', + data: data + }) +} + +// 转办任务 +export function transfer(data) { + return request({ + url: '/workflow/task/transfer', + method: 'post', + data: data + }) +} + +// 退回任务 +export function returnTask(data) { + return request({ + url: '/workflow/task/return', + method: 'post', + data: data + }) +} + +// 拒绝任务 +export function rejectTask(data) { + return request({ + url: '/workflow/task/reject', + method: 'post', + data: data + }) +} + +// 签收任务 +export function claimTask(data) { + return request({ + url: '/workflow/task/claim', + method: 'post', + data: data + }) +} + +// 可退回任务列表 +export function returnList(data) { + return request({ + url: '/workflow/task/returnList', + method: 'post', + data: data + }) +} + +export function getTaskFormDetail(taskId) { + return request({ + url: '/workflow/task/processVariables/'+taskId, + method: 'get', + }) +} diff --git a/components/MyAvatar/index.vue b/components/MyAvatar/index.vue index 1884f01..27cc4cf 100644 --- a/components/MyAvatar/index.vue +++ b/components/MyAvatar/index.vue @@ -66,15 +66,12 @@ export default { }, methods: { getFixedSourceUrl(url) { - console.log('替换头像', url) // 如果 url 以 http://49.232.154.205/api/object/ 开头,则替换为带端口的 if (typeof url === 'string' && url.startsWith('http://49.232.154.205/api/object/')) { - console.log('替换1') return url.replace('http://49.232.154.205/api/object/', 'http://49.232.154.205:10006/api/object/'); } else if (typeof url === 'string' && url.startsWith('http://47.117.71.33/api/object/')) { - console.log("替换2") return url.replace('http://47.117.71.33/api/object/', 'http://49.232.154.205:10006/api/object/'); } diff --git a/components/oa/oa-schema-form/index.vue b/components/oa/oa-schema-form/index.vue new file mode 100644 index 0000000..4c8e764 --- /dev/null +++ b/components/oa/oa-schema-form/index.vue @@ -0,0 +1,91 @@ + + + + + \ No newline at end of file diff --git a/pages.json b/pages.json index 90403b5..df04f9a 100644 --- a/pages.json +++ b/pages.json @@ -429,6 +429,70 @@ "navigationBarTitleText" : "出库记录", "navigationStyle": "default" } + }, + { + "path" : "pages/workbench/process/process", + "style" : + { + "navigationBarTitleText" : "流程管理", + "navigationStyle": "default" + } + }, + { + "path" : "pages/workbench/workflow/apply/apply", + "style" : + { + "navigationBarTitleText" : "我的申请", + "navigationStyle": "default" + } + }, + { + "path" : "pages/workbench/workflow/todo/todo", + "style" : + { + "navigationBarTitleText" : "代办任务", + "navigationStyle": "default" + } + }, + { + "path" : "pages/workbench/workflow/finished/finished", + "style" : + { + "navigationBarTitleText" : "已办任务", + "navigationStyle": "default" + } + }, + { + "path" : "pages/workbench/workflow/detail/detail", + "style" : + { + "navigationBarTitleText" : "流程详情", + "navigationStyle": "default" + } + }, + { + "path" : "pages/workbench/workflow/start/start", + "style" : + { + "navigationBarTitleText" : "发起流程", + "navigationStyle": "default" + } + }, + { + "path" : "pages/workbench/user/user", + "style" : + { + "navigationBarTitleText" : "用户管理", + "navigationStyle": "default" + } + }, + { + "path" : "pages/workbench/cost/cost", + "style" : + { + "navigationBarTitleText" : "项目成本", + "navigationStyle": "default" + } } ], "tabBar": { diff --git a/pages/workbench/cost/components/Bar.vue b/pages/workbench/cost/components/Bar.vue new file mode 100644 index 0000000..077277d --- /dev/null +++ b/pages/workbench/cost/components/Bar.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/pages/workbench/cost/components/Line.vue b/pages/workbench/cost/components/Line.vue new file mode 100644 index 0000000..9d5ea1a --- /dev/null +++ b/pages/workbench/cost/components/Line.vue @@ -0,0 +1,102 @@ + + + + + \ No newline at end of file diff --git a/pages/workbench/cost/components/Pie.vue b/pages/workbench/cost/components/Pie.vue new file mode 100644 index 0000000..0c5c490 --- /dev/null +++ b/pages/workbench/cost/components/Pie.vue @@ -0,0 +1,59 @@ + + + + + \ No newline at end of file diff --git a/pages/workbench/cost/components/RecentRecords.vue b/pages/workbench/cost/components/RecentRecords.vue new file mode 100644 index 0000000..112fb0a --- /dev/null +++ b/pages/workbench/cost/components/RecentRecords.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/pages/workbench/cost/components/SummaryCards.vue b/pages/workbench/cost/components/SummaryCards.vue new file mode 100644 index 0000000..e19e0a6 --- /dev/null +++ b/pages/workbench/cost/components/SummaryCards.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/pages/workbench/cost/cost.vue b/pages/workbench/cost/cost.vue new file mode 100644 index 0000000..768178a --- /dev/null +++ b/pages/workbench/cost/cost.vue @@ -0,0 +1,289 @@ + + + + + \ No newline at end of file diff --git a/pages/workbench/index/index.vue b/pages/workbench/index/index.vue index 18666f1..17c43ae 100644 --- a/pages/workbench/index/index.vue +++ b/pages/workbench/index/index.vue @@ -109,6 +109,12 @@ export default { category: '财务中心', access: ['vice', 'baomi', 'ceo'] // 需要特定权限才能访问 }, + // { + // text: '项目成本', + // icon: '/static/images/cost.png', + // url: '/pages/workbench/cost/cost', + // category: '财务中心', + // }, { text: '智慧库房', icon: '/static/images/smartStock.png', @@ -133,11 +139,35 @@ export default { url: '/pages/workbench/wms/out', category: '库房管理', }, + // { + // text: '我的申请', + // icon: '/static/images/apply.png', + // url: '/pages/workbench/workflow/apply/apply', + // category: '办公流程' + // }, + // { + // text: '代办任务', + // icon: '/static/images/todo.png', + // url: '/pages/workbench/workflow/todo/todo', + // category: '办公流程' + // }, + // { + // text: '已办任务', + // icon: '/static/images/finished.png', + // url: '/pages/workbench/workflow/finished/finished', + // category: '办公流程' + // }, { text: '线上营销', icon: '/static/images/yingxiao.png', url: '/pages/workbench/sales/sales', }, + { + text: "用户管理", + icon: '/static/images/user.png', + url: '/pages/workbench/user/user', + // access: ['vice', 'ceo'] + } ], }; }, diff --git a/pages/workbench/process/process.vue b/pages/workbench/process/process.vue new file mode 100644 index 0000000..8183fd0 --- /dev/null +++ b/pages/workbench/process/process.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/pages/workbench/user/user.vue b/pages/workbench/user/user.vue new file mode 100644 index 0000000..bc39a28 --- /dev/null +++ b/pages/workbench/user/user.vue @@ -0,0 +1,664 @@ + + + + + \ No newline at end of file diff --git a/pages/workbench/wms/out.vue b/pages/workbench/wms/out.vue index 133fa64..ba56251 100644 --- a/pages/workbench/wms/out.vue +++ b/pages/workbench/wms/out.vue @@ -1,6 +1,6 @@ \ No newline at end of file diff --git a/pages/workbench/workflow/apply/apply.vue b/pages/workbench/workflow/apply/apply.vue new file mode 100644 index 0000000..84cd17f --- /dev/null +++ b/pages/workbench/workflow/apply/apply.vue @@ -0,0 +1,563 @@ + + + + + diff --git a/pages/workbench/workflow/detail/detail.vue b/pages/workbench/workflow/detail/detail.vue new file mode 100644 index 0000000..8183fd0 --- /dev/null +++ b/pages/workbench/workflow/detail/detail.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/pages/workbench/workflow/finished/finished.vue b/pages/workbench/workflow/finished/finished.vue new file mode 100644 index 0000000..8183fd0 --- /dev/null +++ b/pages/workbench/workflow/finished/finished.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/pages/workbench/workflow/start/start.vue b/pages/workbench/workflow/start/start.vue new file mode 100644 index 0000000..f980020 --- /dev/null +++ b/pages/workbench/workflow/start/start.vue @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/pages/workbench/workflow/todo/todo.vue b/pages/workbench/workflow/todo/todo.vue new file mode 100644 index 0000000..8183fd0 --- /dev/null +++ b/pages/workbench/workflow/todo/todo.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/static/images/apply.png b/static/images/apply.png new file mode 100644 index 0000000000000000000000000000000000000000..3838d74d729755414bf28f59449af76ef07f2d12 GIT binary patch literal 3093 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�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 DG~2rP literal 0 HcmV?d00001 diff --git a/static/images/todo.png b/static/images/todo.png new file mode 100644 index 0000000000000000000000000000000000000000..4b433b7f99ba0fb57e288835d21efc4eb802e389 GIT binary patch literal 5616 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 DJnS=o literal 0 HcmV?d00001 diff --git a/store/modules/conversation.js b/store/modules/conversation.js index baa8e31..05394b6 100644 --- a/store/modules/conversation.js +++ b/store/modules/conversation.js @@ -65,7 +65,7 @@ const actions = { return []; } }, - getCurrentGroup({ commit }, groupID) { + getCurrentGroup({ commit }, groupID) { IMSDK.asyncApi(IMSDK.IMMethods.GetSpecifiedGroupsInfo, uuidv4(), [ groupID, ]).then(({ data }) => { diff --git a/uni_modules/uni-data-select/changelog.md b/uni_modules/uni-data-select/changelog.md index 0658510..1681eae 100644 --- a/uni_modules/uni-data-select/changelog.md +++ b/uni_modules/uni-data-select/changelog.md @@ -1,3 +1,11 @@ +## 1.1.0(2025-08-19) +- 新增 插槽 selected empty option +- 新增 mutiple 属性,支持多选功能 +- 新增 wrap 属性,支持选中的文字超过一行显示 +- 新增 align 属性,支持修改选中的文字显示的位置 +- 新增 hideRight 属性,支持隐藏右侧所有按钮 +- 新增 mode 属性,支持修改边框样式 +- 新增 事件 open close clear ## 1.0.10(2025-04-14) - 修复 清除按钮不展示问题 ## 1.0.9(2025-03-26) diff --git a/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue index 71ee950..85b2d7b 100644 --- a/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue +++ b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue @@ -2,30 +2,59 @@ {{label + ':'}} - - - {{textShow}} - {{typePlaceholder}} - + + + + + + + - + - - - - - {{emptyTips}} - - - {{formatItemName(item)}} - - - + + + + + + + + + @@ -36,22 +65,56 @@ * DataChecklist 数据选择器 * @description 通过数据渲染的下拉框组件 * @tutorial https://uniapp.dcloud.io/component/uniui/uni-data-select - * @property {String} value 默认值 + * @property {String|Array} value 默认值,多选时为数组 * @property {Array} localdata 本地数据 ,格式 [{text:'',value:''}] * @property {Boolean} clear 是否可以清空已选项 * @property {Boolean} emptyText 没有数据时显示的文字 ,本地数据无效 * @property {String} label 左侧标题 * @property {String} placeholder 输入框的提示文字 * @property {Boolean} disabled 是否禁用 + * @property {Boolean} multiple 是否多选模式 + * @property {Boolean} wrap 是否允许选中文本换行显示 * @property {String} placement 弹出位置 * @value top 顶部弹出 * @value bottom 底部弹出(default) + * @property {String} align 选择文字的位置 + * @value left 显示左侧 + * @value center 显示中间 + * @value right 显示 右侧 + * @property {Boolean} hideRight 是否隐藏右侧按钮 + * @property {String} mode 边框样式 + * @value default 四周边框 + * @value underline 下边框 + * @value none 无边框 * @event {Function} change 选中发生变化触发 + * @event {Function} open 选择框开启时触发 + * @event {Function} close 选择框关闭时触发 + * @event {Function} clear 点击清除按钮之后触发 */ export default { name: "uni-data-select", mixins: [uniCloud.mixinDatacom || {}], + emits: [ + 'open', + 'close', + 'update:modelValue', + 'input', + 'clear', + 'change' + ], + model: { + prop: 'modelValue', + event: 'update:modelValue' + }, + options: { + // #ifdef MP-TOUTIAO + virtualHost: false, + // #endif + // #ifndef MP-TOUTIAO + virtualHost: true + // #endif + }, props: { localdata: { type: Array, @@ -60,11 +123,11 @@ } }, value: { - type: [String, Number], + type: [String, Number, Array], default: '' }, modelValue: { - type: [String, Number], + type: [String, Number, Array], default: '' }, label: { @@ -99,7 +162,27 @@ placement: { type: String, default: 'bottom' - } + }, + multiple: { + type: Boolean, + default: false + }, + wrap: { + type: Boolean, + default: false + }, + align:{ + type: String, + default: "left" + }, + hideRight: { + type: Boolean, + default: false + }, + mode:{ + type: String, + default: 'default' + } }, data() { return { @@ -133,17 +216,35 @@ common }, valueCom() { - // #ifdef VUE3 - return this.modelValue; - // #endif - // #ifndef VUE3 - return this.value; - // #endif + if (this.value === '') return this.modelValue + if (this.modelValue === '') return this.value + return this.value }, textShow() { // 长文本显示 - let text = this.current; - return text; + if (this.multiple) { + const currentValues = this.getCurrentValues(); + if (Array.isArray(currentValues) && currentValues.length > 0) { + const selectedItems = this.mixinDatacomResData.filter(item => currentValues.includes(item.value)); + return selectedItems.map(item => this.formatItemName(item)).join(', '); + } else { + return ''; // 空数组时返回空字符串,显示占位符 + } + } else { + return this.current; + } + }, + shouldShowClear() { + if (this.multiple) { + const currentValues = this.getCurrentValues(); + return Array.isArray(currentValues) && currentValues.length > 0; + } else { + return !!this.current; + } + }, + shouldWrap() { + // 只有在多选模式、开启换行、且有内容时才应用换行样式 + return this.multiple && this.wrap && !!this.textShow; }, getOffsetByPlacement() { switch (this.placement) { @@ -152,10 +253,38 @@ case 'bottom': return "top:calc(100% + 12px);"; } + }, + slotSelected(){ + // #ifdef VUE2 + return this.$scopedSlots ? this.$scopedSlots.selected : false + // #endif + // #ifdef VUE3 + return this.$slots ? this.$slots.selected : false + // #endif + }, + slotEmpty(){ + // #ifdef VUE2 + return this.$scopedSlots ? this.$scopedSlots.empty : false + // #endif + // #ifdef VUE3 + return this.$slots ? this.$slots.empty : false + // #endif + }, + slotOption(){ + // #ifdef VUE2 + return this.$scopedSlots ? this.$scopedSlots.option : false + // #endif + // #ifdef VUE3 + return this.$slots ? this.$slots.option : false + // #endif } }, - watch: { + showSelector:{ + handler(val,old){ + val ? this.$emit('open') : this.$emit('close') + } + }, localdata: { immediate: true, handler(val, old) { @@ -175,9 +304,20 @@ } } }, - }, methods: { + getSelectedItems() { + const currentValues = this.getCurrentValues(); + let _minxData = this.mixinDatacomResData + // #ifdef MP-WEIXIN || MP-TOUTIAO + _minxData = JSON.parse(JSON.stringify(this.mixinDatacomResData)) + // #endif + if (this.multiple) { + return _minxData.filter(item => currentValues.includes(item.value)) || []; + } else { + return _minxData.filter(item => item.value === currentValues) || []; + } + }, debounce(fn, time = 100) { let timer = null return function(...args) { @@ -187,6 +327,23 @@ }, time) } }, + // 检查项目是否已选中 + isSelected(item) { + if (this.multiple) { + const currentValues = this.getCurrentValues(); + return Array.isArray(currentValues) && currentValues.includes(item.value); + } else { + return this.getCurrentValues() === item.value; + } + }, + // 获取当前选中的值 + getCurrentValues() { + if (this.multiple) { + return Array.isArray(this.valueCom) ? this.valueCom : (this.valueCom ? [this.valueCom] : []); + } else { + return this.valueCom; + } + }, // 执行数据库查询 query() { this.mixinDatacomEasyGet(); @@ -198,7 +355,7 @@ } }, initDefVal() { - let defValue = '' + let defValue = this.multiple ? [] : '' if ((this.valueCom || this.valueCom === 0) && !this.isDisabled(this.valueCom)) { defValue = this.valueCom } else { @@ -209,48 +366,105 @@ if (strogeValue || strogeValue === 0) { defValue = strogeValue } else { - let defItem = '' + let defItem = this.multiple ? [] : '' if (this.defItem > 0 && this.defItem <= this.mixinDatacomResData.length) { - defItem = this.mixinDatacomResData[this.defItem - 1].value + defItem = this.multiple ? [this.mixinDatacomResData[this.defItem - 1].value] : this.mixinDatacomResData[this.defItem - 1].value } defValue = defItem } - if (defValue || defValue === 0) { + if (defValue || defValue === 0 || (this.multiple && Array.isArray(defValue) && defValue.length > 0)) { this.emit(defValue) } } - const def = this.mixinDatacomResData.find(item => item.value === defValue) - this.current = def ? this.formatItemName(def) : '' + + if (this.multiple) { + const selectedValues = Array.isArray(defValue) ? defValue : (defValue ? [defValue] : []); + const selectedItems = this.mixinDatacomResData.filter(item => selectedValues.includes(item.value)); + this.current = selectedItems.map(item => this.formatItemName(item)); + } else { + const def = this.mixinDatacomResData.find(item => item.value === defValue) + this.current = def ? this.formatItemName(def) : '' + } }, /** - * @param {[String, Number]} value + * @param {[String, Number, Array]} value * 判断用户给的 value 是否同时为禁用状态 */ isDisabled(value) { - let isDisabled = false; - - this.mixinDatacomResData.forEach(item => { - if (item.value === value) { - isDisabled = item.disable - } - }) - - return isDisabled; + if (Array.isArray(value)) { + // 对于数组,如果任意一个值被禁用,则认为整体被禁用 + return value.some(val => { + return this.mixinDatacomResData.some(item => item.value === val && item.disable); + }); + } else { + let isDisabled = false; + this.mixinDatacomResData.forEach(item => { + if (item.value === value) { + isDisabled = item.disable + } + }) + return isDisabled; + } }, - clearVal() { - this.emit('') - this.current = '' + const emptyValue = this.multiple ? [] : ''; + this.emit(emptyValue) + this.current = this.multiple ? [] : '' if (this.collection) { this.removeCache() } + this.$emit('clear') + }, + checkBoxChange(res){ + let range = res.detail.value + + let currentValues = range && range.length > 0? range.map((item)=>{ + const index = parseInt(item, 10); + + if (isNaN(index)) { + console.error(`无效索引: ${item}`); + } + + if (index < 0 || index >= this.mixinDatacomResData.length) { + console.error(`索引越界: ${index}`); + } + + return this.mixinDatacomResData[index].value; + }) : [] + const selectedItems = this.mixinDatacomResData.filter(dataItem => currentValues.includes(dataItem.value)); + this.current = selectedItems.map(dataItem => this.formatItemName(dataItem)); + + this.emit(currentValues); }, change(item) { if (!item.disable) { - this.showSelector = false - this.current = this.formatItemName(item) - this.emit(item.value) + if (this.multiple) { + // 多选模式 + let currentValues = this.getCurrentValues(); + if (!Array.isArray(currentValues)) { + currentValues = currentValues ? [currentValues] : []; + } + + const itemValue = item.value; + const index = currentValues.indexOf(itemValue); + + if (index > -1) { + currentValues.splice(index, 1); + } else { + currentValues.push(itemValue); + } + + const selectedItems = this.mixinDatacomResData.filter(dataItem => currentValues.includes(dataItem.value)); + this.current = selectedItems.map(dataItem => this.formatItemName(dataItem)); + + this.emit(currentValues); + } else { + // 单选模式 + this.showSelector = false + this.current = this.formatItemName(item) + this.emit(item.value) + } } }, emit(val) { @@ -328,6 +542,11 @@ $uni-main-color: #333 !default; $uni-secondary-color: #909399 !default; $uni-border-3: #e5e5e5; + $uni-primary: #2979ff !default; + $uni-success: #4cd964 !default; + $uni-warning: #f0ad4e !default; + $uni-error: #dd524d !default; + $uni-info: #909399 !default; /* #ifndef APP-NVUE */ @media screen and (max-width: 500px) { @@ -369,9 +588,16 @@ margin-right: 5px; } + .border-bottom { + border-bottom: solid 1px $uni-border-3; + } + + .border-default { + border: 1px solid $uni-border-3; + } + .uni-select { font-size: 14px; - border: 1px solid $uni-border-3; box-sizing: border-box; border-radius: 4px; padding: 0 5px; @@ -383,15 +609,20 @@ /* #endif */ flex-direction: row; align-items: center; - border-bottom: solid 1px $uni-border-3; width: 100%; flex: 1; - height: 35px; + min-height: 35px; &--disabled { background-color: #f5f7fa; cursor: not-allowed; } + + &--wrap { + height: auto; + min-height: 35px; + // align-items: flex-start; + } } .uni-select__label { @@ -403,7 +634,7 @@ } .uni-select__input-box { - height: 35px; + // height: 35px; width: 0px; position: relative; /* #ifndef APP-NVUE */ @@ -412,6 +643,24 @@ flex: 1; flex-direction: row; align-items: center; + + &--wrap { + .uni-select__input-text { + margin-right: 8px; + } + } + + .padding-top-bottom { + padding-top: 5px; + padding-bottom: 5px; + } + + .slot-content { + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: wrap; + } } .uni-select__input { @@ -463,15 +712,18 @@ display: flex; cursor: pointer; /* #endif */ + flex-direction: row; + align-items: center; line-height: 35px; font-size: 14px; - text-align: center; /* border-bottom: solid 1px $uni-border-3; */ padding: 0px 10px; } - .uni-select__selector-item:hover { - background-color: #f9f9f9; + + + .uni-select__selector-item-check { + margin-left: auto; } .uni-select__selector-empty:last-child, @@ -490,15 +742,14 @@ .uni-popper__arrow_bottom, .uni-popper__arrow_bottom::after, .uni-popper__arrow_top, - .uni-popper__arrow_top::after, - { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 6px; + .uni-popper__arrow_top::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 6px; } .uni-popper__arrow_bottom { @@ -544,11 +795,22 @@ text-overflow: ellipsis; -o-text-overflow: ellipsis; overflow: hidden; + + &--wrap { + white-space: normal; + text-overflow: initial; + -o-text-overflow: initial; + overflow: visible; + word-wrap: break-word; + word-break: break-all; + // line-height: 1.5; + } } .uni-select__input-placeholder { color: $uni-base-color; font-size: 12px; + margin: 1px 0; } .uni-select--mask { @@ -559,4 +821,17 @@ left: 0; z-index: 2; } + + .align-left { + text-align: left; + } + + .align-center { + text-align: center; + } + + .align-right { + text-align: right; + } + diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json index d21cc2d..4033502 100644 --- a/uni_modules/uni-data-select/package.json +++ b/uni_modules/uni-data-select/package.json @@ -1,7 +1,7 @@ { "id": "uni-data-select", "displayName": "uni-data-select 下拉框选择器", - "version": "1.0.10", + "version": "1.1.0", "description": "通过数据驱动的下拉框选择器", "keywords": [ "uni-ui", @@ -12,12 +12,14 @@ ], "repository": "https://github.com/dcloudio/uni-ui", "engines": { - "HBuilderX": "^3.1.1" + "HBuilderX": "^3.1.1", + "uni-app": "^4.45", + "uni-app-x": "" }, "directories": { "example": "../../temps/example_temps" }, -"dcloudext": { + "dcloudext": { "sale": { "regular": { "price": "0.00" @@ -35,54 +37,70 @@ "permissions": "无" }, "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", - "type": "component-vue" + "type": "component-vue", + "darkmode": "x", + "i18n": "x", + "widescreen": "x" }, "uni_modules": { - "dependencies": ["uni-load-more"], + "dependencies": [ + "uni-load-more" + ], "encrypt": [], "platforms": { "cloud": { - "tcb": "y", - "aliyun": "y", - "alipay": "n" + "tcb": "√", + "aliyun": "√", + "alipay": "√" }, "client": { - "App": { - "app-vue": "y", - "app-nvue": "n", - "app-harmony": "u", - "app-uvue": "u" + "uni-app": { + "vue": { + "vue2": "√", + "vue3": "√" + }, + "web": { + "safari": "√", + "chrome": "√" + }, + "app": { + "vue": "√", + "nvue": "-", + "android": "√", + "ios": "√", + "harmony": "√" + }, + "mp": { + "weixin": "√", + "alipay": "√", + "toutiao": "√", + "baidu": "-", + "kuaishou": "-", + "jd": "-", + "harmony": "-", + "qq": "-", + "lark": "-" + }, + "quickapp": { + "huawei": "-", + "union": "-" + } }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "u", - "百度": "u", - "字节跳动": "u", - "QQ": "u", - "京东": "u" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" + "uni-app-x": { + "web": { + "safari": "-", + "chrome": "-" + }, + "app": { + "android": "-", + "ios": "-", + "harmony": "-" + }, + "mp": { + "weixin": "-" + } } } } } -} +} \ No newline at end of file diff --git a/uni_modules/uni-fab/changelog.md b/uni_modules/uni-fab/changelog.md new file mode 100644 index 0000000..8a22807 --- /dev/null +++ b/uni_modules/uni-fab/changelog.md @@ -0,0 +1,25 @@ +## 1.2.6(2024-10-12) +- 修复 微信小程序中的getSystemInfo警告 +## 1.2.5(2023-03-29) +- 新增 pattern.icon 属性,可自定义图标 +## 1.2.4(2022-09-07) +小程序端由于 style 使用了对象导致报错,[详情](https://ask.dcloud.net.cn/question/152790?item_id=211778&rf=false) +## 1.2.3(2022-09-05) +- 修复 nvue 环境下,具有 tabBar 时,fab 组件下部位置无法正常获取 --window-bottom 的bug,详见:[https://ask.dcloud.net.cn/question/110638?notification_id=826310](https://ask.dcloud.net.cn/question/110638?notification_id=826310) +## 1.2.2(2021-12-29) +- 更新 组件依赖 +## 1.2.1(2021-11-19) +- 修复 阴影颜色不正确的bug +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-fab](https://uniapp.dcloud.io/component/uniui/uni-fab) +## 1.1.1(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-02-05) +- 调整为uni_modules目录规范 +- 优化 按钮背景色调整 +- 优化 兼容pc端 diff --git a/uni_modules/uni-fab/components/uni-fab/uni-fab.vue b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue new file mode 100644 index 0000000..492b5d1 --- /dev/null +++ b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue @@ -0,0 +1,491 @@ + + + + + diff --git a/uni_modules/uni-fab/package.json b/uni_modules/uni-fab/package.json new file mode 100644 index 0000000..1b8543c --- /dev/null +++ b/uni_modules/uni-fab/package.json @@ -0,0 +1,85 @@ +{ + "id": "uni-fab", + "displayName": "uni-fab 悬浮按钮", + "version": "1.2.6", + "description": "悬浮按钮 fab button ,点击可展开一个图标按钮菜单。", + "keywords": [ + "uni-ui", + "uniui", + "按钮", + "悬浮按钮", + "fab" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss","uni-icons"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-fab/readme.md b/uni_modules/uni-fab/readme.md new file mode 100644 index 0000000..9a444e8 --- /dev/null +++ b/uni_modules/uni-fab/readme.md @@ -0,0 +1,9 @@ +## Fab 悬浮按钮 +> **组件名:uni-fab** +> 代码块: `uFab` + + +点击可展开一个图形按钮菜单 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-fab) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md index 0cc65a0..62e7682 100644 --- a/uni_modules/uni-icons/changelog.md +++ b/uni_modules/uni-icons/changelog.md @@ -1,3 +1,5 @@ +## 2.0.12(2025-08-26) +- 优化 uni-app x 下 size 类型问题 ## 2.0.11(2025-08-18) - 修复 图标点击事件返回 ## 2.0.9(2024-01-12) diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue b/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue index 398678e..53eb2ea 100644 --- a/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue @@ -29,8 +29,8 @@ default: '#333333' }, size: { - type: Object, - default: 16 + type: [Number, String], + default: 16 }, fontFamily: { type: String, @@ -51,9 +51,9 @@ iconSize() : string { const size = this.size if (typeof size == 'string') { - const reg = /^[0-9]*$/g - return reg.test(size as string) ? '' + size + 'px' : '' + size; - // return '' + this.size + const reg = /^[0-9]*$/g + return reg.test(size as string) ? '' + size + 'px' : '' + size; + // return '' + this.size } return this.getFontSize(size as number) }, diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json index 9a9052f..60e45f0 100644 --- a/uni_modules/uni-icons/package.json +++ b/uni_modules/uni-icons/package.json @@ -1,7 +1,7 @@ { "id": "uni-icons", "displayName": "uni-icons 图标", - "version": "2.0.11", + "version": "2.0.12", "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。", "keywords": [ "uni-ui", @@ -64,7 +64,7 @@ }, "app": { "vue": "√", - "nvue": "√", + "nvue": "-", "android": { "extVersion": "", "minVersion": "29" diff --git a/version.md b/version.md index 1649f28..1fe8729 100644 --- a/version.md +++ b/version.md @@ -27,4 +27,10 @@ ## 4.7.1 + 修改路径替换规则 -+ 修改更新地址 \ No newline at end of file ++ 修改更新地址 + +## 4.7.2 ++ 项目选择器增加搜索 + +## 4.7.3 ++ 修复出库记录的显示错误 \ No newline at end of file