Merge remote-tracking branch 'origin/dev' into dev
New file |
| | |
| | | import service from "../libs/axios"; |
| | | |
| | | export const getNews = (params) =>{ |
| | | return service({ |
| | | url: "/news/page", |
| | | method: "GET", |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export const addNews = (params) =>{ |
| | | return service({ |
| | | url: "/news", |
| | | method: "POST", |
| | | data: params |
| | | }) |
| | | } |
| | | |
| | | export const editNews = (params) =>{ |
| | | return service({ |
| | | url: "/news", |
| | | method: "PUT", |
| | | data: params |
| | | }) |
| | | } |
| | | |
| | | export const publish = (param) =>{ |
| | | return service({ |
| | | url: "/news/publish/"+ param, |
| | | method: "PUT", |
| | | }) |
| | | } |
| | | |
| | | export const delById = (param) =>{ |
| | | return service({ |
| | | url: "/news/"+ param, |
| | | method: "DELETE", |
| | | }) |
| | | } |
New file |
| | |
| | | import service from "@/libs/axios"; |
| | | |
| | | // 获取标签分类列表 |
| | | export const getTagTypeList = (params) => { |
| | | return service({ |
| | | url: "/lmk/tag-type/list", |
| | | method: "GET", |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export const getTagKeyTypeList = () => { |
| | | return service({ |
| | | url: "/lmk/tag-type/key/list", |
| | | method: "GET" |
| | | }) |
| | | } |
| | | |
| | | |
| | | |
| | | // 通过id删除标签分类 |
| | | export const deleteTagTypeById = (params) => { |
| | | return service({ |
| | | url: "/lmk/tag-type/" + params, |
| | | method: "DELETE" |
| | | }) |
| | | } |
| | | |
| | | |
| | | // 修改标签分类 |
| | | export const updateTagType = (params) => { |
| | | return service({ |
| | | url: "/lmk/tag-type/", |
| | | method: "PUT", |
| | | data: params |
| | | }) |
| | | } |
| | | |
| | | // 添加标签分类 |
| | | export const saveTagType = (params) => { |
| | | return service({ |
| | | url: "/lmk/tag-type/", |
| | | method: "POST", |
| | | data: params |
| | | }) |
| | | } |
| | | |
| | | |
New file |
| | |
| | | import service from "@/libs/axios"; |
| | | |
| | | // 获取标签分页 |
| | | export const getTags = (data) => { |
| | | return service({ |
| | | url: "/lmk/tag/page", |
| | | method: "GET", |
| | | params: data |
| | | }) |
| | | } |
| | | |
| | | // 获取标签列表 |
| | | export const getTagList = () => { |
| | | return service({ |
| | | url: "/lmk/tag/list", |
| | | method: "GET" |
| | | }) |
| | | } |
| | | |
| | | |
| | | // 通过id删除标签 |
| | | export const deleteTagById = (params) => { |
| | | return service({ |
| | | url: "/lmk/tag/" + params, |
| | | method: "DELETE" |
| | | }) |
| | | } |
| | | |
| | | |
| | | // 修改标签 |
| | | export const editTag = (params) => { |
| | | return service({ |
| | | url: "/lmk/tag/", |
| | | method: "PUT", |
| | | data: params |
| | | }) |
| | | } |
| | | |
| | | // 添加标签 |
| | | export const addTag = (params) => { |
| | | return service({ |
| | | url: "/lmk/tag/", |
| | | method: "POST", |
| | | data: params |
| | | }) |
| | | } |
| | | |
New file |
| | |
| | | <template> |
| | | <div class="news-management"> |
| | | <Card> |
| | | <!-- 搜索表单 --> |
| | | <Form |
| | | ref="searchForm" |
| | | @keydown.enter.native="handleSearch" |
| | | :model="searchForm" |
| | | inline |
| | | :label-width="80" |
| | | class="search-form" |
| | | > |
| | | <FormItem label="标题" prop="title"> |
| | | <Input |
| | | type="text" |
| | | v-model="searchForm.title" |
| | | placeholder="请输入标题名称" |
| | | clearable |
| | | @on-clear="handleSearch" |
| | | style="width: 180px" |
| | | /> |
| | | </FormItem> |
| | | <FormItem label="是否发布" prop="publish"> |
| | | <Select |
| | | v-model="searchForm.publish" |
| | | placeholder="请选择" |
| | | style="width: 180px" |
| | | clearable |
| | | @on-clear="handleSearch" |
| | | @on-change="handleSearch" |
| | | > |
| | | <Option |
| | | v-for="item in typeSelect" |
| | | :value="item.value" |
| | | :key="item.id" |
| | | > |
| | | {{ item.label }} |
| | | </Option> |
| | | </Select> |
| | | </FormItem> |
| | | <Button |
| | | @click="handleSearch" |
| | | type="primary" |
| | | icon="ios-search" |
| | | class="search-btn" |
| | | >搜索</Button> |
| | | <Button |
| | | @click="resetSearch" |
| | | icon="md-refresh" |
| | | style="margin-left: 8px" |
| | | >重置</Button> |
| | | </Form> |
| | | |
| | | <!-- 操作按钮 --> |
| | | <Row class="operation"> |
| | | <Button @click="openAdd" type="primary" icon="md-add">新增活动</Button> |
| | | <Button @click="delBatch" type="error" icon="md-trash" :disabled="selectCount === 0">批量删除</Button> |
| | | </Row> |
| | | |
| | | <!-- 活动表格 --> |
| | | <Table |
| | | :loading="loading" |
| | | border |
| | | :columns="columns" |
| | | :data="newsList" |
| | | ref="table" |
| | | @on-selection-change="showSelect" |
| | | class="news-table" |
| | | > |
| | | <!-- 封面展示插槽 --> |
| | | <!-- 操作按钮插槽 --> |
| | | <template slot-scope="{ row }" slot="action"> |
| | | <div class="action-btns"> |
| | | <Button |
| | | type="primary" |
| | | size="small" |
| | | @click="changeStatus(row, row.publish ? '下架' : '发布')" |
| | | :loading="row.statusLoading" |
| | | > |
| | | {{ row.publish ? '下架' : '发布' }} |
| | | </Button> |
| | | <Button |
| | | type="info" |
| | | size="small" |
| | | @click="detail(row)" |
| | | >详情</Button> |
| | | <Button |
| | | type="info" |
| | | size="small" |
| | | @click="openEdit(row)" |
| | | >编辑</Button> |
| | | <Button |
| | | type="error" |
| | | size="small" |
| | | @click="delById(row)" |
| | | >删除</Button> |
| | | </div> |
| | | </template> |
| | | </Table> |
| | | |
| | | <!-- 分页 --> |
| | | <Row type="flex" justify="end" class="page-footer"> |
| | | <Page |
| | | :current="searchForm.pageNumber" |
| | | :total="total" |
| | | :page-size="searchForm.pageSize" |
| | | @on-change="changePage" |
| | | @on-page-size-change="changePageSize" |
| | | :page-size-opts="[10, 20, 50]" |
| | | size="small" |
| | | show-total |
| | | show-elevator |
| | | show-sizer |
| | | ></Page> |
| | | </Row> |
| | | |
| | | <!-- 新闻编辑/新增模态框 --> |
| | | <Modal |
| | | v-model="modelShow" |
| | | :title="modelTitle" |
| | | @on-cancel="modelClose" |
| | | width="800" |
| | | :mask-closable="false" |
| | | > |
| | | <Form ref="form" :model="newsForm" :label-width="100" :rules="rules"> |
| | | <Row :gutter="16"> |
| | | <Col span="12"> |
| | | <FormItem label="标题" prop="title"> |
| | | <Input |
| | | v-model="newsForm.title" |
| | | placeholder="请输入标题名称" |
| | | clearable |
| | | /> |
| | | </FormItem> |
| | | </Col> |
| | | <Col span="24"> |
| | | <FormItem label="新闻内容:" prop="content"> |
| | | <editor ref="editor" @input="getReason" /> |
| | | </FormItem> |
| | | </Col> |
| | | </Row> |
| | | </Form> |
| | | |
| | | <div slot="footer"> |
| | | <Button @click="modelClose">取消</Button> |
| | | <Button type="primary" :loading="submitLoading" @click="saveOrUpdate">提交</Button> |
| | | </div> |
| | | </Modal> |
| | | |
| | | |
| | | <Modal |
| | | v-model="infoModelShow" |
| | | :title="modelTitle" |
| | | @on-cancel="infoModelClose" |
| | | width="800" |
| | | :mask-closable="false" |
| | | > |
| | | <div class="detail-container"> |
| | | <Row :gutter="16"> |
| | | <Col span="12"> |
| | | <div class="detail-item"> |
| | | <label>标题:</label> |
| | | <span>{{ newsInfo.title || '-' }}</span> |
| | | </div> |
| | | </Col> |
| | | <Col span="12"> |
| | | <div class="detail-item"> |
| | | <label>是否发布:</label> |
| | | <span>{{newsInfo.publish ? '已发布':'未发布'}}</span> |
| | | </div> |
| | | </Col> |
| | | |
| | | <Col span="12"> |
| | | <div class="detail-item" v-if="newsInfo.publish"> |
| | | <label>发布时间:</label> |
| | | <span>{{ newsInfo.publishDate}}</span> |
| | | </div> |
| | | </Col> |
| | | <Col span="24"> |
| | | <div class="detail-item"> |
| | | <label>新闻内容:</label> |
| | | <div |
| | | class="news-content" |
| | | v-html="newsInfo.content || '无内容'" |
| | | ></div> |
| | | </div> |
| | | </Col> |
| | | </Row> |
| | | </div> |
| | | |
| | | <div slot="footer"> |
| | | <Button @click="infoModelClose">关闭</Button> |
| | | </div> |
| | | </Modal> |
| | | |
| | | |
| | | <!-- 图片预览模态框 --> |
| | | <Modal v-model="previewVisible" title="图片预览" footer-hide> |
| | | <img :src="previewImageUrl" style="width: 100%"> |
| | | </Modal> |
| | | </Card> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import Editor from '@/components/editor/index.vue' |
| | | import { getNews,editNews,addNews,publish,delById } from '@/api/news.js' |
| | | export default { |
| | | name: "newsManagement", |
| | | components: {Editor}, |
| | | data(){ |
| | | return{ |
| | | // 图片预览 |
| | | previewVisible: false, |
| | | previewImageUrl: '', |
| | | |
| | | modelShow:false, |
| | | modelTitle:'', |
| | | submitLoading:false, |
| | | infoModelShow:false, |
| | | //表头 |
| | | columns: [ |
| | | { |
| | | type: 'selection', |
| | | width: 60, |
| | | align: 'center' |
| | | }, |
| | | { |
| | | title: '标题', |
| | | key: 'title', |
| | | minWidth: 120, |
| | | tooltip: true |
| | | }, |
| | | { |
| | | title: '发布', |
| | | key: 'publish', |
| | | width: 100, |
| | | align: 'center', |
| | | render: (h, params) => { |
| | | return h('Tag', { |
| | | props: { |
| | | color: params.row.publish ? 'green' : 'default' |
| | | } |
| | | }, params.row.publish ? '已发布' : '未发布') |
| | | } |
| | | }, |
| | | { |
| | | title: '发布时间', |
| | | key: 'publishDate', |
| | | width: 300, |
| | | align: 'center', |
| | | render: (h, { row }) => { |
| | | // 如果 publishDate 为 null 或 undefined,显示 "未发布" |
| | | if (row.publishDate == null) { |
| | | return h('span', { style: { color: '#999' } }, '暂无'); |
| | | } |
| | | // 否则正常显示日期 |
| | | return h('span', row.publishDate); |
| | | }, |
| | | }, |
| | | { |
| | | title: '操作', |
| | | slot: 'action', |
| | | width: 280, |
| | | align: 'center', |
| | | fixed: 'right' |
| | | } |
| | | ], |
| | | |
| | | newsList:[], |
| | | total:0, |
| | | newsForm:{ |
| | | id:'', |
| | | title:'', |
| | | content:'', |
| | | publish:0, |
| | | }, |
| | | newsInfo:{ |
| | | title:'', |
| | | publish:false, |
| | | publishDate:'', |
| | | content:'' |
| | | }, |
| | | rules: { |
| | | title: [ |
| | | { required: true, message: '请输入标题', trigger: 'blur' }, |
| | | { max: 50, message: '长度不能超过50个字符', trigger: 'blur' } |
| | | ], |
| | | publish: [ |
| | | { required: true, message: '请选择是否发布', trigger: 'blur' }, |
| | | ], |
| | | content: [ |
| | | { required: true, message: '请输入新闻内容', trigger: 'blur' } |
| | | ] |
| | | }, |
| | | |
| | | selectList:[], |
| | | selectCount:0, |
| | | |
| | | loading:false, |
| | | |
| | | searchForm: { |
| | | title: '', |
| | | publish: 0, |
| | | pageNumber: 1, |
| | | pageSize: 10 |
| | | }, |
| | | typeSelect:[ |
| | | { |
| | | id:1, |
| | | label:'未发布', |
| | | value:0 |
| | | }, |
| | | { |
| | | id:2, |
| | | label:'已发布', |
| | | value:1 |
| | | } |
| | | |
| | | ] |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.getNewsList(); |
| | | }, |
| | | methods:{ |
| | | getNewsList(){ |
| | | this.loading = true |
| | | getNews(this.searchForm).then(res =>{ |
| | | this.loading = false |
| | | if (res.code === 200) { |
| | | // 为每一行添加loading状态 |
| | | this.newsList = res.data.map(item => ({ |
| | | ...item, |
| | | })) |
| | | this.total = res.total |
| | | } |
| | | }).catch(() => { |
| | | this.loading = false |
| | | }) |
| | | }, |
| | | getReason(content) { |
| | | this.newsForm.content = content |
| | | }, |
| | | saveOrUpdate(){ |
| | | this.$refs.form.validate(valid => { |
| | | if (valid) { |
| | | this.submitLoading = true |
| | | const submitData = { |
| | | ...this.newsForm, |
| | | publish: this.newsForm.publish !== 0, // true → 1, false → 0 |
| | | }; |
| | | if (this.newsForm.id){ |
| | | editNews(submitData).then(res => { |
| | | this.submitLoading = false |
| | | if (res.code === 200) { |
| | | this.$Message.success(res.msg) |
| | | this.modelClose() |
| | | this.getNewsList() |
| | | } |
| | | }).catch(() => { |
| | | this.submitLoading = false |
| | | }) |
| | | }else { |
| | | addNews(submitData).then(res => { |
| | | this.submitLoading = false |
| | | if (res.code === 200) { |
| | | this.$Message.success(res.msg) |
| | | this.modelClose() |
| | | this.getNewsList() |
| | | } |
| | | }).catch(() => { |
| | | this.submitLoading = false |
| | | }) |
| | | } |
| | | |
| | | } |
| | | }) |
| | | }, |
| | | infoModelClose(){ |
| | | this.infoModelShow = false; |
| | | }, |
| | | modelClose(){ |
| | | this.modelShow = false; |
| | | }, |
| | | changePage(page) { |
| | | this.searchForm.pageNumber = page |
| | | this.getNewsList() |
| | | }, |
| | | // 改变每页条数 |
| | | changePageSize(pageSize) { |
| | | this.searchForm.pageNumber = 1 |
| | | this.searchForm.pageSize = pageSize |
| | | this.getNewsList() |
| | | }, |
| | | |
| | | delById(row){ |
| | | delById(row.id).then(res =>{ |
| | | if (res.code === 200){ |
| | | this.$Message.success(res.msg); |
| | | this.getNewsList(); |
| | | } |
| | | |
| | | }) |
| | | }, |
| | | openEdit(row){ |
| | | this.modelTitle = '修改新闻'; |
| | | this.modelShow = true; |
| | | this.$refs.form.resetFields(); |
| | | this.newsForm.title = row.title; |
| | | this.newsForm.content = row.content; |
| | | this.newsForm.id = row.id; |
| | | this.$refs.editor.setContent(this.newsForm.content) |
| | | }, |
| | | openAdd(){ |
| | | this.modelTitle = '新增新闻'; |
| | | this.modelShow = true; |
| | | this.$refs.form.resetFields() |
| | | this.newsForm.id = ''; |
| | | |
| | | }, |
| | | detail(row){ |
| | | this.modelTitle = '活动详情' |
| | | this.infoModelShow = true |
| | | this.newsInfo = row |
| | | }, |
| | | changeStatus(row,action){ |
| | | row.statusLoading = true; |
| | | |
| | | publish(row.id).then(res =>{ |
| | | row.statusLoading = false |
| | | if (res.code === 200){ |
| | | this.$Message.success(res.msg); |
| | | this.getNewsList(); |
| | | } |
| | | }).catch(() => { |
| | | row.statusLoading = false |
| | | }) |
| | | }, |
| | | // 表格选择变化 |
| | | showSelect(selection) { |
| | | this.selectList = selection.map(item => item.id) |
| | | this.selectCount = selection.length |
| | | }, |
| | | |
| | | delBatch(){ |
| | | |
| | | }, |
| | | handleSearch(type, value){ |
| | | this.searchForm.pageNumber = 1 |
| | | this.getNewsList() |
| | | }, |
| | | resetSearch(){ |
| | | this.$refs.searchForm.resetFields() |
| | | this.searchForm.pageNumber = 1 |
| | | this.getNewsList() |
| | | }, |
| | | |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .activity-management { |
| | | .search-form { |
| | | padding: 16px; |
| | | background: #f8f8f9; |
| | | border-radius: 4px; |
| | | margin-bottom: 16px; |
| | | |
| | | .ivu-form-item { |
| | | margin-bottom: 16px; |
| | | margin-right: 16px; |
| | | } |
| | | |
| | | .search-btn { |
| | | margin-left: 8px; |
| | | } |
| | | } |
| | | } |
| | | .detail-container { |
| | | padding: 16px; |
| | | } |
| | | |
| | | .detail-item { |
| | | margin-bottom: 18px; |
| | | line-height: 1.5; |
| | | |
| | | label { |
| | | display: inline-block; |
| | | width: 100px; |
| | | color: #666; |
| | | font-weight: bold; |
| | | vertical-align: top; |
| | | } |
| | | |
| | | span { |
| | | display: inline-block; |
| | | width: calc(100% - 110px); |
| | | } |
| | | } |
| | | |
| | | .news-content { |
| | | border: 1px solid #dcdee2; |
| | | border-radius: 4px; |
| | | padding: 12px; |
| | | min-height: 100px; |
| | | margin-top: 8px; |
| | | } |
| | | .news-table { |
| | | .media-container { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | height: 100px; |
| | | |
| | | .thumbnail { |
| | | max-width: 100%; |
| | | max-height: 100%; |
| | | object-fit: contain; |
| | | cursor: pointer; |
| | | transition: all 0.3s; |
| | | |
| | | &:hover { |
| | | transform: scale(1.05); |
| | | box-shadow: 0 0 8px rgba(0, 0, 0, 0.2); |
| | | } |
| | | } |
| | | } |
| | | |
| | | .action-btns { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | justify-content: center; |
| | | |
| | | .ivu-btn { |
| | | margin: 4px; |
| | | font-size: 12px; |
| | | padding: 2px 6px; |
| | | min-width: 60px; |
| | | } |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <div> |
| | | <Card> |
| | | <div class="operation mb_10"> |
| | | <Button @click="addParent" type="primary" icon="md-add">添加一级分类</Button> |
| | | </div> |
| | | <tree-table ref="treeTable" size="default" :loading="loading" :data="tableData" :columns="columns" |
| | | :border="true" :show-index="false" :is-fold="true" :expand-type="false" primary-key="id"> |
| | | <template slot="action" slot-scope="scope"> |
| | | <Button type="info" @click="edit(scope.row)" size="small" style="margin-right: 5px">编辑 |
| | | </Button> |
| | | |
| | | <Button type="error" @click="remove(scope.row)" size="small" style="margin-right: 5px">删除 |
| | | </Button> |
| | | <Button v-show="scope.row.level != 1" type="success" @click="addChildren(scope.row)" size="small" |
| | | style="margin-right: 5px">添加子分类 |
| | | </Button> |
| | | </template> |
| | | </tree-table> |
| | | </Card> |
| | | <Modal :title="modalTitle" v-model="modalVisible" :mask-closable="false" :width="500"> |
| | | <Form ref="formAdd" :model="formAdd" :label-width="100" :rules="formValidate"> |
| | | <div v-if="showParent"> |
| | | <FormItem label="上级分类" prop="parentId"> |
| | | {{ parentTitle }} |
| | | <Input v-model="formAdd.parentId" clearable style="width: 100%; display: none" /> |
| | | </FormItem> |
| | | </div> |
| | | <FormItem label="分类名称" prop="tagTypeName"> |
| | | <Input v-model="formAdd.tagTypeName" clearable style="width: 100%" /> |
| | | </FormItem> |
| | | <FormItem label="分类标识" prop="typeKey"> |
| | | |
| | | <Select v-model="formAdd.typeKey" :disabled="formAdd.parentId!==0" placeholder="请选择分类标识" filterable :popper-append-to-body="false" |
| | | popper-class="spec-values-popper" style="width: 100%; text-align: left; margin-right: 10px"> |
| | | <Option v-for="item in typeKeyList" :value="item.value" :label="item.value" :key="item.value"> |
| | | </Option> |
| | | </Select> |
| | | </FormItem> |
| | | <FormItem label="排序值" prop="sortNum"> |
| | | <InputNumber v-model="formAdd.sortNum"></InputNumber> |
| | | </FormItem> |
| | | </Form> |
| | | <div slot="footer"> |
| | | <Button type="text" @click="modalVisible = false">取消</Button> |
| | | <Button type="primary" :loading="submitLoading" @click="Submit">提交</Button> |
| | | </div> |
| | | </Modal> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import { |
| | | saveTagType, |
| | | getTagTypeList , |
| | | deleteTagTypeById, |
| | | updateTagType,getTagKeyTypeList |
| | | } from "@/api/tag-type"; |
| | | import TreeTable from "@/components/tree-table/Table/Table"; |
| | | import uploadPicInput from "@/components/lili/upload-pic-input"; |
| | | import { regular } from "@/utils"; |
| | | export default { |
| | | name: "lili-components", |
| | | components: { |
| | | TreeTable, |
| | | uploadPicInput, |
| | | }, |
| | | data() { |
| | | return { |
| | | submitLoading: false, |
| | | loading: false, // 加载状态 |
| | | expandLevel: 1, // 展开的层级 |
| | | modalType: 0, // 添加或编辑标识 |
| | | modalVisible: false, // 添加或编辑显示 |
| | | modalTitle: "", // 添加或编辑标题 |
| | | showParent: false, // 是否展示上级菜单 |
| | | parentTitle: "", // 父级菜单名称 |
| | | formAdd: { |
| | | // 添加或编辑表单对象初始化数据 |
| | | parentId: "", |
| | | sortNum: 1, |
| | | level: 0, |
| | | tagTypeName: "", |
| | | typeKey:'' |
| | | }, |
| | | // 表单验证规则 |
| | | formValidate: { |
| | | tagTypeName: [regular.REQUIRED], |
| | | typeKey: [regular.REQUIRED], |
| | | sortNum: [regular.REQUIRED, regular.INTEGER], |
| | | }, |
| | | columns: [ |
| | | { |
| | | title: "分类名称", |
| | | key: "tagTypeName", |
| | | witt: "100px", |
| | | }, |
| | | { |
| | | title: "分类标识", |
| | | key: "typeKey", |
| | | witt: "100px", |
| | | }, |
| | | { |
| | | title: "排序", |
| | | key: "sortNum", |
| | | width: "100px", |
| | | }, |
| | | { |
| | | title: "操作", |
| | | key: "action", |
| | | align: "center", |
| | | headerAlign: "center", |
| | | width: "400px", |
| | | type: "template", |
| | | template: "action", |
| | | }, |
| | | ], |
| | | typeKeyList: [], |
| | | tableData: [], // 表格数据 |
| | | }; |
| | | }, |
| | | methods: { |
| | | // 初始化数据 |
| | | init() { |
| | | this.getAllList(); |
| | | this.getKeyTypeList(); |
| | | }, |
| | | getKeyTypeList() { |
| | | getTagKeyTypeList().then((res) => { |
| | | this.typeKeyList = res.data |
| | | }) |
| | | }, |
| | | // 添加子分类 |
| | | addChildren(v) { |
| | | this.modalType = 0; |
| | | this.modalTitle = "添加子分类"; |
| | | this.formAdd.tagTypeName = ""; |
| | | this.parentTitle = v.tagTypeName; |
| | | this.formAdd.typeKey = v.typeKey; |
| | | this.typeKeyEdit = false |
| | | this.formAdd.level = eval(v.level + "+1"); |
| | | this.showParent = true; |
| | | delete this.formAdd.id; |
| | | this.formAdd.parentId = v.id; |
| | | this.modalVisible = true; |
| | | }, |
| | | // 编辑分类 |
| | | edit(v) { |
| | | this.modalType = 1; |
| | | this.modalTitle = "编辑"; |
| | | this.formAdd.id = v.id; |
| | | this.formAdd.tagTypeName = v.tagTypeName; |
| | | this.formAdd.level = v.level; |
| | | this.formAdd.parentId = v.parentId; |
| | | this.formAdd.sortNum = v.sortNum; |
| | | this.showParent = false; |
| | | this.modalVisible = true; |
| | | }, |
| | | // 添加一级分类 |
| | | addParent() { |
| | | this.modalType = 0; |
| | | this.modalTitle = "添加一级分类"; |
| | | this.parentTitle = "顶级分类"; |
| | | this.showParent = true; |
| | | this.$refs.formAdd.resetFields(); |
| | | delete this.formAdd.id; |
| | | this.formAdd.parentId = 0; |
| | | this.modalVisible = true; |
| | | }, |
| | | // 提交 |
| | | Submit() { |
| | | this.$refs.formAdd.validate((valid) => { |
| | | if (valid) { |
| | | this.submitLoading = true; |
| | | if (this.modalType === 0) { |
| | | // 添加 避免编辑后传入id等数据 记得删除 |
| | | delete this.formAdd.id; |
| | | saveTagType(this.formAdd).then((res) => { |
| | | this.submitLoading = false; |
| | | if (res.success) { |
| | | this.$Message.success("添加成功"); |
| | | |
| | | this.formAdd = { |
| | | // 添加或编辑表单对象初始化数据 |
| | | parentId: "", |
| | | sortNum: 1, |
| | | level: 0, |
| | | tagTypeName: "", |
| | | }; |
| | | } else { |
| | | // this.$Message.error(res.message); |
| | | } |
| | | this.getAllList(); |
| | | this.modalVisible = false; |
| | | }); |
| | | } else { |
| | | // 编辑 |
| | | updateTagType(this.formAdd, this.formAdd.id).then((res) => { |
| | | this.submitLoading = false; |
| | | if (res.success) { |
| | | this.$Message.success("修改成功"); |
| | | } else { |
| | | // this.$Message.error(res.message); |
| | | } |
| | | this.getAllList(); |
| | | this.modalVisible = false; |
| | | this.$refs.formAdd.resetFields(); |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | // 删除分类 |
| | | remove(v) { |
| | | this.$Modal.confirm({ |
| | | title: "确认删除", |
| | | content: "您确认要删除 " + v.tagTypeName + " ?", |
| | | loading: true, |
| | | onOk: () => { |
| | | // 删除 |
| | | deleteTagTypeById(v.id).then((res) => { |
| | | this.$Modal.remove(); |
| | | if (res.code===200) { |
| | | this.$Message.success("操作成功"); |
| | | this.getAllList(); |
| | | } |
| | | }); |
| | | }, |
| | | }); |
| | | }, |
| | | // 获取分类数据 |
| | | getAllList(newval) { |
| | | this.loading = true; |
| | | getTagTypeList().then((res) => { |
| | | this.loading = false; |
| | | if (res.code===200) { |
| | | // 仅展开指定级数 默认后台已展开所有 |
| | | let expandLevel = this.expandLevel; |
| | | res.data.forEach(function (e) { |
| | | if (expandLevel == 1) { |
| | | if (e.level == 0) { |
| | | e.expand = false; |
| | | } |
| | | if (e.children && e.children.length > 0) { |
| | | e.children.forEach(function (c) { |
| | | if (c.level == 1) { |
| | | c.expand = false; |
| | | } |
| | | if (c.children && c.children.length > 0) { |
| | | c.children.forEach(function (b) { |
| | | if (b.level == 2) { |
| | | b.expand = false; |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | } else if (expandLevel == 2) { |
| | | if (e.level == 0) { |
| | | e.expand = true; |
| | | } |
| | | if (e.children && e.children.length > 0) { |
| | | e.children.forEach(function (c) { |
| | | if (c.level == 1) { |
| | | c.expand = false; |
| | | } |
| | | if (c.children && c.children.length > 0) { |
| | | c.children.forEach(function (b) { |
| | | if (b.level == 2) { |
| | | b.expand = false; |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | } else if (expandLevel == 3) { |
| | | if (e.level == 0) { |
| | | e.expand = true; |
| | | } |
| | | if (e.children && e.children.length > 0) { |
| | | e.children.forEach(function (c) { |
| | | if (c.level == 1) { |
| | | c.expand = true; |
| | | } |
| | | if (c.children && c.children.length > 0) { |
| | | c.children.forEach(function (b) { |
| | | if (b.level == 2) { |
| | | b.expand = false; |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | this.tableData = res.data; |
| | | } |
| | | }); |
| | | }, |
| | | }, |
| | | mounted() { |
| | | this.init(); |
| | | }, |
| | | }; |
| | | </script> |
| | | <style lang="scss" scoped> |
| | | .article { |
| | | font-size: 16px; |
| | | font-weight: 400; |
| | | margin: 12px 0; |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <div class="wrapper"> |
| | | <Row> |
| | | <Col span="4"> |
| | | <Card style="height: 100%;" class="article-category mr_10"> |
| | | <Tree :data="treeData" @on-select-change="handleCateChange"></Tree> |
| | | </Card> |
| | | </Col> |
| | | <Col span="20"> |
| | | <Card class="article-detail"> |
| | | <Row @keydown.enter.native="handleSearch"> |
| | | <Form ref="searchForm" :model="searchForm" inline :label-width="70" style="width: 100%" class="search-form"> |
| | | <Form-item label="标签名称" prop="tagName"> |
| | | <Input type="text" v-model="searchForm.tagName" placeholder="请输入标签名称" clearable style="width: 200px" /> |
| | | </Form-item> |
| | | <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> |
| | | </Form> |
| | | </Row> |
| | | <Row class="operation padding-row"> |
| | | <Button @click="add" v-if="!selected" type="primary">添加</Button> |
| | | </Row> |
| | | <Table :loading="loading" border :columns="columns" :data="data" style="height: calc(100vh - 328px);" |
| | | ref="table"> |
| | | <!-- 页面展示 --> |
| | | <template slot="openStatusSlot" slot-scope="scope"> |
| | | <div></div> |
| | | <i-switch size="large" v-model="scope.row.openStatus" @on-change="changeSwitch(scope.row)"> |
| | | <span slot="open">展示</span> |
| | | <span slot="close">隐藏</span> |
| | | </i-switch> |
| | | </template> |
| | | </Table> |
| | | <Row type="flex" justify="end" class="mt_10"> |
| | | <Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" |
| | | @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small" show-total show-elevator> |
| | | </Page> |
| | | </Row> |
| | | </Card> |
| | | </Col> |
| | | </Row> |
| | | <template v-if="!selected"> |
| | | <Modal :tagName="modalTitle" v-model="modalVisible" :mask-closable="false" :width="1100"> |
| | | <Form ref="form" :model="form" :label-width="100"> |
| | | <FormItem label="标签名称" prop="tagName"> |
| | | <Input v-model="form.tagName" clearable style="width: 40%" /> |
| | | </FormItem> |
| | | <FormItem label="标签分类" prop="tagTypeId"> |
| | | <Select v-model="treeValue" placeholder="请选择" clearable style="width: 180px"> |
| | | <Option v-if="treeValue" :value="treeValue" style="display: none">{{ treeValue }} |
| | | </Option> |
| | | <Tree :data="treeDataDefault" @on-select-change="handleCheckChange"></Tree> |
| | | </Select> |
| | | </FormItem> |
| | | <FormItem label="排序" prop="sortNum"> |
| | | <Input type="number" v-model="form.sortNum" clearable style="width: 10%" /> |
| | | </FormItem> |
| | | </Form> |
| | | <div slot="footer"> |
| | | <Button type="text" @click="modalVisible = false">取消</Button> |
| | | <Button type="primary" :loading="submitLoading" @click="handleSubmit">提交</Button> |
| | | </div> |
| | | </Modal> |
| | | </template> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getTagTypeList } from "@/api/tag-type"; |
| | | import { getTags, deleteTagById, editTag, addTag } from "@/api/tag"; |
| | | import tinymec from "@/components/editor/index.vue"; |
| | | export default { |
| | | components: { |
| | | tinymec: tinymec, |
| | | }, |
| | | props: { |
| | | selected: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | selectedIndex: 99999, // 已选下标 |
| | | loading: true, // 表单加载状态 |
| | | modalType: 0, // 添加或编辑标识 |
| | | modalVisible: false, // 添加或编辑显示 |
| | | modalTitle: "", // 添加或编辑标题 |
| | | treeDataDefault: [], |
| | | searchForm: { |
| | | // 搜索框初始化对象 |
| | | pageNumber: 1, // 当前页数 |
| | | pageSize: 10, // 页面大小 |
| | | sortNum: "createTime", // 默认排序字段 |
| | | order: "desc", // 默认排序方式 |
| | | tagTypeId: "", |
| | | }, |
| | | searchTreeValue: "", // 切换 |
| | | form: { |
| | | // 添加或编辑表单对象初始化数据 |
| | | tagName: "", |
| | | tagTypeId: "", |
| | | sortNum: 1, |
| | | id: "", |
| | | }, |
| | | list: [], // 列表 |
| | | treeValue: "", // 选择的分类 |
| | | //树结构 |
| | | treeData: [], |
| | | submitLoading: false, // 添加或编辑提交状态 |
| | | columns: [ |
| | | // 表头 |
| | | { |
| | | title: "分类名称", |
| | | key: "tagTypeName", |
| | | width: 150, |
| | | }, |
| | | { |
| | | title: "标签名称", |
| | | key: "tagName", |
| | | minWidth: 200, |
| | | tooltip: true, |
| | | }, |
| | | { |
| | | title: "排序", |
| | | key: "sortNum", |
| | | width: 100, |
| | | }, |
| | | { |
| | | title: "操作", |
| | | key: "action", |
| | | align: "center", |
| | | |
| | | width: 230, |
| | | render: (h, params) => { |
| | | return h("div", [ |
| | | h( |
| | | "Button", |
| | | { |
| | | props: { |
| | | size: "small", |
| | | type: |
| | | this.selectedIndex == params.index |
| | | ? "primary" |
| | | : "default", |
| | | }, |
| | | style: { |
| | | marginRight: "5px", |
| | | display: this.selected ? "" : "none", |
| | | }, |
| | | on: { |
| | | click: () => { |
| | | this.selectedIndex = params.index; |
| | | this.$emit("callbacked", params.row); |
| | | }, |
| | | }, |
| | | }, |
| | | this.selectedIndex == params.index ? "已选" : "选择" |
| | | ), |
| | | h( |
| | | "Button", |
| | | { |
| | | props: { |
| | | size: "small", |
| | | type: "info", |
| | | }, |
| | | style: { |
| | | marginRight: "5px", |
| | | }, |
| | | on: { |
| | | click: () => { |
| | | this.edit(params.row); |
| | | }, |
| | | }, |
| | | }, |
| | | "编辑" |
| | | ), |
| | | h( |
| | | "Button", |
| | | { |
| | | props: { |
| | | type: "error", |
| | | size: "small", |
| | | }, |
| | | on: { |
| | | click: () => { |
| | | this.remove(params.row); |
| | | }, |
| | | }, |
| | | }, |
| | | "删除" |
| | | ), |
| | | ]); |
| | | }, |
| | | }, |
| | | ], |
| | | data: [], // 表单数据 |
| | | total: 0, // 表单数据总数 |
| | | }; |
| | | }, |
| | | watch: { |
| | | "searchForm.tagTypeId": { |
| | | handler() { |
| | | this.handleSearch(); |
| | | }, |
| | | deep: true, |
| | | }, |
| | | "searchForm.tagName": { |
| | | handler() { |
| | | this.handleSearch(); |
| | | }, |
| | | deep: true, |
| | | }, |
| | | }, |
| | | methods: { |
| | | // 初始化数据 |
| | | init() { |
| | | this.getDataList(); |
| | | this.getAllList(0); |
| | | }, |
| | | // 选择分类回调 |
| | | handleCateChange(data) { |
| | | let { value, title } = data[0]; |
| | | this.list.push({ |
| | | value, |
| | | title, |
| | | }); |
| | | this.searchForm.tagTypeId = value; |
| | | this.searchTreeValue = title; |
| | | this.getDataList() |
| | | }, |
| | | // 标签分类的选择事件 |
| | | handleCheckChange(data) { |
| | | let value = ""; |
| | | let title = ""; |
| | | this.list = []; |
| | | data.forEach((item, index) => { |
| | | value += `${item.value},`; |
| | | title += `${item.title},`; |
| | | }); |
| | | value = value.substring(0, value.length - 1); |
| | | title = title.substring(0, title.length - 1); |
| | | this.list.push({ |
| | | value, |
| | | title, |
| | | }); |
| | | this.form.tagTypeId = value; |
| | | this.treeValue = title; |
| | | }, |
| | | // 改变页数 |
| | | changePage(v) { |
| | | this.searchForm.pageNumber = v; |
| | | this.getDataList(); |
| | | }, |
| | | // 改变页码 |
| | | changePageSize(v) { |
| | | this.selected.pageNumber = 1; |
| | | this.searchForm.pageSize = v; |
| | | this.getDataList(); |
| | | }, |
| | | // 搜索列表 |
| | | handleSearch() { |
| | | this.searchForm.pageNumber = 1; |
| | | this.searchForm.pageSize = 10; |
| | | this.getDataList(); |
| | | }, |
| | | // 获取全部标签分类 |
| | | getAllList(parent_id) { |
| | | this.loading = true; |
| | | getTagTypeList(parent_id).then((res) => { |
| | | this.loading = false; |
| | | if (res.code == 200) { |
| | | this.treeData = this.getTree(res.data); |
| | | this.treeDataDefault = this.getTree(res.data); |
| | | this.treeData.unshift({ |
| | | title: "全部", |
| | | level: 0, |
| | | children: [], |
| | | id: "0", |
| | | tagTypeId: 0, |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | // 标签分类格式化方法 |
| | | getTree(tree = []) { |
| | | let arr = []; |
| | | if (!!tree && tree.length !== 0) { |
| | | tree.forEach((item) => { |
| | | let obj = {}; |
| | | obj.title = item.tagTypeName; |
| | | obj.value = item.id; |
| | | obj.attr = item.tagTypeName; // 其他你想要添加的属性 |
| | | obj.expand = false; |
| | | obj.selected = false; |
| | | obj.children = this.getTree(item.children); // 递归调用 |
| | | arr.push(obj); |
| | | }); |
| | | } |
| | | return arr; |
| | | }, |
| | | // 获取标签列表 |
| | | getDataList(val) { |
| | | if (val) this.form = {}; |
| | | this.loading = true; |
| | | getTags(this.searchForm).then((res) => { |
| | | this.loading = false; |
| | | if (res.code === 200) { |
| | | this.total = res.total; |
| | | //为了在是否展示一列展示开关 需要改一下数据类型,最终提交再次更改 |
| | | this.data = []; |
| | | if (res.data.length > 0) { |
| | | this.data = res.data; |
| | | } |
| | | } |
| | | }); |
| | | this.total = this.data?.length; |
| | | this.loading = false; |
| | | }, |
| | | // 添加标签 |
| | | handleSubmit() { |
| | | this.$refs.form.validate((valid) => { |
| | | if (valid) { |
| | | this.submitLoading = true; |
| | | if (this.modalType === 0) { |
| | | // 添加 避免编辑后传入id等数据 记得删除 |
| | | delete this.form.id; |
| | | addTag(this.form).then((res) => { |
| | | this.submitLoading = false; |
| | | if (res.code === 200) { |
| | | this.$Message.success("操作成功"); |
| | | this.getDataList(); |
| | | this.modalVisible = false; |
| | | } |
| | | }); |
| | | } else { |
| | | // 编辑 |
| | | editTag(this.form).then((res) => { |
| | | this.submitLoading = false; |
| | | if (res.code === 200) { |
| | | this.$Message.success("操作成功"); |
| | | this.getDataList(); |
| | | this.modalVisible = false; |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | // 添加标签modal |
| | | add() { |
| | | this.modalType = 0; |
| | | this.modalTitle = "添加标签"; |
| | | this.treeValue = ""; |
| | | |
| | | this.form = { |
| | | sortNum: 1, |
| | | tagName: "", |
| | | }; |
| | | this.$refs.form.resetFields(); |
| | | delete this.form.id; |
| | | this.modalVisible = true; |
| | | }, |
| | | // 编辑标签modal |
| | | edit(data) { |
| | | this.modalType = 1; |
| | | this.modalTitle = "编辑标签"; |
| | | this.treeValue = ""; |
| | | this.form = { |
| | | tagName: "", |
| | | }; |
| | | this.$refs.form.resetFields(); |
| | | |
| | | this.modalVisible = true; |
| | | this.form.tagTypeId = data.tagTypeId; |
| | | this.treeValue = data.tagTypeName; |
| | | this.form.id = data.id; |
| | | this.form.tagName = data.tagName; |
| | | this.form.sortNum = data.sortNum; |
| | | }, |
| | | // 删除标签 |
| | | remove(v) { |
| | | this.$Modal.confirm({ |
| | | tagName: "确认删除", |
| | | content: "您确认要删除么?", |
| | | loading: true, |
| | | onOk: () => { |
| | | // 删除 |
| | | deleteTagById(v.id).then((res) => { |
| | | this.$Modal.remove(); |
| | | if (res.code === 200) { |
| | | this.$Message.success("操作成功"); |
| | | this.getDataList(); |
| | | } |
| | | }); |
| | | }, |
| | | }); |
| | | }, |
| | | }, |
| | | mounted() { |
| | | this.init(); |
| | | }, |
| | | }; |
| | | </script> |