提交 8ad8de5c authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 fdfd11dc
......@@ -204,6 +204,7 @@
"usePreferredDark": true,
"usePreferredLanguages": true,
"usePreferredReducedMotion": true,
"usePrevious": true,
"useRafFn": true,
"useRefHistory": true,
"useResizeObserver": true,
......
......@@ -205,6 +205,7 @@ declare global {
const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark']
const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages']
const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion']
const usePrevious: typeof import('@vueuse/core')['usePrevious']
const useRafFn: typeof import('@vueuse/core')['useRafFn']
const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver']
......
差异被折叠。
......@@ -17,12 +17,12 @@
"dependencies": {
"@element-plus/icons-vue": "^2.0.10",
"@tinymce/tinymce-vue": "^5.0.0",
"@vueuse/core": "^9.11.1",
"axios": "^1.2.5",
"@vueuse/core": "^9.12.0",
"axios": "^1.3.1",
"blueimp-md5": "^2.19.0",
"element-plus": "^2.2.28",
"pinia": "^2.0.29",
"vue": "^3.2.45",
"pinia": "^2.0.30",
"vue": "^3.2.47",
"vue-router": "^4.1.6"
},
"devDependencies": {
......@@ -34,13 +34,13 @@
"@vue/tsconfig": "^0.1.3",
"ali-oss": "^6.17.1",
"chalk": "^5.2.0",
"eslint": "^8.32.0",
"eslint": "^8.33.0",
"eslint-plugin-vue": "^9.9.0",
"npm-run-all": "^4.1.5",
"sass": "^1.57.1",
"typescript": "~4.9.4",
"unplugin-auto-import": "^0.12.2",
"vite": "^4.0.4",
"sass": "^1.58.0",
"typescript": "~4.9.5",
"unplugin-auto-import": "^0.13.0",
"vite": "^4.1.1",
"vue-tsc": "^1.0.24"
}
}
.rule {
display: flex;
}
.rule-and-or {
position: relative;
min-width: 30px;
min-height: 40px;
&::before {
content: ' ';
position: absolute;
left: 50%;
top: 0;
bottom: 0;
width: 2px;
background-color: #d4dbe1;
transform: translateX(-50%);
}
span {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 24px;
height: 24px;
line-height: 24px;
color: #00b2a6;
background: #fff;
text-align: center;
border: 1px solid #d4dbe1;
border-radius: 50%;
cursor: pointer;
}
}
.rule-right {
flex: 1;
}
<script setup lang="ts">
import { Operation } from '@element-plus/icons-vue'
</script>
<template>
<el-card shadow="never" style="margin-top: 20px">
<template #header>
<el-button circle color="#f90" :icon="Operation"></el-button>
事件属性满足以下条件</template
>
</el-card>
</template>
<script setup lang="ts"></script>
<template></template>
<script setup lang="ts">
import type { UserAttrRule } from '@/types'
import { UserFilled, Plus } from '@element-plus/icons-vue'
import RuleGroup from './UserRuleGroup.vue'
const rule = ref<UserAttrRule>({
items: [
{
attr_id: '属性ID',
attr: '属性',
attr_name: '属性名称',
attr_type: 1,
operate: '操作',
operate_name: '操作名称',
value: '值'
}
],
current_logic_operate: 'and'
})
function handleChange(data: UserAttrRule) {
rule.value = data
}
</script>
<template>
<el-card shadow="never">
<template #header>
<el-button circle color="#006df1" :icon="UserFilled"></el-button>
用户属性满足以下条件</template
>
<RuleGroup :data="rule" @update="handleChange"></RuleGroup>
<el-button text :icon="Plus">添加条件</el-button>
</el-card>
</template>
<script setup lang="ts">
import type { UserAttrRule } from '@/types'
interface Props {
data: UserAttrRule
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'update', data: UserAttrRule): void
}>()
const andOrText = computed(() => {
const map = { or: '或', and: '且' }
return map[props.data.current_logic_operate]
})
// 切换and 或者 or
function toggleOperate() {
update({ ...props.data, current_logic_operate: props.data.current_logic_operate === 'or' ? 'and' : 'or' })
}
function update(data: UserAttrRule) {
emit('update', data)
}
</script>
<template>
<div class="rule">
<div class="rule-and-or">
<span @click="toggleOperate">{{ andOrText }}</span>
</div>
<div class="rule-item-wrap">
<div class="rule-item" v-for="item in data.items">
<el-select>
<el-option label="1" value="1"></el-option>
</el-select>
<el-select>
<el-option label="1" value="1"></el-option>
</el-select>
</div>
</div>
</div>
</template>
<style src="@/assets/styles/rule.scss"></style>
<script setup lang="ts">
import type { Group } from '../types'
import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage } from 'element-plus'
import { dateUnitList, weekList } from '@/utils/dictionary'
interface Props {
data: Partial<Group>
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'update'): void
(e: 'update:modelValue', visible: boolean): void
}>()
const isUpdate = $computed(() => !!props.data?.id)
const title = $computed(() => {
if (isUpdate) {
return props.data.type === 1 ? '修改静态群组' : '修改动态群组'
} else {
return props.data.type === 1 ? '新建静态群组' : '新建动态群组'
}
})
const formRef = $ref<FormInstance>()
const form = reactive({
id: '',
name: '',
type: '',
status: '',
update_rule: {
type: '1',
info: { unit: undefined, week: undefined, day: undefined }
}
})
const rules = ref<FormRules>({
name: [{ required: true, message: '请输入群组名称' }],
url: [{ required: true, message: '请选择标签类型图标' }]
})
// 提交
function handleSubmit() {
formRef?.validate().then(() => (isUpdate ? handleUpdate() : handleCreate()))
}
// 新建
function handleCreate() {
ElMessage({ message: '创建成功', type: 'success' })
emit('update')
emit('update:modelValue', false)
}
// 修改
function handleUpdate() {
ElMessage({ message: '修改成功', type: 'success' })
emit('update')
emit('update:modelValue', false)
}
</script>
<template>
<el-dialog :title="title" :close-on-click-modal="false" width="600px" @update:modelValue="$emit('update:modelValue')">
<el-form ref="formRef" :model="form" :rules="rules" label-suffix=":" label-width="100px">
<el-form-item label="群组名称" prop="name">
<el-input v-model="form.name" placeholder="请输入" />
</el-form-item>
<el-form-item label="更新频率" prop="update_rule.type" v-if="data.type === 2">
<el-radio-group v-model="form.update_rule.type">
<el-radio label="1">自动更新</el-radio>
<el-radio label="2">手动更新</el-radio>
</el-radio-group>
<div class="update-rule-wrap" v-if="form.update_rule.type === '1'">
<span></span>
<el-select v-model="form.update_rule.info.unit" placeholder=" " style="width: 60px">
<el-option v-for="item in dateUnitList" :label="item.label" :value="item.value"></el-option>
</el-select>
<template v-if="form.update_rule.info.unit === 1">
<span>的凌晨更新</span>
</template>
<template v-if="form.update_rule.info.unit === 2">
<span></span>
<el-select v-model="form.update_rule.info.week" placeholder=" " style="width: 80px">
<el-option v-for="item in weekList" :label="item.label" :value="item.value"></el-option>
</el-select>
<span>的凌晨更新</span>
</template>
<template v-if="form.update_rule.info.unit === 3">
<span></span>
<el-select v-model="form.update_rule.info.day" placeholder=" " style="width: 60px">
<el-option v-for="item in 6" :label="item" :value="item"></el-option>
</el-select>
<span>天的凌晨更新</span>
</template>
</div>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-switch v-model="form.status" active-text="生效" inactive-text="失效" />
</el-form-item>
</el-form>
<template #footer>
<el-row justify="center">
<el-button plain auto-insert-space @click="$emit('update:modelValue', false)">关闭</el-button>
<el-button type="primary" auto-insert-space @click="handleSubmit">保存</el-button>
</el-row>
</template>
</el-dialog>
</template>
<style lang="scss">
.update-rule-wrap {
width: 100%;
.el-select {
margin: 0 10px;
}
}
</style>
<script setup lang="ts">
import type { Group } from '../types'
import { UserFilled } from '@element-plus/icons-vue'
// import { ElMessage } from 'element-plus'
interface Props {
data: Group
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'update'): void
(e: 'update:modelValue', visible: boolean): void
}>()
// 列表配置
const listOptions = computed(() => {
return {
columns: [
{ label: '序号', type: 'index', width: 60 },
{ label: '用户ID', prop: 'id' },
{ label: '姓名', prop: 'name' },
{ label: '性别', prop: 'name' },
{ label: '手机号码', prop: 'name' },
{ label: '来源连接', prop: 'name' },
{ label: '状态', prop: 'name' },
{ label: '更新人', prop: 'name' },
{ label: '更新时间', prop: 'name' }
],
data: [{ id: 1 }, { id: 2 }]
}
})
</script>
<template>
<el-dialog
title="查看群组信息"
:close-on-click-modal="false"
width="800px"
@update:modelValue="$emit('update:modelValue')">
<el-form label-suffix=":" label-width="82px">
<el-row>
<el-col :span="12"><el-form-item label="群组名称">群组名称</el-form-item></el-col>
<el-col :span="12">
<el-form-item label="群组类型">群组类型</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12"><el-form-item label="更新频率">自动更新</el-form-item></el-col>
<el-col :span="12"><el-form-item label="状态">生效</el-form-item></el-col>
</el-row>
</el-form>
<el-card>
<div class="group-box">
<dl>
<dt>符合群组人数</dt>
<dd class="group-box__count">
<el-icon><UserFilled></UserFilled></el-icon>
<span>199人</span>
</dd>
</dl>
<dl>
<dt>最后更新时间</dt>
<dd>2022-10-12 13:24:23</dd>
</dl>
<dl>
<dt>更新状态</dt>
<dd>
<span>完成</span>
<el-button type="primary" plain size="small">立即更新</el-button>
</dd>
</dl>
</div>
</el-card>
<el-card style="margin-top: 20px">
<template #header>群组用户</template>
<AppList v-bind="listOptions" ref="appList"></AppList>
</el-card>
<template #footer>
<el-row justify="center">
<el-button plain auto-insert-space @click="$emit('update:modelValue', false)">关闭</el-button>
</el-row>
</template>
</el-dialog>
</template>
<style lang="scss">
.group-box {
display: flex;
justify-content: space-between;
dt {
margin-bottom: 10px;
text-align: center;
}
dd {
display: flex;
align-items: center;
justify-content: center;
span {
padding: 0 5px;
}
}
}
.group-box__count {
font-weight: bold;
color: var(--main-color);
}
</style>
export interface Group {
id: string
name: string
status: number
type: 1 | 2
}
<script setup lang="ts">
import type { Group } from '../types'
import { Plus, Delete } from '@element-plus/icons-vue'
import AppList from '@/components/base/AppList.vue'
import { ElMessageBox } from 'element-plus'
const FormDialog = defineAsyncComponent(() => import('../components/FormDialog.vue'))
const ViewDialog = defineAsyncComponent(() => import('../components/ViewDialog.vue'))
const appList = $ref<InstanceType<typeof AppList> | null>(null)
// 列表配置
const listOptions = computed(() => {
return {
filters: [{ type: 'input', prop: 'name', placeholder: '请输入群组名称' }],
filters: [
{ type: 'input', prop: 'name', placeholder: '请输入群组名称' },
{ type: 'input', prop: 'id', placeholder: '请输入群组ID' },
{ type: 'select', prop: 'status', placeholder: '请输入群组名称' },
{ type: 'input', prop: 'user', placeholder: '更新人' }
],
columns: [
{ type: 'selection' },
{ label: '序号', type: 'index', width: 60 },
......@@ -20,7 +30,10 @@ const listOptions = computed(() => {
{ label: '更新时间', prop: 'name' },
{ label: '操作', slots: 'table-x', width: 240 }
],
data: [{}, {}]
data: [
{ id: 1, type: 1 },
{ id: 2, type: 2 }
]
}
})
......@@ -28,6 +41,30 @@ const listOptions = computed(() => {
function handleRefresh() {
appList?.refetch()
}
let formVisible = $ref(false)
let currentRow = $ref<Partial<Group>>()
// 新建
function handleAdd(type: 1 | 2) {
currentRow = { type }
formVisible = true
}
// 修改
function handleUpdate(row: Group) {
currentRow = row
formVisible = true
}
// 删除
function handleRemove(row: Group) {
ElMessageBox.confirm('确定要删除该群组吗?', '提示').then(() => {})
}
let viewVisible = $ref(false)
// 查看
function handleView(row: Group) {
currentRow = row
viewVisible = true
}
</script>
<template>
......@@ -35,16 +72,29 @@ function handleRefresh() {
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<el-space>
<el-dropdown>
<el-button type="primary" :icon="Plus">新建</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="handleAdd(2)">新建动态群组</el-dropdown-item>
<el-dropdown-item @click="handleAdd(1)">新建静态群组</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<el-button type="danger" plain :icon="Delete">删除</el-button>
</el-space>
</template>
<template #table-x>
<el-button type="primary" plain>查看</el-button>
<el-button type="primary" plain>编辑</el-button>
<el-button type="primary" plain>删除</el-button>
<template #table-x="{ row }">
<el-button type="primary" plain @click="handleView(row)">查看</el-button>
<el-button type="primary" plain @click="handleUpdate(row)">编辑</el-button>
<el-button type="primary" plain @click="handleRemove(row)">删除</el-button>
</template>
</AppList>
</AppCard>
<!-- 新建/修改群组 -->
<FormDialog v-model="formVisible" :data="currentRow" v-if="formVisible && currentRow"></FormDialog>
<!-- 查看 -->
<ViewDialog v-model="viewVisible" :data="(currentRow as Group)" v-if="viewVisible && currentRow"></ViewDialog>
</template>
......@@ -2,6 +2,7 @@
import type { Label } from '../types'
import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage } from 'element-plus'
import { dateUnitList, weekList } from '@/utils/dictionary'
interface Props {
data?: Label
......@@ -32,23 +33,6 @@ const rules = ref<FormRules>({
type: [{ required: true, message: '请选择标签类型' }]
})
const unitList = [
{ label: '天', value: 1 },
{ label: '周', value: 2 },
{ label: '月', value: 3 }
]
const weekList = [
{ label: '周一', value: 1 },
{ label: '周二', value: 2 },
{ label: '周三', value: 3 },
{ label: '周四', value: 4 },
{ label: '周五', value: 5 },
{ label: '周六', value: 6 },
{ label: '周日', value: 7 }
]
const dayList = [1, 2, 3, 4, 5, 6]
// 提交
function handleSubmit() {
formRef?.validate().then(() => (isUpdate ? handleUpdate() : handleCreate()))
......@@ -83,23 +67,23 @@ function handleUpdate() {
</el-radio-group>
<div class="update-rule-wrap" v-if="form.update_rule.type === '1'">
<span></span>
<el-select v-model="form.update_rule.info.unit" placeholder="" style="width: 60px">
<el-option v-for="item in unitList" :label="item.label" :value="item.value"></el-option>
<el-select v-model="form.update_rule.info.unit" placeholder=" " style="width: 60px">
<el-option v-for="item in dateUnitList" :label="item.label" :value="item.value"></el-option>
</el-select>
<template v-if="form.update_rule.info.unit === 1">
<span>的凌晨更新</span>
</template>
<template v-if="form.update_rule.info.unit === 2">
<span></span>
<el-select v-model="form.update_rule.info.week" placeholder="" style="width: 80px">
<el-select v-model="form.update_rule.info.week" placeholder=" " style="width: 80px">
<el-option v-for="item in weekList" :label="item.label" :value="item.value"></el-option>
</el-select>
<span>的凌晨更新</span>
</template>
<template v-if="form.update_rule.info.unit === 3">
<span></span>
<el-select v-model="form.update_rule.info.day" placeholder="" style="width: 60px">
<el-option v-for="item in dayList" :label="item" :value="item"></el-option>
<el-select v-model="form.update_rule.info.day" placeholder=" " style="width: 60px">
<el-option v-for="item in 6" :label="item" :value="item"></el-option>
</el-select>
<span>天的凌晨更新</span>
</template>
......
<script setup lang="ts">
import type { Label } from '../types'
import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage } from 'element-plus'
import UserRule from '@/components/rule/UserRule.vue'
import EventRule from '@/components/rule/EventRule.vue'
interface Props {
data: Label
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'update'): void
(e: 'update:modelValue', visible: boolean): void
}>()
const formRef = $ref<FormInstance>()
const form = reactive({
id: '',
name: '',
type: '',
status: ''
})
const rules = ref<FormRules>({
name: [{ required: true, message: '请输入标签名称' }],
type: [{ required: true, message: '请选择标签类型' }]
})
// 提交
function handleSubmit() {
formRef?.validate().then(handleUpdate)
}
// 修改
function handleUpdate() {
ElMessage({ message: '保存成功', type: 'success' })
emit('update')
emit('update:modelValue', false)
}
</script>
<template>
<el-dialog
title="标签规则管理"
:close-on-click-modal="false"
width="800px"
@update:modelValue="$emit('update:modelValue')">
<el-form label-suffix=":" label-width="82px">
<el-row>
<el-col :span="12"><el-form-item label="标签名称">标签名称</el-form-item></el-col>
<el-col :span="12">
<el-form-item label="标签类型">标签类型</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12"><el-form-item label="更新频率">自动更新</el-form-item></el-col>
<el-col :span="12"><el-form-item label="状态">生效</el-form-item></el-col>
</el-row>
</el-form>
<!-- 用户属性规则 -->
<UserRule></UserRule>
<!-- 事件属性规则 -->
<EventRule></EventRule>
<template #footer>
<el-row justify="center">
<el-button plain auto-insert-space @click="$emit('update:modelValue', false)">关闭</el-button>
<el-button type="primary" auto-insert-space @click="handleSubmit">保存</el-button>
</el-row>
</template>
</el-dialog>
</template>
<style lang="scss">
.update-rule-wrap {
width: 100%;
.el-select {
margin: 0 10px;
}
}
</style>
......@@ -7,6 +7,7 @@ import { ElMessageBox } from 'element-plus'
const LabelFormDialog = defineAsyncComponent(() => import('../components/LabelFormDialog.vue'))
const LabelViewDialog = defineAsyncComponent(() => import('../components/LabelViewDialog.vue'))
const LabelRuleDialog = defineAsyncComponent(() => import('../components/LabelRuleDialog.vue'))
const appList = $ref<InstanceType<typeof AppList> | null>(null)
// 列表配置
......@@ -54,12 +55,18 @@ function handleUpdate(row: Label) {
function handleRemove(row: Label) {
ElMessageBox.confirm('确定要删除该标签吗?', '提示').then(() => {})
}
let viewVisible = $ref(false)
// 查看
let viewVisible = $ref(false)
function handleView(row: Label) {
currentRow = row
viewVisible = true
}
// 规则
let ruleVisible = $ref(false)
function handleRule(row: Label) {
currentRow = row
ruleVisible = true
}
</script>
<template>
......@@ -74,7 +81,7 @@ function handleView(row: Label) {
</template>
<template #table-x="{ row }">
<el-button type="primary" plain>规则</el-button>
<el-button type="primary" plain @click="handleRule(row)">规则</el-button>
<el-button type="primary" plain @click="handleView(row)">查看</el-button>
<el-button type="primary" plain @click="handleUpdate(row)">编辑</el-button>
<el-button type="primary" plain @click="handleRemove(row)">删除</el-button>
......@@ -86,6 +93,8 @@ function handleView(row: Label) {
<LabelFormDialog v-model="formVisible" :data="currentRow" v-if="formVisible"></LabelFormDialog>
<!-- 查看标签 -->
<LabelViewDialog v-model="viewVisible" :data="currentRow" v-if="viewVisible && currentRow"></LabelViewDialog>
<!-- 规则 -->
<LabelRuleDialog v-model="ruleVisible" :data="currentRow" v-if="ruleVisible && currentRow"></LabelRuleDialog>
</template>
<style lang="scss">
......
......@@ -54,33 +54,23 @@ export interface PermissionType {
tag: string
}
export interface MessageType {
cancel_time: string
channel: 0 | 1 | 2 | 3 | 4 | 5
created_at: string
fail_detail: string
from: string
from_source: number
id: string
is_cancel: 0 | 1
is_platform: number
is_read: 0 | 1
is_send: 0 | 1
messagebus_id: string
parent_id: number
payload: any
read_time: string
send_time: string
source: number
template_id: number
title: string
to: string
type: 1 | 2
updated_at: string
}
export interface SystemDictionary {
id: string
label: string
value: string
}
export interface UserAttrRule {
current_logic_operate: 'and' | 'or'
items: UserAttrRuleItem[]
}
export interface UserAttrRuleItem {
attr_id: string
attr: string
attr_name: string
attr_type: number
operate: string
operate_name: string
value: string
}
......@@ -3,37 +3,46 @@ export const json2Array = function (data: any, isValueToNumber = true) {
return Object.keys(data).map(value => ({ label: data[value], value: isValueToNumber ? parseInt(value) : value }))
}
// 参赛模式
export const contestMode: Record<string, any> = {
'1': '个人赛'
}
// 参赛模式列表
export const contestModeList = json2Array(contestMode, false)
export const dateUnitList = [
{ label: '天', value: 1 },
{ label: '周', value: 2 },
{ label: '月', value: 3 }
]
// 评分规则
export const scoreRule: Record<number, any> = {
1: '平均法',
2: '加权平均法',
3: '综合得分法',
4: '最高分'
}
// 参赛模式列表
export const scoreRuleList = json2Array(scoreRule, false)
export const weekList = [
{ label: '周一', value: 1 },
{ label: '周二', value: 2 },
{ label: '周三', value: 3 },
{ label: '周四', value: 4 },
{ label: '周五', value: 5 },
{ label: '周六', value: 6 },
{ label: '周日', value: 7 }
]
// 实验成绩规则
export const gradeRule: Record<number, any> = {
1: '实验报告',
2: '实验准备',
3: '实验结果',
4: '课堂活跃度',
5: '自定义'
}
// 参赛模式列表
export const gradeRuleList = json2Array(gradeRule)
export const stringConditionList = [
{ label: '等于', value: 1 },
{ label: '不等于', value: 2 },
{ label: '包含', value: 3 },
{ label: '不包含', value: 4 },
{ label: '空值', value: 5 },
{ label: '非空', value: 6 }
]
// 实验报告评分规则
export const reportScoreRule: Record<number, any> = {
1: '人工评分',
2: '自动评分'
}
export const reportScoreRuleList = json2Array(reportScoreRule)
export const numberConditionList = [
{ label: '=', value: 1 },
{ label: '≠', value: 2 },
{ label: '>', value: 3 },
{ label: '≥', value: 4 },
{ label: '<', value: 5 },
{ label: '≤', value: 6 },
{ label: '区间', value: 7 },
{ label: '空值', value: 8 },
{ label: '非空', value: 9 }
]
export const dateConditionList = [
{ label: '绝对时间前后', value: 1 },
{ label: '绝对时间区间', value: 2 },
{ label: '相对时间点', value: 3 },
{ label: '在...天内', value: 4 }
]
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论