32 changed files with 1969 additions and 1854 deletions
@ -0,0 +1,81 @@ |
|||||
|
// generated by unplugin-vue-components
|
||||
|
// We suggest you to commit this file into source control
|
||||
|
// Read more: https://github.com/vuejs/core/pull/3399
|
||||
|
import '@vue/runtime-core' |
||||
|
|
||||
|
export {} |
||||
|
|
||||
|
declare module '@vue/runtime-core' { |
||||
|
export interface GlobalComponents { |
||||
|
Attachment: typeof import('./src/components/upload-attachment/attachment.vue')['default'] |
||||
|
DiyLink: typeof import('./src/components/diy-link/index.vue')['default'] |
||||
|
Editor: typeof import('./src/components/editor/index.vue')['default'] |
||||
|
ElAside: typeof import('element-plus/es')['ElAside'] |
||||
|
ElAvatar: typeof import('element-plus/es')['ElAvatar'] |
||||
|
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] |
||||
|
ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem'] |
||||
|
ElButton: typeof import('element-plus/es')['ElButton'] |
||||
|
ElCard: typeof import('element-plus/es')['ElCard'] |
||||
|
ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] |
||||
|
ElCol: typeof import('element-plus/es')['ElCol'] |
||||
|
ElColorPicker: typeof import('element-plus/es')['ElColorPicker'] |
||||
|
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] |
||||
|
ElContainer: typeof import('element-plus/es')['ElContainer'] |
||||
|
ElDialog: typeof import('element-plus/es')['ElDialog'] |
||||
|
ElDrawer: typeof import('element-plus/es')['ElDrawer'] |
||||
|
ElDropdown: typeof import('element-plus/es')['ElDropdown'] |
||||
|
ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] |
||||
|
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] |
||||
|
ElForm: typeof import('element-plus/es')['ElForm'] |
||||
|
ElFormItem: typeof import('element-plus/es')['ElFormItem'] |
||||
|
ElHeader: typeof import('element-plus/es')['ElHeader'] |
||||
|
ElIcon: typeof import('element-plus/es')['ElIcon'] |
||||
|
ElImage: typeof import('element-plus/es')['ElImage'] |
||||
|
ElImageViewer: typeof import('element-plus/es')['ElImageViewer'] |
||||
|
ElInput: typeof import('element-plus/es')['ElInput'] |
||||
|
ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] |
||||
|
ElMain: typeof import('element-plus/es')['ElMain'] |
||||
|
ElMenu: typeof import('element-plus/es')['ElMenu'] |
||||
|
ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] |
||||
|
ElOption: typeof import('element-plus/es')['ElOption'] |
||||
|
ElPagination: typeof import('element-plus/es')['ElPagination'] |
||||
|
ElPopover: typeof import('element-plus/es')['ElPopover'] |
||||
|
ElRadio: typeof import('element-plus/es')['ElRadio'] |
||||
|
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] |
||||
|
ElRow: typeof import('element-plus/es')['ElRow'] |
||||
|
ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] |
||||
|
ElSelect: typeof import('element-plus/es')['ElSelect'] |
||||
|
ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] |
||||
|
ElSwitch: typeof import('element-plus/es')['ElSwitch'] |
||||
|
ElTable: typeof import('element-plus/es')['ElTable'] |
||||
|
ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] |
||||
|
ElTabPane: typeof import('element-plus/es')['ElTabPane'] |
||||
|
ElTabs: typeof import('element-plus/es')['ElTabs'] |
||||
|
ElTag: typeof import('element-plus/es')['ElTag'] |
||||
|
ElTooltip: typeof import('element-plus/es')['ElTooltip'] |
||||
|
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect'] |
||||
|
ElUpload: typeof import('element-plus/es')['ElUpload'] |
||||
|
ExportSure: typeof import('./src/components/export-sure/index.vue')['default'] |
||||
|
HeatMap: typeof import('./src/components/heat-map/index.vue')['default'] |
||||
|
Icon: typeof import('./src/components/icon/index.vue')['default'] |
||||
|
PopoverInput: typeof import('./src/components/popover-input/index.vue')['default'] |
||||
|
RangeInput: typeof import('./src/components/range-input/index.vue')['default'] |
||||
|
RouterLink: typeof import('vue-router')['RouterLink'] |
||||
|
RouterView: typeof import('vue-router')['RouterView'] |
||||
|
SelectArea: typeof import('./src/components/select-area/index.vue')['default'] |
||||
|
SelectIcon: typeof import('./src/components/select-icon/index.vue')['default'] |
||||
|
TencentMapPicker: typeof import('./src/components/TencentMapPicker.vue')['default'] |
||||
|
UploadAttachment: typeof import('./src/components/upload-attachment/index.vue')['default'] |
||||
|
UploadFile: typeof import('./src/components/upload-file/index.vue')['default'] |
||||
|
UploadImage: typeof import('./src/components/upload-image/index.vue')['default'] |
||||
|
UploadVideo: typeof import('./src/components/upload-video/index.vue')['default'] |
||||
|
Verify: typeof import('./src/components/verifition/Verify.vue')['default'] |
||||
|
VerifyPoints: typeof import('./src/components/verifition/Verify/VerifyPoints.vue')['default'] |
||||
|
VerifySlide: typeof import('./src/components/verifition/Verify/VerifySlide.vue')['default'] |
||||
|
VideoPlayer: typeof import('./src/components/video-player/index.vue')['default'] |
||||
|
WebLink: typeof import('./src/components/web-link/web-link.vue')['default'] |
||||
|
} |
||||
|
export interface ComponentCustomProperties { |
||||
|
vLoading: typeof import('element-plus/es')['ElLoadingDirective'] |
||||
|
} |
||||
|
} |
||||
@ -1,125 +1,198 @@ |
|||||
<template> |
<template> |
||||
|
<el-card class="box-card !border-none" shadow="never"> |
||||
|
<el-button @click="addDict">添加</el-button> |
||||
<div class="schedule-container"> |
<div class="schedule-container"> |
||||
<!-- 周视图日历 --> |
<!-- 周一到周日的布局 --> |
||||
<FullCalendar |
<div v-for="(day, index) in days" :key="index" class="day-column"> |
||||
:options="calendarOptions" |
<div class="day-header">{{ day.date }}</div> |
||||
ref="fullCalendar" |
<el-table |
||||
class="calendar" |
:data="day.timeSlots" |
||||
/> |
border |
||||
|
:span-method="(data) => objectSpanMethod(day.timeSlots, data)" |
||||
<!-- 课程详情弹窗 --> |
style="width: 100%" |
||||
<el-dialog |
@cell-click="handleCellClick" |
||||
v-model="dialogVisible" |
|
||||
title="课程人员安排" |
|
||||
width="30%" |
|
||||
:before-close="handleClose" |
|
||||
> |
> |
||||
<div v-if="selectedEvent"> |
<!-- 时间列 --> |
||||
<h3>{{ selectedEvent.title }}</h3> |
<el-table-column |
||||
<p>时间:{{ selectedEvent.time }}</p> |
prop="timeRange" |
||||
<h4>参与人员:</h4> |
label="时间" |
||||
<ul> |
width="80" |
||||
<li v-for="person in selectedEvent.people" :key="person.id"> |
align="center" |
||||
{{ person.name }} - {{ person.role }} |
> |
||||
</li> |
<template #default="{ row }"> |
||||
</ul> |
<div :style="{ backgroundColor: row.color }"> |
||||
|
{{ row.timeRange }} |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<!-- 教室列 --> |
||||
|
<el-table-column |
||||
|
v-for="(classroom, idx) in day.classrooms" |
||||
|
:key="idx" |
||||
|
:label="`教室${idx + 1}`" |
||||
|
:prop="`classroom${idx + 1}`" |
||||
|
align="center" |
||||
|
> |
||||
|
<template #default="{ row }"> |
||||
|
<div v-if="row.course && row.course.classroom === classroom"> |
||||
|
<div class="teacher-name">{{ row.course.teacher }}</div> |
||||
|
<div class="student-list"> |
||||
|
<el-tag |
||||
|
v-for="student in row.course.students" |
||||
|
:key="student" |
||||
|
size="small" |
||||
|
effect="plain" |
||||
|
> |
||||
|
{{ student }} |
||||
|
</el-tag> |
||||
</div> |
</div> |
||||
|
<div class="classroom-name"> |
||||
|
剩余空位:{{ row.course.hasnumber }} |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</div> |
||||
|
|
||||
|
<!-- 详情弹窗 --> |
||||
|
<el-dialog v-model="dialogVisible" title="课程详情"> |
||||
|
<p><strong>教师:</strong> {{ selectedCourse?.teacher }}</p> |
||||
|
<p><strong>学员:</strong> {{ selectedCourse?.students.join(', ') }}</p> |
||||
</el-dialog> |
</el-dialog> |
||||
</div> |
</div> |
||||
|
</el-card> |
||||
</template> |
</template> |
||||
|
|
||||
<script setup> |
<script setup> |
||||
import { ref } from 'vue' |
import { ref } from 'vue' |
||||
import FullCalendar from '@fullcalendar/vue3' |
|
||||
import dayGridPlugin from '@fullcalendar/daygrid' |
const days = [ |
||||
import timeGridPlugin from '@fullcalendar/timegrid' |
// 示例数据结构 |
||||
import interactionPlugin from '@fullcalendar/interaction' // 新增此行 |
{ |
||||
import zhLocale from '@fullcalendar/core/locales/zh-cn' |
date: '周一', |
||||
|
timeSlots: [ |
||||
// 模拟课程数据(替换为真实接口数据) |
|
||||
const courses = ref([ |
|
||||
{ |
{ |
||||
id: 1, |
timeRange: '9:00-10:00', |
||||
title: '数学课', |
color: '#FFA07A', |
||||
start: '2025-05-18 08:00:00', |
course: { |
||||
end: '2025-05-18 09:00:00', |
teacher: '', |
||||
people: [ |
students: [], |
||||
{ id: 1, name: '张老师', role: '主讲' }, |
classroom: '教室1', |
||||
{ id: 2, name: '李同学', role: '学生' }, |
hasnumber: 5, |
||||
|
}, |
||||
|
}, |
||||
|
// 其他时间段... |
||||
], |
], |
||||
|
classrooms: ['教室1'], // 当天可用教室列表 |
||||
}, |
}, |
||||
{ |
{ |
||||
id: 2, |
date: '周二', |
||||
title: '英语课', |
timeSlots: [ |
||||
start: '2025-05-18 10:00:00', |
{ |
||||
end: '2025-05-18 11:00:00', |
timeRange: '9:00-10:00', |
||||
people: [{ id: 3, name: '王老师', role: '主讲' }], |
color: '#FFA07A', |
||||
|
course: { |
||||
|
teacher: '张老师', |
||||
|
students: ['小明', '小红'], |
||||
|
classroom: '教室1', |
||||
|
hasnumber: 5, |
||||
}, |
}, |
||||
]) |
|
||||
|
|
||||
// 弹窗相关 |
|
||||
const dialogVisible = ref(false) |
|
||||
const selectedEvent = ref(null) |
|
||||
|
|
||||
// FullCalendar 配置 |
|
||||
const calendarOptions = ref({ |
|
||||
locale: zhLocale, |
|
||||
plugins: [ |
|
||||
dayGridPlugin, |
|
||||
timeGridPlugin, |
|
||||
interactionPlugin, // 新增此行 |
|
||||
], |
|
||||
initialView: 'timeGridWeek', // 周视图 |
|
||||
headerToolbar: { |
|
||||
left: 'prev,next today', |
|
||||
center: 'title', |
|
||||
right: 'timeGridWeek,timeGridDay', // 切换视图 |
|
||||
}, |
}, |
||||
events: courses.value, |
{ |
||||
eventClick: (info) => { |
timeRange: '11:00-12:00', |
||||
selectedEvent.value = { |
color: '#712e13', |
||||
title: info.event.title, |
course: { |
||||
time: `${info.event.start.toLocaleTimeString()} - ${info.event.end.toLocaleTimeString()}`, |
teacher: '张老师', |
||||
people: info.event.extendedProps.people, |
students: ['小明', '小红'], |
||||
} |
classroom: '教室2', |
||||
dialogVisible.value = true |
hasnumber: 5, |
||||
}, |
}, |
||||
eventContent: (arg) => { |
|
||||
// 自定义事件内容(可选) |
|
||||
return { html: `<div class="fc-event-title">${arg.event.title}</div>` } |
|
||||
}, |
}, |
||||
allDaySlot: false, // 隐藏全天时段 |
// 其他时间段... |
||||
slotDuration: '01:00', // 时间段间隔(1小时) |
], |
||||
slotLabelFormat: { |
classrooms: ['教室1', '教室2'], // 当天可用教室列表 |
||||
hour: 'numeric', |
|
||||
minute: '2-digit', |
|
||||
omitZeroMinute: false, |
|
||||
meridiem: 'short', |
|
||||
}, |
}, |
||||
}) |
] |
||||
|
|
||||
|
const dialogVisible = ref(false) |
||||
|
const selectedCourse = ref(null) |
||||
|
|
||||
|
// 合并单元格方法 |
||||
|
const objectSpanMethod = (timeSlots, { row, column, rowIndex }) => { |
||||
|
if (column.property === 'timeRange') { |
||||
|
// 获取当前时间段 |
||||
|
const current = timeSlots[rowIndex] |
||||
|
|
||||
|
// 如果当前行没有时间范围,不合并 |
||||
|
if (!current || !current.timeRange) return { rowspan: 0, colspan: 0 } |
||||
|
|
||||
|
let spanCount = 1 |
||||
|
|
||||
|
// 向下查找相同时间段的行数 |
||||
|
while (timeSlots[rowIndex + spanCount]?.timeRange === current.timeRange) { |
||||
|
spanCount++ |
||||
|
} |
||||
|
|
||||
|
// 如果是重复的,隐藏该行 |
||||
|
if ( |
||||
|
spanCount > 1 && |
||||
|
rowIndex > 0 && |
||||
|
timeSlots[rowIndex - 1]?.timeRange === current.timeRange |
||||
|
) { |
||||
|
return { rowspan: 0, colspan: 0 } |
||||
|
} |
||||
|
|
||||
|
return { rowspan: spanCount, colspan: 1 } |
||||
|
} |
||||
|
|
||||
|
return { rowspan: 1, colspan: 1 } |
||||
|
} |
||||
|
|
||||
// 关闭弹窗时重置数据 |
// 单元格点击事件 |
||||
const handleClose = () => { |
const handleCellClick = (row, column, cell, event) => { |
||||
dialogVisible.value = false |
console.log(row, column, cell, event) |
||||
selectedEvent.value = null |
if (column.property.startsWith('classroom')) { |
||||
|
selectedCourse.value = row.course |
||||
|
dialogVisible.value = true |
||||
|
} |
||||
} |
} |
||||
</script> |
</script> |
||||
|
|
||||
<style> |
<style scoped> |
||||
.schedule-container { |
.schedule-container { |
||||
padding: 20px; |
display: flex; |
||||
|
gap: 10px; |
||||
|
} |
||||
|
|
||||
|
.day-column { |
||||
|
flex: 1; |
||||
|
min-width: 200px; |
||||
|
} |
||||
|
|
||||
|
.day-header { |
||||
|
text-align: center; |
||||
|
font-weight: bold; |
||||
|
padding: 8px; |
||||
|
background-color: #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.teacher-name { |
||||
|
font-weight: bold; |
||||
|
margin-bottom: 5px; |
||||
} |
} |
||||
|
|
||||
.calendar { |
.student-list { |
||||
margin-bottom: 20px; |
margin-top: 5px; |
||||
} |
} |
||||
|
|
||||
.fc-event-title { |
.el-table__cell { |
||||
white-space: normal !important; |
display: flex; |
||||
font-size: 14px; |
align-items: center; |
||||
} |
} |
||||
|
|
||||
.fc-timegrid-event { |
.classroom-name { |
||||
cursor: pointer; |
margin-bottom: 5px; |
||||
} |
} |
||||
</style> |
</style> |
||||
|
|||||
@ -0,0 +1,212 @@ |
|||||
|
<template> |
||||
|
<div class="main-container"> |
||||
|
<el-card class="box-card !border-none" shadow="never" v-loading="loading"> |
||||
|
|
||||
|
<div class="flex justify-between items-center"> |
||||
|
<span class="text-lg">{{ pageName }}</span> |
||||
|
<el-button type="primary" @click="addStage"> |
||||
|
新增阶段 |
||||
|
</el-button> |
||||
|
</div> |
||||
|
</el-card> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<el-card class="box-card !border-none" shadow="never" > |
||||
|
|
||||
|
<div class="flex items-center justify-between p-[10px] table-item-border bg"> |
||||
|
<span class="text-base w-[230px]">阶段名称</span> |
||||
|
<span class="text-base w-[110px] text-center">底薪</span> |
||||
|
</div> |
||||
|
|
||||
|
<el-collapse v-model="activeNames" accordion > |
||||
|
<el-collapse-item v-for="(stage, index) in stages" :key="stage.id" :name="stage.id"> |
||||
|
|
||||
|
<template #title> |
||||
|
<div class="collapse-title"> |
||||
|
<span class="title-name">{{ stage.name }}</span> |
||||
|
<span class="arrow">{{ stage.price }} 元</span> |
||||
|
<!-- <span class="arrow">></span> --> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<el-form label-width="100px" style="margin-bottom: 10px"> |
||||
|
<el-form-item label="阶段名称"> |
||||
|
<el-input v-model="stage.name" placeholder="请输入阶段名称" /> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
|
||||
|
<el-form label-width="100px" style="margin-bottom: 10px"> |
||||
|
<el-form-item label="阶段底薪"> |
||||
|
<el-input v-model="stage.price" placeholder="请输入阶段底薪" /> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
|
||||
|
|
||||
|
|
||||
|
<el-button type="success" size="small" @click="addRule(stage)">新增规则</el-button> |
||||
|
|
||||
|
<el-table :data="stage.rules" border style="margin-top: 10px"> |
||||
|
<el-table-column prop="renewal_standard_min" label="续费上限"> |
||||
|
<template #default="{ row }"> |
||||
|
<el-input v-model="row.renewal_standard_min" placeholder="请输入续费上限" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<el-table-column prop="renewal_standard_max" label="续费下限"> |
||||
|
<template #default="{ row }"> |
||||
|
<el-input v-model="row.renewal_standard_max" placeholder="请输入续费下限" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<el-table-column prop="renewal_commission" label="续费提成"> |
||||
|
<template #default="{ row }"> |
||||
|
<el-input v-model="row.renewal_commission" placeholder="%" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<el-table-column prop="new_count_min" label="新单成交数上限"> |
||||
|
<template #default="{ row }"> |
||||
|
<el-input v-model="row.new_count_min" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<el-table-column prop="new_count_max" label="新单成交数下限"> |
||||
|
<template #default="{ row }"> |
||||
|
<el-input v-model="row.new_count_max" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<el-table-column prop="new_move_5" label="新招(5+1)x3"> |
||||
|
<template #default="{ row }"> |
||||
|
<el-input v-model="row.new_move_5" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column prop="new_move_7" label="新招(7+1)x3"> |
||||
|
<template #default="{ row }"> |
||||
|
<el-input v-model="row.new_move_7" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="操作" width="100"> |
||||
|
<template #default="{ $index }"> |
||||
|
<el-button type="danger" size="small" @click="removeRule(stage, $index)">删除</el-button> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
|
||||
|
<el-button type="danger" size="small" style="margin-top: 10px" |
||||
|
@click="removeStage(index)">删除该阶段</el-button> |
||||
|
</el-collapse-item> |
||||
|
</el-collapse> |
||||
|
|
||||
|
<div style="text-align: right; margin-top: 20px;"> |
||||
|
<el-button type="primary" @click="onSave">提交保存</el-button> |
||||
|
</div> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script lang="ts" setup> |
||||
|
import { xsyjConfig, getXsyjConfig } from '@/app/api/sys' |
||||
|
import { reactive, ref } from 'vue' |
||||
|
import {ElMessage} from 'element-plus' |
||||
|
import { useRoute } from 'vue-router' |
||||
|
const route = useRoute() |
||||
|
const pageName = route.meta.title |
||||
|
|
||||
|
const loading = ref(true) |
||||
|
const stages = ref([]) |
||||
|
const activeNames = ref(null) |
||||
|
|
||||
|
function addStage() { |
||||
|
const newStage = { |
||||
|
name: '默认阶段', |
||||
|
price:0, |
||||
|
rules: [{ |
||||
|
renewal_standard_min: '', |
||||
|
renewal_standard_max: '', |
||||
|
renewal_commission: '', |
||||
|
new_count_min: '', |
||||
|
new_count_max: '', |
||||
|
new_move_5: '', |
||||
|
new_move_7: '' |
||||
|
}] |
||||
|
} |
||||
|
stages.value.push(newStage) |
||||
|
activeNames.value = newStage.name |
||||
|
} |
||||
|
|
||||
|
function removeStage(index) { |
||||
|
stages.value.splice(index, 1) |
||||
|
} |
||||
|
|
||||
|
function addRule(stage) { |
||||
|
stage.rules.push({ |
||||
|
renewal_standard_min: '', |
||||
|
renewal_standard_max: '', |
||||
|
renewal_commission: '', |
||||
|
new_count_min: '', |
||||
|
new_count_max: '', |
||||
|
new_move_5: '', |
||||
|
new_move_7: '' |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
function removeRule(stage, ruleIndex) { |
||||
|
if (stage.rules.length === 1) { |
||||
|
ElMessage.warning('至少保留一条规则') |
||||
|
return |
||||
|
} |
||||
|
stage.rules.splice(ruleIndex, 1) |
||||
|
} |
||||
|
|
||||
|
const setFormData = async () => { |
||||
|
const data = await (await getXsyjConfig()).data |
||||
|
stages.value = data |
||||
|
loading.value = false |
||||
|
} |
||||
|
|
||||
|
setFormData(); |
||||
|
|
||||
|
const onSave = async () => { |
||||
|
xsyjConfig(stages.value) |
||||
|
.then(() => { |
||||
|
loading.value = true |
||||
|
setFormData() |
||||
|
}) |
||||
|
.catch(() => { |
||||
|
loading.value = false |
||||
|
}) |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.collapse-title { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
width: 100%; |
||||
|
font-size: 14px; |
||||
|
font-weight: 500; |
||||
|
padding-right: 10px; |
||||
|
color: #333; |
||||
|
padding: 10px; |
||||
|
} |
||||
|
|
||||
|
.title-name { |
||||
|
width: 230px; |
||||
|
} |
||||
|
|
||||
|
.title-salary { |
||||
|
width: 110px; |
||||
|
text-align: center; |
||||
|
color: #7438D5; |
||||
|
} |
||||
|
|
||||
|
.arrow { |
||||
|
margin-left: auto; |
||||
|
color: #999; |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
|
||||
|
</style> |
||||
@ -0,0 +1,55 @@ |
|||||
|
<?php |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | Niucloud-admin 企业快速开发的多应用管理平台 |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | 官方网址:https://www.niucloud.com |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | niucloud团队 版权所有 开源版本可自由商用 |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | Author: Niucloud Team |
||||
|
// +---------------------------------------------------------------------- |
||||
|
|
||||
|
namespace app\model\student; |
||||
|
|
||||
|
use core\base\BaseModel; |
||||
|
use think\model\concern\SoftDelete; |
||||
|
use think\model\relation\HasMany; |
||||
|
use think\model\relation\HasOne; |
||||
|
|
||||
|
|
||||
|
class Student extends BaseModel |
||||
|
{ |
||||
|
use SoftDelete; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 数据表主键 |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $pk = 'id'; |
||||
|
|
||||
|
/** |
||||
|
* 模型名称 |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $name = 'student'; |
||||
|
|
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 定义软删除标记字段 |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $deleteTime = 'deleted_at'; |
||||
|
|
||||
|
/** |
||||
|
* 定义软删除字段的默认值 |
||||
|
* @var int |
||||
|
*/ |
||||
|
protected $defaultSoftDelete = 0; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
Loading…
Reference in new issue