diff --git a/.gitea/workflows/build-service-server.yaml b/.gitea/workflows/build-service-server.yaml index 9c09511..c68901b 100644 --- a/.gitea/workflows/build-service-server.yaml +++ b/.gitea/workflows/build-service-server.yaml @@ -37,7 +37,7 @@ jobs: deploy: needs: build - runs-on: ubuntu-latest + runs-on: hongKong steps: - name: Download Artifact uses: actions/download-artifact@v3 diff --git a/src/api/ticket.js b/src/api/ticket.js index 47f9dbd..7ea0668 100644 --- a/src/api/ticket.js +++ b/src/api/ticket.js @@ -5,8 +5,13 @@ import request from "@/utils/request.js"; * @returns {Promise} */ -export function getTickerList(count, page, status) { - return request.get('/api/v1/admin/work_order/list', { count, page, status }) +export function getTickerList(count, page, status, orderBy, order) { + const params = { count, page } + if (status !== undefined && status !== '') params.status = status + if (orderBy) params.orderBy = orderBy + if (order) params.order = order + console.log('工单列表请求参数:', params) // 调试日志 + return request.get('/api/v1/admin/work_order/list', params) } // 待处理 diff --git a/src/config/menus.js b/src/config/menus.js index d889424..adabf4f 100644 --- a/src/config/menus.js +++ b/src/config/menus.js @@ -6,8 +6,14 @@ export const menus = [ }, { path: '/ticket', - title: '工单处理', - icon: 'DataBoard' + title: '工单管理', + icon: 'Tickets', + children: [ + { + path: '/ticket/list', + title: '工单列表' + } + ] }, { path: '/user', @@ -18,10 +24,6 @@ export const menus = [ path: '/user/list', title: '用户列表' }, - { - path: '/user/balance', - title: '用户余额管理' - }, { path: '/user/group', title: '用户组管理' diff --git a/src/router/index.js b/src/router/index.js index 61ae1b1..5af0bf8 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -39,7 +39,27 @@ const routes = [ title: '工单管理', icon: 'Tickets' }, - component: () => import('../views/ticket/TicketChat.vue'), + redirect: '/ticket/list', + children: [ + { + path: 'list', + name: 'TicketList', + component: () => import('../views/ticket/TicketList.vue'), + meta: { + title: '工单列表' + } + }, + { + path: 'detail', + name: 'TicketDetail', + component: () => import('../views/ticket/TicketDetail.vue'), + meta: { + title: '工单详情', + hidden: true, + activeMenu: '/ticket/list' + } + } + ] }, // ACS管理路由 diff --git a/src/views/product/ProductList.vue b/src/views/product/ProductList.vue index c950298..0ec3de4 100644 --- a/src/views/product/ProductList.vue +++ b/src/views/product/ProductList.vue @@ -706,7 +706,10 @@ const paramValueForm = reactive({ attr_id: undefined, attr_name: '', attr_value: '', - attr_price: 0 + attr_price: 0, + index: 0, + attr_range: 0, + range_type: 'equal' }) const paramValueRules = { @@ -853,7 +856,10 @@ const handleAddParamValue = () => { attr_id: undefined, attr_name: '', attr_value: '', - attr_price: 0 + attr_price: 0, + index: 0, + attr_range: 0, + range_type: 'equal' }) paramValueFormRef.value?.resetFields() } @@ -866,7 +872,10 @@ const handleEditParamValue = (row) => { attr_id: row.id, attr_name: row.name, attr_value: row.value, - attr_price: row.price / 100 + attr_price: row.price / 100, + index: row.index || 0, + attr_range: row.attr_range || 0, + range_type: row.range_type || 'equal' }) } @@ -900,7 +909,10 @@ const submitParamValueForm = () => { arg_id: Number(currentParam.value.id), attr_name: paramValueForm.attr_name, attr_value: paramValueForm.attr_value, - attr_price: paramValueForm.attr_price + attr_price: paramValueForm.attr_price, + index: Number(paramValueForm.index), + attr_range: Number(paramValueForm.attr_range), + range_type: paramValueForm.range_type } if (paramValueFormType.value === 'edit') { submitData.attr_id = paramValueForm.attr_id diff --git a/src/views/ticket/TicketDetail.vue b/src/views/ticket/TicketDetail.vue new file mode 100644 index 0000000..ce79c8c --- /dev/null +++ b/src/views/ticket/TicketDetail.vue @@ -0,0 +1,1322 @@ + + + + + diff --git a/src/views/ticket/TicketList.vue b/src/views/ticket/TicketList.vue new file mode 100644 index 0000000..64fd0d9 --- /dev/null +++ b/src/views/ticket/TicketList.vue @@ -0,0 +1,394 @@ + + + + + diff --git a/src/views/user/UserBalance.vue b/src/views/user/UserBalance.vue index 0bd1f4a..252784a 100644 --- a/src/views/user/UserBalance.vue +++ b/src/views/user/UserBalance.vue @@ -1,315 +1,112 @@ - - - diff --git a/src/views/user/UserDetail.vue b/src/views/user/UserDetail.vue index 3784779..f9f456e 100644 --- a/src/views/user/UserDetail.vue +++ b/src/views/user/UserDetail.vue @@ -393,6 +393,10 @@ const Edit = EditIcon const route = useRoute() const router = useRouter() +// 引入tagsViewStore +import { useTagsViewStore } from '@/store/tagsViewStore' +const tagsViewStore = useTagsViewStore() + // 用户信息 const userInfo = ref({}) const loading = ref(false) @@ -546,6 +550,8 @@ const refreshData = () => { // 返回上一页 const goBack = () => { + // 关闭当前tab + tagsViewStore.delVisitedView(route) router.go(-1) } diff --git a/src/views/user/UserList.vue b/src/views/user/UserList.vue index f298ae6..d3c8083 100644 --- a/src/views/user/UserList.vue +++ b/src/views/user/UserList.vue @@ -129,6 +129,7 @@ 修改密码 修改用户组 实名信息 + 余额管理 登录记录 操作记录 模拟登录 @@ -512,12 +513,24 @@ const fetchUserList = async () => { const res = await getUserList(queryParams) console.log("获取用户列表:", res) if (res.data.code === 200) { - userList.value = res.data.data.data || [] + // 映射 API 返回的字段到组件使用的字段格式 + userList.value = (res.data.data.data || []).map(user => ({ + UserId: user.user_id, + UserName: user.user_name, + Phone: user.phone, + Email: user.email, + Sex: user.sex, + Age: user.age, + IsAdmin: user.is_admin, + CoverID: user.cover_id, + avatarUrl: user.cover || '', // 直接使用 cover 字段作为头像 URL + UserGroup: user.user_group, + RealName: user.real_name, + IsDeleted: user.is_deleted, + CreatedAt: user.created_at + })) console.log("用户列表:", userList.value) total.value = res.data.data.all_count || 0 - - // 为每个用户加载头像URL - await loadAvatarsForUsers() } } catch (error) { ElMessage.error('获取用户列表失败') @@ -526,26 +539,6 @@ const fetchUserList = async () => { } } -// 为用户列表加载头像URL -const loadAvatarsForUsers = async () => { - const promises = userList.value.map(async (user) => { - if (user.CoverID) { - try { - const res = await getFileDetail({ file_id: user.CoverID }) - if (res.data.code === 200) { - user.avatarUrl = res.data.data.url - } - } catch (error) { - console.error('加载头像失败:', error) - user.avatarUrl = '' - } - } else { - user.avatarUrl = '' - } - }) - await Promise.all(promises) -} - // 查询用户列表 const handleQuery = () => { queryParams.page = 1 @@ -676,6 +669,9 @@ const handleCommand = (command, row) => { case 'realname': handleRealnameModify(row) break + case 'balance': + handleBalanceManage(row) + break case 'loginHistory': handleLoginHistory(row) break @@ -691,6 +687,14 @@ const handleCommand = (command, row) => { } } +// 余额管理 +const handleBalanceManage = (row) => { + router.push({ + path: '/user/balance', + query: { user_id: row.UserId } + }) +} + // 模拟登录 const handleSimulateLogin = async (row) => {