This commit is contained in:
xiaoqiantx223 2024-07-17 17:07:59 +08:00
commit 84dba3f8f3
9 changed files with 137 additions and 95 deletions

108
README.md
View File

@ -1,66 +1,70 @@
## 介绍
- 基于Vue3、TypeScript、Element Plus、Vue Router、Pinia、Axios、i18n、Vite等开发的后台管理使用门槛极低。
- 目前已实现maku-admin后端接口的有【maku-boot】 和 【maku-cloud】 2个后端开源项目。
- 开发文档https://maku.net/docs/maku-admin
- 官网地址https://maku.net
## 项目文档
## maku-boot | 单体低代码开发平台
- Gitee仓库https://gitee.com/makunet/maku-boot
- Github仓库https://github.com/makunet/maku-boot
- 演示环境https://demo.maku.net/maku-boot
数据库设计文档https://kdocs.cn/l/caIBoD7HcEBL
API接口设计文档https://apifox.com/apidoc/shared-ff0060f8-8bb5-40c5-87d2-f8a29ee5ecd5
API接口加入文档https://app.apifox.com/invite/project?token=Xp3BUXBEYQ34hiKcFX-ub
前端代码仓库http://47.96.1.176:3000/work/book-web
后端代码仓库http://47.96.1.176:3000/work/book-api
## 项目说明
### 书籍管理系统
角色 用户
书本管理员(账号与密码你们自己创建 管理员没有指定的创建入口 但客户要有注册功能)
书本录入管理员
功能:
书本的上架(书本的基本信息 封面的上传 书本币的定价 库存)
用户的管理 (基本的增删改查 可以禁止用户登录)
## maku-cloud | 微服务低代码开发平台
- Gitee仓库https://gitee.com/makunet/maku-cloud
- Github仓库https://github.com/makunet/maku-cloud
- 演示环境https://demo.maku.net/maku-cloud
书本商城网页
商城首页
功能点:
1、可以根据书名搜索图书
2、可以查看图书的详情界面
3、可以查看评论【评论不需要回复功能】
4、可以收藏、购买、加入购物车的图书
用户个人中心
功能点:
1、基本信息
2、头像
3、书本币余额【用来购买的图书】
4、我购买的图书列表
5、我收藏的图书列表
6、我的购物车
7、充值书本币(不需要接入真实的支付 模拟充值就ok)
注:没有登录,不可以收藏、加入购物车、评论、以及购买。
## 安装
注意:需使用 nodejs 长期维护版本,如:[18.x、20.x],能保证项目的稳定运行。
要求:
1、使用redis作为缓存,
```bash
# 克隆项目
git clone https://gitee.com/makunet/maku-admin.git
# 进入项目
cd maku-admin
# 安装依赖
npm install
# 运行项目
npm run dev
# 打包发布
npm run build
```
## 微信交流群
为了更好的交流,我们新提供了微信交流群,需扫描下面的二维码,关注公众号,回复【加群】,根据提示信息,作者会拉你进群的,感谢配合!
![](https://maku.net/app/img/qrcode.jpg)
## 开源汇总
- 低代码开发平台单体版https://gitee.com/makunet/maku-boot
- 低代码开发平台微服务https://gitee.com/makunet/maku-cloud
- 超好用的代码生成器https://gitee.com/makunet/maku-generator
- Vue3.x 后台管理UIhttps://gitee.com/makunet/maku-admin
- Vue3.x 表单设计器https://gitee.com/makunet/maku-form-design
2、不强制使用security,但是前端必须要有token,后端可以统一用拦截器拦截做校验是否登录
## 支持
如果觉得框架还不错,或者已经在使用了,希望你可以去 [Github](https://github.com/makunet/maku-admin) 或 [Gitee](https://gitee.com/makunet/maku-admin) 帮作者点个 ⭐ Star这将是对作者极大的鼓励与支持。
## 效果图
![输入图片说明](public/images/1.jpg)
![输入图片说明](public/images/2.jpg)
![输入图片说明](public/images/3.jpg)
![输入图片说明](public/images/4.jpg)

View File

@ -1,31 +1,31 @@
<template>
<el-dialog v-model="visible" :title="!dataForm.id ? '新增' : '修改'" :close-on-click-modal="false">
<el-form ref="dataFormRef" :model="dataForm" :rules="dataRules" label-width="100px" @keyup.enter="submitHandle()">
<el-form-item label="作者" prop="bookName">
<el-form-item label="书名" prop="bookName">
<el-input v-model="dataForm.bookName" placeholder=""></el-input>
</el-form-item>
<el-form-item label="价格" prop="author">
<el-form-item label="作者" prop="author">
<el-input v-model="dataForm.author" placeholder=""></el-input>
</el-form-item>
<el-form-item label="封面" prop="price">
<el-form-item label="价格" prop="price">
<el-input v-model="dataForm.price" placeholder=""></el-input>
</el-form-item>
<el-form-item label="图书介绍" prop="bookCover">
<el-form-item label="封面" prop="bookCover">
<el-input v-model="dataForm.bookCover" placeholder=""></el-input>
</el-form-item>
<el-form-item label="图书详情" prop="introduction">
<el-form-item label="书籍介绍" prop="introduction">
<el-input v-model="dataForm.introduction" placeholder=""></el-input>
</el-form-item>
<el-form-item label="图书库存" prop="description">
<el-form-item label="书籍详情" prop="description">
<el-input v-model="dataForm.description" placeholder=""></el-input>
</el-form-item>
<el-form-item label="创建时间" prop="store">
<el-form-item label="库存" prop="store">
<el-input v-model="dataForm.store" placeholder=""></el-input>
</el-form-item>
<el-form-item label="修改时间" prop="createTime">
<el-form-item label="创建时间" prop="createTime">
<el-input v-model="dataForm.createTime" placeholder=""></el-input>
</el-form-item>
<el-form-item label="" prop="updateTime">
<el-form-item label="修改时间" prop="updateTime">
<el-input v-model="dataForm.updateTime" placeholder=""></el-input>
</el-form-item>
</el-form>
@ -79,6 +79,9 @@ const getT_book = (id: number) => {
}
const dataRules = ref({
bookName: [{ required: true, message: '必填项不能为空', trigger: 'blur' }],
price: [{ required: true, message: '必填项不能为空', trigger: 'blur' }],
store: [{ required: true, message: '必填项不能为空', trigger: 'blur' }],
})
//

View File

@ -1,7 +1,13 @@
<template>
<el-card class="layout-query">
<el-form ref="queryRef" :inline="true" :model="state.queryForm" @keyup.enter="getDataList()">
<el-form-item>
<el-form-item prop="bookName">
<el-input v-model="state.queryForm.bookName" placeholder="书名"></el-input>
</el-form-item>
<el-form-item prop="author">
<el-input v-model="state.queryForm.author" placeholder="作者"></el-input>
</el-form-item>
<el-form-item>
<el-button icon="Search" type="primary" @click="getDataList()">查询</el-button>
</el-form-item>
<el-form-item>
@ -21,16 +27,15 @@
</el-space>
<el-table v-loading="state.dataListLoading" :data="state.dataList" border class="layout-table" @selection-change="selectionChangeHandle">
<el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
<el-table-column prop="id" label="编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="bookName" label="书籍名称" header-align="center" align="center"></el-table-column>
<el-table-column prop="bookName" label="书名" header-align="center" align="center"></el-table-column>
<el-table-column prop="author" label="作者" header-align="center" align="center"></el-table-column>
<el-table-column prop="price" label="价格" header-align="center" align="center"></el-table-column>
<el-table-column prop="bookCover" label="图书封面" header-align="center" align="center"></el-table-column>
<el-table-column prop="introduction" label="书介绍" header-align="center" align="center"></el-table-column>
<el-table-column prop="description" label="书详情" header-align="center" align="center"></el-table-column>
<el-table-column prop="store" label="图书库存" header-align="center" align="center"></el-table-column>
<el-table-column prop="bookCover" label="封面" header-align="center" align="center"></el-table-column>
<el-table-column prop="introduction" label="介绍" header-align="center" align="center"></el-table-column>
<el-table-column prop="description" label="详情" header-align="center" align="center"></el-table-column>
<el-table-column prop="store" label="库存" header-align="center" align="center"></el-table-column>
<el-table-column prop="createTime" label="创建时间" header-align="center" align="center"></el-table-column>
<el-table-column prop="updateTime" label=" 修改时间" header-align="center" align="center"></el-table-column>
<el-table-column prop="updateTime" label="修改时间" header-align="center" align="center"></el-table-column>
<el-table-column label="操作" fixed="right" header-align="center" align="center" width="150">
<template #default="scope">
<el-button v-auth="'maku:t_book:update'" type="primary" link @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
@ -64,6 +69,8 @@
dataListUrl: '/maku/t_book/page',
deleteUrl: '/maku/t_book',
queryForm: {
bookName: '',
author: '',
}
})

