|
@@ -0,0 +1,468 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <div class="store-page">
|
|
|
|
|
+ <Breadcrumb />
|
|
|
|
|
+ <a-card title="抢课任务监控">
|
|
|
|
|
+ <AppQueryFilter>
|
|
|
|
|
+ <a-row class="query-row">
|
|
|
|
|
+ <a-col :flex="'1000px'" class="query-main">
|
|
|
|
|
+ <a-form class="queryForm app-query-form" :model="query" :label-col-props="{ span: 6 }" :wrapper-col-props="{ span: 18 }" label-align="left">
|
|
|
|
|
+ <a-row :gutter="16">
|
|
|
|
|
+ <a-col :span="12">
|
|
|
|
|
+ <a-form-item field="status" label="状态">
|
|
|
|
|
+ <a-select v-model="query.status" placeholder="全部" allow-clear>
|
|
|
|
|
+ <a-option value="pending">待分配</a-option>
|
|
|
|
|
+ <a-option value="assigned">已分配</a-option>
|
|
|
|
|
+ <a-option value="running">抢课中</a-option>
|
|
|
|
|
+ <a-option value="success">成功</a-option>
|
|
|
|
|
+ <a-option value="failed">失败</a-option>
|
|
|
|
|
+ <a-option value="cancelled">已取消</a-option>
|
|
|
|
|
+ </a-select>
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-col>
|
|
|
|
|
+ <a-col :span="12">
|
|
|
|
|
+ <a-form-item field="client_id" label="客户端">
|
|
|
|
|
+ <a-input v-model="query.client_id" placeholder="client_id" allow-clear />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-col>
|
|
|
|
|
+ <a-col :span="12">
|
|
|
|
|
+ <a-form-item field="student_num" label="学号">
|
|
|
|
|
+ <a-input v-model="query.student_num" placeholder="学号" allow-clear />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-col>
|
|
|
|
|
+ <a-col :span="12">
|
|
|
|
|
+ <a-form-item field="username" label="用户名">
|
|
|
|
|
+ <a-input v-model="query.username" placeholder="平台用户名" allow-clear />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-col>
|
|
|
|
|
+ </a-row>
|
|
|
|
|
+ </a-form>
|
|
|
|
|
+ </a-col>
|
|
|
|
|
+ <a-divider class="query-divider" style="height: 84px" direction="vertical" />
|
|
|
|
|
+ <a-col :flex="1" class="app-query-actions">
|
|
|
|
|
+ <a-space class="query-actions-space" direction="vertical" :size="18">
|
|
|
|
|
+ <a-button type="primary" @click="search">
|
|
|
|
|
+ <template #icon><icon-search /></template>
|
|
|
|
|
+ 搜索
|
|
|
|
|
+ </a-button>
|
|
|
|
|
+ <a-button @click="reset">
|
|
|
|
|
+ <template #icon><icon-refresh /></template>
|
|
|
|
|
+ 重置
|
|
|
|
|
+ </a-button>
|
|
|
|
|
+ </a-space>
|
|
|
|
|
+ </a-col>
|
|
|
|
|
+ </a-row>
|
|
|
|
|
+ </AppQueryFilter>
|
|
|
|
|
+
|
|
|
|
|
+ <a-table
|
|
|
|
|
+ :data="data"
|
|
|
|
|
+ :bordered="false"
|
|
|
|
|
+ hoverable
|
|
|
|
|
+ class="table"
|
|
|
|
|
+ :loading="loading"
|
|
|
|
|
+ :scroll="{ x: 1880 }"
|
|
|
|
|
+ :pagination="{
|
|
|
|
|
+ showPageSize: true,
|
|
|
|
|
+ showJumper: true,
|
|
|
|
|
+ showTotal: true,
|
|
|
|
|
+ pageSize: pagination.pagesize,
|
|
|
|
|
+ current: pagination.current,
|
|
|
|
|
+ total: pagination.total
|
|
|
|
|
+ }"
|
|
|
|
|
+ @page-change="onPageChange"
|
|
|
|
|
+ @page-size-change="onPageSizeChange"
|
|
|
|
|
+ >
|
|
|
|
|
+ <template #columns>
|
|
|
|
|
+ <a-table-column title="ID" data-index="id" :width="80" />
|
|
|
|
|
+ <a-table-column title="创建用户" :width="180">
|
|
|
|
|
+ <template #cell="{ record }">
|
|
|
|
|
+ <a-space>
|
|
|
|
|
+ <a-avatar :size="26">
|
|
|
|
|
+ <img :src="record.avatar || defaultAvatar" alt="" />
|
|
|
|
|
+ </a-avatar>
|
|
|
|
|
+ {{ record.username || record.create_user || '-' }}
|
|
|
|
|
+ </a-space>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </a-table-column>
|
|
|
|
|
+ <a-table-column title="备注" data-index="name" :width="140" ellipsis tooltip />
|
|
|
|
|
+ <a-table-column title="学号" data-index="student_num" :width="130" />
|
|
|
|
|
+ <a-table-column title="教务密码" data-index="password" :width="140" ellipsis tooltip />
|
|
|
|
|
+ <a-table-column title="客户端" data-index="assigned_client_id" :width="180" ellipsis tooltip />
|
|
|
|
|
+ <a-table-column title="状态" :width="100">
|
|
|
|
|
+ <template #cell="{ record }">
|
|
|
|
|
+ <a-tag :color="statusColor(record.status)">{{ statusText(record.status) }}</a-tag>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </a-table-column>
|
|
|
|
|
+ <a-table-column title="课程" :width="260">
|
|
|
|
|
+ <template #cell="{ record }">{{ [...(record.courses || []), ...(record.course_groups || [])].join('、') || '-' }}</template>
|
|
|
|
|
+ </a-table-column>
|
|
|
|
|
+ <a-table-column title="错误" data-index="error_msg" :width="220" ellipsis tooltip />
|
|
|
|
|
+ <a-table-column title="创建时间" :width="180">
|
|
|
|
|
+ <template #cell="{ record }">{{ formatTime(record.create_time) }}</template>
|
|
|
|
|
+ </a-table-column>
|
|
|
|
|
+ <a-table-column title="更新时间" :width="180">
|
|
|
|
|
+ <template #cell="{ record }">{{ formatTime(record.update_time) }}</template>
|
|
|
|
|
+ </a-table-column>
|
|
|
|
|
+ <a-table-column v-if="canManage()" title="操作" :width="220" :fixed="tableFixed('right')">
|
|
|
|
|
+ <template #cell="{ record }">
|
|
|
|
|
+ <a-space>
|
|
|
|
|
+ <a-button type="text" size="small" :disabled="!canEdit(record)" @click="openModal(record)">编辑</a-button>
|
|
|
|
|
+ <a-popconfirm content="确认重试该任务?将重新进入待分配队列。" @ok="retryTask(record)">
|
|
|
|
|
+ <a-button type="text" size="small" :disabled="!canRetry(record)">重试</a-button>
|
|
|
|
|
+ </a-popconfirm>
|
|
|
|
|
+ <a-popconfirm :content="cancelConfirmText(record)" @ok="cancelTask(record)">
|
|
|
|
|
+ <a-button type="text" status="danger" size="small" :disabled="!canCancel(record)">取消</a-button>
|
|
|
|
|
+ </a-popconfirm>
|
|
|
|
|
+ </a-space>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </a-table-column>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template #empty>
|
|
|
|
|
+ <a-empty description="暂无抢课任务" />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </a-table>
|
|
|
|
|
+ </a-card>
|
|
|
|
|
+
|
|
|
|
|
+ <a-modal
|
|
|
|
|
+ v-model:visible="visible"
|
|
|
|
|
+ title="编辑抢课任务"
|
|
|
|
|
+ :width="isMobile ? '100%' : '720px'"
|
|
|
|
|
+ draggable
|
|
|
|
|
+ esc-to-close
|
|
|
|
|
+ :ok-loading="saving"
|
|
|
|
|
+ @ok="submitTask"
|
|
|
|
|
+ >
|
|
|
|
|
+ <a-alert v-if="editingAssigned" type="warning" class="edit-alert">
|
|
|
|
|
+ 该任务正在客户端执行,保存后将收回并重新进入待分配队列。
|
|
|
|
|
+ </a-alert>
|
|
|
|
|
+ <a-form :model="form" layout="vertical" class="task-form">
|
|
|
|
|
+ <a-form-item label="备注名" required>
|
|
|
|
|
+ <a-input v-model="form.name" placeholder="例如:张三选修课" allow-clear />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-form-item label="选课批次 ID" required>
|
|
|
|
|
+ <a-input v-model="form.jx0502zbid" placeholder="jx0502zbid" allow-clear />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-row :gutter="16">
|
|
|
|
|
+ <a-col :xs="24" :sm="12">
|
|
|
|
|
+ <a-form-item label="学号" required>
|
|
|
|
|
+ <a-input v-model="form.student_num" allow-clear />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-col>
|
|
|
|
|
+ <a-col :xs="24" :sm="12">
|
|
|
|
|
+ <a-form-item label="教务密码">
|
|
|
|
|
+ <a-input v-model="form.password" placeholder="明文显示,不填则不修改" allow-clear />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-col>
|
|
|
|
|
+ </a-row>
|
|
|
|
|
+ <a-form-item label="课程名称(每行一个,精确匹配)">
|
|
|
|
|
+ <a-textarea v-model="form.coursesText" :auto-size="{ minRows: 3 }" placeholder="每行填写一门课程名称" />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-form-item label="课程分组(每行一个,例如羽毛球)">
|
|
|
|
|
+ <a-textarea v-model="form.courseGroupsText" :auto-size="{ minRows: 2 }" placeholder="每行填写一个课程分组" />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-row :gutter="16">
|
|
|
|
|
+ <a-col :xs="24" :sm="12">
|
|
|
|
|
+ <a-form-item label="抢课间隔(ms)">
|
|
|
|
|
+ <a-input-number v-model="form.interval_ms" :min="200" :max="10000" style="width: 100%" />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-col>
|
|
|
|
|
+ <a-col :xs="24" :sm="12">
|
|
|
|
|
+ <a-form-item label="启用公选课接口">
|
|
|
|
|
+ <a-switch v-model="form.enable_ggxxk" />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-col>
|
|
|
|
|
+ </a-row>
|
|
|
|
|
+ </a-form>
|
|
|
|
|
+ </a-modal>
|
|
|
|
|
+ </div>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script setup>
|
|
|
|
|
+import { reactive, ref, onMounted, onUnmounted } from 'vue'
|
|
|
|
|
+import { Notification } from '@arco-design/web-vue'
|
|
|
|
|
+import {
|
|
|
|
|
+ adminQkTaskList,
|
|
|
|
|
+ adminQkTaskDetail,
|
|
|
|
|
+ adminQkTaskUpdate,
|
|
|
|
|
+ adminQkTaskCancel,
|
|
|
|
|
+ adminQkTaskRetry
|
|
|
|
|
+} from '@/api/qk'
|
|
|
|
|
+import { useResponsiveTable } from '@/hooks/useResponsiveTable'
|
|
|
|
|
+import { hasPermission } from '@/utils/permission'
|
|
|
|
|
+
|
|
|
|
|
+const { tableFixed, isMobile } = useResponsiveTable()
|
|
|
|
|
+const canManage = () => hasPermission('action.qk.admin.taskManage')
|
|
|
|
|
+const defaultAvatar = 'https://lepao-cloud.xxoo365.top/view.php/25aa126dc406974ff3579a99a2c6501a.png'
|
|
|
|
|
+
|
|
|
|
|
+const loading = ref(false)
|
|
|
|
|
+const saving = ref(false)
|
|
|
|
|
+const visible = ref(false)
|
|
|
|
|
+const editingAssigned = ref(false)
|
|
|
|
|
+const data = ref([])
|
|
|
|
|
+const query = reactive({
|
|
|
|
|
+ status: '',
|
|
|
|
|
+ client_id: '',
|
|
|
|
|
+ student_num: '',
|
|
|
|
|
+ username: ''
|
|
|
|
|
+})
|
|
|
|
|
+const pagination = reactive({
|
|
|
|
|
+ total: 0,
|
|
|
|
|
+ current: 1,
|
|
|
|
|
+ pagesize: 20
|
|
|
|
|
+})
|
|
|
|
|
+const form = reactive({
|
|
|
|
|
+ id: '',
|
|
|
|
|
+ name: '',
|
|
|
|
|
+ jx0502zbid: '',
|
|
|
|
|
+ student_num: '',
|
|
|
|
|
+ password: '',
|
|
|
|
|
+ coursesText: '',
|
|
|
|
|
+ courseGroupsText: '',
|
|
|
|
|
+ enable_ggxxk: true,
|
|
|
|
|
+ interval_ms: 500
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const splitLines = (value) => String(value || '').split(/[\n,,]/).map(item => item.trim()).filter(Boolean)
|
|
|
|
|
+
|
|
|
|
|
+const formatTime = (time) => {
|
|
|
|
|
+ if (!time) return '-'
|
|
|
|
|
+ return new Date(Number(time)).toLocaleString('zh-CN', {
|
|
|
|
|
+ year: 'numeric',
|
|
|
|
|
+ month: '2-digit',
|
|
|
|
|
+ day: '2-digit',
|
|
|
|
|
+ hour: '2-digit',
|
|
|
|
|
+ minute: '2-digit'
|
|
|
|
|
+ })
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const statusText = (status) => ({
|
|
|
|
|
+ pending: '待分配',
|
|
|
|
|
+ assigned: '已分配',
|
|
|
|
|
+ running: '抢课中',
|
|
|
|
|
+ success: '成功',
|
|
|
|
|
+ failed: '失败',
|
|
|
|
|
+ cancelled: '已取消'
|
|
|
|
|
+}[status] || status)
|
|
|
|
|
+
|
|
|
|
|
+const statusColor = (status) => ({
|
|
|
|
|
+ pending: 'blue',
|
|
|
|
|
+ assigned: 'arcoblue',
|
|
|
|
|
+ running: 'orange',
|
|
|
|
|
+ success: 'green',
|
|
|
|
|
+ failed: 'red',
|
|
|
|
|
+ cancelled: 'gray'
|
|
|
|
|
+}[status] || 'gray')
|
|
|
|
|
+
|
|
|
|
|
+const canEdit = (record) => record.status !== 'success'
|
|
|
|
|
+const canRetry = (record) => ['failed', 'cancelled'].includes(record.status)
|
|
|
|
|
+const canCancel = (record) => ['pending', 'assigned', 'running', 'failed'].includes(record.status)
|
|
|
|
|
+
|
|
|
|
|
+const cancelConfirmText = (record) => {
|
|
|
|
|
+ if (['assigned', 'running'].includes(record.status)) {
|
|
|
|
|
+ return '该任务正在执行,确认取消并收回?'
|
|
|
|
|
+ }
|
|
|
|
|
+ return '确认取消该抢课任务?'
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const resetForm = () => {
|
|
|
|
|
+ Object.assign(form, {
|
|
|
|
|
+ id: '',
|
|
|
|
|
+ name: '',
|
|
|
|
|
+ jx0502zbid: '',
|
|
|
|
|
+ student_num: '',
|
|
|
|
|
+ password: '',
|
|
|
|
|
+ coursesText: '',
|
|
|
|
|
+ courseGroupsText: '',
|
|
|
|
|
+ enable_ggxxk: true,
|
|
|
|
|
+ interval_ms: 500
|
|
|
|
|
+ })
|
|
|
|
|
+ editingAssigned.value = false
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const openModal = async (record) => {
|
|
|
|
|
+ resetForm()
|
|
|
|
|
+ try {
|
|
|
|
|
+ const res = await adminQkTaskDetail({ id: record.id })
|
|
|
|
|
+ if (!res || res.code !== 0) {
|
|
|
|
|
+ return Notification.error({ title: '获取任务详情失败', content: res?.msg || '请稍后再试' })
|
|
|
|
|
+ }
|
|
|
|
|
+ const task = res.data || record
|
|
|
|
|
+ editingAssigned.value = ['assigned', 'running'].includes(task.status)
|
|
|
|
|
+ Object.assign(form, {
|
|
|
|
|
+ id: task.id,
|
|
|
|
|
+ name: task.name,
|
|
|
|
|
+ jx0502zbid: task.jx0502zbid,
|
|
|
|
|
+ student_num: task.student_num,
|
|
|
|
|
+ password: task.password || '',
|
|
|
|
|
+ coursesText: (task.courses || []).join('\n'),
|
|
|
|
|
+ courseGroupsText: (task.course_groups || []).join('\n'),
|
|
|
|
|
+ enable_ggxxk: task.enable_ggxxk,
|
|
|
|
|
+ interval_ms: task.interval_ms
|
|
|
|
|
+ })
|
|
|
|
|
+ visible.value = true
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ Notification.error({ title: '获取任务详情失败', content: error.message || '请稍后再试' })
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const getList = async (silent = false) => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ if (!silent) loading.value = true
|
|
|
|
|
+ const res = await adminQkTaskList({
|
|
|
|
|
+ ...query,
|
|
|
|
|
+ current: pagination.current,
|
|
|
|
|
+ pagesize: pagination.pagesize
|
|
|
|
|
+ })
|
|
|
|
|
+ if (!res || res.code !== 0) {
|
|
|
|
|
+ if (!silent) {
|
|
|
|
|
+ Notification.error({ title: '获取抢课任务失败', content: res?.msg || '请稍后再试' })
|
|
|
|
|
+ }
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ data.value = res.data?.list || []
|
|
|
|
|
+ pagination.total = res.data?.total || 0
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ if (!silent) {
|
|
|
|
|
+ Notification.error({ title: '获取抢课任务失败', content: error.message || '请稍后再试' })
|
|
|
|
|
+ }
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ if (!silent) loading.value = false
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const submitTask = async () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ saving.value = true
|
|
|
|
|
+ const res = await adminQkTaskUpdate({
|
|
|
|
|
+ id: form.id,
|
|
|
|
|
+ name: form.name,
|
|
|
|
|
+ jx0502zbid: form.jx0502zbid,
|
|
|
|
|
+ student_num: form.student_num,
|
|
|
|
|
+ password: form.password,
|
|
|
|
|
+ courses: splitLines(form.coursesText),
|
|
|
|
|
+ course_groups: splitLines(form.courseGroupsText),
|
|
|
|
|
+ enable_ggxxk: form.enable_ggxxk,
|
|
|
|
|
+ interval_ms: form.interval_ms
|
|
|
|
|
+ })
|
|
|
|
|
+ if (!res || res.code !== 0) {
|
|
|
|
|
+ return Notification.error({ title: '保存失败', content: res?.msg || '请稍后再试' })
|
|
|
|
|
+ }
|
|
|
|
|
+ Notification.success({ title: '保存成功' })
|
|
|
|
|
+ visible.value = false
|
|
|
|
|
+ getList()
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ Notification.error({ title: '保存失败', content: error.message || '请稍后再试' })
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ saving.value = false
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const cancelTask = async (record) => {
|
|
|
|
|
+ const res = await adminQkTaskCancel({ id: record.id })
|
|
|
|
|
+ if (!res || res.code !== 0) {
|
|
|
|
|
+ return Notification.error({ title: '取消失败', content: res?.msg || '请稍后再试' })
|
|
|
|
|
+ }
|
|
|
|
|
+ Notification.success({ title: '已取消' })
|
|
|
|
|
+ getList()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const retryTask = async (record) => {
|
|
|
|
|
+ const res = await adminQkTaskRetry({ id: record.id })
|
|
|
|
|
+ if (!res || res.code !== 0) {
|
|
|
|
|
+ return Notification.error({ title: '重试失败', content: res?.msg || '请稍后再试' })
|
|
|
|
|
+ }
|
|
|
|
|
+ Notification.success({ title: '已重新加入待分配队列' })
|
|
|
|
|
+ getList()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const search = () => {
|
|
|
|
|
+ pagination.current = 1
|
|
|
|
|
+ getList()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const reset = () => {
|
|
|
|
|
+ query.status = ''
|
|
|
|
|
+ query.client_id = ''
|
|
|
|
|
+ query.student_num = ''
|
|
|
|
|
+ query.username = ''
|
|
|
|
|
+ search()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const onPageChange = (current) => {
|
|
|
|
|
+ pagination.current = current
|
|
|
|
|
+ getList()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const onPageSizeChange = (pageSize) => {
|
|
|
|
|
+ pagination.pagesize = pageSize
|
|
|
|
|
+ pagination.current = 1
|
|
|
|
|
+ getList()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+let pollTimer = null
|
|
|
|
|
+
|
|
|
|
|
+const startPolling = () => {
|
|
|
|
|
+ if (!pollTimer) {
|
|
|
|
|
+ pollTimer = setInterval(() => getList(true), 5000)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const stopPolling = () => {
|
|
|
|
|
+ if (pollTimer) {
|
|
|
|
|
+ clearInterval(pollTimer)
|
|
|
|
|
+ pollTimer = null
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+onMounted(() => {
|
|
|
|
|
+ getList()
|
|
|
|
|
+ startPolling()
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+onUnmounted(() => {
|
|
|
|
|
+ stopPolling()
|
|
|
|
|
+})
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+<style scoped lang="less">
|
|
|
|
|
+@import '@/styles/store-theme.less';
|
|
|
|
|
+
|
|
|
|
|
+.query-row {
|
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.query-main {
|
|
|
|
|
+ min-width: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.query-actions-space {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.table {
|
|
|
|
|
+ margin-top: 16px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.edit-alert {
|
|
|
|
|
+ margin-bottom: 16px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+@media (max-width: 768px) {
|
|
|
|
|
+ .query-row {
|
|
|
|
|
+ display: block;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .query-divider {
|
|
|
|
|
+ display: none;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .query-actions-space {
|
|
|
|
|
+ margin-top: 4px;
|
|
|
|
|
+ flex-direction: row !important;
|
|
|
|
|
+ gap: 10px !important;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .query-actions-space :deep(.arco-btn) {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|