k_m_x 6 months ago
parent e1c6dd3497
commit 4ace44e6b0

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 数据源本地存储已忽略文件
/dataSources/
/dataSources.local.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/libarary_management.iml" filepath="$PROJECT_DIR$/.idea/libarary_management.iml" />
</modules>
</component>
</project>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/vue" vcs="Git" />
</component>
</project>

@ -0,0 +1,23 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

@ -0,0 +1,19 @@
# vue
## Project setup
```
yarn install
```
### Compiles and hot-reloads for development
```
yarn serve
```
### Compiles and minifies for production
```
yarn build
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

@ -0,0 +1,19 @@
{
"compilerOptions": {
"target": "es5",
"module": "esnext",
"baseUrl": "./",
"moduleResolution": "node",
"paths": {
"@/*": [
"src/*"
]
},
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,29 @@
{
"name": "vue",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
},
"dependencies": {
"axios": "^1.7.2",
"core-js": "^3.8.3",
"echarts": "^5.5.0",
"element-ui": "^2.15.14",
"js-cookie": "^3.0.5",
"vue": "^2.6.14",
"vue-router": "^3.5.1"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-router": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"vue-template-compiler": "^2.6.14"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<style>
</style>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

@ -0,0 +1,8 @@
<template>
<div id="app">
<!-- 只显示一级路由-->
<router-view />
</div>
</template>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

@ -0,0 +1,9 @@
body{
pardding: 0;
margin: 0;
background-image: url("shouye1.png");
background-size: cover;
}
*{
box-sizing: border-box;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 590 KiB

@ -0,0 +1,58 @@
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<p>
For a guide and recipes on how to configure / customize this project,<br>
check out the
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
</p>
<h3>Installed CLI Plugins</h3>
<ul>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li>
</ul>
<h3>Essential Links</h3>
<ul>
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
</ul>
<h3>Ecosystem</h3>
<ul>
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
</ul>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
msg: String
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

@ -0,0 +1,13 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import '@/assets/global.css'
Vue.config.productionTip = false
Vue.use(ElementUI,{size: 'small'});
new Vue({
router,
render: h => h(App)
}).$mount('#app')

@ -0,0 +1,59 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
import Layout from '../views/Layout.vue'
import Cookies from "js-cookie";
Vue.use(VueRouter)
const routes = [
// ====== 登录 =====
{
path: '/login',
name: 'Login',
component: () => import('@/views/login/Login.vue'),
},
// ====== 主页 =====
{
path: '/',
name: 'Layout',
component: Layout,
redirect: '/home',
children: [ // 子路由
{
path: 'home',
name: 'Home',
component: () => import('@/views/home/HomeView.vue'),
},
// ==== User ====
{
path: 'userList',
name: 'UserList',
component: () => import('@/views/user/User.vue'),
},
// ==== Category ====
{ path: 'categoryList', name: 'CategoryList', component: () => import('@/views/category/List.vue') },
{ path: 'addCategory', name: 'AddCategory', component: () => import('@/views/category/Add.vue') },
{ path: 'editCategory', name: 'EditCategory', component: () => import('@/views/category/Edit.vue') },
// ==== Book ====
{ path: 'bookList', name: 'BookList', component: () => import('@/views/book/List.vue') },
{ path: 'addBook', name: 'AddBook', component: () => import('@/views/book/Add.vue') },
{ path: 'editBook', name: 'EditBook', component: () => import('@/views/book/Edit.vue') },
]
},
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
router.beforeEach((to, from, next) => {
if (to.path === '/login') next()
const admin = Cookies.get("admin")
//if (!admin && to.path !== '/login') return next("/login") // 强制退回到登录页面
// 访问 /home 的时候并且cookie里面存在数据这个时候我就直接放行
next()
})
export default router

@ -0,0 +1,47 @@
import axios from 'axios'
import router from "@/router";
import Cookies from 'js-cookie'
const request = axios.create({
baseURL: 'http://localhost:9090/api',
timeout: 5000
})
// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token对请求参数统一加密
request.interceptors.request.use(config => {
config.headers['Content-Type'] = 'application/json;charset=utf-8';
const adminJson = Cookies.get('admin')
if (adminJson) {
// 设置请求头
config.headers['token'] = JSON.parse(adminJson).token
}
return config
}, error => {
return Promise.reject(error)
});
// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
response => {
let res = response.data;
// 兼容服务端返回的字符串数据
if (typeof res === 'string') {
res = res ? JSON.parse(res) : res
}
if (res.code === '401') {
router.push('/login')
}
return res;
},
error => {
console.log('err' + error) // for debug
return Promise.reject(error)
}
)
export default request

@ -0,0 +1,5 @@
<template>
<div class="about">
<h1>This is an about page</h1>
</div>
</template>

@ -0,0 +1,105 @@
<template>
<div>
<!-- 头部-->
<div class="top1">
<div style="width: 300px">
<img src="@/assets/logo.png" alt="" style="width: 30px;position: relative;top: 10px;left: 20px;">
<span style="margin-left: 30px;font-size: 24px;">图书管理系统</span>
</div>
<div style="flex: 1; text-align: right; padding-right: 20px">
<el-dropdown size="medium">
<img src="@/assets/girl.png" alt="" style="width: 30px;position: relative;top: 10px;right: 5px;">
<span class="el-dropdown-link" style="cursor: pointer">
管理员<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown" style="margin-top: -5px">
<el-dropdown-item><div style="width: 50px; text-align: center;" @click="logout">退</div></el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
<!-- 侧边栏和主体-->
<div style="display: flex">
<!-- 侧边栏-->
<div class="leftbar">
<el-menu :default-active="$route.path" router class="el-menu-demo">
<el-menu-item index="/" class="leftmenubotton">
<i class="el-icon-coffee-cup"></i>
<span>首页</span>
</el-menu-item>
<el-submenu index="user">
<template slot="title">
<i class="el-icon-cold-drink"></i>
<span>会员管理</span>
</template>
<el-menu-item index="/userList"><i class="el-icon-coffee-cup"></i><span>会员列表</span></el-menu-item>
</el-submenu>
<el-submenu index="category">
<template slot="title">
<i class="el-icon-s-operation"></i>
<span>图书分类管理</span>
</template>
<el-menu-item index="/addCategory">图书分类添加</el-menu-item>
<el-menu-item index="/categoryList">图书分类列表</el-menu-item>
</el-submenu>
<el-submenu index="book">
<template slot="title">
<i class="el-icon-notebook-1"></i>
<span>图书管理</span>
</template>
<el-menu-item index="/addBook">图书添加</el-menu-item>
<el-menu-item index="/bookList">图书列表</el-menu-item>
</el-submenu>
</el-menu>
</div>
<!-- 主体-->
<div class="bodyshow">
<router-view/>
</div>
</div>
</div>
</template>
<script>
import Cookies from 'js-cookie'
export default{
name:"Layout.vue",
data() {
return {
}
},
methods: {
logout() {
//
Cookies.remove('admin')
this.$router.push('/login')
}
}
}
</script>
<style scoped>
.top1{
height: 60px;
line-height: 60px;
display: flex;
background-color: rgba(248,248,255,0.8);
border-radius: 0px 0px 10px 10px;
margin-bottom: 2px;
}
.leftbar{
width: 200px;
min-height: calc(100vh - 62px);
overflow: hidden;
margin-right: 2px;
background-color: rgba(248,248,255,0.8);
}
.bodyshow{
flex: 1;
width: 0;
background-color: rgba(248,248,255,0.8);
padding: 10px;
}
</style>

@ -0,0 +1,164 @@
<template>
<div style="width: 80%">
<div style="margin-bottom: 30px">新增图书</div>
<el-form :inline="true" :rules="rules" ref="ruleForm" :model="form" label-width="100px">
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="描述" prop="description">
<el-input style="width: 400px" type="textarea" v-model="form.description" placeholder="请输入描述"></el-input>
</el-form-item>
<el-form-item label="出版日期" prop="publishDate">
<el-date-picker
v-model="form.publishDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择出版日期">
</el-date-picker>
</el-form-item>
<el-form-item label="作者" prop="author">
<el-input v-model="form.author" placeholder="请输入作者"></el-input>
</el-form-item>
<el-form-item label="出版社" prop="publisher">
<el-input v-model="form.publisher" placeholder="请输入出版社"></el-input>
</el-form-item>
<el-form-item label="分类" prop="category">
<el-cascader
style="width: 220px"
:props="{ value: 'name', label: 'name'}"
v-model="form.categories"
:options="categories"></el-cascader>
</el-form-item>
<el-form-item label="标准码" prop="bookNo">
<el-input v-model="form.bookNo" placeholder="请输入标准码"></el-input>
</el-form-item>
<el-form-item label="借书积分" prop="cover">
<el-input-number v-model="form.score" :min="10" :max="30" label="所需积分"></el-input-number>
</el-form-item>
<el-form-item label="数量" prop="nums">
<el-input v-model="form.nums" placeholder="请输入数量"></el-input>
</el-form-item>
<br>
<el-form-item label="封面" prop="cover">
<el-upload
class="avatar-uploader"
:action="'http://localhost:9090/api/book/file/upload?token=' + this.admin.token"
:show-file-list="false"
:on-success="handleCoverSuccess"
>
<img v-if="form.cover" :src="form.cover" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
</el-form>
<div style="text-align: center; margin-top: 30px">
<el-button class="botton1" @click="save" size="medium">提交</el-button>
</div>
</div>
</template>
<script>
import request from "@/utils/request";
import Cookies from "js-cookie";
export default {
name: 'AddBook',
data() {
const checkNums = (rule, value, callback) => {
value = parseInt(value)
if (value < 0 || value >= 1000) {
callback(new Error('请输入大于等于0小于1000的整数'));
}
callback()
};
return {
admin: Cookies.get('admin') ? JSON.parse(Cookies.get('admin')) : {},
form: { score: 10, cover: '' },
categories: [],
rules: {
name: [
{ required: true, message: '请输入图书名称', trigger: 'blur'}
],
bookNo: [
{ required: true, message: '请输入图书标准码', trigger: 'blur'}
],
score: [
{ validator: checkNums, trigger: 'blur' }
],
nums: [
{ required: true, message: '请输入数量', trigger: 'blur'},
{ validator: checkNums, trigger: 'blur' }
]
}
}
},
created() {
request.get('/category/tree').then(res => {
this.categories = res.data
})
},
methods: {
handleCoverSuccess(res) {
if (res.code === '200') {
console.log(res.data)
// this.$set(this.form, 'cover', res.data)
this.form.cover = res.data
}
},
save() {
this.$refs['ruleForm'].validate((valid) => {
if (valid) {
request.post('/book/save', this.form).then(res => {
if (res.code === '200') {
this.$notify.success('新增成功')
this.$refs['ruleForm'].resetFields()
} else {
this.$notify.error(res.msg)
}
})
}
})
}
}
}
</script>
<style>
.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: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
.botton1{
color: white;
margin-left: 5px;
border-radius: 10px;
background-color: #4169E1;
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1);
}
.botton1:hover{
background-color: lightblue;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.2);
}
</style>

@ -0,0 +1,153 @@
<template>
<div style="width: 80%">
<div style="margin-bottom: 30px">编辑图书</div>
<el-form :inline="true" :rules="rules" ref="ruleForm" :model="form" label-width="100px">
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="描述" prop="description">
<el-input style="width: 400px" type="textarea" v-model="form.description" placeholder="请输入描述"></el-input>
</el-form-item>
<el-form-item label="出版日期" prop="publishDate">
<el-date-picker
v-model="form.publishDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择出版日期">
</el-date-picker>
</el-form-item>
<el-form-item label="作者" prop="author">
<el-input v-model="form.author" placeholder="请输入作者"></el-input>
</el-form-item>
<el-form-item label="出版社" prop="publisher">
<el-input v-model="form.publisher" placeholder="请输入出版社"></el-input>
</el-form-item>
<el-form-item label="分类" prop="category">
<el-cascader
style="width: 220px"
:props="{ value: 'name', label: 'name'}"
v-model="form.categories"
:options="categories"></el-cascader>
</el-form-item>
<el-form-item label="标准码" prop="bookNo">
<el-input v-model="form.bookNo" placeholder="请输入标准码"></el-input>
</el-form-item>
<el-form-item label="借书积分" prop="cover">
<el-input-number v-model="form.score" :min="10" :max="30" label="所需积分"></el-input-number>
</el-form-item>
<br>
<el-form-item label="封面" prop="cover">
<el-upload
class="avatar-uploader"
:action="'http://localhost:9090/api/book/file/upload?token=' + this.admin.token"
:show-file-list="false"
:on-success="handleCoverSuccess"
>
<img v-if="form.cover" :src="form.cover" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
</el-form>
<div style="text-align: center; margin-top: 30px">
<el-button class="botton1" @click="save" size="medium">提交</el-button>
</div>
</div>
</template>
<script>
import request from "@/utils/request";
import Cookies from "js-cookie";
export default {
name: 'EditBook',
data() {
return {
admin: Cookies.get('admin') ? JSON.parse(Cookies.get('admin')) : {},
form: { score: 10 },
categories: [],
rules: {
name: [
{ required: true, message: '请输入图书名称', trigger: 'blur'}
],
bookNo: [
{ required: true, message: '请输入图书标准码', trigger: 'blur'}
],
score: [
{ required: true, message: '请输入借书积分', trigger: 'blur'}
]
}
}
},
created() {
request.get('/category/tree').then(res => {
this.categories = res.data
})
const id = this.$route.query.id
request.get("/book/" + id).then(res => {
this.form = res.data
if (this.form.category) {
this.form.categories = this.form.category.split(' > ')
console.log(this.form.categories)
}
})
},
methods: {
handleCoverSuccess(res) {
if (res.code === '200') {
this.form.cover = res.data
}
},
save() {
request.put('/book/update', this.form).then(res => {
if (res.code === '200') {
this.$notify.success('更新成功')
this.$router.push("/bookList")
} else {
this.$notify.error(res.msg)
}
})
}
}
}
</script>
<style>
.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: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
.botton1{
margin-left: 5px;
border-radius: 10px;
background-color: #4169E1;
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1);
}
.botton1:hover{
background-color: lightblue;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.2);
}
</style>

@ -0,0 +1,122 @@
<template>
<div>
<!-- 搜索表单-->
<div style="margin-bottom: 20px">
<el-input style="width: 240px" placeholder="请输入图书名称" v-model="params.name"></el-input>
<el-input style="width: 240px; margin-left: 5px" placeholder="请输入图书标准码" v-model="params.bookNo"></el-input>
<el-button style="margin-left: 5px" type="primary" @click="load"><i class="el-icon-search"></i> 搜索</el-button>
<el-button style="margin-left: 5px" type="warning" @click="reset"><i class="el-icon-refresh"></i> 重置</el-button>
</div>
<el-table :data="tableData" stripe row-key="id" default-expand-all>
<el-table-column prop="id" label="编号" width="80"></el-table-column>
<el-table-column prop="name" label="图书名称"></el-table-column>
<el-table-column prop="bookNo" label="标准码"></el-table-column>
<el-table-column prop="description" width="200" label="描述"></el-table-column>
<el-table-column prop="publishDate" label="出版日期"></el-table-column>
<el-table-column prop="author" label="作者"></el-table-column>
<el-table-column prop="publisher" label="出版社"></el-table-column>
<el-table-column prop="category" label="分类"></el-table-column>
<el-table-column prop="score" label="借书积分"></el-table-column>
<el-table-column prop="nums" label="数量"></el-table-column>
<el-table-column prop="cover" label="封面">
<template v-slot="scope">
<el-image :src="scope.row.cover" :preview-src-list="[scope.row.cover]"></el-image>
</template>
</el-table-column>
<el-table-column prop="createtime" label="创建时间"></el-table-column>
<el-table-column prop="updatetime" label="更新时间"></el-table-column>
<el-table-column label="操作" width="140">
<template v-slot="scope">
<!-- scope.row 就是当前行数据-->
<el-button type="primary" @click="$router.push('/editBook?id=' + scope.row.id)">编辑</el-button>
<el-popconfirm
style="margin-left: 5px"
title="您确定删除这行数据吗?"
@confirm="del(scope.row.id)"
>
<el-button type="danger" slot="reference">删除</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<!-- 分页-->
<div style="margin-top: 20px">
<el-pagination
background
:current-page="params.pageNum"
:page-size="params.pageSize"
layout="prev, pager, next"
@current-change="handleCurrentChange"
:total="total">
</el-pagination>
</div>
</div>
</template>
<script>
import request from "@/utils/request";
import Cookies from 'js-cookie'
export default {
name: 'BookList',
data() {
return {
admin: Cookies.get('admin') ? JSON.parse(Cookies.get('admin')) : {},
tableData: [],
total: 0,
params: {
pageNum: 1,
pageSize: 10,
name: '',
bookNo: ''
}
}
},
created() {
this.load()
},
methods: {
load() {
request.get('/book/page', {
params: this.params
}).then(res => {
if (res.code === '200') {
this.tableData = res.data.list
this.total = res.data.total
}
})
},
reset() {
this.params = {
pageNum: 1,
pageSize: 10,
name: '',
bookNo: ''
}
this.load()
},
handleCurrentChange(pageNum) {
//
this.params.pageNum = pageNum
this.load()
},
del(id) {
request.delete("/book/delete/" + id).then(res => {
if (res.code === '200') {
this.$notify.success('删除成功')
this.load()
} else {
this.$notify.error(res.msg)
}
})
}
}
}
</script>
<style scoped>
</style>

@ -0,0 +1,53 @@
<template>
<div style="width: 80%">
<div style="margin-bottom: 30px">新增分类</div>
<el-form :inline="true" :rules="rules" ref="ruleForm" :model="form" label-width="100px">
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注"></el-input>
</el-form-item>
</el-form>
<div style="text-align: center; margin-top: 30px">
<el-button type="primary" @click="save" size="medium">提交</el-button>
</div>
</div>
</template>
<script>
import request from "@/utils/request";
export default {
name: 'AddCategory',
data() {
return {
form: {},
rules: {
name: [
{ required: true, message: '请输入分类名称', trigger: 'blur'}
]
}
}
},
methods: {
save() {
this.$refs['ruleForm'].validate((valid) => {
if (valid) {
request.post('/category/save', this.form).then(res => {
if (res.code === '200') {
this.$notify.success('新增成功')
this.$refs['ruleForm'].resetFields()
} else {
this.$notify.error(res.msg)
}
})
}
})
}
}
}
</script>

@ -0,0 +1,55 @@
<template>
<div style="width: 80%">
<div style="margin-bottom: 30px">编辑分类</div>
<el-form :inline="true" :rules="rules" ref="ruleForm" :model="form" label-width="100px">
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注"></el-input>
</el-form-item>
</el-form>
<div style="text-align: center; margin-top: 30px">
<el-button type="primary" @click="save" size="medium">提交</el-button>
</div>
</div>
</template>
<script>
import request from "@/utils/request";
export default {
name: 'EditCategory',
data() {
return {
form: {},
rules: {
name: [
{ required: true, message: '请输入分类名称', trigger: 'blur'}
]
}
}
},
created() {
const id = this.$route.query.id
request.get("/category/" + id).then(res => {
this.form = res.data
})
},
methods: {
save() {
request.put('/category/update', this.form).then(res => {
if (res.code === '200') {
this.$notify.success('更新成功')
this.$router.push("/categoryList")
} else {
this.$notify.error(res.msg)
}
})
}
}
}
</script>

@ -0,0 +1,154 @@
<template>
<div>
<!-- 搜索表单-->
<div style="margin-bottom: 20px">
<el-input style="width: 240px" placeholder="请输入分类名称" v-model="params.name"></el-input>
<el-button style="margin-left: 5px" type="primary" @click="load"><i class="el-icon-search"></i> 搜索</el-button>
<el-button style="margin-left: 5px" type="warning" @click="reset"><i class="el-icon-refresh"></i> 重置</el-button>
</div>
<el-table :data="tableData" stripe row-key="id" default-expand-all>
<el-table-column prop="id" label="编号" width="80"></el-table-column>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="remark" label="备注"></el-table-column>
<el-table-column prop="createtime" label="创建时间"></el-table-column>
<el-table-column prop="updatetime" label="更新时间"></el-table-column>
<el-table-column label="操作" width="280">
<template v-slot="scope">
<!-- scope.row 就是当前行数据-->
<el-button type="success" v-if="!scope.row.pid" @click="handleAdd(scope.row)"></el-button>
<el-button type="primary" @click="$router.push('/editCategory?id=' + scope.row.id)">编辑</el-button>
<el-popconfirm
style="margin-left: 5px"
title="您确定删除这行数据吗?"
@confirm="del(scope.row.id)"
>
<el-button type="danger" slot="reference">删除</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<!-- 分页-->
<div style="margin-top: 20px">
<el-pagination
background
:current-page="params.pageNum"
:page-size="params.pageSize"
layout="prev, pager, next"
@current-change="handleCurrentChange"
:total="total">
</el-pagination>
</div>
<el-dialog title="添加二级分类" :visible.sync="dialogFormVisible" width="30%">
<el-form :model="form" label-width="100px" ref="ruleForm" :rules="rules" style="width: 85%">
<el-form-item label="分类名称" prop="name">
<el-input v-model="form.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="分类备注" prop="remark">
<el-input v-model="form.remark" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="save"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import request from "@/utils/request";
import Cookies from 'js-cookie'
export default {
name: 'CategoryList',
data() {
return {
admin: Cookies.get('admin') ? JSON.parse(Cookies.get('admin')) : {},
tableData: [],
total: 0,
dialogFormVisible: false,
form: {},
pid: null,
params: {
pageNum: 1,
pageSize: 10,
name: '',
},
rules: {
name: [
{required: true, message: '请输入分类名称', trigger: 'blur'}
]
}
}
},
created() {
this.load()
},
methods: {
load() {
request.get('/category/page', {
params: this.params
}).then(res => {
if (res.code === '200') {
this.tableData = res.data.list
this.total = res.data.total
}
})
},
reset() {
this.params = {
pageNum: 1,
pageSize: 10,
name: ''
}
this.load()
},
handleCurrentChange(pageNum) {
//
this.params.pageNum = pageNum
this.load()
},
del(id) {
request.delete("/category/delete/" + id).then(res => {
if (res.code === '200') {
this.$notify.success('删除成功')
this.load()
} else {
this.$notify.error(res.msg)
}
})
},
handleAdd(row) {
// idpid
this.pid = row.id
this.dialogFormVisible = true
},
save() {
this.$refs['ruleForm'].validate((valid) => {
if (valid) {
// pid
this.form.pid = this.pid
request.post('/category/save', this.form).then(res => {
if (res.code === '200') {
this.$notify.success('新增二级分类成功')
this.$refs['ruleForm'].resetFields()
this.dialogFormVisible = false
this.load()
} else {
this.$notify.error(res.msg)
}
})
}
})
}
}
}
</script>
<style scoped>
</style>

@ -0,0 +1,96 @@
<template>
<div>
<div style="margin: 20px 0">
<el-select class="input" v-model="timeRange" placeholder="请选择" > <!-- 从后台加载最新的数据 -->
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<el-card>
<div id="line" style="width: 100%; height: 400px"><div class="echart" id="mychart" :style="myChartStyle"></div></div>
</el-card>
</div>
</template>
<script>
import Cookies from 'js-cookie'
import request from "@/utils/request";
import * as echarts from 'echarts'
export default {
data() {
return {
myChart: {},
xData: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], //
yData: [23, 24, 18, 25, 27, 28, 25], //
taskData: [10, 11, 9, 17, 14, 13, 14], //
myChartStyle: { float: "left", width: "100%", height: "400px" }, //
options: [
{label: '最近一周', value: 'week'},
{label: '最近一个月', value: 'month'},
{label: '最近两个月', value: 'month2'},
{label: '最近三个月', value: 'month3'},
]
};
},
mounted() {
this.initEcharts();
},
methods: {
initEcharts() {
const option = {
xAxis: {
data: this.xData
},
legend: { //
data: ["人数", "任务"],
bottom: "0%"
},
yAxis: {},
series: [
{
name: "人数",
data: this.yData,
type: "line", // 线
label: {
show: true,
position: "top",
textStyle: {
fontSize: 16
}
}
},
{
name: "任务",
data: this.taskData,
type: "line", // 线
label: {
show: true,
position: "bottom",
textStyle: {
fontSize: 16
}
}
}
]
};
this.myChart = echarts.init(document.getElementById("mychart"));
this.myChart.setOption(option);
//
window.addEventListener("resize", () => {
this.myChart.resize();
});
}
}
};
</script>
<style>
.input {
width: 300px;
}
</style>

@ -0,0 +1,106 @@
<template>
<div class="box1">
<div class="box2">
<div style="margin-top: 50px;text-align: center;font-size: 40px;color: white;margin-bottom: 50px;font-family: Yuanti SC;">L O G I N</div>
<el-form :model="admin" :rules="rules" ref="loginForm">
<el-form-item prop="username">
<el-input placeholder="请输入账号" prefix-icon="el-icon-user" v-model="admin.username"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input placeholder="请输入密码" prefix-icon="el-icon-user" v-model="admin.password" show-password></el-input>
</el-form-item>
<el-form-item>
<el-button class="button1-hover" size="medium" @click="Login"> </el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
import request from "@/utils/request";
import Cookies from 'js-cookie'
export default{
name:'LOGIN',
data(){
return{
loginAdmin: {},
admin: {},
rules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur'},
{ min: 3, max: 10, message: '长度在3-10个字符', trigger: 'blur'}
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur'},
{ min: 3, max: 10, message: '长度在3-10个字符', trigger: 'blur'}
]
}
}
},
methods:{
login(){
this.$refs['loginForm'].validate((valid) => {
if (valid) {
request.post('/admin/login', this.admin).then(res => {
if (res.code === '200') {
this.loginAdmin = res.data //
} else {
this.$notify.error(res.msg)
}
})
}
})
},
onSuccess() { //
Cookies.set('admin', JSON.stringify(this.loginAdmin))
this.$notify.success("登录成功")
this.$router.push('/')
},
onFail() {
console.log('onFail')
},
onRefresh() {
console.log('refresh')
}
}
}
</script>
<style scoped>
.box1{
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background: url("background.png");
background-size: cover;
}
.box2{
width: 450px;
height: 500px;
background-color: rgba(60,60,60,0.5);
border-radius: 10px;
display: flex;
flex-direction: column;
margin: 100px auto;
align-items: center;
padding: 40px;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.3);
}
.button1-hover {
margin-top: 15px;
width: 100%;
background-color: rgb(30, 27, 248);
color: white;
border-radius: 15px;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
transition: box-shadow 0.3s ease;
}
.button1-hover:hover {
background-color: #1E90FF;
box-shadow: 0px 8px 10px rgba(0, 0, 0, 0.2);
}
</stylescoped>

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 KiB

@ -0,0 +1,99 @@
<template>
<div>
<div style="margin-bottom: 20px;">
<!-- 搜索表单-->
<el-input style="width: 240px" placeholder="请输入名称" v-model="params.name"></el-input>
<el-input style="width: 240px;margin-left: 5px;" placeholder="请输入联系方式" v-model="params.phone"></el-input>
<el-button class="botton1" type="primary" @click="load"><i class="el-icon-search"></i> </el-button>
<el-button class="botton1" type="primary" @click="reset"><i class="el-icon-magic-stick"></i> </el-button>
</div>
<div>
<el-table :data="tableData" stripe>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="address" label="地址"></el-table-column>
<el-table-column prop="phone" label="电话"></el-table-column>
<el-table-column prop="sex" label="性别"></el-table-column>
</el-table>
</div>
<!-- 分页-->
<div style="margin-top: 20px;">
<el-pagination
background
:current-page="params.pageNum"
:page-size="params.pageSize"
layout="prev, pager, next"
@current-change="handleCurrentChange"
:total="total">
</el-pagination>
</div>
</div>
</template>
<script>
import request from "@/utils/request";
export default {
name: 'User',
data(){
return {
tableData:[
{name:'kkkk',age: 40,address:'dsfasf',phone: 'safjhsiafhs',sex: 'sjf'},
{name:'kkkk',age: 40,address:'dsfasf',phone: 'safjhsiafhs',sex: 'sjf'},
{name:'kkkk',age: 40,address:'dsfasf',phone: 'safjhsiafhs',sex: 'sjf'},
{name:'kkkk',age: 40,address:'dsfasf',phone: 'safjhsiafhs',sex: 'sjf'},
],
total: 0,
params:{
pageNum: 1,
pageSize: 10,
name:'',
phone:''
}
}
},
created(){
this.load()
},
methods: {
load(){
request.get( '/user/page', {
params: this.params
}).then(res => {
if(res.code==='200'){
this.tableData=res.data.list
this.total=res.data.total
}
})
},
reset(){
this.params={
pageNum: 1,
pageSize: 10,
name: '',
phone: ''
}
this.load()
},
handleCurrentChange(pageNum){
//
this.params.pageNum=pageNum
this.load()
}
}
}
</script>
<style scoped>
.botton1{
margin-left: 5px;
border-radius: 10px;
background-color: #4169E1;
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1);
}
.botton1:hover{
background-color: lightblue;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.2);
}
</style>

@ -0,0 +1,4 @@
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true
})

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save