View File

@ -1,7 +1,13 @@
<template>
<el-card class="layout-query">
<el-form ref="queryRef" :inline="true" :model="state.queryForm" @keyup.enter="getDataList()">
<el-form-item>
<el-form-item prop="userId">
<el-input v-model="state.queryForm.userId" placeholder="用户id"></el-input>
</el-form-item>
<el-form-item prop="bookId">
<el-input v-model="state.queryForm.bookId" placeholder="书本id"></el-input>
</el-form-item>
<el-form-item>
<el-button icon="Search" type="primary" @click="getDataList()">查询</el-button>
</el-form-item>
<el-form-item>
@ -21,11 +27,10 @@
</el-space>
<el-table v-loading="state.dataListLoading" :data="state.dataList" border class="layout-table" @selection-change="selectionChangeHandle">
<el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
<el-table-column prop="id" label="编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="userId" label="用户编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="bookId" label="书编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="createTime" label=" 创建时间" header-align="center" align="center"></el-table-column>
<el-table-column prop="updateTime" label=" 修改时间" header-align="center" align="center"></el-table-column>
<el-table-column prop="bookId" label="书编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="createTime" label="创建时间" header-align="center" align="center"></el-table-column>
<el-table-column prop="updateTime" label="修改时间" header-align="center" align="center"></el-table-column>
<el-table-column label="操作" fixed="right" header-align="center" align="center" width="150">
<template #default="scope">
<el-button v-auth="'maku:t_book_collection:update'" type="primary" link @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
@ -59,6 +64,8 @@
dataListUrl: '/maku/t_book_collection/page',
deleteUrl: '/maku/t_book_collection',
queryForm: {
userId: '',
bookId: ''
}
})

