From 29c59c3b748cf2c823e2b162d3c5895e3c5d9bcb Mon Sep 17 00:00:00 2001
From: dayezi <1372755472@qq.com>
Date: Sat, 21 Dec 2024 01:59:29 +0800
Subject: [PATCH 1/4] =?UTF-8?q?=F0=9F=90=9E=20fix(addUser):=20=E6=96=B0?=
=?UTF-8?q?=E5=A2=9E=E7=94=A8=E6=88=B7=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 6 +++---
backend/app/api/v1/admin/users.py | 3 +--
backend/app/schemas/users.py | 10 +++++++++-
backend/app/utils/cnnp.py | 4 ++--
.../views/superAdmin/UserManagement/utils/hook.tsx | 12 +++++++++++-
5 files changed, 26 insertions(+), 9 deletions(-)
diff --git a/README.md b/README.md
index 48787b0..7f3b5d6 100644
--- a/README.md
+++ b/README.md
@@ -16,16 +16,16 @@
构建镜像
```bash
-docker build -t material:1.0.5 .
+docker build -t material:1.0.6 .
```
保存镜像
```bash
-docker save material:1.0.5 -o material105.tar
+docker save material:1.0.6 -o material106.tar
```
加载镜像
```bash
-docker load -i material105.tar
+docker load -i material106.tar
```
启动容器
diff --git a/backend/app/api/v1/admin/users.py b/backend/app/api/v1/admin/users.py
index 0d7049d..8848aa6 100644
--- a/backend/app/api/v1/admin/users.py
+++ b/backend/app/api/v1/admin/users.py
@@ -26,7 +26,7 @@ async def create_user(
user_obj = await user_controller.create(obj_in=item)
await user_obj.roles.add(role_obj)
except Exception as e:
- logger.error(f"用户 {item.nickname} 已存在")
+ logger.error(f"用户添加失败:{e}")
continue
return Success(msg="创建成功!")
@@ -116,4 +116,3 @@ async def reset_pwd(
user.password = get_password_hash(data["newPwd"])
await user.save()
return Success(msg="Reset Successfully")
-
diff --git a/backend/app/schemas/users.py b/backend/app/schemas/users.py
index 357b450..e49a19d 100644
--- a/backend/app/schemas/users.py
+++ b/backend/app/schemas/users.py
@@ -36,7 +36,6 @@ class UpdateStatus(BaseModel):
status: int = Field(description="状态")
-
class UserLdap(BaseModel):
sAMAccountName: str = Field(description="邮箱前缀")
employeeID: str = Field(description="工号")
@@ -47,6 +46,15 @@ class UserLdap(BaseModel):
name: str = Field(description="姓名")
dn: str = Field(description="DN")
+class UserLdapCreate(BaseModel):
+ username: str
+ nickname: str
+ email: str
+ mobile: str
+ employeeID: str
+ department: str
+ company: str
+
if __name__ == '__main__':
pass
diff --git a/backend/app/utils/cnnp.py b/backend/app/utils/cnnp.py
index 50f9272..0428e27 100644
--- a/backend/app/utils/cnnp.py
+++ b/backend/app/utils/cnnp.py
@@ -4,7 +4,7 @@
from ldap3 import Server, Connection, ALL, SUBTREE
from app.utils.log import logger
-from app.schemas.users import UserLdap, UserCreate
+from app.schemas.users import UserLdap, UserLdapCreate
from app.settings import settings
@@ -65,7 +65,7 @@ def getUserList(self, fiterKey: str, fiterValue: str) -> list[UserLdap]:
if self.conn.search(settings.LDAP_BASE, f'({fiterKey}={fiterValue})', attributes=self.attr):
userList = self.conn.entries
for user in userList:
- userList[userList.index(user)] = UserCreate(
+ userList[userList.index(user)] = UserLdapCreate(
employeeID=user.employeeID.value,
username=user.sAMAccountName.value,
nickname=user.name.value,
diff --git a/frontend/src/views/superAdmin/UserManagement/utils/hook.tsx b/frontend/src/views/superAdmin/UserManagement/utils/hook.tsx
index a292238..029641f 100644
--- a/frontend/src/views/superAdmin/UserManagement/utils/hook.tsx
+++ b/frontend/src/views/superAdmin/UserManagement/utils/hook.tsx
@@ -278,7 +278,17 @@ export function useUser(tableRef: Ref) {
props: {
formInline: {
userList: [],
- transferList: []
+ transferList: [
+ // {
+ // username: "zhangsan",
+ // nickname: "张三",
+ // department: "技术部",
+ // mobile: "13888888888",
+ // email: "xxx@xxx.com",
+ // employeeID: "10001",
+ // company: "xxx公司"
+ // }
+ ]
}
},
width: "50%",
From 5ebb845f160c8b4406ba87c56c94a3d5093ce7dd Mon Sep 17 00:00:00 2001
From: dayezi <1372755472@qq.com>
Date: Fri, 10 Jan 2025 19:57:36 +0800
Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E7=94=A8=E6=88=B7?=
=?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=92=8C=E9=83=A8=E9=97=A8=E5=AD=97=E6=AE=B5?=
=?UTF-8?q?=E4=BB=A5=E5=8C=B9=E9=85=8D=E6=96=B0=E6=95=B0=E6=8D=AE=E7=BB=93?=
=?UTF-8?q?=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/app/utils/cnnp.py | 22 +++++++--------------
frontend/src/views/admin/Approval/index.vue | 2 +-
frontend/src/views/material/page/key.vue | 4 ++--
3 files changed, 10 insertions(+), 18 deletions(-)
diff --git a/backend/app/utils/cnnp.py b/backend/app/utils/cnnp.py
index 0428e27..3fb8cdb 100644
--- a/backend/app/utils/cnnp.py
+++ b/backend/app/utils/cnnp.py
@@ -35,13 +35,13 @@ def get_user_info(self, username: str) -> UserLdap:
raise HTTPException(status_code=400, detail="用户不存在")
else:
return UserLdap(
- company="海南核电有限公司",
- department="运行一处运行值",
+ company="xxx有限公司",
+ department="xx处xx科",
employeeID="10000",
mobile="13800138000",
mail="EMAIL",
- dn="cn=liushuo,ou=海南核电有限公司,dc=cnnp,dc=com,dc=cn",
- sAMAccountName="liushuo",
+ dn="cn=zhangsan,ou=xxx有限公司,dc=com,dc=cn",
+ sAMAccountName="zhangsan",
name="张三"
)
@@ -86,23 +86,15 @@ def getUserList(self, fiterKey: str, fiterValue: str) -> list[UserLdap]:
if __name__ == '__main__':
- from ldap3 import SUBTREE, ALL_ATTRIBUTES
- # server = Server('10.20.21.2', get_info=ALL, connect_timeout=10)
- server = Server('panel2.pylover.net.', get_info=ALL, connect_timeout=10)
- conn = Connection(server, user='uid=test,ou=people,dc=eryajf,dc=net', password='test1234', auto_bind=True, authentication="SIMPLE")
- conn.search('ou=海南核电有限公司,dc=cnnp,dc=com,dc=cn', '(sAMAccountName=liushuo)', SUBTREE, attributes=ALL_ATTRIBUTES) # 获取所有信息
- attr = ["cn", "company", "department", "employeeID", "mobile", "name", "mail", "distinguishedName"]
- conn.search('ou=海南核电有限公司,dc=cnnp,dc=com,dc=cn', '(sAMAccountName=liushuo)', SUBTREE, attributes=attr)
- entry = conn.entries[0]
- conn.unbind()
"""
cn: 姓名
company: 公司
- department: 运行一处运行值
+ department: xx处xx科
employeeID: 工号
mobile: 手机
name: 姓名
mail: 邮箱
- distinguishedName: cn=xxx,ou=xxx,dc=cnnp,dc=com,dc=cn
+ distinguishedName: cn=xxx,ou=xxx,dc=com,dc=cn
"""
+ pass
diff --git a/frontend/src/views/admin/Approval/index.vue b/frontend/src/views/admin/Approval/index.vue
index 451b627..e03eb3e 100644
--- a/frontend/src/views/admin/Approval/index.vue
+++ b/frontend/src/views/admin/Approval/index.vue
@@ -35,7 +35,7 @@ onMounted(() => {
areaOpt.value = res.data.map(item => {
return {
label: item.name,
- value: item.id
+ value: item.code
};
});
});
diff --git a/frontend/src/views/material/page/key.vue b/frontend/src/views/material/page/key.vue
index aab4b03..3cd06a5 100644
--- a/frontend/src/views/material/page/key.vue
+++ b/frontend/src/views/material/page/key.vue
@@ -96,10 +96,10 @@ const columns: TableColumnList = [
width="200"
trigger="click"
v-slots={{
- reference: () => {row.username},
+ reference: () => {row.nickname},
default: () => (
- - 姓名:{row.username}
+ - 工号:{row.employeeID}
- 电话:{row.phone}
- 部门:{row.userDepart}
From 9ea1078077ab1cd2bebab58e29b0e52720636d4d Mon Sep 17 00:00:00 2001
From: dayezi <1372755472@qq.com>
Date: Fri, 10 Jan 2025 22:09:56 +0800
Subject: [PATCH 3/4] =?UTF-8?q?fix(api):=20=E4=BF=AE=E6=AD=A3=E5=80=9F?=
=?UTF-8?q?=E5=87=BA=E6=9D=90=E6=96=99=E4=BF=A1=E6=81=AF=E5=A4=84=E7=90=86?=
=?UTF-8?q?=E5=92=8C=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E6=98=BE=E7=A4=BA?=
=?UTF-8?q?=20=E5=9C=A8=E5=80=9F=E5=87=BA=E6=9D=90=E6=96=99=E4=BF=A1?=
=?UTF-8?q?=E6=81=AF=E5=A4=84=E7=90=86=E4=B8=AD=EF=BC=8C=E5=BD=93=E7=94=B5?=
=?UTF-8?q?=E8=AF=9D=E4=B8=BA=E7=A9=BA=E6=97=B6=E6=89=8D=E8=AE=BE=E7=BD=AE?=
=?UTF-8?q?=E7=94=A8=E6=88=B7=E7=94=B5=E8=AF=9D=EF=BC=8C=E9=81=BF=E5=85=8D?=
=?UTF-8?q?=E8=A6=86=E7=9B=96=E5=B7=B2=E6=9C=89=E7=94=B5=E8=AF=9D=E3=80=82?=
=?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BA=86=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF?=
=?UTF-8?q?=E6=98=BE=E7=A4=BA=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=B7=A5=E5=8F=B7?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=B9=B6=E8=B0=83=E6=95=B4=E5=BC=B9=E5=87=BA?=
=?UTF-8?q?=E6=A1=86=E4=BD=8D=E7=BD=AE=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
fix(frontend): 调整表格布局和选中状态管理
修改了表格列的布局,使显示更合理。同时,修正了选中状态管理的变量名,确保取消选择能正确清空选中状态。
---
backend/app/api/v1/material/borrowed.py | 7 ++++---
backend/app/core/init_db.py | 2 +-
.../src/views/admin/Approval/panels/returned.vue | 14 +++++++-------
.../src/views/admin/Approval/panels/returning.vue | 5 ++---
frontend/src/views/material/page/tool.vue | 2 +-
.../views/welcome/dialog/MaterialBorrowDialog.vue | 8 ++++----
6 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/backend/app/api/v1/material/borrowed.py b/backend/app/api/v1/material/borrowed.py
index 72f1918..1698ffe 100644
--- a/backend/app/api/v1/material/borrowed.py
+++ b/backend/app/api/v1/material/borrowed.py
@@ -33,7 +33,8 @@ async def create_borrowed(data: CreateBorrowedInfo):
item["userDepart"] = data.depart
item["uuid"] = data.uuid
user = await user_controller.get_by_uuid(item["uuid"])
- item["phone"] = user.mobile
+ if not (len(item["phone"]) > 0):
+ item["phone"] = user.mobile
item["reason"] = data.reason
item["material_id"] = material.id
obj: Borrowed = await borrowedController.create(obj_in=item)
@@ -70,10 +71,10 @@ async def get_home_list(
material = await obj.material.all().values("name", "model", "position", "number", "borrowed")
obj_dict = await obj.to_dict()
if obj.borrowApproveStatus:
- borrowApproveUser = await obj.borrowApproveUser.all().values("id", "nickname", "mobile", "department")
+ borrowApproveUser = await obj.borrowApproveUser.all().values("id", "nickname", "employeeID", "mobile", "department")
obj_dict["borrowApproveUser"] = borrowApproveUser
if obj.returnApproveStatus:
- returnApproveUser = await obj.returnApproveUser.all().values("id", "nickname", "mobile", "department")
+ returnApproveUser = await obj.returnApproveUser.all().values("id", "nickname", "employeeID", "mobile", "department")
obj_dict["returnApproveUser"] = returnApproveUser
obj_dict["material"] = material
data.append(obj_dict)
diff --git a/backend/app/core/init_db.py b/backend/app/core/init_db.py
index 9acf041..6c381f7 100644
--- a/backend/app/core/init_db.py
+++ b/backend/app/core/init_db.py
@@ -30,7 +30,7 @@ async def tortoise_init(app: FastAPI):
await init_api(app)
await init_menus()
await init_roles()
- await register_superAdmin()
+ # await register_superAdmin()
async def register_superAdmin():
diff --git a/frontend/src/views/admin/Approval/panels/returned.vue b/frontend/src/views/admin/Approval/panels/returned.vue
index 17643ea..ce0f429 100644
--- a/frontend/src/views/admin/Approval/panels/returned.vue
+++ b/frontend/src/views/admin/Approval/panels/returned.vue
@@ -172,7 +172,7 @@ const columns: TableColumnList = [
prop: "reason",
cellRenderer: ({ row }) => (
(
- - 姓名:{row.borrowApproveUser?.nickname}
- - 电话:{row.borrowApproveUser?.phone}
- - 部门:{row.borrowApproveUser?.depart}
+ - 工号:{row.borrowApproveUser?.employeeID}
+ - 电话:{row.borrowApproveUser?.mobile}
+ - 部门:{row.borrowApproveUser?.department}
)
}}
@@ -251,9 +251,9 @@ const columns: TableColumnList = [
),
default: () => (
- - 姓名:{row.returnApproveUser?.nickname}
- - 电话:{row.returnApproveUser?.phone}
- - 部门:{row.returnApproveUser?.depart}
+ - 工号:{row.returnApproveUser?.employeeID}
+ - 电话:{row.returnApproveUser?.mobile}
+ - 部门:{row.returnApproveUser?.department}
)
}}
diff --git a/frontend/src/views/admin/Approval/panels/returning.vue b/frontend/src/views/admin/Approval/panels/returning.vue
index a7a7e87..9cb39bc 100644
--- a/frontend/src/views/admin/Approval/panels/returning.vue
+++ b/frontend/src/views/admin/Approval/panels/returning.vue
@@ -50,7 +50,6 @@ const onSearchReturn = () => {
});
};
-const selectedNum = ref(0);
// 表格ref
const tableRef = ref();
@@ -201,7 +200,7 @@ const onBatchReturn = () => {
/** 取消选择 */
function onSelectionCancel() {
- selectedNum.value = 0;
+ returnSelectedNum.value = 0;
// 用于多选表格,清空用户的选择
tableRef.value.getTableRef().clearSelection();
}
@@ -286,7 +285,7 @@ function handleCurrentChange(val: number) {
>
diff --git a/frontend/src/views/material/page/tool.vue b/frontend/src/views/material/page/tool.vue
index 78ec4a1..86b2440 100644
--- a/frontend/src/views/material/page/tool.vue
+++ b/frontend/src/views/material/page/tool.vue
@@ -136,7 +136,7 @@ const lastRemark = ref("");
const step2Init = ref(true);
const step2Status = computed(() => {
- return remark.value.length > 0 ? StepStatus.Success : StepStatus.Error;
+ return remark.value?.length > 0 ? StepStatus.Success : StepStatus.Error;
});
const copyLastRemark = () => {
diff --git a/frontend/src/views/welcome/dialog/MaterialBorrowDialog.vue b/frontend/src/views/welcome/dialog/MaterialBorrowDialog.vue
index 5ed5592..7b13007 100644
--- a/frontend/src/views/welcome/dialog/MaterialBorrowDialog.vue
+++ b/frontend/src/views/welcome/dialog/MaterialBorrowDialog.vue
@@ -172,11 +172,11 @@ const openVerifyDialog = () => {
class="resultItem"
>
- {{ item.name }}
{
class="resultItem"
>
- {{ item.name }}
Date: Fri, 10 Jan 2025 22:34:33 +0800
Subject: [PATCH 4/4] =?UTF-8?q?fix(api):=20=E4=BF=AE=E6=AD=A3=E7=94=A8?=
=?UTF-8?q?=E6=88=B7=E9=83=A8=E9=97=A8=E5=92=8C=E5=BD=92=E8=BF=98=E7=94=A8?=
=?UTF-8?q?=E6=88=B7=E9=83=A8=E9=97=A8=E4=BF=A1=E6=81=AF=E6=8B=BC=E6=8E=A5?=
=?UTF-8?q?=20=E5=B0=86=E7=94=A8=E6=88=B7=E9=83=A8=E9=97=A8=E5=92=8C?=
=?UTF-8?q?=E5=BD=92=E8=BF=98=E7=94=A8=E6=88=B7=E9=83=A8=E9=97=A8=E7=9A=84?=
=?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=8B=BC=E6=8E=A5=E6=96=B9=E5=BC=8F=E4=BB=8E?=
=?UTF-8?q?=E5=8D=95=E4=B8=80=E9=83=A8=E9=97=A8=E6=94=B9=E4=B8=BA=E5=85=AC?=
=?UTF-8?q?=E5=8F=B8=E5=92=8C=E9=83=A8=E9=97=A8=E6=8B=BC=E6=8E=A5=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
fix(frontend): 修正员工信息显示和弹出框位置
修正员工工号显示为昵称,调整验证人弹出框位置为底部,并优化表格列宽设置。
---
backend/app/api/v1/material/checked.py | 4 +--
frontend/src/views/admin/MaterialChecked.vue | 10 +++----
frontend/src/views/admin/MaterialMeta.vue | 29 +++++++++++++-------
frontend/src/views/material/page/key.vue | 5 ++--
4 files changed, 28 insertions(+), 20 deletions(-)
diff --git a/backend/app/api/v1/material/checked.py b/backend/app/api/v1/material/checked.py
index 83540c8..0d472c4 100644
--- a/backend/app/api/v1/material/checked.py
+++ b/backend/app/api/v1/material/checked.py
@@ -47,7 +47,7 @@ async def get_checked(
data = []
for obj in checked_objs:
user = await obj.toCheckUser.all()
- userDepart = user.department
+ userDepart = user.company + user.department
material = await obj.material.all()
material_dict = await material.to_dict()
user_dict = await user.to_dict()
@@ -57,7 +57,7 @@ async def get_checked(
obj_dict["toCheckUser"] = user_dict
try:
user2 = await obj.toReturnUser.all()
- user2Depart = user2.department
+ user2Depart = user2.company + user2.department
user_dict2 = await user2.to_dict()
obj_dict["toReturnUser"] = user_dict2
user_dict2["depart"] = user2Depart
diff --git a/frontend/src/views/admin/MaterialChecked.vue b/frontend/src/views/admin/MaterialChecked.vue
index e8b139b..a9ecbef 100644
--- a/frontend/src/views/admin/MaterialChecked.vue
+++ b/frontend/src/views/admin/MaterialChecked.vue
@@ -40,7 +40,7 @@ const areaOpt: SelectOpt = [
}
];
// 类型配置
-const typeOpt: SelectOpt = [
+const typeOpt: SelectOpt[] = [
{
label: "工具",
value: "tool"
@@ -52,7 +52,7 @@ const typeOpt: SelectOpt = [
];
// 送检状态
-const checkOpt: SelectOpt = [
+const checkOpt: SelectOpt[] = [
{
label: "送检中",
value: false
@@ -158,7 +158,7 @@ const columns: TableColumnList = [
default: () => (
- 姓名:{row.toCheckUser.nickname}
- - 电话:{row.toCheckUser.phone}
+ - 电话:{row.toCheckUser.mobile}
- 部门:{row.toCheckUser.depart}
)
@@ -184,7 +184,7 @@ const columns: TableColumnList = [
default: () => (
- 姓名:{row.toReturnUser?.nickname}
- - 电话:{row.toReturnUser?.phone}
+ - 电话:{row.toReturnUser?.mobile}
- 部门:{row.toReturnUser?.depart}
)
@@ -280,7 +280,7 @@ const openReturnDialog = (rowList, idList?: [number]) => {
const verifyForm = ref();
addDialog({
title: "验证人",
- width: "20%",
+ width: "30%",
props: {
userInfo: {
account: "",
diff --git a/frontend/src/views/admin/MaterialMeta.vue b/frontend/src/views/admin/MaterialMeta.vue
index 2d4ead8..e6b024e 100644
--- a/frontend/src/views/admin/MaterialMeta.vue
+++ b/frontend/src/views/admin/MaterialMeta.vue
@@ -35,7 +35,7 @@ const tableRef = ref();
// 表格加载控制
const loading = ref(false);
// 区域配置
-const areaOpt: SelectOpt = [
+const areaOpt: SelectOpt[] = [
{
label: "隔离办",
value: "glb"
@@ -50,7 +50,7 @@ const areaOpt: SelectOpt = [
}
];
// 类型配置
-const typeOpt: SelectOpt = [
+const typeOpt: SelectOpt[] = [
{
label: "工具",
value: "tool"
@@ -133,10 +133,10 @@ const columns: TableColumnList = [
reserveSelection: true // 数据刷新后保留选项
},
{ label: "序号", type: "index", width: "60" },
- { label: "编号", prop: "code", width: "100" },
+ { label: "编号", prop: "code", minWidth: "60" },
{ label: "名称", prop: "name" },
{ label: "位置", prop: "position" },
- { label: "型号", prop: "model", width: "200" },
+ { label: "型号", prop: "model", minWidth: "200" },
{ label: "数量", prop: "number", width: "100" },
{ label: "借出数量", prop: "borrowed", width: "100" },
{ label: "送检数量", prop: "checking", width: "100" },
@@ -172,15 +172,24 @@ const columns: TableColumnList = [
plain
onClick={() => {
addDialog({
- title: "送检数量",
+ title: "送检确认",
width: "15%",
contentRenderer: () => (
-
+
+
+
+ {row.name}
+
+
+
+
+
+
),
beforeSure(done, { options, index }) {
diff --git a/frontend/src/views/material/page/key.vue b/frontend/src/views/material/page/key.vue
index 3cd06a5..643f390 100644
--- a/frontend/src/views/material/page/key.vue
+++ b/frontend/src/views/material/page/key.vue
@@ -99,7 +99,7 @@ const columns: TableColumnList = [
reference: () => {row.nickname},
default: () => (
- - 工号:{row.employeeID}
+ - 工号:{row.nickname}
- 电话:{row.phone}
- 部门:{row.userDepart}
@@ -121,7 +121,7 @@ const columns: TableColumnList = [
prop: "reason",
cellRenderer: ({ row }) => (
{
});
listBorrowed(props.area, 1, 100, true, true, false).then(res => {
tableDataList.push(...res.data);
- console.log(tableDataList);
});
getLatestNote(props.area, props.metaType).then(res => {
lastRemark.value = res.data.note;