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

chore update

上级 b858fb16
......@@ -7,7 +7,9 @@ const props = defineProps<{ info: Record<string, any>; comments: { total: number
const emit = defineEmits(['remove'])
const imageList = computed<string[]>(() => {
try {
return JSON.parse(props.info.picture)
return JSON.parse(props.info.picture).map((item: { name: string; url: string } | string) => {
return typeof item === 'string' ? item : item.url
})
} catch (error) {
return []
}
......@@ -28,8 +30,7 @@ const onRemove = (data: any) => {
<div class="publish-item-hd" v-if="info.user_info">
<img
:src="info.user_info.avatar || 'https://webapp-pub.ezijing.com/weapp/share/default.jpg'"
class="publish-avatar"
/>
class="publish-avatar" />
<div class="publish-item-hd-info">
<h5>{{ info.user_info.name }}</h5>
</div>
......
......@@ -125,22 +125,19 @@ defineExpose({ refetch })
v-bind="item"
clearable
@change="search"
v-if="item.type === 'input'"
/>
v-if="item.type === 'input'" />
<!-- select -->
<el-select
v-model="params[item.prop]"
v-bind="item"
clearable
@change="search"
v-if="item.type === 'select'"
>
v-if="item.type === 'select'">
<el-option
:label="option[item.labelKey] || option.label"
:value="option[item.valueKey] || option.value"
v-for="(option, index) in item.options"
:key="index"
/>
:key="index" />
</el-select>
</template>
</el-form-item>
......@@ -183,8 +180,7 @@ defineExpose({ refetch })
@size-change="pageSizeChange"
@current-change="fetchList()"
:hide-on-single-page="true"
v-if="hasPagination"
>
v-if="hasPagination">
</el-pagination>
</div>
</div>
......
......@@ -8,10 +8,12 @@ export default {
import type { Component } from 'vue'
import {
User,
School,
Picture,
Files,
VideoCamera,
Notebook,
Goods,
DishDot,
QuestionFilled,
Stamp,
......@@ -27,10 +29,12 @@ interface IMenuItem {
const menuList: IMenuItem[] = [
{ name: '学员管理', path: '/student', icon: User },
{ name: '导师管理', path: '/lecturer', icon: School },
{ name: '广告管理', path: '/banner', icon: Picture },
{ name: '资料管理', path: '/doc', icon: Files },
{ name: '视频管理', path: '/video', icon: VideoCamera },
{ name: '课程管理', path: '/course', icon: Notebook },
{ name: '推荐课程', path: '/course/recommend', icon: Goods },
{ name: '团队管理', path: '/team', icon: DishDot },
{ name: '问答管理', path: '/qa', icon: QuestionFilled },
{ name: '审核管理', path: '/audit', icon: Stamp },
......
......@@ -3,7 +3,7 @@ import { ElMessage } from 'element-plus'
import type { FormInstance } from 'element-plus'
import { updateCourse } from '../api'
const props = defineProps<{ data: Record<string, any>; modelValue: boolean }>()
const props = defineProps<{ data: Record<string, any> }>()
const emit = defineEmits(['update:modelValue', 'success'])
......@@ -34,8 +34,12 @@ function update() {
</script>
<template>
<el-dialog :model-value="modelValue" title="更新课程" :close-on-click-modal="false" v-bind="$attrs" width="400px">
<el-form :model="form" :rules="rules" ref="formRef">
<el-dialog
title="更新课程"
:close-on-click-modal="false"
width="400px"
@update:modelValue="$emit('update:modelValue')">
<el-form :model="form" :rules="rules" ref="formRef" label-width="60px">
<el-form-item label="权重" prop="weight">
<el-input type="number" v-model="form.weight" placeholder="请输入内容" />
</el-form-item>
......@@ -45,8 +49,7 @@ function update() {
active-text="显示"
active-value="2"
inactive-text="不显示"
inactive-value="1"
/>
inactive-value="1" />
</el-form-item>
</el-form>
<template #footer>
......
......@@ -63,21 +63,19 @@ const onUpdateSuccess = () => {
preview-teleported
lazy
fit="cover"
style="width: 200px; height: 100px"
/>
style="width: 200px; height: 100px" />
</template>
<template #table-desc="{ row }">
<div v-html="row.course_represent" style="max-height: 100px"></div>
</template>
<template #table-status="{ row }">
<el-switch
:value="row.status"
:model-value="row.status"
active-text="显示"
active-value="2"
inactive-text="不显示"
inactive-value="1"
@change="onChangeStatus(row)"
/>
@change="onChangeStatus(row)" />
</template>
<template #table-operate="{ row }">
<el-button @click="onEdit(row)">更新</el-button>
......
import httpRequest from '@/utils/axios'
// 获取推荐课程列表
export function getCourseRecommendList(params?: { name?: string; page?: number; page_size?: number }) {
return httpRequest.get('/api/psp/backend/recommend-course/index', { params })
}
// 创建推荐课程
export function createCourseRecommend(data: { name: string; cover: string; weight?: string }) {
return httpRequest.post('/api/psp/backend/recommend-course/create', data)
}
// 更新推荐课程
export function updateCourseRecommend(data: { id: string; name: string; cover: string; weight?: string }) {
return httpRequest.post('/api/psp/backend/recommend-course/update', data)
}
// 获取推荐课程详情
export function getCourseRecommend(params: { id: string }) {
return httpRequest.get('/api/psp/backend/recommend-course/view', { params })
}
// 删除推荐课程
export function deleteCourseRecommend(data: { id: string }) {
return httpRequest.post('/api/psp/backend/recommend-course/delete', data)
}
import type { RouteRecordRaw } from 'vue-router'
import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/course/recommend',
component: AppLayout,
children: [
{ path: '', component: () => import('./views/List.vue') },
{ path: 'create', component: () => import('./views/Update.vue') },
{ path: 'update/:id', component: () => import('./views/Update.vue'), props: true }
]
}
]
<script setup lang="ts">
import { ElMessage, ElMessageBox } from 'element-plus'
import { getCourseRecommendList, deleteCourseRecommend } from '../api'
const appList = ref()
const listOptions = {
remote: {
httpRequest: getCourseRecommendList,
params: { type: '' }
},
filters: [{ type: 'input', prop: 'name', placeholder: '课程名' }],
columns: [
{ label: '封面', slots: 'table-cover', width: 224 },
{ label: 'ID', prop: 'id' },
{ label: '课程名', prop: 'name' },
{ label: '免费/付费', prop: 'is_free_name' },
{ label: '浏览量', prop: 'pv' },
{ label: '权重', prop: 'weight' },
{ label: '创建时间', prop: 'created_time' },
{ label: '操作', slots: 'table-operate', width: 160, align: 'right' }
]
}
const onRemove = (row: any) => {
ElMessageBox.confirm('确定要删除吗?', '提示').then(() => {
deleteCourseRecommend({ id: row.id }).then(() => {
ElMessage({ type: 'success', message: '删除成功' })
appList.value?.refetch()
})
})
}
</script>
<template>
<AppCard>
<AppList v-bind="listOptions" ref="appList">
<template #header-aside>
<router-link to="/course/recommend/create">
<el-button type="primary">创建</el-button>
</router-link>
</template>
<template #table-cover="{ row }">
<el-image
:src="row.cover + '?x-oss-process=image/resize,m_fill,h_100,w_200'"
:preview-src-list="[row.cover]"
preview-teleported
lazy
fit="cover"
style="width: 200px; height: 100px" />
</template>
<template #table-operate="{ row }">
<el-space>
<router-link :to="`/course/recommend/update/${row.id}`">
<el-button plain>编辑</el-button>
</router-link>
<el-button type="danger" plain @click="onRemove(row)">删除</el-button>
</el-space>
</template>
</AppList>
</AppCard>
</template>
<script setup lang="ts">
import { ElMessage } from 'element-plus'
import type { FormInstance } from 'element-plus'
import { createCourseRecommend, updateCourseRecommend, getCourseRecommend } from '../api'
const props = defineProps<{ id?: string }>()
const router = useRouter()
const formRef = ref<FormInstance>()
const form = reactive({ name: '', cover: '', weight: '', is_free: '1' })
const rules = {
name: [{ required: true, message: '请输入课程名', trigger: 'blur' }],
cover: [{ required: true, message: '请上传封面', trigger: 'change' }]
}
// 提交
const onSubmit = () => {
if (!formRef.value) return
formRef.value.validate().then(() => {
props.id ? update() : create()
})
}
// 取消
const onCancel = () => {
router.replace('/course/recommend')
}
// 创建
const create = () => {
createCourseRecommend(form).then(() => {
ElMessage({ message: '创建成功', type: 'success' })
router.push('/course/recommend')
})
}
// 修改
const update = () => {
const params = { ...form, id: props.id as string }
updateCourseRecommend(params).then(() => {
ElMessage({ message: '修改成功', type: 'success' })
router.push('/course/recommend')
})
}
onMounted(() => {
props.id &&
getCourseRecommend({ id: props.id }).then(res => {
Object.assign(form, res.data)
})
})
</script>
<template>
<AppCard>
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="课程名" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="封面" prop="cover">
<AppUpload v-model="form.cover" accept="image/*"></AppUpload>
</el-form-item>
<el-form-item label="免费/付费" prop="is_free">
<el-switch v-model="form.is_free" active-text="付费" active-value="0" inactive-text="免费" inactive-value="1" />
</el-form-item>
<el-form-item label="权重" prop="weight">
<el-input type="number" v-model="form.weight" />
</el-form-item>
<el-form-item>
<el-button type="primary" auto-insert-space @click="onSubmit">保存</el-button>
<el-button auto-insert-space @click="onCancel">取消</el-button>
</el-form-item>
</el-form>
</AppCard>
</template>
......@@ -25,7 +25,8 @@ const typeList = [
{ label: '入学指南', value: '1' },
{ label: '学习地图', value: '2' },
{ label: '考试攻略', value: '3' },
{ label: '消息', value: '4' }
{ label: '消息', value: '4' },
{ label: '公告', value: '5' }
]
const onChangeType = () => {
......
......@@ -20,7 +20,8 @@ const typeList = [
{ label: '入学指南', value: '1' },
{ label: '学习地图', value: '2' },
{ label: '考试攻略', value: '3' },
{ label: '消息', value: '4' }
{ label: '消息', value: '4' },
{ label: '公告', value: '5' }
]
// 提交
const onSubmit = () => {
......
import httpRequest from '@/utils/axios'
// 获取导师列表
export function getLecturerList(params?: { name?: string; page?: number; page_size?: number }) {
return httpRequest.get('/api/psp/backend/lecturer/index', { params })
}
// 创建导师
export function createLecturer(data: { name: string; avatar: string; weight?: string }) {
return httpRequest.post('/api/psp/backend/lecturer/create', data)
}
// 更新导师
export function updateLecturer(data: { id: string; name: string; avatar: string; weight?: string }) {
return httpRequest.post('/api/psp/backend/lecturer/update', data)
}
// 获取导师详情
export function getLecturer(params: { id: string }) {
return httpRequest.get('/api/psp/backend/lecturer/view', { params })
}
// 删除导师
export function deleteLecturer(data: { id: string }) {
return httpRequest.post('/api/psp/backend/lecturer/delete', data)
}
import type { RouteRecordRaw } from 'vue-router'
import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/lecturer',
component: AppLayout,
children: [
{ path: '', component: () => import('./views/List.vue') },
{ path: 'create', component: () => import('./views/Update.vue') },
{ path: 'update/:id', component: () => import('./views/Update.vue'), props: true }
]
}
]
<script setup lang="ts">
import { ElMessage, ElMessageBox } from 'element-plus'
import { getLecturerList, deleteLecturer } from '../api'
const appList = ref()
const listOptions = {
remote: {
httpRequest: getLecturerList,
params: { type: '' }
},
filters: [{ type: 'input', prop: 'name', placeholder: '姓名' }],
columns: [
{ label: '头像', slots: 'table-avatar', width: 124 },
{ label: 'ID', prop: 'id' },
{ label: '姓名', prop: 'name' },
{ label: '权重', prop: 'weight' },
{ label: '创建时间', prop: 'created_time' },
{ label: '操作', slots: 'table-operate', width: 160, align: 'right' }
]
}
const typeList = [
{ label: '全部', value: '' },
{ label: '站内文章', value: '1' },
{ label: '输入链接', value: '2' }
]
const onChangeType = () => {
appList.value?.refetch()
}
const onRemove = (row: any) => {
ElMessageBox.confirm('确定要删除吗?', '提示').then(() => {
deleteLecturer({ id: row.id }).then(() => {
ElMessage({ type: 'success', message: '删除成功' })
appList.value?.refetch()
})
})
}
</script>
<template>
<AppCard>
<AppList v-bind="listOptions" ref="appList">
<template #header-aside>
<router-link to="/lecturer/create">
<el-button type="primary">创建</el-button>
</router-link>
</template>
<template #filter-type="{ params }">
<el-radio-group v-model="params.type" @change="onChangeType">
<el-radio-button :label="item.value" v-for="item in typeList" :key="item.value">
{{ item.label }}
</el-radio-button>
</el-radio-group>
</template>
<template #table-avatar="{ row }">
<el-image
:src="row.avatar + '?x-oss-process=image/resize,m_fill,h_120,w_100'"
:preview-src-list="[row.avatar]"
preview-teleported
lazy
fit="cover"
style="width: 100px; height: 120px" />
</template>
<template #table-operate="{ row }">
<el-space>
<router-link :to="`/lecturer/update/${row.id}`">
<el-button plain>编辑</el-button>
</router-link>
<el-button type="danger" plain @click="onRemove(row)">删除</el-button>
</el-space>
</template>
</AppList>
</AppCard>
</template>
<script setup lang="ts">
import { ElMessage } from 'element-plus'
import type { FormInstance } from 'element-plus'
// import AppEditor from '@/components/tinymce/Index.vue'
import { createLecturer, updateLecturer, getLecturer } from '../api'
const props = defineProps<{ id?: string }>()
const router = useRouter()
const formRef = ref<FormInstance>()
const form = reactive({ name: '', type: '2', desc: '', weight: '', avatar: '', url: '' })
const rules = {
name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
avatar: [{ required: true, message: '请上传头像', trigger: 'change' }]
// url: [{ required: true, message: '请输入文章链接', trigger: 'blur' }],
// desc: [{ required: true, message: '请输入正文', trigger: 'blur' }]
}
// 提交
const onSubmit = () => {
if (!formRef.value) return
formRef.value.validate().then(() => {
props.id ? update() : create()
})
}
// 取消
const onCancel = () => {
router.replace('/lecturer')
}
// 创建
const create = () => {
createLecturer(form).then(() => {
ElMessage({ message: '创建成功', type: 'success' })
router.push('/lecturer')
})
}
// 修改
const update = () => {
const params = { ...form, id: props.id as string }
updateLecturer(params).then(() => {
ElMessage({ message: '修改成功', type: 'success' })
router.push('/lecturer')
})
}
onMounted(() => {
props.id &&
getLecturer({ id: props.id }).then(res => {
Object.assign(form, res.data)
})
})
</script>
<template>
<AppCard>
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="姓名" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="头像" prop="avatar">
<AppUpload v-model="form.avatar" accept="image/*"></AppUpload>
</el-form-item>
<!-- <el-form-item label="链接内容" prop="type">
<el-radio-group v-model="form.type">
<el-radio label="1">站内文章</el-radio>
<el-radio label="2">输入链接</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="文章链接" prop="url" v-if="form.type === '2'">
<el-input v-model="form.url" />
</el-form-item>
<el-form-item label="正文" prop="desc" v-if="form.type === '1'">
<AppEditor v-model="form.desc"></AppEditor>
</el-form-item> -->
<el-form-item label="权重" prop="weight">
<el-input type="number" v-model="form.weight" />
</el-form-item>
<el-form-item>
<el-button type="primary" auto-insert-space @click="onSubmit">保存</el-button>
<el-button auto-insert-space @click="onCancel">取消</el-button>
</el-form-item>
</el-form>
</AppCard>
</template>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论