View File

@ -1,7 +1,13 @@
<template>
<el-card class="layout-query">
<el-form ref="queryRef" :inline="true" :model="state.queryForm" @keyup.enter="getDataList()">
<el-form-item>
<el-form-item prop="userId">
<el-input v-model="state.queryForm.userId" placeholder="用户id"></el-input>
</el-form-item>
<el-form-item prop="bookId">
<el-input v-model="state.queryForm.bookId" placeholder="书本id"></el-input>
</el-form-item>
<el-form-item>
<el-button icon="Search" type="primary" @click="getDataList()">查询</el-button>
</el-form-item>
<el-form-item>
@ -21,11 +27,9 @@
</el-space>
<el-table v-loading="state.dataListLoading" :data="state.dataList" border class="layout-table" @selection-change="selectionChangeHandle">
<el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
<el-table-column prop="id" label="编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="userId" label="用户编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="bookId" label="书籍编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="comment" label="评论内容" header-align="center" align="center"></el-table-column>
<el-table-column prop="parentId" label="父级编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="bookId" label="书本编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="comment" label="评价" header-align="center" align="center"></el-table-column>
<el-table-column prop="createTime" label="创建时间" header-align="center" align="center"></el-table-column>
<el-table-column prop="updateTime" label="修改时间" header-align="center" align="center"></el-table-column>
<el-table-column label="操作" fixed="right" header-align="center" align="center" width="150">
@ -61,6 +65,8 @@
dataListUrl: '/maku/t_book_comment/page',
deleteUrl: '/maku/t_book_comment',
queryForm: {
userId: '',
bookId: ''
}
})

View File

@ -1,7 +1,13 @@
<template>
<el-card class="layout-query">
<el-form ref="queryRef" :inline="true" :model="state.queryForm" @keyup.enter="getDataList()">
<el-form-item>
<el-form-item prop="purchaseId">
<el-input v-model="state.queryForm.purchaseId" placeholder="订单编号"></el-input>
</el-form-item>
<el-form-item prop="bookId">
<el-input v-model="state.queryForm.bookId" placeholder="书本编号"></el-input>
</el-form-item>
<el-form-item>
<el-button icon="Search" type="primary" @click="getDataList()">查询</el-button>
</el-form-item>
<el-form-item>
@ -21,10 +27,9 @@
</el-space>
<el-table v-loading="state.dataListLoading" :data="state.dataList" border class="layout-table" @selection-change="selectionChangeHandle">
<el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
<el-table-column prop="id" label="编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="purchaseId" label="订单编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="bookId" label="书编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="price" label="书本价格" header-align="center" align="center"></el-table-column>
<el-table-column prop="bookId" label="书编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="price" label="价格" header-align="center" align="center"></el-table-column>
<el-table-column label="操作" fixed="right" header-align="center" align="center" width="150">
<template #default="scope">
<el-button v-auth="'maku:t_purchase_details:update'" type="primary" link @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
@ -58,6 +63,8 @@
dataListUrl: '/maku/t_purchase_details/page',
deleteUrl: '/maku/t_purchase_details',
queryForm: {
purchaseId: '',
bookId: ''
}
})

