Merge pull request '完成广告管理模块接口' (#39) from Brunch_LPQ into main
commit
02aeabc082
@ -0,0 +1,59 @@
|
|||||||
|
package com.itmk.web.banner.controller;
|
||||||
|
|
||||||
|
|
||||||
|
import com.alibaba.druid.util.StringUtils;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.itmk.utils.ResultUtils;
|
||||||
|
import com.itmk.utils.ResultVo;
|
||||||
|
import com.itmk.web.banner.entity.BannerParm;
|
||||||
|
import com.itmk.web.banner.entity.SysBanner;
|
||||||
|
import com.itmk.web.banner.service.SysBannerService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/banner")
|
||||||
|
public class SysBannerController {
|
||||||
|
@Autowired
|
||||||
|
private SysBannerService sysBannerService;
|
||||||
|
|
||||||
|
// 新增
|
||||||
|
@PostMapping
|
||||||
|
public ResultVo addCategory(@RequestBody SysBanner sysBanner) {
|
||||||
|
sysBannerService.save(sysBanner);
|
||||||
|
return ResultUtils.success("新增广告成功!", sysBanner);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 编辑广告
|
||||||
|
@PutMapping
|
||||||
|
public ResultVo editCategory(@RequestBody SysBanner sysBanner){
|
||||||
|
if(sysBannerService.updateById(sysBanner)){
|
||||||
|
return ResultUtils.success("编辑广告成功!", sysBanner);
|
||||||
|
}
|
||||||
|
return ResultUtils.error("编辑广告失败!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除广告
|
||||||
|
@DeleteMapping("/{categoryId}")
|
||||||
|
public ResultVo deleteCategory(@PathVariable Long categoryId){
|
||||||
|
if(sysBannerService.removeById(categoryId)){
|
||||||
|
return ResultUtils.success("删除广告成功!");
|
||||||
|
}
|
||||||
|
return ResultUtils.error("删除广告失败!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 列表查询
|
||||||
|
// 列表查询需要分页
|
||||||
|
@GetMapping("/list")
|
||||||
|
public ResultVo getList(BannerParm parm) {
|
||||||
|
IPage<SysBanner> page = new Page<>(parm.getCurrentPage(), parm.getPageSize());
|
||||||
|
//构造查询条件
|
||||||
|
QueryWrapper<SysBanner> query = new QueryWrapper<>();
|
||||||
|
query.lambda().like(!StringUtils.isEmpty(parm.getTitle()),SysBanner::getTitle,parm.getTitle());
|
||||||
|
IPage<SysBanner> list = sysBannerService.page(page, query);
|
||||||
|
return ResultUtils.success("查询成功",list);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package com.itmk.web.banner.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class BannerParm {
|
||||||
|
private Integer currentPage; //当前页
|
||||||
|
private Integer pageSize;//每页查询的条数
|
||||||
|
private String title;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
|||||||
|
package com.itmk.web.banner.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@TableName("sys_banner")
|
||||||
|
public class SysBanner {
|
||||||
|
@TableId(type = IdType.AUTO)
|
||||||
|
private Long bannerId;
|
||||||
|
private Long goodsId;
|
||||||
|
private String title;
|
||||||
|
private String images;
|
||||||
|
private String status;
|
||||||
|
private Integer orderNum;
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.itmk.web.banner.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.itmk.web.banner.entity.SysBanner;
|
||||||
|
|
||||||
|
public interface SysBannerMapper extends BaseMapper<SysBanner> {
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.itmk.web.banner.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.itmk.web.banner.entity.SysBanner;
|
||||||
|
|
||||||
|
public interface SysBannerService extends IService<SysBanner> {
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package com.itmk.web.banner.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.itmk.web.banner.entity.SysBanner;
|
||||||
|
import com.itmk.web.banner.mapper.SysBannerMapper;
|
||||||
|
import com.itmk.web.banner.service.SysBannerService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class SysBannerServiceImpl extends ServiceImpl<SysBannerMapper, SysBanner> implements SysBannerService {
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
<!DOCTYPE mapper
|
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
|
||||||
|
<mapper namespace="com.itmk.web.sys_banner.mapper.SysBannerMapper">
|
||||||
|
|
||||||
|
</mapper>
|
@ -0,0 +1,18 @@
|
|||||||
|
//列表参数类型
|
||||||
|
export type bannerListParm = {
|
||||||
|
currentPage:number;
|
||||||
|
pageSize:number;
|
||||||
|
title:string;
|
||||||
|
total:number; //分页的总条数
|
||||||
|
}
|
||||||
|
//广告管理数据类型
|
||||||
|
export type bannerType = {
|
||||||
|
categoryId: string;
|
||||||
|
type:string;
|
||||||
|
bannerId:string;
|
||||||
|
goodsId:string;
|
||||||
|
title:string;
|
||||||
|
images:string;
|
||||||
|
status:string;
|
||||||
|
orderNum:string;
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
import http from "../../http";
|
||||||
|
import type { bannerType, bannerListParm } from "./bannerModel";
|
||||||
|
//新增
|
||||||
|
export const addApi = (parm:bannerType)=>{
|
||||||
|
return http.post("/api/banner",parm)
|
||||||
|
}
|
||||||
|
|
||||||
|
//列表
|
||||||
|
export const getListApi = (parm:bannerListParm)=>{
|
||||||
|
return http.get("/api/banner/list",parm)
|
||||||
|
}
|
||||||
|
|
||||||
|
//编辑
|
||||||
|
export const editApi = (parm:bannerType)=>{
|
||||||
|
return http.put("/api/banner",parm)
|
||||||
|
}
|
||||||
|
//删除
|
||||||
|
export const deleteApi = (bannerId:string)=>{
|
||||||
|
return http.delete(`/api/banner/${bannerId}`)
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
import type { bannerType } from "../../api/banner/bannerModel";
|
||||||
|
import { EditType, type FuncList } from "../../type/baseType";
|
||||||
|
import { ref } from "vue";
|
||||||
|
import { deleteApi } from '../../api/banner/index'
|
||||||
|
import useInstance from "@/hooks/useInstance";
|
||||||
|
import { ElMessage } from "element-plus";
|
||||||
|
export default function useBanner(getList: FuncList) {
|
||||||
|
const { global } = useInstance()
|
||||||
|
const showBtn = ref<{ show: (title: string, type: string, width?: number, height?: number, row?: bannerType) => {} }>();
|
||||||
|
//新增
|
||||||
|
const addBtn = () => {
|
||||||
|
showBtn.value?.show("新增", EditType.ADD, 900, 500)
|
||||||
|
}
|
||||||
|
//编辑
|
||||||
|
const editBtn = (row: bannerType) => {
|
||||||
|
showBtn.value?.show("编辑", EditType.EDIT, 900, 500, row)
|
||||||
|
}
|
||||||
|
//删除
|
||||||
|
const deleteBtn = async (row: bannerType) => {
|
||||||
|
const confirm = await global.$myconfirm('确定删除吗?')
|
||||||
|
if (confirm) {
|
||||||
|
let res = await deleteApi(row.bannerId)
|
||||||
|
if (res && res.code == 200) {
|
||||||
|
ElMessage.success(res.msg)
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
showBtn,
|
||||||
|
addBtn,
|
||||||
|
editBtn,
|
||||||
|
deleteBtn
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
import type { bannerListParm } from "../../api/banner/bannerModel";
|
||||||
|
import { reactive ,ref,onMounted,nextTick} from "vue";
|
||||||
|
import {getListApi} from '../../api/banner/index'
|
||||||
|
export default function useBannerTable(){
|
||||||
|
//表格高度
|
||||||
|
const tableHeight = ref(0)
|
||||||
|
//接收表格数据
|
||||||
|
const tableList = ref([])
|
||||||
|
//列表查询的参数
|
||||||
|
const listParm = reactive<bannerListParm>({
|
||||||
|
currentPage:1,
|
||||||
|
pageSize:10,
|
||||||
|
title:'',
|
||||||
|
total:0
|
||||||
|
})
|
||||||
|
//列表
|
||||||
|
const getList = async()=>{
|
||||||
|
let res = await getListApi(listParm)
|
||||||
|
if(res && res.code == 200){
|
||||||
|
tableList.value = res.data.records;
|
||||||
|
listParm.total = res.data.total;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//搜索
|
||||||
|
const searchBtn = ()=>{
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
//重置
|
||||||
|
const resetBtn = ()=>{
|
||||||
|
listParm.currentPage = 1;
|
||||||
|
listParm.title = ''
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
//页容量改变时触发
|
||||||
|
const sizeChange = (size:number)=>{
|
||||||
|
listParm.pageSize = size;
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
//页数改变触发
|
||||||
|
const currentChange = (page:number)=>{
|
||||||
|
listParm.currentPage = page;
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
onMounted(()=>{
|
||||||
|
getList()
|
||||||
|
nextTick(()=>{
|
||||||
|
tableHeight.value = window.innerHeight - 220
|
||||||
|
})
|
||||||
|
})
|
||||||
|
return{
|
||||||
|
listParm,
|
||||||
|
getList,
|
||||||
|
searchBtn,
|
||||||
|
resetBtn,
|
||||||
|
tableList,
|
||||||
|
sizeChange,
|
||||||
|
currentChange,
|
||||||
|
tableHeight
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
import { ref } from "vue";
|
||||||
|
import { getSelectListApi } from "../../api/goods";
|
||||||
|
|
||||||
|
// 定义下拉选项的类型
|
||||||
|
export interface SelectOption {
|
||||||
|
value: string | number;
|
||||||
|
label: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function useSelectCategory() {
|
||||||
|
// 下拉数据
|
||||||
|
const selectData = ref<SelectOption[]>([])
|
||||||
|
|
||||||
|
// 获取下拉数据
|
||||||
|
const getSelect = async () => {
|
||||||
|
try {
|
||||||
|
let res = await getSelectListApi();
|
||||||
|
console.log("API原始响应:", res); // 打印完整响应
|
||||||
|
|
||||||
|
if (res && res.code == 200) {
|
||||||
|
// 打印实际数据结构
|
||||||
|
console.log("API返回的数据类型:", typeof res.data);
|
||||||
|
console.log("API返回的数据:", res.data);
|
||||||
|
|
||||||
|
// 检查数据是否为数组
|
||||||
|
if (!Array.isArray(res.data)) {
|
||||||
|
console.error("API返回的数据不是数组:", res.data);
|
||||||
|
selectData.value = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查数组元素结构
|
||||||
|
if (res.data.length > 0) {
|
||||||
|
console.log("第一个元素的结构:", Object.keys(res.data[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建新数组赋值,确保响应式更新
|
||||||
|
const newData = res.data.map(item => ({
|
||||||
|
value: item.value.toString(),
|
||||||
|
label: item.label
|
||||||
|
}));
|
||||||
|
|
||||||
|
selectData.value = newData;
|
||||||
|
console.log("映射后的分类数据:", JSON.parse(JSON.stringify(newData)));
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("获取分类数据失败:", error);
|
||||||
|
selectData.value = [];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
return {
|
||||||
|
selectData, getSelect
|
||||||
|
}
|
||||||
|
}
|
@ -1,13 +1,70 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<el-main>
|
||||||
广告管理
|
<!-- 搜索栏 -->
|
||||||
</div>
|
<el-form :model="listParm" :inline="true" size="default">
|
||||||
|
<el-form-item>
|
||||||
|
<el-input placeholder="请输入标题" v-model="listParm.title"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button :icon="Search" @click="searchBtn">搜索</el-button>
|
||||||
|
<el-button :icon="Close" type="danger" plain @click="resetBtn"
|
||||||
|
>重置</el-button
|
||||||
|
>
|
||||||
|
<el-button :icon="Plus" type="primary" plain @click="addBtn">新增</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<!-- 表格 -->
|
||||||
|
<el-table :height="tableHeight" :data="tableList" border stripe>
|
||||||
|
<el-table-column label="广告图片" prop="goodsImage">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-image
|
||||||
|
:src="scope.row.images.split(',')[0]"
|
||||||
|
style="height: 60px; width: 60px; border-radius: 50%"
|
||||||
|
></el-image>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="标题" prop="title"></el-table-column>
|
||||||
|
<el-table-column label="是否上架" prop="title">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-tag v-if="scope.row.status == '0'" type="danger" size="default"
|
||||||
|
>否</el-tag
|
||||||
|
>
|
||||||
|
<el-tag v-else size="default" effect="light">是</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="序号" prop="orderNum"></el-table-column>
|
||||||
|
<el-table-column label="操作" width="220" align="center">
|
||||||
|
<template #default="scoped">
|
||||||
|
<el-button :icon="Edit" type="primary" size="default" @click="editBtn(scoped.row)">编辑</el-button>
|
||||||
|
<el-button :icon="Delete" type="danger" size="default" @click="deleteBtn(scoped.row)">删除</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<el-pagination
|
||||||
|
@size-change="sizeChange"
|
||||||
|
@current-change="currentChange"
|
||||||
|
:current-page.sync="listParm.currentPage"
|
||||||
|
:page-sizes="[10,20, 40, 80, 100]"
|
||||||
|
:page-size="listParm.pageSize"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
:total="listParm.total" background>
|
||||||
|
</el-pagination>
|
||||||
|
|
||||||
|
</el-main>
|
||||||
|
<!-- 新增、编辑 -->
|
||||||
|
<add-banner ref="showBtn" @onFresh="getList"></add-banner>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import AddBanner from "@/views/banner/AddBanner.vue";
|
||||||
|
import { Edit, Plus, Delete, Search, Close } from "@element-plus/icons-vue";
|
||||||
|
import useBannerTable from "@/compositions/banner/useBannerTable";
|
||||||
|
import useBanner from "@/compositions/banner/useBanner";
|
||||||
|
//表格业务
|
||||||
|
const { getList, listParm, resetBtn, searchBtn, tableList,sizeChange ,currentChange,tableHeight} = useBannerTable();
|
||||||
|
//增删改业务
|
||||||
|
const { addBtn, editBtn, deleteBtn, showBtn } = useBanner(getList);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped></style>
|
||||||
|
|
||||||
</style>
|
|
Loading…
Reference in new issue