-
+
@@ -278,12 +312,18 @@ import { useAuthStore } from '@/stores/auth'
import { UserController } from './index.js'
import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus'
+import { ArrowLeft } from '@element-plus/icons-vue'
// 初始化
const { t } = useI18n()
const authStore = useAuthStore()
const userController = new UserController()
+// 导航方法
+const handleBack = () => {
+ window.history.back()
+}
+
// 响应式数据
const userData = ref({
role: authStore.user?.userRole == '2' ? 'creator' : 'free'
@@ -297,6 +337,17 @@ const pointsRecords = ref([])
const commissionRecords = ref([])
const settlementRecords = ref([])
+// 佣金结算统计数据
+const settlementStatistics = ref({
+ pendingSettlement: 0, // 待结算
+ unsettled: 0, // 未结算
+ settled: 0, // 已结算
+ pendingCommission: 0, // 待结算佣金
+ unsettledCommission: 0, // 未结算佣金
+ settledCommission: 0, // 已结算佣金
+ commissionRate: 0 // 佣金比例
+})
+
// 佣金记录总条数
const commissionTotal = ref(0)
const settlementTotal = ref(0)
@@ -305,7 +356,8 @@ const settlementTotal = ref(0)
const loading = ref({
points: false,
commission: false,
- settlement: false
+ settlement: false,
+ statistics: false
})
// 筛选条件
@@ -393,12 +445,12 @@ const fetchCommissionRecords = async () => {
isAsc: 'desc'
}
- // 只传递非空的筛选条件
+ // 只传递非空的筛选条件,并转换时间格式为 2026-02-13T00:00:00+08:00
if (filters.value.startTime) {
- params.startTime = filters.value.startTime
+ params.startTime = new Date(filters.value.startTime).toISOString().slice(0, 19) + '+08:00'
}
if (filters.value.endTime) {
- params.endTime = filters.value.endTime
+ params.endTime = new Date(filters.value.endTime).toISOString().slice(0, 19) + '+08:00'
}
if (filters.value.email) {
params.email = filters.value.email
@@ -406,7 +458,7 @@ const fetchCommissionRecords = async () => {
const response = await userController.getInviteCommissionRecords(params)
- if (response.code === 0 || response.code === 1073741824) {
+ if (response.code === 200 || response.code === 0) {
// 转换API返回的数据格式
commissionRecords.value = response.rows.map(item => ({
maskedEmail: item.maskedEmail,
@@ -452,6 +504,7 @@ const handleTabChange = (tabName) => {
fetchCommissionRecords()
} else if (tabName === 'settlement') {
fetchSettlementList()
+ fetchSettlementStatistics()
}
}
@@ -499,6 +552,38 @@ const fetchSettlementList = async () => {
}
}
+// 获取佣金结算统计信息
+const fetchSettlementStatistics = async () => {
+ if (userData.value.role !== 'creator') return
+
+ try {
+ loading.value.statistics = true
+ const response = await userController.getSettlementStatistics()
+
+ if (response.code === 0 || response.success) {
+ // 打印返回数据到控制台,方便查看字段格式
+ console.log('Settlement Statistics Response:', response)
+
+ // 保存统计数据
+ if (response.data) {
+ settlementStatistics.value = {
+ pendingSettlement: response.data.pending_amount || 0,
+ unsettled: response.data.unsettled_amount || 0,
+ settled: response.data.settled_amount || 0,
+ pendingCommission: response.data.pending_commission || 0,
+ unsettledCommission: response.data.unsettled_commission || 0,
+ settledCommission: response.data.settled_commission || 0,
+ commissionRate: response.data.commission_rate || 0
+ }
+ }
+ }
+ } catch (error) {
+ console.error('获取佣金结算统计信息失败:', error)
+ } finally {
+ loading.value.statistics = false
+ }
+}
+
// 申请结算弹窗处理
const handleApplySettlement = () => {
dialogVisible.value = true
@@ -562,11 +647,8 @@ const handleReset = () => {
// 页面挂载时获取数据
onMounted(() => {
- fetchPointsRecords()
- if (userData.value.role === 'creator') {
- fetchCommissionRecords()
- fetchSettlementList()
- }
+ // 只调用当前选中选项卡对应的接口
+ handleTabChange(activeTab.value)
})
@@ -583,6 +665,39 @@ onMounted(() => {
/* 页面标题 */
.page-header {
margin-bottom: 32px;
+ display: flex;
+ align-items: center;
+ gap: 16px;
+}
+
+.back-button {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ color: var(--text-primary, #1f2937);
+ font-size: 14px;
+ font-weight: 500;
+ padding: 8px 12px;
+ border-radius: 8px;
+ transition: all 0.3s ease;
+ background: rgba(139, 92, 246, 0.1);
+ border: 1px solid transparent;
+ color: #8B5CF6;
+}
+
+.back-button:hover {
+ background: rgba(139, 92, 246, 0.1);
+ color: #8B5CF6;
+ border-color: rgba(139, 92, 246, 0.2);
+}
+
+.back-button .el-icon {
+ font-size: 16px;
+ transition: transform 0.3s ease;
+}
+
+.back-button:hover .el-icon {
+ transform: translateX(-2px);
}
.page-header h1 {
@@ -593,6 +708,7 @@ onMounted(() => {
display: flex;
align-items: center;
gap: 12px;
+ flex: 1;
}
.page-header h1::before {
@@ -604,6 +720,17 @@ onMounted(() => {
border-radius: 2px;
}
+/* 暗色主题下的返回按钮 */
+html.dark .back-button {
+ color: #F3F4F6;
+}
+
+html.dark .back-button:hover {
+ background: rgba(139, 92, 246, 0.2);
+ color: #A78BFA;
+ border-color: rgba(139, 92, 246, 0.3);
+}
+
/* 选项卡样式 */
.invite-tabs {
margin-bottom: 24px;
@@ -728,8 +855,53 @@ onMounted(() => {
/* 结算记录头部样式 */
.settlement-header {
display: flex;
- justify-content: flex-end;
+ justify-content: space-between;
+ align-items: center;
margin-bottom: 24px;
+ padding: 20px;
+ background: rgba(107, 70, 193, 0.03);
+ border-radius: 12px;
+ border: 1px solid rgba(107, 70, 193, 0.1);
+}
+
+/* 结算统计信息样式 */
+.settlement-statistics {
+ display: flex;
+ justify-content: space-around;
+ gap: 40px;
+ flex: 1;
+}
+
+.stat-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.stat-label {
+ font-size: 14px;
+ color: var(--text-secondary, #6B7280);
+ margin-bottom: 8px;
+}
+
+.stat-value {
+ font-size: 24px;
+ font-weight: 700;
+ color: #8B5CF6;
+}
+
+/* 暗色主题下的结算统计样式 */
+html.dark .settlement-header {
+ background: rgba(139, 92, 246, 0.1);
+ border-color: rgba(139, 92, 246, 0.2);
+}
+
+html.dark .stat-label {
+ color: #9CA3AF;
+}
+
+html.dark .stat-value {
+ color: #A78BFA;
}
/* 响应式设计 */
@@ -741,6 +913,15 @@ onMounted(() => {
.page-header h1 {
font-size: 20px;
}
+
+ .back-button {
+ padding: 6px 10px;
+ font-size: 13px;
+ }
+
+ .back-button .el-icon {
+ font-size: 14px;
+ }
.details-table th,
.details-table td {
@@ -757,9 +938,20 @@ onMounted(() => {
}
.settlement-header {
+ flex-direction: column;
+ gap: 16px;
justify-content: center;
margin-bottom: 16px;
}
+
+ .settlement-statistics {
+ gap: 20px;
+ margin-bottom: 16px;
+ }
+
+ .stat-value {
+ font-size: 20px;
+ }
}
/* 暗色主题支持 */
diff --git a/openspec/changes/create-admin-dashboard/design.md b/openspec/changes/create-admin-dashboard/design.md
index e5c1363..96c0800 100644
--- a/openspec/changes/create-admin-dashboard/design.md
+++ b/openspec/changes/create-admin-dashboard/design.md
@@ -21,7 +21,7 @@ AdminLayout.vue (根布局)
/login - 登录页面
/admin - 管理后台根路径
├── /admin/dashboard - 仪表板
- ├── /admin/content-review - 内容审核
+ ├── /admin/orders/content-review - 内容审核
├── /admin/orders - 订单管理
└── /admin/users - 用户管理
```
diff --git a/openspec/changes/create-admin-dashboard/specs/admin-pages/spec.md b/openspec/changes/create-admin-dashboard/specs/admin-pages/spec.md
index c5b8ada..d97640f 100644
--- a/openspec/changes/create-admin-dashboard/specs/admin-pages/spec.md
+++ b/openspec/changes/create-admin-dashboard/specs/admin-pages/spec.md
@@ -8,7 +8,7 @@
**Then** 显示包含统计卡片、图表区域、快捷操作的仪表板布局
#### Scenario: 内容审核页面展示
-**Given** 用户访问 `/admin/content-review`
+**Given** 用户访问 `/admin/orders/content-review`
**When** 页面加载
**Then** 显示内容审核列表、筛选功能、审核操作按钮的页面结构
diff --git a/openspec/changes/create-disassembly-workflow/specs/shipping-step/spec.md b/openspec/changes/create-disassembly-workflow/specs/shipping-step/spec.md
index 9fd5b7e..1db28b4 100644
--- a/openspec/changes/create-disassembly-workflow/specs/shipping-step/spec.md
+++ b/openspec/changes/create-disassembly-workflow/specs/shipping-step/spec.md
@@ -176,7 +176,7 @@ const submitShipping = async () => {
// 跳转到完成页面或返回列表
setTimeout(() => {
- router.push('/admin/content-review')
+ router.push('/admin/orders/content-review')
}, 2000)
} catch (error) {
diff --git a/packages/utils/src/api/FrontendDesigner/index.js b/packages/utils/src/api/FrontendDesigner/index.js
index 4429a37..fa64749 100644
--- a/packages/utils/src/api/FrontendDesigner/index.js
+++ b/packages/utils/src/api/FrontendDesigner/index.js
@@ -11,7 +11,7 @@ import configuration from './configuration.js';
import seriespriceConfig from './seriespriceConfig.js';
import voucher from './voucher.js';
import agent from './agent.js';
-
+import shop from './shop.js';
export default {
...login,
...order,
@@ -26,4 +26,5 @@ export default {
...seriespriceConfig,
...voucher,
...agent,
+ ...shop,
};
\ No newline at end of file
diff --git a/packages/utils/src/api/FrontendDesigner/permission.js b/packages/utils/src/api/FrontendDesigner/permission.js
index 3d42c96..9158839 100644
--- a/packages/utils/src/api/FrontendDesigner/permission.js
+++ b/packages/utils/src/api/FrontendDesigner/permission.js
@@ -11,8 +11,10 @@ const permission = {
assignPermissionToRole: {url: '/api-base/admin/permission/assign/{roleId}', method: 'POST', isLoading: true},//为角色分配权限
getPermissionDetail: {url: '/api-base/admin/permission/{permissionId}', method: 'GET', isLoading: true},//查询权限详情
deletePermission: {url: '/api-base/admin/permission/{permissionId}', method: 'DELETE', isLoading: true},//删除权限
+ // getPermissionList: {url: '/api-base/admin/permission/list', method: 'GET', isLoading: true},//查询权限列表
getPermissionList: {url: '/api-base/admin/permission/list', method: 'GET', isLoading: true},//查询权限列表
- getPermissionCodesByUserId: {url: '/api-base/admin/permission/codes/user/{userId}', method: 'GET', isLoading: true},//根据用户ID查询权限代码集合
+ // getPermissionCodesByUserId: {url: '/api-base/admin/permission/codes/user/{userId}', method: 'GET', isLoading: true},//根据用户ID查询权限代码集合
+ getPermissionCodesByUserId: {url: '/api-base/admin/permission/codes/current', method: 'GET', isLoading: true},//根据用户ID查询权限代码集合
getPermissionCodesByRoleId: {url: '/api-base/admin/permission/role/{roleId}', method: 'GET', isLoading: true},//根据角色ID查询权限代码集合
updateAdminUser: {url: '/api-base/admin/admin-user/update', method: 'POST', isLoading: true},//更新管理员用户
toggleAdminUserStatus: {url: '/api-base/admin/admin-user/toggle-status/{userId}', method: 'POST', isLoading: true},//启用/禁用用户
diff --git a/packages/utils/src/api/FrontendDesigner/shop.js b/packages/utils/src/api/FrontendDesigner/shop.js
new file mode 100644
index 0000000..9d9d235
--- /dev/null
+++ b/packages/utils/src/api/FrontendDesigner/shop.js
@@ -0,0 +1,21 @@
+const shop = {
+ updateShopStatus:{url:'/api-base/admin/shop/{id}/status',method:'POST'},// 更新店铺状态
+ updateBusinessStatus:{url:'/api-base/admin/shop/{id}/business-status',method:'POST'},// 更新营业状态
+ updateShop:{url:'/api-base/admin/shop/update/{id}',method:'POST'},// 更新店铺
+ deleteShop:{url:'/api-base/admin/shop/delete/{id}',method:'POST'},// 删除店铺
+ createShop:{url:'/api-base/admin/shop/create',method:'POST'},// 创建店铺
+ batchDeleteShop:{url:'/api-base/admin/shop/batch-delete',method:'POST'},// 批量删除店铺
+ getShopDetail:{url:'/api-base/admin/shop/{id}',method:'GET'},// 查询店铺详情
+ getShopList:{url:'/api-base/admin/shop/list',method:'GET'},// 分页查询店铺列表
+ // 店铺员工相关接口
+ createShopEmployee:{url:'/api-base/admin/shop-employee',method:'POST'},// 创建员工
+ updateWorkStatus:{url:'/api-base/admin/shop-employee/{id}/work-status',method:'POST'},// 更新工作状态
+ updateEmployeeStatus:{url:'/api-base/admin/shop-employee/{id}/status',method:'POST'},// 更新员工状态
+ employeeResign:{url:'/api-base/admin/shop-employee/{id}/resign',method:'POST'},// 员工离职
+ updateEmployee:{url:'/api-base/admin/shop-employee/update/{id}',method:'POST'},// 更新员工
+ deleteEmployee:{url:'/api-base/admin/shop-employee/delete/{id}',method:'POST'},// 删除员工
+ batchDeleteEmployee:{url:'/api-base/admin/shop-employee/batch-delete',method:'POST'},// 批量删除员工
+ getEmployeeById:{url:'/api-base/admin/shop-employee/{id}',method:'GET'},// 根据ID查询员工
+ getEmployeeList:{url:'/api-base/admin/shop-employee/list',method:'GET'},// 分页查询员工列表
+}
+export default shop;
diff --git a/packages/utils/src/api/FrontendDesigner/user.js b/packages/utils/src/api/FrontendDesigner/user.js
index 2dd374f..e603638 100644
--- a/packages/utils/src/api/FrontendDesigner/user.js
+++ b/packages/utils/src/api/FrontendDesigner/user.js
@@ -9,5 +9,9 @@ const order = {
generateInviteCode:{url:'/api-base/admin/invite-code/generate',method:'POST',isLoading:true},//为用户生成邀请码(支持批量生成)
deleteInviteCode:{url:'/api-base/admin/invite-code/CODEID',method:'DELETE',isLoading:true},//根据邀请码ID删除邀请码
getOperationLogList:{url:'/api-base/admin/operation-log/list',method:'GET'},//分页查询操作日志列表
+ getSettlementList:{url:'/api-core/admin/order/commission-settlement/list',method:'POST'},//获取结算申请列表
+ approveSettlement:{url:'/api-core/admin/order/commission-settlement/approve',method:'POST'},//审核通过结算申请
+ rejectSettlement:{url:'/api-core/admin/order/commission-settlement/reject',method:'POST'},//审核拒绝结算申请
+ getSettlementOrders:{url:'/api-core/admin/order/commission-settlement/orders',method:'POST'},//根据结算ID获取订单列表
}
export default order;
\ No newline at end of file
diff --git a/packages/utils/src/api/frontend/index.js b/packages/utils/src/api/frontend/index.js
index 59d7b22..a7e0eba 100644
--- a/packages/utils/src/api/frontend/index.js
+++ b/packages/utils/src/api/frontend/index.js
@@ -9,6 +9,7 @@ import logistics from './logistics.js';
import agent from './agent.js';
import rechargeconfig from './rechargeconfig.js';
import voucher from './voucher.js';
+import shop from './shop.js';
export default {
...meshy,
...login,
@@ -21,4 +22,5 @@ export default {
...agent,
...rechargeconfig,
...voucher,
+ ...shop,
};
\ No newline at end of file
diff --git a/packages/utils/src/api/frontend/shop.js b/packages/utils/src/api/frontend/shop.js
new file mode 100644
index 0000000..379b746
--- /dev/null
+++ b/packages/utils/src/api/frontend/shop.js
@@ -0,0 +1,4 @@
+const login = {
+ getNearbyShops:{url:'/api-base/shops/nearby',method:'GET'},// 查询店铺
+}
+export default login;
diff --git a/packages/utils/src/api/frontend/user.js b/packages/utils/src/api/frontend/user.js
index 6bfcb06..94620e9 100644
--- a/packages/utils/src/api/frontend/user.js
+++ b/packages/utils/src/api/frontend/user.js
@@ -10,5 +10,6 @@ const login = {
INVITE_COMMISSION_RECORDS:{url:'/api-base/user/invite/commission-records',method:'GET',isLoading:true},// 返回邀请的用户佣金记录
COMMISSION_SETTLEMENT_APPLY:{url:'/api-core/front/user/commission-settlement/apply',method:'POST',isLoading:true},// 申请结算佣金 - 只能结算已完成30天的订单
COMMISSION_SETTLEMENT_LIST:{url:'/api-core/front/user/commission-settlement/list',method:'GET',isLoading:true},// 获取结算申请列表
+ COMMISSION_SETTLEMENT_STATISTICS:{url:'/api-core/front/user/commission-settlement/statistics',method:'GET',isLoading:true},// 获取佣金结算统计信息:待结算金额、未结算金额、已结算金额
}
export default login;
diff --git a/packages/utils/src/servers/payserver.js b/packages/utils/src/servers/payserver.js
index bfce7f3..c09786b 100644
--- a/packages/utils/src/servers/payserver.js
+++ b/packages/utils/src/servers/payserver.js
@@ -155,6 +155,7 @@ export class PayServer {
payReducerUrl = `${window.location.origin}/#/order-management`
pamras = {
product_id: orderInfo.product_id,
+ shop_id: orderInfo.shop_id || '',
"methods": [
"card"
],
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 376d056..72dd082 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -56,6 +56,9 @@ importers:
'@types/three':
specifier: ^0.180.0
version: 0.180.0
+ element-china-area-data:
+ specifier: ^6.1.0
+ version: 6.1.0
element-plus:
specifier: ^2.11.7
version: 2.11.7(vue@3.5.24)
@@ -1735,6 +1738,10 @@ packages:
supports-color: 7.2.0
dev: true
+ /china-division@2.7.0:
+ resolution: {integrity: sha512-4uUPAT+1WfqDh5jytq7omdCmHNk3j+k76zEG/2IqaGcYB90c2SwcixttcypdsZ3T/9tN1TTpBDoeZn+Yw/qBEA==}
+ dev: false
+
/chokidar@4.0.3:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
@@ -1962,6 +1969,12 @@ packages:
resolution: {integrity: sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==}
dev: true
+ /element-china-area-data@6.1.0:
+ resolution: {integrity: sha512-IkpcjwQv2A/2AxFiSoaISZ+oMw1rZCPUSOg5sOCwT5jKc96TaawmKZeY81xfxXsO0QbKxU5LLc6AirhG52hUmg==}
+ dependencies:
+ china-division: 2.7.0
+ dev: false
+
/element-plus@2.11.7(vue@3.5.24):
resolution: {integrity: sha512-Bh47wuzsqaNBNDkbtlOlZER1cGcOB8GsXp/+C9b95MOrk0wvoHUV4NKKK7xMkfYNFYdYysQ752oMhnExgAL6+g==}
peerDependencies: