以下是配置文件内容
#服务器配置
server.port=93
server.servlet.context-path=/
#server.context-path=
#server.display-name=
#server.tomcat.uri-encoding=UTF-8
#包含某个文件配置
#spring.profiles.include=
#数据源配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/fuxi2
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
#mybatis-plus增强工具配置
mybatis-plus.mapper-locations=classpath*:/mappers/**/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#枚举处理 不通的项目扫描的不通的枚举包
mybatis-plus.type-enums-package=com.chjx.syscourse.enums
#支持上传的配置
spring.servlet.multipart.enabled=true
#文件上传的大小
spring.servlet.multipart.max-file-size=2MB
#批量上传的最大请求大小
spring.servlet.multipart.max-request-size=10MB
#配置上传的路径地址
upload.path=D:/pic/
#配置访问的地址
upload.url=http://localhost:92/img/
后台代码如下
控制层代码
@RestController
@RequestMapping("/course")
public class CourseController {
private Logger logger = LoggerFactory.getLogger(CourseController.class);
@Autowired
private ICourseService iCourseService;
@Autowired
private ISectionService iSectionService;
@RequestMapping("/list")
public ResultApi list(Page page, Course course,String meiju,boolean sort){
//定义查询条件
QueryWrapper wrapper =new QueryWrapper();
if(course!=null){
//枚举处理
if(meiju!=null && !"".equals(meiju)){
if(meiju.equals("外语")){
course.setCategory(CategoryEnum.CATEGORY_TWO);
}else if(meiju.equals("考研")){
course.setCategory(CategoryEnum.CATEGORY_THREE);
}else if(meiju.equals("计算机")){
course.setCategory(CategoryEnum.CATEGORY_ONE);
}
wrapper.eq("category",course.getCategory());
}
//判断条件 !"".equals();
if(course.getName()!=null && !"".equals(course.getName())){
wrapper.like("name",course.getName());
}
//判断条件
if(course.getSprice()!=null && course.getEprice()!=null){
wrapper.between("sale",course.getSprice(),course.getEprice());
}
//判断条件
if(course.getStime()!=null && course.getEtime()!=null){
wrapper.between("starttime",course.getStime(),course.getEtime());
}
}
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@"+sort);
//判断排序
if(sort){
wrapper.orderByAsc("sale");
}else{
wrapper.orderByDesc("sale");
}
//查询课程
Page pageInfo = iCourseService.page(page, wrapper);
return ResultApi.success(pageInfo);
}
@RequestMapping("/insert")
public ResultApi insert(@RequestBody Course entity){
return ResultApi.success(iCourseService.save(entity));
}
@RequestMapping("/cateogries")
public ResultApi cateogries(){
return ResultApi.success(CategoryEnum.values());
}
@RequestMapping("/upload")
public ResultApi upload(MultipartFile file){
try {
//返回文件名称
String upload = UploadUtil.upload(file);
//拼接访问的路径地址
return ResultApi.success("http://localhost:93/img/"+upload);
} catch (IOException e) {
e.printStackTrace();
}
return ResultApi.error(null);
}
@RequestMapping("/deletes")
@Transactional
public ResultApi deletes(Integer ids[]){
try {
//先删除章节表
for (Integer id : ids) {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("cid", id);
iSectionService.remove(queryWrapper);
}
//删除课程表
iCourseService.removeByIds(Arrays.asList(ids));
return ResultApi.success(true);
}catch (Exception ex){
ex.printStackTrace();
}
return ResultApi.success(false);
}
}
@RestController
@RequestMapping("/section")
public class SectionController {
@Autowired
private ISectionService iSectionService;
@RequestMapping("/insert")
public ResultApi insert(@RequestBody Section entity){
return ResultApi.success(iSectionService.save(entity));
}
@RequestMapping("/sections")
public ResultApi getSectionByCid(Integer cid){
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("cid",cid);
return ResultApi.success(iSectionService.list(queryWrapper));
}
}
枚举类中的代码(配置文件中要配置扫描枚举类)
@Getter
public enum CategoryEnum {
CATEGORY_ONE(1,"计算机"),
CATEGORY_TWO(2,"外语"),
CATEGORY_THREE(3,"考研");
@EnumValue
private Integer id;
@JsonValue
private String name;
private CategoryEnum(Integer id,String name){
this.id=id;
this.name=name;
}
}
实体类中的时间格式
@TableField(exist = false)
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date stime;
前台代码 (使用elementUi)
<template>
<div class="about">
<el-row style="margin-bottom: 20px;">
<el-col :span="24">
<el-col :span="5">
<el-button type="primary" @click="openInsert">添加课程</el-button>
</el-col>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form :inline="true" :model="searhForm">
<el-form-item label="课程名称">
<el-input v-model="searhForm.name" placeholder="请输入课程名称"></el-input>
</el-form-item>
<el-form-item label="价格区间">
<el-input v-model="searhForm.sprice" style="width: 40%;"></el-input>至 <el-input v-model="searhForm.eprice" style="width: 40%;"></el-input>
</el-form-item>
<el-form-item label="上架时间区间">
<el-date-picker v-model="sdatevalues" type="daterange" value-format="yyyy-MM-dd" start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
</el-form-item>
<el-form-item label="课程分类">
<el-select v-model="searhForm.category" placeholder="请选择课程分类" style="width: 100%;">
<!--枚举添加的最终使用 {"reason":"数据操作成功","code":1001,"result":["计算机","外语","考研"]}-->
<!--categories ["计算机","外语","考研"]-->
<el-option v-for="item in categories" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="searchData">查询</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-switch v-model="sort" active-color="#13ce66" inactive-color="#ff4949" active-text="价格升序" inactive-text="价格降序">
</el-switch>
</el-col>
</el-row>
<el-row style="margin-bottom: 20px;">
<el-col :span="5" v-for="row in tableData" :offset="1">
<el-card :body-style="{ padding: '0px' }">
<img :src="row.img" class="image">
<div style="padding: 14px;text-align: left;">
<div>课程名称:{{row.name}}</div>
<div>课程价格:{{row.sale}}</div>
<div>课程分类:{{row.category}}</div>
<div>上架时间:{{row.starttime}}</div>
<div style="margin-top: 3px; margin-bottom: 3px;">
<el-button type="primary" size="mini" @click="opensInsert(row)">添加章节</el-button>
</div>
<div style="margin-top: 3px; margin-bottom: 3px;">
<el-button type="success" size="mini">修改课程</el-button>
</div>
<div style="margin-top: 3px; margin-bottom: 3px;">
<el-button type="danger" size="mini" @click="deleteData(row)">删除课程</el-button>
</div>
<div style="margin-top: 3px; margin-bottom: 3px;">
<el-button type="danger" size="mini" @click="detailcourse(row)">课程详细</el-button>
</div>
</div>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col :span="24" style="text-align: center;">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="current"
:page-sizes="pagesizes" :page-size="pagesize" layout="total, sizes, prev, pager, next, jumper" :total="total">
</el-pagination>
</el-col>
</el-row>
<!--课程添加操作-->
<el-dialog title="添加课程" :visible.sync="adddialogVisible" width="60%" center>
<el-form :model="addForm" :rules="addFormRules" ref="addForm" label-width="100px">
<el-form-item label="课程名称" prop="name">
<el-input v-model="addForm.name"></el-input>
</el-form-item>
<el-form-item label="课程封面">
<el-upload class="avatar-uploader" action="http://localhost:93/course/upload" :show-file-list="false" :on-success="handleAvatarSuccess">
<img v-if="imageUrl" :src="imageUrl" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
<el-form-item label="课程分类">
<el-select v-model="addForm.category" placeholder="请选择课程分类" style="width: 100%;">
<!--枚举添加的最终使用 {"reason":"数据操作成功","code":1001,"result":["计算机","外语","考研"]}-->
<!--categories ["计算机","外语","考研"]-->
<el-option v-for="item in categories" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="课程日期">
<el-date-picker v-model="datevalues" type="daterange" value-format="yyyy-MM-dd" start-placeholder="课程开始日期"
end-placeholder="课程结束日期">
</el-date-picker>
</el-form-item>
<el-form-item label="课程标价" prop="price">
<el-input type="number" v-model="addForm.price"></el-input>
</el-form-item>
<el-form-item label="课程销售价格" prop="sale">
<el-input type="number" v-model="addForm.sale"></el-input>
</el-form-item>
<el-form-item label="课程介绍" prop="remark">
<el-input type="textarea" v-model="addForm.remark"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="addData('addForm')">立即创建</el-button>
<el-button @click="resetForm('addForm')">重置</el-button>
</el-form-item>
</el-form>
</el-dialog>
<!--课程添加操作-->
<el-dialog title="添加章节" :visible.sync="addsdialogVisible" width="60%" center>
<el-form :model="addsForm" label-width="100px">
<el-form-item label="章节名称" prop="name">
<el-input v-model="addsForm.name"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="addsData('addsForm')">添加章节</el-button>
<el-button @click="resetForm('addsForm')">重置</el-button>
</el-form-item>
</el-form>
</el-dialog>
<!--/课程详细///-->
<el-dialog title="课程详细" :visible.sync="coursedetaildialogVisible" width="60%" center>
<div>
{{this.detailcoursedata.name}}
</div>
<div v-for="section in sections">
{{section.name}}
</div>
<div>
<el-button @click="coursedetaildialogVisible= false">关闭</el-button>
</div>
</el-dialog>
</div>
</template>
前台js代码
<script>
export default {
data() {
//自定义价格校验
var checkSale = (rule, value, callback) => {
//转换float类型
if (value > parseFloat(this.addForm.price)) {
callback(new Error('销售价格应该小于标价格!'));
} else {
callback();
}
}
return {
addsdialogVisible: false,
addsForm: {
name: '',
cid: 0,
},
sort: false,
sdatevalues: '',
searhForm: {
name: '',
sprice: '',
eprice: '',
stime: '',
etime: '',
category: ''
},
current: 1,
pagesize: 4,
pagesizes: [4, 8, 12],
total: 0,
tableData: [],
adddialogVisible: false,
addForm: {
category: '',
name: '',
remark: '',
img: '',
starttime: '',
endtime: '',
price: 0,
sale: 0
},
addFormRules: {
sale: [{
validator: checkSale,
trigger: 'blur'
}],
},
categories: [],
imageUrl: '',
datevalues: '',
detailcoursedata:{
},
coursedetaildialogVisible:false,
sections:[]
};
},
created: function() {
this.initCategories();
this.initData();
},
methods: {
deleteData(row){
this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.axios.get('http://localhost:93/course/deletes',{params:{ids:row.id}}).then((res)=>{
if(res.data.result){
this.$message({
type: 'success',
message: '删除成功!'
});
this.initData();
}
});
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
});
});
},
detailcourse(row){
Object.assign(this.detailcoursedata,row);
this.axios.get('http://localhost:93/section/sections',{params:{cid:row.id}}).then((res)=>{
this.sections=res.data.result;
console.log(this.sections);
});
this.coursedetaildialogVisible=true;
},
addsData() {
//发送添加请求处理 post 请求
this.axios.post('http://localhost:93/section/insert', this.addsForm).then((res) => {
if (res.data.result) {
this.$message({
message: '恭喜你,成功添加数据',
type: 'success'
});
this.addsdialogVisible = false;
} else {
this.$message({
message: '添加失败消息',
type: 'warning'
});
}
});
},
opensInsert(row) {
this.addsForm.cid = row.id;
this.addsdialogVisible = true;
},
searchData() {
this.current = 1;
this.initData();
},
handleSizeChange(val) {
this.pagesize = val;
this.initData();
},
handleCurrentChange(val) {
this.current = val;
this.initData();
},
initData() {
//对于日期处理一下
if (this.sdatevalues instanceof Array && this.sdatevalues.length > 0) {
//开始日期
this.searhForm.stime = this.sdatevalues[0];
//结束日期
this.searhForm.etime = this.sdatevalues[1];
}
this.axios.get('http://localhost:93/course/list', {
params: {
current: this.current,
size: this.pagesize,
name: this.searhForm.name,
sprice: this.searhForm.sprice,
eprice: this.searhForm.eprice,
stime: this.searhForm.stime,
etime: this.searhForm.etime,
meiju: this.searhForm.category,
sort: this.sort
}
}).then((res) => {
//固定数据
this.tableData = res.data.result.records;
this.total = res.data.result.total;
});
},
//图片上传成功的事件
handleAvatarSuccess(res, file) {
this.imageUrl = URL.createObjectURL(file.raw);
if (this.adddialogVisible) {
//直接用res.result接收
this.addForm.img = res.result;
}
},
//初始化枚举
initCategories() {
this.axios.get('http://localhost:93/course/cateogries').then((res) => {
this.categories = res.data.result;
});
},
//打开添加的对话框
openInsert() {
this.adddialogVisible = true;
},
//添加处理事件
addData(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
//对于日期处理一下
if (this.datevalues instanceof Array && this.datevalues.length > 0) {
//开始日期
this.addForm.starttime = this.datevalues[0];
//结束日期
this.addForm.endtime = this.datevalues[1];
}
//发送添加请求处理 post 请求
this.axios.post('http://localhost:93/course/insert', this.addForm).then((res) => {
});
} else {
console.log('error submit!!');
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
}
}
};
</script>
前台style样式
<style>
.image {
width: 100%;
display: block;
}
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 100px;
height: 100px;
line-height: 100px;
text-align: center;
}
.avatar {
width: 100px;
height: 100px;
display: block;
}
</style>
查询sql语句
-- 按照分类分组 求出 平均值
select category,SUM(price) sumtotal,avg(price) avgprice from course GROUP BY category;
select category,SUM(price) sumtotal,avg(price) avgprice from course GROUP BY category having sumtotal>300
-- 按照计算销售出的去 价格
select *,sale*nums as saleTotal from course order by category asc;
select sum(sale*nums)as saleTotal from course where category =1;
select sum(sale*nums)as saleTotal from course where category =2;
select sum(sale*nums)as saleTotal from course where category =3;
select sum(sale*nums) as saleTotal from course;
#按照分类统计每个分类中销售的总价格,进行排序,取出前2名
select * from (select category ,sum(sale*nums)as saleTotal from course GROUP BY category) t order by saleTotal limit 2;
#按照课程的销售量排名,取出前三名
select * from course order by nums desc limit 3;