先放实现效果!!
前台,前台的基本功能都已经实现
后台 页面套的瑞吉外卖的后台模板
前端部分代码
<script setup>
import { ref, onMounted } from 'vue';
import { getAll } from "@/api/CategoryApi.js";
import MainLayoutTop from "@/components/MainLayoutTop.vue";
import router from "@/router/index.js";
import BookSearchView from "@/components/BookSearchView.vue";
import {
getBookSalesMostService,
getNewMostSaleBookService,
getRecentBookService,
getRecommendService
} from "@/api/BookApi.js";
const categorys = ref([]);
const getAllCategory = async () => {
let result = await getAll();
if (result.code === 0) {
categorys.value = result.data.map(category => ({
...category,
collapsed: true
}));
}
};
const gotoCategory=(id)=>{
router.push({ name: 'categoryBook', params: { categorySecondId:id } })
}
const bookName = ref("")
const toSearchBook=()=>{
router.push({ name: 'bookSearch', params: { bookName: bookName.value } })
}
const getImage= (imageUrl)=> {
return `/api/common/download?name=${imageUrl}`
}
const recommendBooks = ref([{
bookId:0,
picture:null,
bookName:null,
dangdangPrice:0,
originPrice:0
}])
const salesBooks = ref([{
bookId:0,
picture:null,
bookName:null,
dangdangPrice:0,
originPrice:0
}])
const recentBooks = ref([{
bookId:0,
picture:null,
bookName:null,
dangdangPrice:0,
originPrice:0
}])
const recentAndSalesMostBooks=ref([{
bookId:0,
picture:null,
bookName:null,
dangdangPrice:0,
originPrice:0
}])
const getRecommend=async()=>{
let result = await getRecommendService();
recommendBooks.value = result.data
}
const getSalesMost=async()=>{
let result = await getBookSalesMostService();
salesBooks.value = result.data
}
const getRecentBooks = async () =>{
let result = await getRecentBookService()
recentBooks.value = result.data
}
const getNewAndSaleMost = async ()=>{
let result = await getNewMostSaleBookService()
recentAndSalesMostBooks.value = result.data
}
onMounted(()=>{
getAllCategory()
getRecommend()
getSalesMost()
getRecentBooks()
getNewAndSaleMost()
});
</script>
<template>
<MainLayoutTop></MainLayoutTop>
<div class="container">
<BookSearchView></BookSearchView>
<br>
<br>
<div class="row">
<div class="col-md-3">
<div class="panel panel-warning">
<div class="panel-heading">
<h5 class="panel-title">分类浏览</h5>
</div>
<div class="panel-body">
<div class="panel-group" id="category">
<div>
<div class="panel-group" id="category">
<div v-for="category in categorys" :key="category.categoryFirstId" class="category-container">
<a :href="'#' + category.categoryFirstId" data-toggle="collapse" :data-target="'#' + category.categoryFirstId">
<strong class="text-danger">[{{ category.categoryFirstName }}]</strong>
</a>
<div :class="{'panel-collapse': true, 'collapse': category.collapsed}" :id="category.categoryFirstId">
<div class="panel-body bg-success">
<h5><a>{{ category.categoryFirstName }}</a></h5>
<div class="sub-category-container">
<router-link to v-for="subCategory in category.categorySecondList" :key="subCategory.categorySecondId" class="sub-category-item">
<span @click="gotoCategory(subCategory.categorySecondId)" class="text-info">{{ subCategory.categorySecondName }}</span>
</router-link>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div id="top" class="carousel slide" data-ride="carousel">
<ol class="carousel-indicators">
<li data-target="#top" data-slide-to="0"></li>
<li data-target="#top" data-slide-to="1"></li>
<li data-target="#top" data-slide-to="2"></li>
<li data-target="#top" data-slide-to="3"></li>
<li data-target="#top" data-slide-to="4"></li>
<li data-target="#top" data-slide-to="5"></li>
</ol>
<div class="carousel-inner" role="list-box">
<div class="item active">
<img src="@/images/top/hzjsj2020618750315.jpg" alt="">
<div class="carousel-caption"></div>
</div>
<div class="item">
<img src="@/images/top/200424_wj_sxzmzt_750x315.jpg" alt="">
<div class="carousel-caption">
</div>
</div>
<div class="item">
<img src="@/images/top/200513_rjn2_dptj_750x315.jpg" alt="">
<div class="carousel-caption"></div>
</div>
<div class="item">
<img src="@/images/top/rrkddlzjs750315.jpg" alt="">
<div class="carousel-caption"></div>
</div>
<div class="item">
<img src="@/images/top/xcjg750_315.jpg" alt="">
<div></div>
</div>
<div class="item">
<img src="@/images/top/yunjisuan0422750315.jpg" alt="">
<div></div>
</div>
</div>
<a href="#top" class="left carousel-control" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left"></span>
</a>
<a href="#top" class="right carousel-control" data-slide="next">
<span class="glyphicon glyphicon-chevron-right"></span>
</a>
</div>
</div>
<div class="col-md-3">
<h4>信息公告</h4>
<ul>
<li>精品童装限时0元领</li>
<li>30万图书 5折封顶</li>
<li>当当阅读器 海量电子书免费读</li>
<li>多种商品,礼品卡支付更优惠</li>
<li>当当周年庆 实付200再减30</li>
</ul>
</div>
</div>
<br>
<br>
<div class="row">
<div class="col-sm-12">
<ul class="nav nav-tabs" style="display:inline-block">
<li class="active" @click="handRecord"><a href="#recommend" data-toggle="tab"><strong>编辑推荐</strong></a></li>
<li><a href="#hot-sale" data-toggle="tab"><strong>热销图书</strong></a></li>
<li><a href="#new-stores" data-toggle="tab"><strong>最新上架图书</strong></a></li>
<li><a href="#new-hot-sale" data-toggle="tab"><strong>新书热卖榜</strong></a></li>
</ul>
</div>
</div>
<div class="row">
<div class="tab-content">
<div class="tab-pane active" id="recommend">
<!--推荐-->
<div>
<div v-if="recommendBooks.length > 0">
<div v-for="book in recommendBooks" class="col-md-3">
<div class="thumbnail">
<router-link
:to="{ name: 'bookDetail', params: { bookId: book.bookId } }"
>
<img
:src="getImage(book.picture)"
alt="图片" style="height: 200px; width: 200px"
>
</router-link>
<div class="caption">
<router-link :to="{ name: 'bookDetail', params: { bookId: book.bookId }}">
<strong>{{ book.bookName }}</strong>
</router-link>
<p>
<span>¥{{ book.dangdangPrice }}</span>
<span> </span>
<del style="color:red" class="text-muted small">¥{{ book.originPrice }}</del>
</p>
</div>
</div>
</div>
</div>
<div v-else class="centered-text">
<h1>暂无推荐</h1>
</div>
</div>
</div>
<div class="tab-pane" id="hot-sale">
<!-- 热销 -->
<div>
<div v-if="salesBooks.length > 0">
<div v-for="book in salesBooks" class="col-md-3">
<div class="thumbnail">
<router-link
:to="{ name: 'bookDetail', params: { bookId: book.bookId } }"
>
<img
:src="getImage(book.picture)"
alt="图片" style="height: 200px; width: 200px"
>
</router-link>
<div class="caption">
<router-link :to="{ name: 'bookDetail', params: { bookId: book.bookId }}">
<strong>{{ book.bookName }}</strong>
</router-link>
<p>
<span>¥{{ book.dangdangPrice }}</span>
<span> </span>
<del style="color:red" class="text-muted small">¥{{ book.originPrice }}</del>
</p>
</div>
</div>
</div>
</div>
<div v-else class="centered-text">
<h1>暂无热销</h1>
</div>
</div>
</div>
<div class="tab-pane" id="new-stores">
<!-- 新书上架 -->
<div>
<div v-if="recentBooks.length > 0">
<div v-for="book in recentBooks" class="col-md-3">
<div class="thumbnail">
<router-link
:to="{ name: 'bookDetail', params: { bookId: book.bookId } }"
>
<img
:src="getImage(book.picture)"
alt="图片" style="height: 200px; width: 200px"
>
</router-link>
<div class="caption">
<router-link :to="{ name: 'bookDetail', params: { bookId: book.bookId }}">
<strong>{{ book.bookName }}</strong>
</router-link>
<p>
<span>¥{{ book.dangdangPrice }}</span>
<span> </span>
<del style="color:red" class="text-muted small">¥{{ book.originPrice }}</del>
</p>
</div>
</div>
</div>
</div>
<div v-else class="centered-text">
<h1>暂无热销</h1>
</div>
</div>
</div>
<div class="tab-pane" id="new-hot-sale">
<!-- 新书热卖 -->
<div>
<div v-if="recentAndSalesMostBooks.length > 0">
<div v-for="book in recentAndSalesMostBooks" class="col-md-3">
<div class="thumbnail">
<router-link
:to="{ name: 'bookDetail', params: { bookId: book.bookId } }"
>
<img
:src="getImage(book.picture)"
alt="图片" style="height: 200px; width: 200px"
>
</router-link>
<div class="caption">
<router-link :to="{ name: 'bookDetail', params: { bookId: book.bookId }}">
<strong>{{ book.bookName }}</strong>
</router-link>
<p>
<span>¥{{ book.dangdangPrice }}</span>
<span> </span>
<del style="color:red" class="text-muted small">¥{{ book.originPrice }}</del>
</p>
</div>
</div>
</div>
</div>
<div v-else class="centered-text">
<h1>暂无热卖</h1>
</div>
</div>
</div>
</div>
</div>
</div>
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
</template>
<style scoped>
.navbar-nav li.divider:after {
content: '';
position: absolute;
width: 1px;
height: 14px;
background-color: #a4a4a4;
top: 18px;
right: 0;
}
.carousel-indicators li{
background-color:rgba(167,167,167,0.5);
}
.category-container {
margin-bottom: 5px; /* 设置标题之间的下边距为 10px */
}
.category-container {
margin-bottom: 5px; /* 设置标题之间的下边距为 10px */
}
.sub-category-container {
display: flex;
}
.sub-category-item {
margin-right: 10px; /* 设置二级标题之间的右间距为 10px */
}
.centered-text {
display: flex;
justify-content: center;
align-items: center;
height: 100%; /* 或者设定一个具体的高度,如 300px */
text-align: center;
}
</style>
后端部分代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.dangdangbackend.mapper.BookMapper">
<insert id="insertBook" parameterType="com.example.dangdangbackend.entity.Book">
INSERT INTO book (book_id, book_name, category_id, origin_price, dangdang_price, stocks, writer, publisher, publish_time, order_edition, print_time, print_num, IBSN, format, paper, book_package, page_num, word_num, picture, editor_promote, content_introduction, writer_introduction, basic_directory, media_remark,create_time,update_time)
VALUES (#{bookId}, #{bookName}, #{categoryId}, #{originPrice}, #{dangdangPrice}, #{stocks}, #{writer}, #{publisher}, #{publishTime}, #{orderEdition}, #{printTime}, #{printNum}, #{IBSN}, #{format}, #{paper}, #{bookPackage}, #{pageNum}, #{wordNum}, #{picture}, #{editorPromote}, #{contentIntroduction}, #{writerIntroduction}, #{basicDirection}, #{mediaRemark},#{createTime},#{updateTime});
</insert>
<select id="searchBooks" parameterType="string" resultType="com.example.dangdangbackend.VO.BookTableVO">
SELECT book_id,book_name,writer,publisher,origin_price,dangdang_price,publish_time,picture,stocks,sales,status
FROM book
WHERE 1=1
<if test="bookName != null and bookName != ''">
AND book_name LIKE CONCAT('%', #{bookName}, '%')
</if>
<if test="publisher != null and publisher != ''">
AND publisher LIKE CONCAT('%', #{publisher}, '%')
</if>
<if test="writer != null and writer != ''">
AND writer LIKE CONCAT('%', #{writer}, '%')
</if>
</select>
<delete id="deleteBooks" parameterType="java.util.List">
delete from book where book_id in
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</delete>
<update id="updateBookById" parameterType="com.example.dangdangbackend.DTO.UpdateBookDTO">
UPDATE book
SET
book_name = #{bookName},
category_id = #{categoryId},
origin_price = #{originPrice},
dangdang_price = #{dangdangPrice},
stocks = #{stocks},
writer = #{writer},
publisher = #{publisher},
publish_time = #{publishTime},
order_edition = #{orderEdition},
print_time = #{printTime},
print_num = #{printNum},
IBSN = #{IBSN},
format = #{format},
paper = #{paper},
book_package = #{bookPackage},
page_num = #{pageNum},
word_num = #{wordNum},
picture = #{picture},
editor_promote = #{editorPromote},
content_introduction = #{contentIntroduction},
writer_introduction = #{writerIntroduction},
basic_directory = #{basicDirection},
media_remark = #{mediaRemark},
update_time = NOW()
WHERE book_id = #{bookId}
</update>
<select id="selectById" parameterType="int" resultType="com.example.dangdangbackend.DTO.BookDTO">
select * from book where book_id = #{bookId}
</select>
<select id="searchBooksByCategory" parameterType="int" resultType="com.example.dangdangbackend.VO.BookTableVO">
SELECT book_id,book_name,writer,publisher,origin_price,dangdang_price,publish_time,picture,stocks
FROM book
WHERE 1=1
<if test="categorySecondId != null and categorySecondId != 0">
AND category_id = #{categorySecondId}
</if>
</select>
<update id="addBookSales" parameterType="java.util.List">
update book
<set>
<foreach collection="list" item="item" separator=",">
book.sales = book.sales+ #{item.count},
stocks = stocks - #{item.count},
</foreach>
</set>
where book_id in
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item.bookId}
</foreach>
</update>
<update id="alertStatus" parameterType="int">
UPDATE book
SET status = CASE
WHEN status = 1 THEN 0
ELSE 1
END,
update_time = NOW()
WHERE book_id = #{bookId};
</update>
<!-- 查询最新编辑推荐的书目-->
<select id="getRecommendBooks" resultType="com.example.dangdangbackend.VO.SelectBooksVO">
SELECT book_id,picture,book_name,dangdang_price,origin_price
FROM book
WHERE status = 1
ORDER BY update_time DESC
LIMIT 4;
</select>
<!-- 查询热销图书-->
<select id="selectSalesMost" resultType="com.example.dangdangbackend.VO.SelectBooksVO">
SELECT book_id,picture,book_name,dangdang_price,origin_price
FROM book
ORDER BY sales DESC
LIMIT 4;
</select>
<!-- 查询最新上架图书-->
<select id="selectRecentBooks" resultType="com.example.dangdangbackend.VO.SelectBooksVO">
SELECT book_id,picture,book_name,dangdang_price,origin_price
FROM book
ORDER BY create_time DESC
LIMIT 4;
</select>
<!-- 新书热卖-->
<select id="selectNewBookAndSalesMost" resultType="com.example.dangdangbackend.VO.SelectBooksVO">
SELECT book_id,picture,book_name,dangdang_price,origin_price
FROM book
ORDER BY
create_time DESC,
sales DESC
LIMIT 4;
</select>
</mapper>
有想要的私信我吧,留一个免费的赞吧