fix: 统一系统生成时间为北京时间(UTC+8)并优化审计日志表格列展示
This commit is contained in:
@ -2,6 +2,7 @@ from flask_sqlalchemy import SQLAlchemy
|
|||||||
from flask_migrate import Migrate
|
from flask_migrate import Migrate
|
||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
from flask_jwt_extended import JWTManager # 确保引入了 JWTManager
|
from flask_jwt_extended import JWTManager # 确保引入了 JWTManager
|
||||||
|
from datetime import datetime, timezone, timedelta
|
||||||
|
|
||||||
# 1. 创建扩展实例(此时未绑定具体的 App)
|
# 1. 创建扩展实例(此时未绑定具体的 App)
|
||||||
db = SQLAlchemy()
|
db = SQLAlchemy()
|
||||||
@ -10,6 +11,11 @@ cors = CORS()
|
|||||||
jwt = JWTManager() # 必须实例化
|
jwt = JWTManager() # 必须实例化
|
||||||
|
|
||||||
|
|
||||||
|
def beijing_time():
|
||||||
|
"""获取北京时间 (UTC+8)"""
|
||||||
|
return datetime.now(timezone(timedelta(hours=8)))
|
||||||
|
|
||||||
|
|
||||||
# 2. 定义初始化函数 (供工厂函数 create_app 调用)
|
# 2. 定义初始化函数 (供工厂函数 create_app 调用)
|
||||||
def init_extensions(app):
|
def init_extensions(app):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
# inventory-backend/app/models/audit.py
|
# inventory-backend/app/models/audit.py
|
||||||
from app.extensions import db
|
from app.extensions import db, beijing_time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ class AuditLog(db.Model):
|
|||||||
url = db.Column(db.String(500)) # 请求URL
|
url = db.Column(db.String(500)) # 请求URL
|
||||||
status_code = db.Column(db.Integer) # 响应状态码
|
status_code = db.Column(db.Integer) # 响应状态码
|
||||||
error_message = db.Column(db.Text) # 错误信息(如有)
|
error_message = db.Column(db.Text) # 错误信息(如有)
|
||||||
created_at = db.Column(db.DateTime, default=datetime.now, index=True) # 操作时间
|
created_at = db.Column(db.DateTime, default=beijing_time, index=True) # 操作时间
|
||||||
|
|
||||||
def to_dict(self):
|
def to_dict(self):
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
# inventory-backend/app/models/inbound/service.py
|
# inventory-backend/app/models/inbound/service.py
|
||||||
from app.extensions import db
|
from app.extensions import db, beijing_time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
@ -35,8 +35,8 @@ class StockService(db.Model):
|
|||||||
status = db.Column(db.String(20), default='active')
|
status = db.Column(db.String(20), default='active')
|
||||||
|
|
||||||
# 时间与系统字段
|
# 时间与系统字段
|
||||||
created_at = db.Column(db.DateTime, default=datetime.now, nullable=False)
|
created_at = db.Column(db.DateTime, default=beijing_time, nullable=False)
|
||||||
updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
|
updated_at = db.Column(db.DateTime, default=beijing_time, onupdate=beijing_time)
|
||||||
is_deleted = db.Column(db.Boolean, default=False)
|
is_deleted = db.Column(db.Boolean, default=False)
|
||||||
|
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
from app.extensions import db # .material -> .base refactor checked
|
from app.extensions import db, beijing_time # .material -> .base refactor checked
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
class StocktakeDraft(db.Model):
|
class StocktakeDraft(db.Model):
|
||||||
@ -9,7 +9,7 @@ class StocktakeDraft(db.Model):
|
|||||||
uuid = db.Column(db.String(100))
|
uuid = db.Column(db.String(100))
|
||||||
# ★ 新增 quantity 字段
|
# ★ 新增 quantity 字段
|
||||||
quantity = db.Column(db.Numeric(19, 4), default=1)
|
quantity = db.Column(db.Numeric(19, 4), default=1)
|
||||||
scan_time = db.Column(db.DateTime, default=datetime.now)
|
scan_time = db.Column(db.DateTime, default=beijing_time)
|
||||||
|
|
||||||
def to_dict(self):
|
def to_dict(self):
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
from app.extensions import db
|
from app.extensions import db, beijing_time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ class TransOutbound(db.Model):
|
|||||||
# 签字与追溯
|
# 签字与追溯
|
||||||
consumer_name = db.Column(db.String(100)) # 领用人/客户
|
consumer_name = db.Column(db.String(100)) # 领用人/客户
|
||||||
signature_path = db.Column(db.Text) # 电子签名图片路径
|
signature_path = db.Column(db.Text) # 电子签名图片路径
|
||||||
outbound_time = db.Column(db.DateTime, default=datetime.now)
|
outbound_time = db.Column(db.DateTime, default=beijing_time)
|
||||||
operator_name = db.Column(db.String(100)) # 操作员
|
operator_name = db.Column(db.String(100)) # 操作员
|
||||||
|
|
||||||
remark = db.Column(db.Text)
|
remark = db.Column(db.Text)
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
# inventory-backend/app/models/system.py
|
# inventory-backend/app/models/system.py
|
||||||
from app.extensions import db
|
from app.extensions import db, beijing_time
|
||||||
from werkzeug.security import generate_password_hash, check_password_hash
|
from werkzeug.security import generate_password_hash, check_password_hash
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ class SysUser(db.Model):
|
|||||||
role = db.Column(db.String(50))
|
role = db.Column(db.String(50))
|
||||||
status = db.Column(db.String(20), default='active')
|
status = db.Column(db.String(20), default='active')
|
||||||
password_hash = db.Column(db.Text)
|
password_hash = db.Column(db.Text)
|
||||||
created_at = db.Column(db.DateTime, default=datetime.now)
|
created_at = db.Column(db.DateTime, default=beijing_time)
|
||||||
|
|
||||||
def set_password(self, password):
|
def set_password(self, password):
|
||||||
"""生成加密密码"""
|
"""生成加密密码"""
|
||||||
@ -76,7 +76,7 @@ class SysLog(db.Model):
|
|||||||
__tablename__ = 'sys_log'
|
__tablename__ = 'sys_log'
|
||||||
|
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
op_time = db.Column(db.DateTime, default=datetime.now)
|
op_time = db.Column(db.DateTime, default=beijing_time)
|
||||||
op_user_name = db.Column(db.String(100))
|
op_user_name = db.Column(db.String(100))
|
||||||
op_user_id = db.Column(db.String(50))
|
op_user_id = db.Column(db.String(50))
|
||||||
module_name = db.Column(db.String(100))
|
module_name = db.Column(db.String(100))
|
||||||
@ -167,7 +167,7 @@ class SysWarehouseLocation(db.Model):
|
|||||||
full_path = db.Column(db.String(500)) # 完整路径,如 "A区/货架1/第3层"
|
full_path = db.Column(db.String(500)) # 完整路径,如 "A区/货架1/第3层"
|
||||||
level = db.Column(db.Integer, default=0) # 层级深度,顶级为0
|
level = db.Column(db.Integer, default=0) # 层级深度,顶级为0
|
||||||
is_enabled = db.Column(db.Boolean, default=True)
|
is_enabled = db.Column(db.Boolean, default=True)
|
||||||
created_at = db.Column(db.DateTime, default=datetime.now)
|
created_at = db.Column(db.DateTime, default=beijing_time)
|
||||||
# 注意:数据库表中没有 updated_at 字段,不要添加!
|
# 注意:数据库表中没有 updated_at 字段,不要添加!
|
||||||
|
|
||||||
# 自关联 - 使用 backref 定义父节点的反向引用
|
# 自关联 - 使用 backref 定义父节点的反向引用
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
from app.extensions import db
|
from app.extensions import db, beijing_time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
|
|
||||||
@ -14,7 +14,7 @@ class TransBorrow(db.Model):
|
|||||||
barcode = db.Column(db.String(100))
|
barcode = db.Column(db.String(100))
|
||||||
quantity = db.Column(db.Numeric(19, 4))
|
quantity = db.Column(db.Numeric(19, 4))
|
||||||
borrower_name = db.Column(db.String(100))
|
borrower_name = db.Column(db.String(100))
|
||||||
borrow_time = db.Column(db.DateTime, default=datetime.now)
|
borrow_time = db.Column(db.DateTime, default=beijing_time)
|
||||||
borrow_signature = db.Column(db.Text)
|
borrow_signature = db.Column(db.Text)
|
||||||
expected_return_time = db.Column(db.DateTime)
|
expected_return_time = db.Column(db.DateTime)
|
||||||
is_returned = db.Column(db.Boolean, default=False)
|
is_returned = db.Column(db.Boolean, default=False)
|
||||||
@ -110,7 +110,7 @@ class TransScrap(db.Model):
|
|||||||
quantity = db.Column(db.Numeric(19, 4))
|
quantity = db.Column(db.Numeric(19, 4))
|
||||||
reason = db.Column(db.Text)
|
reason = db.Column(db.Text)
|
||||||
operator_name = db.Column(db.String(100))
|
operator_name = db.Column(db.String(100))
|
||||||
operation_time = db.Column(db.DateTime, default=datetime.now)
|
operation_time = db.Column(db.DateTime, default=beijing_time)
|
||||||
approver_name = db.Column(db.String(100))
|
approver_name = db.Column(db.String(100))
|
||||||
approval_status = db.Column(db.String(20), default='pending')
|
approval_status = db.Column(db.String(20), default='pending')
|
||||||
cost_at_scrap = db.Column(db.Numeric(19, 4))
|
cost_at_scrap = db.Column(db.Numeric(19, 4))
|
||||||
|
|||||||
@ -53,7 +53,7 @@
|
|||||||
<el-tag>{{ scope.row.module }}</el-tag>
|
<el-tag>{{ scope.row.module }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="action" label="操作" width="100">
|
<el-table-column prop="action" label="操作类型" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tag :type="getActionType(scope.row.action)">{{ scope.row.action }}</el-tag>
|
<el-tag :type="getActionType(scope.row.action)">{{ scope.row.action }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
@ -63,10 +63,10 @@
|
|||||||
<el-table-column prop="created_at" label="操作时间" width="170" />
|
<el-table-column prop="created_at" label="操作时间" width="170" />
|
||||||
<el-table-column label="操作" width="120" fixed="right">
|
<el-table-column label="操作" width="120" fixed="right">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button v-if="scope.row.details" link type="primary" size="small" @click="handleViewDetails(scope.row)">
|
<el-button v-if="scope.row.details && Object.keys(scope.row.details).length > 0" link type="primary" size="small" @click="handleViewDetails(scope.row)">
|
||||||
详情
|
查看详情
|
||||||
</el-button>
|
</el-button>
|
||||||
<span v-else class="text-gray">-</span>
|
<span v-else style="color: #909399; font-size: 12px;">无变更明细</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|||||||
Reference in New Issue
Block a user