View File

@ -9,7 +9,6 @@
</el-form-item>
</el-form>
</el-card>
<el-card>
<el-space>
<el-space>

View File

@ -1,7 +1,7 @@
<template>
<el-dialog v-model="visible" :title="!dataForm.id ? '新增' : '修改'" :close-on-click-modal="false">
<el-form ref="dataFormRef" :model="dataForm" :rules="dataRules" label-width="100px" @keyup.enter="submitHandle()">
<el-form-item label="用户名" prop="username">
<el-form-item label="用户名" prop="username">
<el-input v-model="dataForm.username" placeholder=""></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
@ -10,10 +10,10 @@
<el-form-item label="头像" prop="avatar">
<el-input v-model="dataForm.avatar" placeholder=""></el-input>
</el-form-item>
<el-form-item label="书本币余额" prop="balance">
<el-form-item label="书本币" prop="balance">
<el-input v-model="dataForm.balance" placeholder=""></el-input>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item label="用状态" prop="status">
<el-input v-model="dataForm.status" placeholder=""></el-input>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
@ -71,6 +71,10 @@ const getT_user = (id: number) => {
}
const dataRules = ref({
username: [{ required: true, message: '必填项不能为空', trigger: 'blur' }],
password: [{ required: true, message: '必填项不能为空', trigger: 'blur' }],
balance: [{ required: true, message: '必填项不能为空', trigger: 'blur' }],
status: [{ required: true, message: '必填项不能为空', trigger: 'blur' }],
})
//

View File

@ -1,7 +1,13 @@
<template>
<el-card class="layout-query">
<el-form ref="queryRef" :inline="true" :model="state.queryForm" @keyup.enter="getDataList()">
<el-form-item>
<el-form-item prop="username">
<el-input v-model="state.queryForm.username" placeholder="用户名"></el-input>
</el-form-item>
<el-form-item prop="status">
<el-input v-model="state.queryForm.status" placeholder="禁用状态"></el-input>
</el-form-item>
<el-form-item>
<el-button icon="Search" type="primary" @click="getDataList()">查询</el-button>
</el-form-item>
<el-form-item>
@ -9,7 +15,6 @@
</el-form-item>
</el-form>
</el-card>
<el-card>
<el-space>
<el-space>
@ -21,12 +26,10 @@
</el-space>
<el-table v-loading="state.dataListLoading" :data="state.dataList" border class="layout-table" @selection-change="selectionChangeHandle">
<el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
<el-table-column prop="id" label="编号" header-align="center" align="center"></el-table-column>
<el-table-column prop="username" label="用户名" header-align="center" align="center"></el-table-column>
<el-table-column prop="password" label="密码" header-align="center" align="center"></el-table-column>
<el-table-column prop="avatar" label="头像" header-align="center" align="center"></el-table-column>
<el-table-column prop="balance" label="书本币余额" header-align="center" align="center"></el-table-column>
<el-table-column prop="status" label="用户状态" header-align="center" align="center"></el-table-column>
<el-table-column prop="balance" label="书本币" header-align="center" align="center"></el-table-column>
<el-table-column prop="status" label="禁用状态" header-align="center" align="center"></el-table-column>
<el-table-column prop="createTime" label="创建时间" header-align="center" align="center"></el-table-column>
<el-table-column prop="updateTime" label="修改时间" header-align="center" align="center"></el-table-column>
<el-table-column label="操作" fixed="right" header-align="center" align="center" width="150">
@ -52,7 +55,7 @@
</el-card>
</template>
<script setup lang="ts" name="MakuT_userIndex">
<script setup lang="ts">
import {useCrud} from '@/hooks'
import {reactive, ref} from 'vue'
import {IHooksOptions} from '@/hooks/interface'
@ -62,6 +65,8 @@
dataListUrl: '/maku/t_user/page',
deleteUrl: '/maku/t_user',
queryForm: {
username: '',
status: ''
}
})
@ -72,4 +77,4 @@ const addOrUpdateHandle = (id?: number) => {
}
const { getDataList, selectionChangeHandle, sizeChangeHandle, currentChangeHandle, deleteBatchHandle, reset } = useCrud(state)
</script>
</script>