├── .gitignore ├── doc └── java_book.docx ├── java_book.sql ├── readme.md ├── server ├── .gitignore ├── Readme.md ├── pom.xml ├── src │ └── main │ │ ├── java │ │ └── com │ │ │ └── gk │ │ │ └── study │ │ │ ├── MySpringApplication.java │ │ │ ├── common │ │ │ ├── APIResponse.java │ │ │ └── ResponeCode.java │ │ │ ├── config │ │ │ ├── MyConfig.java │ │ │ └── Swagger3Config.java │ │ │ ├── controller │ │ │ ├── AdController.java │ │ │ ├── AddressController.java │ │ │ ├── BannerController.java │ │ │ ├── BorrowController.java │ │ │ ├── ClassificationController.java │ │ │ ├── CommentController.java │ │ │ ├── ErrorLogController.java │ │ │ ├── NoticeController.java │ │ │ ├── OpLogController.java │ │ │ ├── OverViewController.java │ │ │ ├── TagController.java │ │ │ ├── ThingCollectController.java │ │ │ ├── ThingController.java │ │ │ ├── ThingWishController.java │ │ │ └── UserController.java │ │ │ ├── entity │ │ │ ├── Ad.java │ │ │ ├── Address.java │ │ │ ├── Banner.java │ │ │ ├── Borrow.java │ │ │ ├── Classification.java │ │ │ ├── Comment.java │ │ │ ├── ErrorLog.java │ │ │ ├── Notice.java │ │ │ ├── OpLog.java │ │ │ ├── Tag.java │ │ │ ├── Thing.java │ │ │ ├── ThingCollect.java │ │ │ ├── ThingTag.java │ │ │ ├── ThingWish.java │ │ │ ├── User.java │ │ │ └── VisitData.java │ │ │ ├── handler │ │ │ └── CustomExceptionHandler.java │ │ │ ├── interceptor │ │ │ └── AccessInterceptor.java │ │ │ ├── mapper │ │ │ ├── AdMapper.java │ │ │ ├── AddressMapper.java │ │ │ ├── BannerMapper.java │ │ │ ├── BorrowMapper.java │ │ │ ├── ClassificationMapper.java │ │ │ ├── CommentMapper.java │ │ │ ├── ErrorLogMapper.java │ │ │ ├── NoticeMapper.java │ │ │ ├── OpLogMapper.java │ │ │ ├── OverviewMapper.java │ │ │ ├── TagMapper.java │ │ │ ├── ThingCollectMapper.java │ │ │ ├── ThingMapper.java │ │ │ ├── ThingTagMapper.java │ │ │ ├── ThingWishMapper.java │ │ │ └── UserMapper.java │ │ │ ├── permission │ │ │ ├── Access.java │ │ │ └── AccessLevel.java │ │ │ ├── service │ │ │ ├── AdService.java │ │ │ ├── AddressService.java │ │ │ ├── BannerService.java │ │ │ ├── BorrowService.java │ │ │ ├── ClassificationService.java │ │ │ ├── CommentService.java │ │ │ ├── ErrorLogService.java │ │ │ ├── NoticeService.java │ │ │ ├── OpLogService.java │ │ │ ├── TagService.java │ │ │ ├── ThingCollectService.java │ │ │ ├── ThingService.java │ │ │ ├── ThingWishService.java │ │ │ ├── UserService.java │ │ │ └── impl │ │ │ │ ├── AdServiceImpl.java │ │ │ │ ├── AddressServiceImpl.java │ │ │ │ ├── BannerServiceImpl.java │ │ │ │ ├── BorrowServiceImpl.java │ │ │ │ ├── ClassificationServiceImpl.java │ │ │ │ ├── CommentServiceImpl.java │ │ │ │ ├── ErrorLogServiceImpl.java │ │ │ │ ├── NoticeServiceImpl.java │ │ │ │ ├── OpLogServiceImpl.java │ │ │ │ ├── TagServiceImpl.java │ │ │ │ ├── ThingCollectServiceImpl.java │ │ │ │ ├── ThingServiceImpl.java │ │ │ │ ├── ThingWishServiceImpl.java │ │ │ │ └── UserServiceImpl.java │ │ │ └── utils │ │ │ ├── HttpContextUtils.java │ │ │ ├── IpUtils.java │ │ │ └── JsonUtils.java │ │ └── resources │ │ ├── application.yml │ │ ├── logback-spring.xml │ │ └── mapper │ │ ├── BorrowMapper.xml │ │ ├── CommentMapper.xml │ │ ├── OverviewMapper.xml │ │ ├── ThingCollectMapper.xml │ │ ├── ThingMapper.xml │ │ ├── ThingWishMapper.xml │ │ └── UserMapper.xml ├── start.sh └── upload │ ├── avatar │ ├── 137b9040-b3a4-4de5-b5f2-8efc9014f28f.jpeg │ ├── 4ef360ce-9fb9-4080-bf10-83a6f3c0a3f2.png │ ├── b3a4fd2c-cbf4-4fad-8064-c22e09e72676.jpeg │ └── ec794bf4-da3c-4c69-ad67-ae17ef3803b1.jpeg │ └── image │ ├── 02669227-c406-45b5-8656-8d0817aaaf75.jpeg │ ├── 066794d5-285c-467c-b2dc-de0b2597b758.jpeg │ ├── 07dfd814-28a7-408a-ba89-368789592361.jpeg │ ├── 09c48dc0-9e4b-4304-9798-48e8b659f5ef.jpeg │ ├── 1085cacc-bd97-451b-b9f0-a5a3bfa0cd13.jpeg │ ├── 119c87c5-b59e-4936-9fbc-cd8351470dc1.jpeg │ ├── 1316bb64-a45c-4154-b333-a8cdd74e8c48.jpeg │ ├── 1693fa26-ea7f-455b-86c6-3d3d73082562.jpeg │ ├── 1c3f9fe6-6680-4da3-a217-0ed37042de81.jpeg │ ├── 1de697b6-a299-4f0b-9bc0-f26518f2b6fd.jpeg │ ├── 1fbbae3b-887b-45f3-8ef9-a2904edee5b6.jpeg │ ├── 2013778b-2460-4d76-ac9c-90ec5e1d7f2f.jpeg │ ├── 266001d1-d4bd-41cb-9a09-8ab94991f35d.jpeg │ ├── 2baa3f45-61ac-4cf4-a837-48c419621dde.jpeg │ ├── 2c9276dc-b3ee-4328-be6f-a8739eaf3531.jpeg │ ├── 31ab2951-96f8-4d8e-adee-5fd6c46a4e5d.jpeg │ ├── 36509a1c-65a9-4e53-b919-4b592c32a04d.jpeg │ ├── 3a24c6d2-40ab-4bb4-a744-80bf04220e39.jpeg │ ├── 3ad74c90-394f-4b1c-b37f-52265925d2d6.jpeg │ ├── 3b456cbf-0fff-44c1-8adc-5e6261a6b25f.jpeg │ ├── 3c4b2947-aa34-4e69-8f3c-904e01a6791a.jpeg │ ├── 3d01f74c-20b3-47f5-8fa9-740c7cddbf07.jpeg │ ├── 3d5c44b6-de8b-42ac-8a15-910ec593c72a.jpeg │ ├── 3dc65bc1-32e6-42f5-a426-1cdf0b5b12d2.jpeg │ ├── 3e96dae1-8f41-4d70-9de0-c9e4c529d81b.jpeg │ ├── 3f75945f-46c2-4bb7-9d16-3f89dda111bf.jpeg │ ├── 45fa2ea1-c066-4770-a6d7-57b9846005d9.jpeg │ ├── 4a5c51b4-f837-40c5-9925-fdb63d494533.jpeg │ ├── 4aa269a6-4c83-4263-a6cb-740ad108bcd1.jpeg │ ├── 4be29101-fd0d-46b9-9bff-ea375fe4a1da.jpeg │ ├── 4e5065a6-4dbd-4c20-97b6-92f1e4192647.jpeg │ ├── 4ec354f7-8651-4919-b878-342896444193.jpeg │ ├── 4fdc13c2-1f8c-499b-ac75-c6fa18f54205.png │ ├── 50b04075-6b81-46a9-90da-4d5af215265b.jpeg │ ├── 55c42013-b94e-44c6-b839-81471cc04dcb.jpeg │ ├── 58cd7cef-c4c6-4dd4-8d25-fc8d3e0af8ad.jpeg │ ├── 5a7fc4c7-4327-4e69-9e5e-82182d19bc03.jpeg │ ├── 5f299ffb-c2f8-4ade-980e-cba7d4938519.png │ ├── 63538afc-533a-44b1-8e00-7466e0c528ae.jpeg │ ├── 63e916d9-75c2-4398-bd10-0a578c13031a.jpeg │ ├── 64c66b8f-b82e-4c7a-b714-9adc32cd5ff6.jpeg │ ├── 701d29e3-8c39-46c3-95ae-264c87ee13d2.jpeg │ ├── 70e77e0a-019a-44b3-ac28-8399ef030728.jpeg │ ├── 7859b029-5bc2-4ece-8546-4408ce8d69bb.jpeg │ ├── 791e2e6a-6db9-4d54-9f92-cbb9c91c57d9.jpeg │ ├── 7b730c2e-be16-4914-a754-4ecbafc4cfce.png │ ├── 7c37dbd8-956a-43d8-a476-0fe7f0b36e95.jpeg │ ├── 7da385db-6603-4e08-ad6b-2de775dfab68.jpeg │ ├── 7fc5f045-ac08-4be1-b88a-f07545a0e45c.jpeg │ ├── 8164fc3b-f47b-4b0e-ba26-50602d4ef276.png │ ├── 839fb8e2-636e-47bb-a39f-7c6d326de88f.jpeg │ ├── 88f76aa8-b9dd-4831-b772-e5466e877da9.jpeg │ ├── 8e50750e-cada-47ff-8fcc-9b531d67e780.jpeg │ ├── 9058201e-d821-4afd-b979-0553cf1fdd68.jpeg │ ├── 92b6a1c4-f786-441b-a285-ad8262db560f.jpeg │ ├── 94c9900c-1922-4616-9d9f-46917eb177ef.jpeg │ ├── 98be90a3-8c89-436c-a24b-c16ac3c379df.jpeg │ ├── 9a6c7d68-6856-424d-897c-804bdca2f4a5.jpeg │ ├── 9da218e9-becd-4b16-aedf-82fc46b6b2ce.jpeg │ ├── 9f576635-f270-4e3a-92ec-741692d80cb7.jpeg │ ├── a.png │ ├── a281dfe1-3c78-4522-b38e-c53de2ff22c9.jpeg │ ├── a2e19f07-c866-4b93-b429-2e8a6937afd1.png │ ├── af235af7-f71f-416a-9e38-68c3ad26ad20.jpeg │ ├── af4777cd-2f23-4c05-9fdd-bd07274f008b.jpeg │ ├── b.png │ ├── b395ea5c-e5a9-4a56-9b5e-f1736078e722.jpeg │ ├── b5de8200-ff15-4574-8e38-7642fe952f77.jpeg │ ├── b6dbbb0e-262f-4267-83ef-bf527d0c8aa0.jpeg │ ├── b7c5ee92-17f1-4040-bed8-6f61f3f5930d.jpeg │ ├── b86fc2cd-f135-419d-8039-600d10cf674f.jpeg │ ├── b88780a0-5b8e-4a6c-b238-8562ad7c8375.jpeg │ ├── b988bb82-552b-4ae9-acfb-b6eff78e221f.jpeg │ ├── ca174798-a1fe-4e1a-ab03-8d80d74ad0d4.jpeg │ ├── cad0f753-04da-4ebd-aeed-d2ce83cf0b9c.jpeg │ ├── d139c44e-d24a-47ac-9f8b-72807b5a3849.jpeg │ ├── debc41a3-20b8-4e01-b17d-fca1a7820574.jpeg │ ├── dfbbcffe-362e-42d0-bcdd-063f5b307553.jpeg │ ├── e1d4e3a4-06e7-4d96-b60d-71cb8db4b019.jpeg │ ├── e98af765-4b0f-4f4b-8e8a-f232133ab100.jpeg │ ├── e9bbf322-28a9-4b87-83da-f1028971ac72.jpeg │ ├── e9c140a4-e077-4750-8e3d-9db540a150d0.jpeg │ ├── ea71ad95-7da2-41c0-9e49-ea2b96f81e53.jpeg │ ├── eb71dae5-b84d-4b9a-8e36-5b2adf25c4e2.png │ ├── ed17adc0-d18a-4ea4-9447-7817fc2a4168.jpeg │ ├── ed6410b5-16ea-4f90-b853-c4d6e48a8548.jpeg │ ├── edff6448-f92e-4f92-a475-1556ca7a7615.jpeg │ ├── f08190e5-502e-476c-a4f9-f7eac0be937b.jpeg │ ├── f3c07fdd-dada-4eda-ac8a-91c583fd0a85.png │ ├── f480ca9b-abc5-4bbf-8a69-e872fc842679.jpeg │ ├── f6b8099e-9c89-4795-b3fc-ee128b5b637c.jpeg │ ├── f77de97e-b79d-48b7-b6e5-6567df26585f.jpeg │ ├── f79c3ceb-9690-4be8-b188-ff91933bffab.jpeg │ ├── f7f12f87-7a98-4175-a900-45f4f84f758c.jpeg │ ├── f7f8a920-5a79-480e-9288-d3caf83df406.jpeg │ ├── fb209198-480a-4e4c-a665-56efa58c1942.jpeg │ └── fe1245c5-0d59-4d50-90d6-ca680267027e.jpeg └── web ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .stylelintignore ├── README.md ├── build ├── constant.ts └── vite │ └── plugins │ ├── autoImport.ts │ ├── component.ts │ ├── compress.ts │ ├── imagemin.ts │ ├── index.ts │ ├── progress.ts │ ├── restart.ts │ ├── unocss.ts │ └── visualizer.ts ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── prettier.config.js ├── public ├── favicon.ico └── images │ ├── admin-login-bg.jpg │ ├── bg2.jpg │ └── demo.jpg ├── src ├── App.vue ├── api │ ├── ad.ts │ ├── address.ts │ ├── borrow.ts │ ├── classification.ts │ ├── comment.ts │ ├── log.ts │ ├── notice.ts │ ├── order.ts │ ├── overview.ts │ ├── tag.ts │ ├── thing.ts │ ├── thingCollect.ts │ ├── thingWish.ts │ └── user.ts ├── assets │ ├── fonts │ │ ├── Blimone-ExtraBold.woff │ │ ├── Blimone-ExtraLight.woff │ │ ├── Blimone-Light.woff │ │ └── Blimone-Regular.woff │ ├── icons │ │ ├── logo.png │ │ └── svg │ │ │ ├── github.svg │ │ │ ├── logo.svg │ │ │ ├── marks.svg │ │ │ ├── test.svg │ │ │ ├── ts.svg │ │ │ └── twitter.svg │ ├── images │ │ ├── add.svg │ │ ├── address-right-icon.svg │ │ ├── ali-pay-icon.svg │ │ ├── avatar.jpg │ │ ├── banner-02.webp │ │ ├── banner2.svg │ │ ├── cart-icon.svg │ │ ├── clear-search.svg │ │ ├── code-icon.svg │ │ ├── delete-icon.svg │ │ ├── ebook-download-icon.svg │ │ ├── k-logo.png │ │ ├── login-banner.png │ │ ├── login.png │ │ ├── logo.png │ │ ├── mail-icon.svg │ │ ├── message-icon.svg │ │ ├── order-address-icon.svg │ │ ├── order-icon.svg │ │ ├── order-point-icon.svg │ │ ├── order-thing-icon.svg │ │ ├── pwd-hidden.svg │ │ ├── pwd-icon.svg │ │ ├── qunerweima.jpg │ │ ├── read-online-icon.svg │ │ ├── recommend-hover.svg │ │ ├── register-name.svg │ │ ├── search-icon.svg │ │ ├── searchIcon.svg │ │ ├── setting-card-icon.svg │ │ ├── setting-icon.svg │ │ ├── setting-msg-icon.svg │ │ ├── setting-push-icon.svg │ │ ├── setting-safe-icon.svg │ │ ├── share-icon.svg │ │ ├── tel-icon.svg │ │ ├── want-read-hover.svg │ │ ├── wb-share.svg │ │ └── wx-pay-icon.svg │ └── styles │ │ └── base.less ├── core │ └── bootstrap.js ├── main.ts ├── router │ ├── index.ts │ └── root.ts ├── store │ ├── constants.ts │ ├── index.ts │ └── modules │ │ ├── app │ │ ├── index.ts │ │ └── types.ts │ │ └── user │ │ ├── index.ts │ │ └── types.ts ├── styles │ ├── index.less │ └── reset.less ├── utils │ ├── auth.ts │ ├── http │ │ └── axios │ │ │ ├── index.ts │ │ │ ├── status.ts │ │ │ └── type.ts │ ├── index.ts │ └── result.ts └── views │ ├── admin │ ├── ad.vue │ ├── admin-login.vue │ ├── borrow.vue │ ├── classification.vue │ ├── comment.vue │ ├── error-log.vue │ ├── login-log.vue │ ├── main.vue │ ├── notice.vue │ ├── op-log.vue │ ├── overview.vue │ ├── sys-info.vue │ ├── tag.vue │ ├── thing.vue │ └── user.vue │ └── index │ ├── components │ ├── content.vue │ ├── footer.vue │ ├── header.vue │ └── search-content-view.vue │ ├── detail.vue │ ├── index.vue │ ├── login.vue │ ├── portal.vue │ ├── register.vue │ ├── search.vue │ ├── user │ ├── address-view.vue │ ├── borrow-view.vue │ ├── collect-thing-view.vue │ ├── comment-view.vue │ ├── fans-view.vue │ ├── follow-view.vue │ ├── message-view.vue │ ├── mine-infos-view.vue │ ├── modal │ │ └── edit-address.vue │ ├── push-view.vue │ ├── score-view.vue │ ├── security-view.vue │ ├── userinfo-edit-view.vue │ └── wish-thing-view.vue │ └── usercenter.vue ├── stylelint.config.js ├── tsconfig.json ├── types ├── auto-imports.d.ts ├── components.d.ts └── env.d.ts ├── vite.config.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | -------------------------------------------------------------------------------- /doc/java_book.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/doc/java_book.docx -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | > *一直想做一款管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套管理系统。现将部分源码开源,如需完整源码,可以联系客服微信购买:lengqin1024* 2 | 3 | 4 | ### 演示地址 5 | 6 | * 前台 http://book.gitapp.cn 7 | * 后台 http://book.gitapp.cn/#/admin 8 | 9 | 后台管理帐号: 10 | 11 | 用户名:admin123 12 | 密码:admin123 13 | 14 | ### 功能介绍 15 | 16 | 平台采用B/S结构,后端采用主流的Springboot框架进行开发,前端采用主流的Vue.js进行开发。 17 | 18 | 整个平台包括前台和后台两个部分。 19 | 20 | - 前台功能包括:首页、图书详情页、借阅中心、用户中心模块。 21 | - 后台功能包括:总览、借阅管理、图书管理、分类管理、标签管理、评论管理、用户管理、运营管理、日志管理、系统信息模块。 22 | 23 | ### 适合人群 24 | 25 | 大学生、系统设计人员、课程作业 26 | 27 | 28 | ### 代码结构 29 | 30 | - server目录是后端代码 31 | - web目录是前端代码 32 | 33 | ### 部署运行 34 | 35 | #### 后端运行步骤 36 | 37 | 1. 下载JDK 1.8,并配置环境变量 38 | 39 | 2. 下载本代码后,使用IntelliJ IDEA打开server目录 40 | 41 | 3. 配置server目录中的application.yml文件,配置BASE_LOCATION、DB_NAME、数据库账号密码 42 | 43 | 4. 安装mysql 5.7数据库,并创建数据库,创建SQL如下: 44 | ``` 45 | CREATE DATABASE IF NOT EXISTS java_book DEFAULT CHARSET utf8 COLLATE utf8_general_ci 46 | ``` 47 | 5. 恢复sql数据。在mysql下依次执行如下命令: 48 | 49 | ``` 50 | mysql> use java_book; 51 | mysql> source D:/xxx/xxx/xxx.sql; 52 | ``` 53 | 54 | 6. 启动后端服务:点击IDEA顶部run按钮 55 | 56 | 57 | #### 前端运行步骤 58 | 59 | 1. 安装node 16.14 60 | 61 | 2. 修改web/src/store下的constansts.ts文件中的BASE_URL,改成你自己后端的地址 62 | 63 | 3. cmd命令进入web目录下,安装依赖,执行: 64 | ``` 65 | npm install 66 | ``` 67 | 4. 运行项目 68 | ``` 69 | npm run dev 70 | ``` 71 | 5. 在浏览器输入: http://localhost:3000 即可预览 72 | 73 | 74 | ### 界面预览 75 | 76 | 首页 77 | 78 | ![](https://raw.githubusercontent.com/geeeeeeeek/java_book/master/server/upload/image/a.png) 79 | 80 | 81 | 后台页面 82 | 83 | ![](https://raw.githubusercontent.com/geeeeeeeek/java_book/master/server/upload/image/b.png) 84 | 85 | 86 | 87 | 88 | ### 参考论文 89 | [点击进入](doc/java_book.docx) 90 | 91 | 92 | ### 付费咨询 93 | 94 | 微信:lengqin1024 95 | 96 | -------------------------------------------------------------------------------- /server/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | !**/src/main/**/target/ 4 | !**/src/test/**/target/ 5 | 6 | ### STS ### 7 | .apt_generated 8 | .classpath 9 | .factorypath 10 | .project 11 | .settings 12 | .springBeans 13 | .sts4-cache 14 | 15 | ### IntelliJ IDEA ### 16 | .idea 17 | *.iws 18 | *.iml 19 | *.ipr 20 | 21 | ### NetBeans ### 22 | /nbproject/private/ 23 | /nbbuild/ 24 | /dist/ 25 | /nbdist/ 26 | /.nb-gradle/ 27 | build/ 28 | !**/src/main/**/build/ 29 | !**/src/test/**/build/ 30 | 31 | ### VS Code ### 32 | .vscode/ 33 | my-log 34 | -------------------------------------------------------------------------------- /server/Readme.md: -------------------------------------------------------------------------------- 1 | > 学习过程中,遇到问题可以咨询作者:lengqin1024(微信) 2 | 3 | 4 | ### 功能 5 | 6 | * 增删改查 7 | * 文件上传 8 | * 数据库配置 9 | * 日志管理 10 | * 权限控制 11 | 12 | ### 后端部署流程 13 | 14 | * 配置端口 位于application.yml 15 | * 配置DB_NAME 位于application.yml 16 | * 配置BASE_LOCATION 位于application.yml 17 | * 关闭swagger配置 位于application.yml 18 | * 修改logback-spring.xml下的LOG_HOME的value值 19 | * maven clean -> maven package 20 | * 将jar包复制到服务器 21 | * 将upload文件夹复制到服务器 22 | * 迁移mysql数据库 23 | * 运行启动jar包命令 24 | 25 | ### 运行jar命令(或双击start.sh) 26 | 27 | title xxxx 28 | java -jar -Xms64m -Xmx128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=64m xxxxx.jar 29 | 30 | 31 | ### 数据库相关 32 | 33 | 删除数据库命令: 34 | 35 | drop database if exists java_book; 36 | 37 | 创建数据库命令: 38 | 39 | CREATE DATABASE IF NOT EXISTS java_book DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 40 | 41 | 数据库备份命令: 42 | 43 | mysqldump -u root -p --databases 数据库名称 > xxx.sql 44 | 45 | 数据库恢复命令: 46 | 47 | source D:\\xxx.sql 48 | 49 | 50 | ### 常见问题 51 | 52 | #### 日志路径 53 | 54 | 修改logback-spring.xml下的LOG_HOME的value值 55 | 56 | #### 配置数据库 57 | 58 | application.yml中 59 | 60 | #### Druid连接池配置 61 | 62 | * application.yml中配置druid 63 | * 参考链接:https://blog.csdn.net/nothingavenger/article/details/114119585 64 | * 监控地址:http://localhost:8009/druid/index.html 65 | 66 | #### mysql主键id过长 67 | 68 | https://blog.csdn.net/qq_46728644/article/details/120772577 69 | 70 | #### yml不起作用 71 | 72 | 需要maven clean一下 73 | 74 | #### 注意实体字段最好是String类型 75 | 76 | 实体字段最好是String类型,mybatis-plus的update的时候,null的不更新 77 | 78 | #### 打包步骤 79 | 80 | maven clean -> maven package 81 | 82 | https://blog.csdn.net/weixin_42822484/article/details/107893586 83 | 84 | #### 配置文件上传大小 85 | 86 | application.yml中multipart下 87 | 88 | #### 静态资源路径配置 89 | 90 | https://blog.csdn.net/cylcjsg/article/details/128102776? 91 | 92 | #### 跨域配置 93 | 94 | 见CorsConfig.java 95 | 96 | ### swagger配置 97 | 98 | https://juejin.cn/post/6959877018892959775 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/MySpringApplication.java: -------------------------------------------------------------------------------- 1 | package com.gk.study; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | /** 7 | * @author lengqin1024(微信) 8 | * @email net936@163.com 9 | */ 10 | @SpringBootApplication 11 | public class MySpringApplication { 12 | 13 | public static void main(String[] args) { 14 | SpringApplication.run(MySpringApplication.class, args); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/common/APIResponse.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.common; 2 | 3 | 4 | import java.io.Serializable; 5 | 6 | import lombok.Data; 7 | 8 | /** 9 | * @功能描述: 响应报文,统一封装类 10 | */ 11 | @Data 12 | public class APIResponse implements Serializable { 13 | private int code; 14 | private String msg; 15 | private T data; 16 | private String trace; 17 | private long timestamp; 18 | 19 | public APIResponse() { 20 | this.timestamp = System.currentTimeMillis(); 21 | } 22 | 23 | public APIResponse(ResponeCode responseCode) { 24 | this.timestamp = System.currentTimeMillis(); 25 | this.code = responseCode.getCode(); 26 | this.msg = responseCode.getMsg(); 27 | } 28 | 29 | public APIResponse(ResponeCode responseCode, String msg) { 30 | this(responseCode); 31 | this.msg = msg; 32 | } 33 | 34 | public APIResponse(ResponeCode responseCode, T data) { 35 | this(responseCode); 36 | this.data = data; 37 | } 38 | 39 | public APIResponse(ResponeCode responseCode, String msg, T data) { 40 | this(responseCode); 41 | this.trace = msg; 42 | this.data = data; 43 | } 44 | 45 | @Override 46 | public String toString() { 47 | return "APIResponse{" + 48 | "timestamp=" + timestamp + 49 | ", code=" + code + 50 | ", msg='" + msg + '\'' + 51 | ", trace='" + trace + '\'' + 52 | ", data=" + data + 53 | //", count=" + count + 54 | '}'; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/common/ResponeCode.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.common; 2 | 3 | /** 4 | * @功能描述: 响应报文,统一封装类 5 | */ 6 | public enum ResponeCode { 7 | SUCCESS(200, "成功"), 8 | FAIL(400, "失败"), 9 | UNAUTHORIZED(401, "未认证"), 10 | NOT_FOUND(404, "接口不存在"), 11 | INTERNAL_SERVER_ERROR(500, "服务器内部错误"); 12 | 13 | private int code; 14 | private String msg; 15 | 16 | private ResponeCode(int code, String msg) { 17 | this.code = code; 18 | this.msg = msg; 19 | } 20 | 21 | public int getCode() { 22 | return this.code; 23 | } 24 | 25 | public String getMsg() { 26 | return this.msg; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/config/MyConfig.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.config; 2 | 3 | import com.gk.study.interceptor.AccessInterceptor; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.servlet.config.annotation.CorsRegistry; 6 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 7 | import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 8 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 9 | 10 | @Configuration 11 | public class MyConfig implements WebMvcConfigurer { 12 | @Override 13 | public void addCorsMappings(CorsRegistry registry) { 14 | registry.addMapping("/**")//项目中的所有接口都支持跨域 15 | .allowedOriginPatterns("*") //所有地址都可以访问,也可以配置具体地址 16 | .allowCredentials(true) 17 | .allowedMethods("*");//"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS" 18 | 19 | } 20 | 21 | @Override 22 | public void addResourceHandlers(ResourceHandlerRegistry registry) { 23 | 24 | // 添加swagger静态资源 25 | registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); 26 | registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); 27 | } 28 | 29 | @Override 30 | public void addInterceptors(InterceptorRegistry registry) { 31 | // 自定义拦截器 32 | registry.addInterceptor(new AccessInterceptor()); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/config/Swagger3Config.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.config; 2 | 3 | import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import springfox.documentation.builders.ApiInfoBuilder; 7 | import springfox.documentation.builders.PathSelectors; 8 | import springfox.documentation.builders.RequestHandlerSelectors; 9 | import springfox.documentation.oas.annotations.EnableOpenApi; 10 | import springfox.documentation.service.ApiInfo; 11 | import springfox.documentation.spi.DocumentationType; 12 | import springfox.documentation.spring.web.plugins.Docket; 13 | 14 | @EnableKnife4j 15 | @Configuration 16 | @EnableOpenApi 17 | public class Swagger3Config { 18 | 19 | @Bean 20 | public Docket coreApiConfig(){ 21 | return new Docket(DocumentationType.OAS_30) 22 | .apiInfo(getApiInfo()) 23 | .groupName("apis") 24 | .select() 25 | .apis(RequestHandlerSelectors.basePackage("com.gk.study.controller")) 26 | .paths(PathSelectors.any()) 27 | .build(); 28 | } 29 | 30 | private ApiInfo getApiInfo(){ 31 | return new ApiInfoBuilder() 32 | .title("api文档") 33 | .description("管理系统接口描述") 34 | .version("1.0") 35 | .build(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/controller/ErrorLogController.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.controller; 2 | 3 | import com.gk.study.common.APIResponse; 4 | import com.gk.study.common.ResponeCode; 5 | import com.gk.study.entity.ErrorLog; 6 | import com.gk.study.service.ErrorLogService; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.transaction.annotation.Transactional; 11 | import org.springframework.web.bind.annotation.RequestMapping; 12 | import org.springframework.web.bind.annotation.RequestMethod; 13 | import org.springframework.web.bind.annotation.RestController; 14 | 15 | import java.io.IOException; 16 | import java.util.List; 17 | 18 | @RestController 19 | @RequestMapping("/errorLog") 20 | public class ErrorLogController { 21 | 22 | private final static Logger logger = LoggerFactory.getLogger(ErrorLogController.class); 23 | 24 | @Autowired 25 | ErrorLogService service; 26 | 27 | @RequestMapping(value = "/list", method = RequestMethod.GET) 28 | public APIResponse list(){ 29 | List list = service.getErrorLogList(); 30 | return new APIResponse(ResponeCode.SUCCESS, "查询成功", list); 31 | } 32 | 33 | @RequestMapping(value = "/create", method = RequestMethod.POST) 34 | @Transactional 35 | public APIResponse create(ErrorLog errorLog) throws IOException { 36 | service.createErrorLog(errorLog); 37 | return new APIResponse(ResponeCode.SUCCESS, "创建成功"); 38 | } 39 | 40 | @RequestMapping(value = "/delete", method = RequestMethod.POST) 41 | public APIResponse delete(String ids){ 42 | System.out.println("ids===" + ids); 43 | // 批量删除 44 | String[] arr = ids.split(","); 45 | for (String id : arr) { 46 | service.deleteErrorLog(id); 47 | } 48 | return new APIResponse(ResponeCode.SUCCESS, "删除成功"); 49 | } 50 | 51 | @RequestMapping(value = "/update", method = RequestMethod.POST) 52 | @Transactional 53 | public APIResponse update(ErrorLog errorLog) throws IOException { 54 | service.updateErrorLog(errorLog); 55 | return new APIResponse(ResponeCode.SUCCESS, "更新成功"); 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/controller/NoticeController.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.controller; 2 | 3 | import com.gk.study.common.APIResponse; 4 | import com.gk.study.common.ResponeCode; 5 | import com.gk.study.entity.Notice; 6 | import com.gk.study.permission.Access; 7 | import com.gk.study.permission.AccessLevel; 8 | import com.gk.study.service.NoticeService; 9 | import org.slf4j.Logger; 10 | import org.slf4j.LoggerFactory; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.transaction.annotation.Transactional; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RequestMethod; 15 | import org.springframework.web.bind.annotation.RestController; 16 | 17 | import java.io.IOException; 18 | import java.util.List; 19 | 20 | @RestController 21 | @RequestMapping("/notice") 22 | public class NoticeController { 23 | 24 | private final static Logger logger = LoggerFactory.getLogger(NoticeController.class); 25 | 26 | @Autowired 27 | NoticeService service; 28 | 29 | @RequestMapping(value = "/list", method = RequestMethod.GET) 30 | public APIResponse list(){ 31 | List list = service.getNoticeList(); 32 | return new APIResponse(ResponeCode.SUCCESS, "查询成功", list); 33 | } 34 | 35 | @Access(level = AccessLevel.ADMIN) 36 | @RequestMapping(value = "/create", method = RequestMethod.POST) 37 | @Transactional 38 | public APIResponse create(Notice notice) throws IOException { 39 | service.createNotice(notice); 40 | return new APIResponse(ResponeCode.SUCCESS, "创建成功"); 41 | } 42 | 43 | @Access(level = AccessLevel.ADMIN) 44 | @RequestMapping(value = "/delete", method = RequestMethod.POST) 45 | public APIResponse delete(String ids){ 46 | System.out.println("ids===" + ids); 47 | // 批量删除 48 | String[] arr = ids.split(","); 49 | for (String id : arr) { 50 | service.deleteNotice(id); 51 | } 52 | return new APIResponse(ResponeCode.SUCCESS, "删除成功"); 53 | } 54 | 55 | @Access(level = AccessLevel.ADMIN) 56 | @RequestMapping(value = "/update", method = RequestMethod.POST) 57 | @Transactional 58 | public APIResponse update(Notice notice) throws IOException { 59 | service.updateNotice(notice); 60 | return new APIResponse(ResponeCode.SUCCESS, "更新成功"); 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/controller/TagController.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.controller; 2 | 3 | import com.gk.study.common.APIResponse; 4 | import com.gk.study.common.ResponeCode; 5 | import com.gk.study.entity.Tag; 6 | import com.gk.study.permission.Access; 7 | import com.gk.study.permission.AccessLevel; 8 | import com.gk.study.service.TagService; 9 | import org.slf4j.Logger; 10 | import org.slf4j.LoggerFactory; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.transaction.annotation.Transactional; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RequestMethod; 15 | import org.springframework.web.bind.annotation.RestController; 16 | 17 | import java.io.IOException; 18 | import java.util.List; 19 | /** 20 | * @author lengqin1024(微信) 21 | * @email net936@163.com 22 | */ 23 | @RestController 24 | @RequestMapping("/tag") 25 | public class TagController { 26 | 27 | private final static Logger logger = LoggerFactory.getLogger(TagController.class); 28 | 29 | @Autowired 30 | TagService service; 31 | 32 | @RequestMapping(value = "/list", method = RequestMethod.GET) 33 | public APIResponse list(){ 34 | List list = service.getTagList(); 35 | 36 | return new APIResponse(ResponeCode.SUCCESS, "查询成功", list); 37 | } 38 | 39 | @Access(level = AccessLevel.ADMIN) 40 | @RequestMapping(value = "/create", method = RequestMethod.POST) 41 | @Transactional 42 | public APIResponse create(Tag tag) throws IOException { 43 | service.createTag(tag); 44 | return new APIResponse(ResponeCode.SUCCESS, "创建成功"); 45 | } 46 | 47 | @Access(level = AccessLevel.ADMIN) 48 | @RequestMapping(value = "/delete", method = RequestMethod.POST) 49 | public APIResponse delete(String ids){ 50 | System.out.println("ids===" + ids); 51 | // 批量删除 52 | String[] arr = ids.split(","); 53 | for (String id : arr) { 54 | service.deleteTag(id); 55 | } 56 | return new APIResponse(ResponeCode.SUCCESS, "删除成功"); 57 | } 58 | 59 | @Access(level = AccessLevel.ADMIN) 60 | @RequestMapping(value = "/update", method = RequestMethod.POST) 61 | @Transactional 62 | public APIResponse update(Tag tag) throws IOException { 63 | service.updateTag(tag); 64 | return new APIResponse(ResponeCode.SUCCESS, "更新成功"); 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/Ad.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | import org.springframework.web.multipart.MultipartFile; 9 | 10 | import java.io.File; 11 | import java.io.Serializable; 12 | 13 | @Data 14 | @TableName("b_ad") 15 | public class Ad implements Serializable { 16 | @TableId(value = "id",type = IdType.AUTO) 17 | public Long id; 18 | @TableField 19 | public String image; 20 | @TableField(exist = false) 21 | public MultipartFile imageFile; 22 | @TableField 23 | public String link; 24 | @TableField 25 | public String createTime; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/Address.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | @Data 12 | @TableName("b_address") 13 | public class Address implements Serializable { 14 | @TableId(value = "id",type = IdType.AUTO) 15 | public Long id; 16 | @TableField 17 | public String name; 18 | @TableField 19 | public String mobile; 20 | @TableField 21 | public String description; 22 | @TableField 23 | public String def; // 默认 24 | @TableField 25 | public String createTime; 26 | @TableField 27 | public String userId; 28 | 29 | } 30 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/Banner.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | import org.springframework.web.multipart.MultipartFile; 9 | 10 | import java.io.Serializable; 11 | 12 | @Data 13 | @TableName("b_banner") 14 | public class Banner implements Serializable { 15 | @TableId(value = "id",type = IdType.AUTO) 16 | public Long id; 17 | @TableField 18 | public String image; 19 | @TableField(exist = false) 20 | public MultipartFile imageFile; 21 | @TableField 22 | public Long thingId; 23 | @TableField 24 | public String createTime; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/Borrow.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | @Data 12 | @TableName("b_borrow") 13 | public class Borrow implements Serializable { 14 | @TableId(value = "id",type = IdType.AUTO) 15 | public Long id; 16 | @TableField 17 | public String status; 18 | @TableField 19 | public String borrowTime; 20 | @TableField 21 | public String returnTime; 22 | @TableField 23 | public String expectTime; 24 | @TableField 25 | public String thingId; 26 | @TableField 27 | public String userId; 28 | @TableField 29 | public String hasDelayed; 30 | 31 | @TableField(exist = false) 32 | public String username; // 用户名 33 | @TableField(exist = false) 34 | public String title; // 商品名称 35 | @TableField(exist = false) 36 | public String cover; // 商品封面 37 | 38 | } 39 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/Classification.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import lombok.Data; 5 | import org.springframework.web.multipart.MultipartFile; 6 | 7 | import java.io.Serializable; 8 | import java.sql.Date; 9 | 10 | @Data 11 | @TableName("b_classification") 12 | public class Classification implements Serializable { 13 | @TableId(value = "id",type = IdType.AUTO) 14 | public Long id; 15 | @TableField 16 | public String title; 17 | @TableField 18 | public String createTime; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/Comment.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | @Data 12 | @TableName("b_comment") 13 | public class Comment implements Serializable { 14 | @TableId(value = "id",type = IdType.AUTO) 15 | public Long id; 16 | @TableField 17 | public String content; 18 | @TableField 19 | public String commentTime; 20 | @TableField 21 | public String likeCount; 22 | @TableField 23 | public String userId; 24 | @TableField(exist = false) 25 | public String username; // 用户名 26 | @TableField 27 | public String thingId; 28 | @TableField(exist = false) 29 | public String title; // 商品名称 30 | @TableField(exist = false) 31 | public String cover; // 商品封面 32 | 33 | } 34 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/ErrorLog.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | @Data 12 | @TableName("b_error_log") 13 | public class ErrorLog implements Serializable { 14 | @TableId(value = "id",type = IdType.AUTO) 15 | public Long id; 16 | @TableField 17 | public String ip; 18 | @TableField 19 | public String url; 20 | @TableField 21 | public String method; 22 | @TableField 23 | public String content; 24 | @TableField 25 | public String logTime; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/Notice.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | @Data 12 | @TableName("b_notice") 13 | public class Notice implements Serializable { 14 | @TableId(value = "id",type = IdType.AUTO) 15 | public Long id; 16 | @TableField 17 | public String title; 18 | @TableField 19 | public String content; 20 | @TableField 21 | public String createTime; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/OpLog.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import com.fasterxml.jackson.annotation.JsonFormat; 5 | import lombok.Data; 6 | 7 | import java.io.Serializable; 8 | import java.util.Date; 9 | 10 | @Data 11 | @TableName("b_op_log") 12 | public class OpLog implements Serializable { 13 | @TableId(value = "id",type = IdType.AUTO) 14 | public Long id; 15 | @TableField 16 | public String reIp; 17 | @TableField 18 | public String reTime; 19 | @TableField 20 | public String reUa; 21 | @TableField 22 | public String reUrl; 23 | @TableField 24 | public String reMethod; 25 | @TableField 26 | public String reContent; 27 | @TableField 28 | public String accessTime; 29 | 30 | } 31 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/Tag.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | @Data 12 | @TableName("b_tag") 13 | public class Tag implements Serializable { 14 | @TableId(value = "id",type = IdType.AUTO) 15 | public Long id; 16 | @TableField 17 | public String title; 18 | @TableField 19 | public String createTime; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/Thing.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | import org.springframework.web.multipart.MultipartFile; 9 | 10 | import java.io.Serializable; 11 | import java.util.List; 12 | 13 | @Data 14 | @TableName("b_thing") 15 | public class Thing implements Serializable { 16 | @TableId(value = "id",type = IdType.AUTO) 17 | public Long id; 18 | @TableField 19 | public String title; 20 | @TableField 21 | public String cover; 22 | @TableField 23 | public String description; 24 | @TableField 25 | public String price; 26 | @TableField 27 | public String status; 28 | @TableField 29 | public String createTime; 30 | @TableField 31 | public String repertory; 32 | @TableField 33 | public String translator; 34 | @TableField 35 | public String isbn; 36 | @TableField 37 | public String layout; 38 | @TableField 39 | public String author; 40 | @TableField 41 | public String press; 42 | @TableField 43 | public String pubDate; 44 | @TableField 45 | public String score; 46 | @TableField 47 | public String pageCount; 48 | @TableField 49 | public String pv; 50 | @TableField 51 | public String recommendCount; 52 | @TableField 53 | public String wishCount; 54 | @TableField 55 | public String collectCount; 56 | @TableField 57 | public Long classificationId; 58 | 59 | @TableField(exist = false) 60 | public List tags; // 标签 61 | 62 | @TableField(exist = false) 63 | public MultipartFile imageFile; 64 | 65 | } 66 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/ThingCollect.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | 12 | @Data 13 | @TableName("b_thing_collect") 14 | public class ThingCollect implements Serializable { 15 | @TableId(value = "id",type = IdType.AUTO) 16 | public Long id; 17 | @TableField 18 | public String thingId; 19 | @TableField 20 | public String userId; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/ThingTag.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | @Data 12 | @TableName("b_thing_tag") 13 | public class ThingTag implements Serializable { 14 | @TableId(value = "id",type = IdType.AUTO) 15 | public Long id; 16 | @TableField 17 | public Long thingId; 18 | @TableField 19 | public Long tagId; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/ThingWish.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | 12 | @Data 13 | @TableName("b_thing_wish") 14 | public class ThingWish implements Serializable { 15 | @TableId(value = "id",type = IdType.AUTO) 16 | public Long id; 17 | @TableField 18 | public String thingId; 19 | @TableField 20 | public String userId; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/User.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import com.fasterxml.jackson.annotation.JsonFormat; 8 | import com.fasterxml.jackson.annotation.JsonIgnore; 9 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 10 | import lombok.Data; 11 | import org.springframework.web.multipart.MultipartFile; 12 | 13 | import java.io.Serializable; 14 | 15 | @Data 16 | @TableName("b_user") 17 | public class User implements Serializable { 18 | public static final int NormalUser = 1; 19 | public static final int DemoUser = 2; 20 | public static final int AdminUser = 3; 21 | 22 | @TableId(value = "id",type = IdType.AUTO) 23 | public String id; 24 | @TableField 25 | public String username; 26 | @TableField 27 | public String password; 28 | @TableField(exist = false) 29 | public String rePassword; 30 | @TableField 31 | public String nickname; 32 | @TableField 33 | public String mobile; 34 | @TableField 35 | public String email; 36 | @TableField 37 | public String description; 38 | @TableField 39 | public String role; 40 | @TableField 41 | public String status; 42 | @TableField 43 | public String score; 44 | @TableField 45 | public String avatar; 46 | @TableField(exist = false) 47 | public MultipartFile avatarFile; 48 | @TableField 49 | public String token; 50 | @TableField 51 | public String createTime; 52 | @TableField 53 | public String pushEmail; 54 | @TableField 55 | public String pushSwitch; 56 | 57 | 58 | 59 | } 60 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/entity/VisitData.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.entity; 2 | 3 | public class VisitData { 4 | 5 | public String reIp; 6 | public int count; 7 | } 8 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/handler/CustomExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.handler; 2 | 3 | 4 | import com.gk.study.common.APIResponse; 5 | import com.gk.study.service.ErrorLogService; 6 | import com.gk.study.common.ResponeCode; 7 | import com.gk.study.entity.ErrorLog; 8 | import com.gk.study.utils.HttpContextUtils; 9 | import com.gk.study.utils.IpUtils; 10 | import org.slf4j.Logger; 11 | import org.slf4j.LoggerFactory; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.web.bind.annotation.ExceptionHandler; 14 | import org.springframework.web.bind.annotation.RestControllerAdvice; 15 | 16 | import javax.servlet.http.HttpServletRequest; 17 | import java.util.Arrays; 18 | import java.util.Map; 19 | 20 | @RestControllerAdvice 21 | public class CustomExceptionHandler { 22 | private static final Logger logger = LoggerFactory.getLogger(CustomExceptionHandler.class); 23 | 24 | @Autowired 25 | private ErrorLogService service; 26 | 27 | @ExceptionHandler(Exception.class) 28 | public APIResponse handleException(Exception ex){ 29 | logger.error("error log======>" + ex.getMessage(), ex); 30 | 31 | saveLog(ex); 32 | return new APIResponse(ResponeCode.FAIL, ex.getMessage()); 33 | } 34 | 35 | /** 36 | * 保存异常日志 37 | */ 38 | private void saveLog(Exception ex){ 39 | ErrorLog log = new ErrorLog(); 40 | //请求相关信息 41 | HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); 42 | log.setIp(IpUtils.getIpAddr(request)); 43 | log.setUrl(request.getRequestURI()); 44 | log.setMethod(request.getMethod()); 45 | // 请求参数 46 | Map params = HttpContextUtils.getParameterMap(request); 47 | if(!params.isEmpty()){ 48 | //log.setRequestParams(JsonUtils.toJsonString(params)); 49 | } 50 | 51 | //异常信息 52 | log.setContent(Arrays.toString(ex.getStackTrace())); 53 | log.setLogTime(String.valueOf(System.currentTimeMillis())); 54 | 55 | //保存 56 | service.createErrorLog(log); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/AdMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.Ad; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface AdMapper extends BaseMapper { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/AddressMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.Address; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface AddressMapper extends BaseMapper
{ 9 | 10 | } 11 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/BannerMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.Banner; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface BannerMapper extends BaseMapper { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/BorrowMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.Borrow; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | import java.util.List; 8 | 9 | @Mapper 10 | public interface BorrowMapper extends BaseMapper { 11 | 12 | List getList(); 13 | 14 | List getUserBorrowList(String userId, String status); 15 | } 16 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/ClassificationMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.Classification; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface ClassificationMapper extends BaseMapper { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/CommentMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.Comment; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | import java.util.List; 8 | 9 | @Mapper 10 | public interface CommentMapper extends BaseMapper { 11 | 12 | List getList(); 13 | 14 | List selectThingCommentList(String thingId, String order); 15 | 16 | List selectUserCommentList(String userId); 17 | } 18 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/ErrorLogMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.ErrorLog; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface ErrorLogMapper extends BaseMapper { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/NoticeMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.Notice; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface NoticeMapper extends BaseMapper { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/OpLogMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.OpLog; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface OpLogMapper extends BaseMapper { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/OverviewMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.VisitData; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import java.util.List; 9 | 10 | @Mapper 11 | public interface OverviewMapper extends BaseMapper { 12 | 13 | List getPopularThing(); 14 | List getPopularClassification(); 15 | List getWebVisitData(@Param("day") String day); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/TagMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.Tag; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface TagMapper extends BaseMapper { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/ThingCollectMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.ThingCollect; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | @Mapper 11 | public interface ThingCollectMapper extends BaseMapper { 12 | 13 | 14 | List getThingCollectList(String userId); 15 | } 16 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/ThingMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.Thing; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface ThingMapper extends BaseMapper { 9 | // List getList(); 10 | // boolean update(Thing thing); 11 | } 12 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/ThingTagMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.ThingTag; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface ThingTagMapper extends BaseMapper { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/ThingWishMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.ThingWish; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | @Mapper 11 | public interface ThingWishMapper extends BaseMapper { 12 | 13 | List getThingWishList(String userId); 14 | } 15 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.gk.study.entity.User; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface UserMapper extends BaseMapper { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/permission/Access.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.permission; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Retention(RetentionPolicy.RUNTIME) 6 | @Target(ElementType.METHOD) 7 | @Documented // 在生成javac时显示该注解的信息 8 | @Inherited 9 | public @interface Access { 10 | AccessLevel level() default AccessLevel.LOGIN; //默认为ALL 11 | } 12 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/permission/AccessLevel.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.permission; 2 | 3 | public enum AccessLevel { 4 | 5 | // 此处需与user表的role字段对应起来 6 | 7 | LOGIN(1, "all"), // 登录用户 8 | DEMO(2, "demo"), // 演示账号 9 | ADMIN(3, "admin"), // 管理员 10 | SUPER(4, "super"); // 超级管理员 11 | 12 | int code; 13 | String msg; 14 | 15 | AccessLevel(int code, String msg) { 16 | this.code = code; 17 | this.msg = msg; 18 | } 19 | 20 | public int getCode() { 21 | return code; 22 | } 23 | 24 | public String getMsg() { 25 | return msg; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/AdService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.Ad; 5 | 6 | import java.util.List; 7 | 8 | public interface AdService { 9 | List getAdList(); 10 | void createAd(Ad ad); 11 | void deleteAd(String id); 12 | 13 | void updateAd(Ad ad); 14 | } 15 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/AddressService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.Address; 5 | 6 | import java.util.List; 7 | 8 | public interface AddressService { 9 | List
getAddressList(String userId); 10 | void createAddress(Address address); 11 | void deleteAddress(String id); 12 | 13 | void updateAddress(Address address); 14 | } 15 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/BannerService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.Banner; 5 | 6 | import java.util.List; 7 | 8 | public interface BannerService { 9 | List getBannerList(); 10 | void createBanner(Banner banner); 11 | void deleteBanner(String id); 12 | 13 | void updateBanner(Banner banner); 14 | } 15 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/BorrowService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.Borrow; 5 | 6 | import java.util.List; 7 | 8 | public interface BorrowService { 9 | List getBorrowList(); 10 | void createBorrow(Borrow borrow); 11 | void deleteBorrow(String id); 12 | 13 | void updateBorrow(Borrow borrow); 14 | 15 | List getUserBorrowList(String userId, String status); 16 | 17 | Borrow detail(Long id); 18 | } 19 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/ClassificationService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.Classification; 5 | 6 | import java.util.List; 7 | 8 | public interface ClassificationService { 9 | List getClassificationList(); 10 | void createClassification(Classification Classification); 11 | void deleteClassification(String id); 12 | 13 | void updateClassification(Classification Classification); 14 | } 15 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/CommentService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.Comment; 5 | 6 | import java.util.List; 7 | 8 | public interface CommentService { 9 | List getCommentList(); 10 | void createComment(Comment comment); 11 | void deleteComment(String id); 12 | void updateComment(Comment comment); 13 | Comment getCommentDetail(String id); 14 | 15 | List getThingCommentList(String thingId, String order); 16 | 17 | List getUserCommentList(String userId); 18 | } 19 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/ErrorLogService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.ErrorLog; 5 | 6 | import java.util.List; 7 | 8 | public interface ErrorLogService { 9 | List getErrorLogList(); 10 | void createErrorLog(ErrorLog errorLog); 11 | void deleteErrorLog(String id); 12 | void updateErrorLog(ErrorLog errorLog); 13 | } 14 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/NoticeService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.Notice; 5 | 6 | import java.util.List; 7 | 8 | public interface NoticeService { 9 | List getNoticeList(); 10 | void createNotice(Notice notice); 11 | void deleteNotice(String id); 12 | 13 | void updateNotice(Notice notice); 14 | } 15 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/OpLogService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.OpLog; 5 | 6 | import java.util.List; 7 | 8 | public interface OpLogService { 9 | List getOpLogList(); 10 | void createOpLog(OpLog opLog); 11 | void deleteOpLog(String id); 12 | void updateOpLog(OpLog opLog); 13 | 14 | List getLoginLogList(); 15 | } 16 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/TagService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.Tag; 5 | 6 | import java.util.List; 7 | 8 | public interface TagService { 9 | List getTagList(); 10 | void createTag(Tag tag); 11 | void deleteTag(String id); 12 | 13 | void updateTag(Tag tag); 14 | } 15 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/ThingCollectService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.ThingCollect; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | public interface ThingCollectService { 10 | List getThingCollectList(String userId); 11 | void createThingCollect(ThingCollect thingCollect); 12 | void deleteThingCollect(String id); 13 | ThingCollect getThingCollect(String userId, String thingId); 14 | } 15 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/ThingService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.Thing; 5 | 6 | import java.util.List; 7 | 8 | public interface ThingService { 9 | List getThingList(String keyword, String sort, String c, String tag); 10 | void createThing(Thing thing); 11 | void deleteThing(String id); 12 | 13 | void updateThing(Thing thing); 14 | 15 | Thing getThingById(String id); 16 | 17 | void addWishCount(String thingId); 18 | 19 | void addCollectCount(String thingId); 20 | } 21 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/ThingWishService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.ThingWish; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | public interface ThingWishService { 10 | List getThingWishList(String userId); 11 | void createThingWish(ThingWish thingWish); 12 | void deleteThingWish(String id); 13 | 14 | ThingWish getThingWish(String userId, String thingId); 15 | } 16 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service; 2 | 3 | 4 | import com.gk.study.entity.User; 5 | 6 | import java.util.List; 7 | 8 | public interface UserService { 9 | List getUserList(String keyword); 10 | User getAdminUser(User user); 11 | User getNormalUser(User user); 12 | void createUser(User user); 13 | void deleteUser(String id); 14 | 15 | void updateUser(User user); 16 | 17 | User getUserByToken(String token); 18 | User getUserByUserName(String username); 19 | 20 | User getUserDetail(String userId); 21 | } 22 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/AdServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 5 | import com.gk.study.mapper.AdMapper; 6 | import com.gk.study.service.AdService; 7 | import com.gk.study.entity.Ad; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | @Service 14 | public class AdServiceImpl extends ServiceImpl implements AdService { 15 | @Autowired 16 | AdMapper mapper; 17 | 18 | @Override 19 | public List getAdList() { 20 | return mapper.selectList(new QueryWrapper<>()); 21 | } 22 | 23 | @Override 24 | public void createAd(Ad ad) { 25 | System.out.println(ad); 26 | ad.setCreateTime(String.valueOf(System.currentTimeMillis())); 27 | mapper.insert(ad); 28 | } 29 | 30 | @Override 31 | public void deleteAd(String id) { 32 | mapper.deleteById(id); 33 | } 34 | 35 | @Override 36 | public void updateAd(Ad ad) { 37 | mapper.updateById(ad); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/AddressServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 5 | import com.gk.study.entity.Address; 6 | import com.gk.study.mapper.AddressMapper; 7 | import com.gk.study.service.AddressService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | @Service 14 | public class AddressServiceImpl extends ServiceImpl implements AddressService { 15 | @Autowired 16 | AddressMapper mapper; 17 | 18 | @Override 19 | public List
getAddressList(String userId) { 20 | QueryWrapper
queryWrapper = new QueryWrapper<>(); 21 | queryWrapper.eq("user_id", userId); 22 | queryWrapper.orderBy(true, false, "create_time"); 23 | return mapper.selectList(queryWrapper); 24 | } 25 | 26 | @Override 27 | public void createAddress(Address address) { 28 | System.out.println(address); 29 | address.setCreateTime(String.valueOf(System.currentTimeMillis())); 30 | mapper.insert(address); 31 | } 32 | 33 | @Override 34 | public void deleteAddress(String id) { 35 | mapper.deleteById(id); 36 | } 37 | 38 | @Override 39 | public void updateAddress(Address address) { 40 | mapper.updateById(address); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/BannerServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 5 | import com.gk.study.service.BannerService; 6 | import com.gk.study.entity.Banner; 7 | import com.gk.study.mapper.BannerMapper; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | @Service 14 | public class BannerServiceImpl extends ServiceImpl implements BannerService { 15 | @Autowired 16 | BannerMapper mapper; 17 | 18 | @Override 19 | public List getBannerList() { 20 | return mapper.selectList(new QueryWrapper<>()); 21 | } 22 | 23 | @Override 24 | public void createBanner(Banner banner) { 25 | System.out.println(banner); 26 | banner.setCreateTime(String.valueOf(System.currentTimeMillis())); 27 | mapper.insert(banner); 28 | } 29 | 30 | @Override 31 | public void deleteBanner(String id) { 32 | mapper.deleteById(id); 33 | } 34 | 35 | @Override 36 | public void updateBanner(Banner banner) { 37 | mapper.updateById(banner); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/BorrowServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.gk.study.entity.Borrow; 5 | import com.gk.study.mapper.BorrowMapper; 6 | import com.gk.study.service.BorrowService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.List; 11 | 12 | @Service 13 | public class BorrowServiceImpl extends ServiceImpl implements BorrowService { 14 | @Autowired 15 | BorrowMapper mapper; 16 | 17 | @Override 18 | public List getBorrowList() { 19 | return mapper.getList(); 20 | } 21 | 22 | @Override 23 | public void createBorrow(Borrow borrow) { 24 | long ct = System.currentTimeMillis(); 25 | borrow.setBorrowTime(String.valueOf(ct)); 26 | borrow.setStatus("1"); 27 | mapper.insert(borrow); 28 | } 29 | 30 | @Override 31 | public void deleteBorrow(String id) { 32 | mapper.deleteById(id); 33 | } 34 | 35 | @Override 36 | public void updateBorrow(Borrow borrow) { 37 | mapper.updateById(borrow); 38 | } 39 | 40 | @Override 41 | public List getUserBorrowList(String userId, String status) { 42 | return mapper.getUserBorrowList(userId, status); 43 | } 44 | 45 | @Override 46 | public Borrow detail(Long id) { 47 | return mapper.selectById(id); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/ClassificationServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 5 | import com.gk.study.mapper.ClassificationMapper; 6 | import com.gk.study.entity.Classification; 7 | import com.gk.study.service.ClassificationService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | @Service 14 | public class ClassificationServiceImpl extends ServiceImpl implements ClassificationService { 15 | 16 | @Autowired 17 | ClassificationMapper mapper; 18 | 19 | @Override 20 | public List getClassificationList() { 21 | return mapper.selectList(new QueryWrapper<>()); 22 | } 23 | 24 | @Override 25 | public void createClassification(Classification classification) { 26 | System.out.println(classification); 27 | classification.setCreateTime(String.valueOf(System.currentTimeMillis())); 28 | mapper.insert(classification); 29 | } 30 | 31 | @Override 32 | public void deleteClassification(String id) { 33 | mapper.deleteById(id); 34 | } 35 | 36 | @Override 37 | public void updateClassification(Classification classification) { 38 | mapper.updateById(classification); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/CommentServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.gk.study.entity.Comment; 5 | import com.gk.study.mapper.CommentMapper; 6 | import com.gk.study.service.CommentService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.List; 11 | 12 | @Service 13 | public class CommentServiceImpl extends ServiceImpl implements CommentService { 14 | @Autowired 15 | CommentMapper mapper; 16 | 17 | @Override 18 | public List getCommentList() { 19 | return mapper.getList(); 20 | } 21 | 22 | @Override 23 | public void createComment(Comment comment) { 24 | System.out.println(comment); 25 | comment.setCommentTime(String.valueOf(System.currentTimeMillis())); 26 | mapper.insert(comment); 27 | } 28 | 29 | @Override 30 | public void deleteComment(String id) { 31 | mapper.deleteById(id); 32 | } 33 | 34 | @Override 35 | public void updateComment(Comment comment) { 36 | mapper.updateById(comment); 37 | } 38 | 39 | @Override 40 | public Comment getCommentDetail(String id) { 41 | return mapper.selectById(id); 42 | } 43 | 44 | @Override 45 | public List getThingCommentList(String thingId, String order) { 46 | return mapper.selectThingCommentList(thingId, order); 47 | } 48 | 49 | @Override 50 | public List getUserCommentList(String userId) { 51 | return mapper.selectUserCommentList(userId); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/ErrorLogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 5 | import com.gk.study.entity.ErrorLog; 6 | import com.gk.study.mapper.ErrorLogMapper; 7 | import com.gk.study.service.ErrorLogService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | @Service 14 | public class ErrorLogServiceImpl extends ServiceImpl implements ErrorLogService { 15 | @Autowired 16 | ErrorLogMapper mapper; 17 | 18 | @Override 19 | public List getErrorLogList() { 20 | return mapper.selectList(new QueryWrapper<>()); 21 | } 22 | 23 | @Override 24 | public void createErrorLog(ErrorLog errorLog) { 25 | mapper.insert(errorLog); 26 | } 27 | 28 | @Override 29 | public void deleteErrorLog(String id) { 30 | mapper.deleteById(id); 31 | } 32 | 33 | @Override 34 | public void updateErrorLog(ErrorLog errorLog) { 35 | mapper.updateById(errorLog); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/NoticeServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 5 | import com.gk.study.entity.Notice; 6 | import com.gk.study.mapper.NoticeMapper; 7 | import com.gk.study.service.NoticeService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | @Service 14 | public class NoticeServiceImpl extends ServiceImpl implements NoticeService { 15 | @Autowired 16 | NoticeMapper mapper; 17 | 18 | @Override 19 | public List getNoticeList() { 20 | return mapper.selectList(new QueryWrapper<>()); 21 | } 22 | 23 | @Override 24 | public void createNotice(Notice notice) { 25 | System.out.println(notice); 26 | notice.setCreateTime(String.valueOf(System.currentTimeMillis())); 27 | mapper.insert(notice); 28 | } 29 | 30 | @Override 31 | public void deleteNotice(String id) { 32 | mapper.deleteById(id); 33 | } 34 | 35 | @Override 36 | public void updateNotice(Notice notice) { 37 | mapper.updateById(notice); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/OpLogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 5 | import com.gk.study.entity.OpLog; 6 | import com.gk.study.service.OpLogService; 7 | import com.gk.study.mapper.OpLogMapper; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | @Service 14 | public class OpLogServiceImpl extends ServiceImpl implements OpLogService { 15 | @Autowired 16 | OpLogMapper mapper; 17 | 18 | @Override 19 | public List getOpLogList() { 20 | QueryWrapper queryWrapper = new QueryWrapper(); 21 | queryWrapper.orderBy(true, false, "re_time"); 22 | queryWrapper.last("limit 0, 1000"); // 前1000条 23 | return mapper.selectList(queryWrapper); 24 | } 25 | 26 | @Override 27 | public void createOpLog(OpLog opLog) { 28 | mapper.insert(opLog); 29 | } 30 | 31 | @Override 32 | public void deleteOpLog(String id) { 33 | mapper.deleteById(id); 34 | } 35 | 36 | @Override 37 | public void updateOpLog(OpLog opLog) { 38 | mapper.updateById(opLog); 39 | } 40 | 41 | @Override 42 | public List getLoginLogList() { 43 | QueryWrapper queryWrapper = new QueryWrapper(); 44 | queryWrapper.eq("re_url", "/api/user/userLogin"); 45 | queryWrapper.orderBy(true, false, "re_time"); 46 | queryWrapper.last("limit 0, 1000"); // 前1000条 47 | return mapper.selectList(queryWrapper); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/TagServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 5 | import com.gk.study.mapper.TagMapper; 6 | import com.gk.study.entity.Tag; 7 | import com.gk.study.service.TagService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | @Service 14 | public class TagServiceImpl extends ServiceImpl implements TagService { 15 | @Autowired 16 | TagMapper mapper; 17 | 18 | @Override 19 | public List getTagList() { 20 | return mapper.selectList(new QueryWrapper<>()); 21 | } 22 | 23 | @Override 24 | public void createTag(Tag tag) { 25 | System.out.println(tag); 26 | tag.setCreateTime(String.valueOf(System.currentTimeMillis())); 27 | mapper.insert(tag); 28 | } 29 | 30 | @Override 31 | public void deleteTag(String id) { 32 | mapper.deleteById(id); 33 | } 34 | 35 | @Override 36 | public void updateTag(Tag tag) { 37 | mapper.updateById(tag); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/ThingCollectServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 5 | import com.gk.study.mapper.ThingCollectMapper; 6 | import com.gk.study.service.ThingCollectService; 7 | import com.gk.study.entity.ThingCollect; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | @Service 15 | class ThingCollectServiceImpl extends ServiceImpl implements ThingCollectService { 16 | @Autowired 17 | ThingCollectMapper mapper; 18 | 19 | @Override 20 | public List getThingCollectList(String userId) { 21 | return mapper.getThingCollectList(userId); 22 | } 23 | 24 | @Override 25 | public void createThingCollect(ThingCollect thingCollect) { 26 | mapper.insert(thingCollect);; 27 | } 28 | 29 | @Override 30 | public void deleteThingCollect(String id) { 31 | mapper.deleteById(id); 32 | } 33 | 34 | @Override 35 | public ThingCollect getThingCollect(String userId, String thingId) { 36 | QueryWrapper queryWrapper = new QueryWrapper<>(); 37 | queryWrapper.eq("thing_id", thingId) 38 | .eq("user_id", userId); 39 | return mapper.selectOne(queryWrapper); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/service/impl/ThingWishServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 5 | import com.gk.study.mapper.ThingWishMapper; 6 | import com.gk.study.service.ThingWishService; 7 | import com.gk.study.entity.ThingWish; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | @Service 15 | class ThingWishServiceImpl extends ServiceImpl implements ThingWishService { 16 | @Autowired 17 | ThingWishMapper mapper; 18 | 19 | @Override 20 | public List getThingWishList(String userId) { 21 | return mapper.getThingWishList(userId); 22 | } 23 | 24 | @Override 25 | public void createThingWish(ThingWish thingWish) { 26 | mapper.insert(thingWish);; 27 | } 28 | 29 | @Override 30 | public void deleteThingWish(String id) { 31 | mapper.deleteById(id); 32 | } 33 | 34 | @Override 35 | public ThingWish getThingWish(String userId, String thingId) { 36 | QueryWrapper queryWrapper = new QueryWrapper<>(); 37 | queryWrapper.eq("thing_id", thingId) 38 | .eq("user_id", userId); 39 | return mapper.selectOne(queryWrapper); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/utils/HttpContextUtils.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.utils; 2 | 3 | import com.baomidou.mybatisplus.core.toolkit.StringUtils; 4 | import org.springframework.http.HttpHeaders; 5 | import org.springframework.web.context.request.RequestAttributes; 6 | import org.springframework.web.context.request.RequestContextHolder; 7 | import org.springframework.web.context.request.ServletRequestAttributes; 8 | 9 | import javax.servlet.http.HttpServletRequest; 10 | import java.util.Enumeration; 11 | import java.util.HashMap; 12 | import java.util.Map; 13 | 14 | public class HttpContextUtils { 15 | 16 | public static HttpServletRequest getHttpServletRequest() { 17 | RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); 18 | if(requestAttributes == null){ 19 | return null; 20 | } 21 | 22 | return ((ServletRequestAttributes) requestAttributes).getRequest(); 23 | } 24 | 25 | public static Map getParameterMap(HttpServletRequest request) { 26 | Enumeration parameters = request.getParameterNames(); 27 | 28 | Map params = new HashMap<>(); 29 | while (parameters.hasMoreElements()) { 30 | String parameter = parameters.nextElement(); 31 | String value = request.getParameter(parameter); 32 | if (StringUtils.isNotBlank(value)) { 33 | params.put(parameter, value); 34 | } 35 | } 36 | 37 | return params; 38 | } 39 | 40 | public static String getDomain(){ 41 | HttpServletRequest request = getHttpServletRequest(); 42 | StringBuffer url = request.getRequestURL(); 43 | return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString(); 44 | } 45 | 46 | public static String getOrigin(){ 47 | HttpServletRequest request = getHttpServletRequest(); 48 | return request.getHeader(HttpHeaders.ORIGIN); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/utils/IpUtils.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.utils; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.util.StringUtils; 6 | 7 | import javax.servlet.http.HttpServletRequest; 8 | 9 | public class IpUtils { 10 | private static Logger logger = LoggerFactory.getLogger(IpUtils.class); 11 | 12 | /** 13 | * 获取IP地址 14 | * 15 | * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址 16 | * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址 17 | */ 18 | public static String getIpAddr(HttpServletRequest request) { 19 | String unknown = "unknown"; 20 | String ip = null; 21 | try { 22 | ip = request.getHeader("x-forwarded-for"); 23 | if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { 24 | ip = request.getHeader("Proxy-Client-IP"); 25 | } 26 | if (StringUtils.isEmpty(ip) || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) { 27 | ip = request.getHeader("WL-Proxy-Client-IP"); 28 | } 29 | if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { 30 | ip = request.getHeader("HTTP_CLIENT_IP"); 31 | } 32 | if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { 33 | ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 34 | } 35 | if (StringUtils.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { 36 | ip = request.getRemoteAddr(); 37 | } 38 | } catch (Exception e) { 39 | logger.error("IPUtils ERROR ", e); 40 | } 41 | 42 | return ip; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /server/src/main/java/com/gk/study/utils/JsonUtils.java: -------------------------------------------------------------------------------- 1 | package com.gk.study.utils; 2 | 3 | import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; 4 | import com.fasterxml.jackson.core.type.TypeReference; 5 | import com.fasterxml.jackson.databind.ObjectMapper; 6 | import org.springframework.util.StringUtils; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | public class JsonUtils { 12 | private static final ObjectMapper objectMapper = new ObjectMapper(); 13 | 14 | public static String toJsonString(Object object) { 15 | try { 16 | return objectMapper.writeValueAsString(object); 17 | } catch (Exception e) { 18 | throw new RuntimeException(e); 19 | } 20 | } 21 | 22 | public static T parseObject(String text, Class clazz) { 23 | if (StringUtils.isEmpty(text)) { 24 | return null; 25 | } 26 | try { 27 | return objectMapper.readValue(text, clazz); 28 | } catch (Exception e) { 29 | throw new RuntimeException(e); 30 | } 31 | } 32 | 33 | public static T parseObject(byte[] bytes, Class clazz) { 34 | if (bytes == null || bytes.length <= 0) { 35 | return null; 36 | } 37 | try { 38 | return objectMapper.readValue(bytes, clazz); 39 | } catch (Exception e) { 40 | throw new RuntimeException(e); 41 | } 42 | } 43 | 44 | public static T parseObject(String text, TypeReference typeReference) { 45 | try { 46 | return objectMapper.readValue(text, typeReference); 47 | } catch (Exception e) { 48 | throw new RuntimeException(e); 49 | } 50 | } 51 | 52 | public static List parseArray(String text, Class clazz) { 53 | if (StringUtils.isEmpty(text)) { 54 | return new ArrayList<>(); 55 | } 56 | try { 57 | return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); 58 | } catch (Exception e) { 59 | throw new RuntimeException(e); 60 | } 61 | } 62 | 63 | } 64 | 65 | 66 | -------------------------------------------------------------------------------- /server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | 2 | server.port: 9100 3 | server.servlet.context-path: /api 4 | 5 | BASE_LOCATION: D:\projects\java_book 6 | DB_NAME: java_book 7 | 8 | springfox: 9 | documentation: 10 | swagger-ui: 11 | # 生产环境需要关闭 12 | enabled: true 13 | 14 | 15 | 16 | File: 17 | uploadPath: ${BASE_LOCATION}\server\upload 18 | 19 | mybatis: 20 | configuration: 21 | map-underscore-to-camel-case: true 22 | -------------------------------------------------------------------------------- /server/src/main/resources/mapper/BorrowMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 13 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /server/src/main/resources/mapper/CommentMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 13 | 28 | 29 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /server/src/main/resources/mapper/OverviewMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 11 | 12 | 18 | 19 | 29 | 30 | -------------------------------------------------------------------------------- /server/src/main/resources/mapper/ThingCollectMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /server/src/main/resources/mapper/ThingMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /server/src/main/resources/mapper/ThingWishMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /server/src/main/resources/mapper/UserMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /server/start.sh: -------------------------------------------------------------------------------- 1 | title xxxx 2 | java -jar -Xms64m -Xmx128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=64m xxxx.jar 3 | -------------------------------------------------------------------------------- /server/upload/avatar/137b9040-b3a4-4de5-b5f2-8efc9014f28f.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/avatar/137b9040-b3a4-4de5-b5f2-8efc9014f28f.jpeg -------------------------------------------------------------------------------- /server/upload/avatar/4ef360ce-9fb9-4080-bf10-83a6f3c0a3f2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/avatar/4ef360ce-9fb9-4080-bf10-83a6f3c0a3f2.png -------------------------------------------------------------------------------- /server/upload/avatar/b3a4fd2c-cbf4-4fad-8064-c22e09e72676.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/avatar/b3a4fd2c-cbf4-4fad-8064-c22e09e72676.jpeg -------------------------------------------------------------------------------- /server/upload/avatar/ec794bf4-da3c-4c69-ad67-ae17ef3803b1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/avatar/ec794bf4-da3c-4c69-ad67-ae17ef3803b1.jpeg -------------------------------------------------------------------------------- /server/upload/image/02669227-c406-45b5-8656-8d0817aaaf75.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/02669227-c406-45b5-8656-8d0817aaaf75.jpeg -------------------------------------------------------------------------------- /server/upload/image/066794d5-285c-467c-b2dc-de0b2597b758.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/066794d5-285c-467c-b2dc-de0b2597b758.jpeg -------------------------------------------------------------------------------- /server/upload/image/07dfd814-28a7-408a-ba89-368789592361.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/07dfd814-28a7-408a-ba89-368789592361.jpeg -------------------------------------------------------------------------------- /server/upload/image/09c48dc0-9e4b-4304-9798-48e8b659f5ef.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/09c48dc0-9e4b-4304-9798-48e8b659f5ef.jpeg -------------------------------------------------------------------------------- /server/upload/image/1085cacc-bd97-451b-b9f0-a5a3bfa0cd13.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/1085cacc-bd97-451b-b9f0-a5a3bfa0cd13.jpeg -------------------------------------------------------------------------------- /server/upload/image/119c87c5-b59e-4936-9fbc-cd8351470dc1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/119c87c5-b59e-4936-9fbc-cd8351470dc1.jpeg -------------------------------------------------------------------------------- /server/upload/image/1316bb64-a45c-4154-b333-a8cdd74e8c48.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/1316bb64-a45c-4154-b333-a8cdd74e8c48.jpeg -------------------------------------------------------------------------------- /server/upload/image/1693fa26-ea7f-455b-86c6-3d3d73082562.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/1693fa26-ea7f-455b-86c6-3d3d73082562.jpeg -------------------------------------------------------------------------------- /server/upload/image/1c3f9fe6-6680-4da3-a217-0ed37042de81.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/1c3f9fe6-6680-4da3-a217-0ed37042de81.jpeg -------------------------------------------------------------------------------- /server/upload/image/1de697b6-a299-4f0b-9bc0-f26518f2b6fd.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/1de697b6-a299-4f0b-9bc0-f26518f2b6fd.jpeg -------------------------------------------------------------------------------- /server/upload/image/1fbbae3b-887b-45f3-8ef9-a2904edee5b6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/1fbbae3b-887b-45f3-8ef9-a2904edee5b6.jpeg -------------------------------------------------------------------------------- /server/upload/image/2013778b-2460-4d76-ac9c-90ec5e1d7f2f.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/2013778b-2460-4d76-ac9c-90ec5e1d7f2f.jpeg -------------------------------------------------------------------------------- /server/upload/image/266001d1-d4bd-41cb-9a09-8ab94991f35d.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/266001d1-d4bd-41cb-9a09-8ab94991f35d.jpeg -------------------------------------------------------------------------------- /server/upload/image/2baa3f45-61ac-4cf4-a837-48c419621dde.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/2baa3f45-61ac-4cf4-a837-48c419621dde.jpeg -------------------------------------------------------------------------------- /server/upload/image/2c9276dc-b3ee-4328-be6f-a8739eaf3531.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/2c9276dc-b3ee-4328-be6f-a8739eaf3531.jpeg -------------------------------------------------------------------------------- /server/upload/image/31ab2951-96f8-4d8e-adee-5fd6c46a4e5d.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/31ab2951-96f8-4d8e-adee-5fd6c46a4e5d.jpeg -------------------------------------------------------------------------------- /server/upload/image/36509a1c-65a9-4e53-b919-4b592c32a04d.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/36509a1c-65a9-4e53-b919-4b592c32a04d.jpeg -------------------------------------------------------------------------------- /server/upload/image/3a24c6d2-40ab-4bb4-a744-80bf04220e39.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/3a24c6d2-40ab-4bb4-a744-80bf04220e39.jpeg -------------------------------------------------------------------------------- /server/upload/image/3ad74c90-394f-4b1c-b37f-52265925d2d6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/3ad74c90-394f-4b1c-b37f-52265925d2d6.jpeg -------------------------------------------------------------------------------- /server/upload/image/3b456cbf-0fff-44c1-8adc-5e6261a6b25f.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/3b456cbf-0fff-44c1-8adc-5e6261a6b25f.jpeg -------------------------------------------------------------------------------- /server/upload/image/3c4b2947-aa34-4e69-8f3c-904e01a6791a.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/3c4b2947-aa34-4e69-8f3c-904e01a6791a.jpeg -------------------------------------------------------------------------------- /server/upload/image/3d01f74c-20b3-47f5-8fa9-740c7cddbf07.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/3d01f74c-20b3-47f5-8fa9-740c7cddbf07.jpeg -------------------------------------------------------------------------------- /server/upload/image/3d5c44b6-de8b-42ac-8a15-910ec593c72a.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/3d5c44b6-de8b-42ac-8a15-910ec593c72a.jpeg -------------------------------------------------------------------------------- /server/upload/image/3dc65bc1-32e6-42f5-a426-1cdf0b5b12d2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/3dc65bc1-32e6-42f5-a426-1cdf0b5b12d2.jpeg -------------------------------------------------------------------------------- /server/upload/image/3e96dae1-8f41-4d70-9de0-c9e4c529d81b.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/3e96dae1-8f41-4d70-9de0-c9e4c529d81b.jpeg -------------------------------------------------------------------------------- /server/upload/image/3f75945f-46c2-4bb7-9d16-3f89dda111bf.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/3f75945f-46c2-4bb7-9d16-3f89dda111bf.jpeg -------------------------------------------------------------------------------- /server/upload/image/45fa2ea1-c066-4770-a6d7-57b9846005d9.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/45fa2ea1-c066-4770-a6d7-57b9846005d9.jpeg -------------------------------------------------------------------------------- /server/upload/image/4a5c51b4-f837-40c5-9925-fdb63d494533.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/4a5c51b4-f837-40c5-9925-fdb63d494533.jpeg -------------------------------------------------------------------------------- /server/upload/image/4aa269a6-4c83-4263-a6cb-740ad108bcd1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/4aa269a6-4c83-4263-a6cb-740ad108bcd1.jpeg -------------------------------------------------------------------------------- /server/upload/image/4be29101-fd0d-46b9-9bff-ea375fe4a1da.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/4be29101-fd0d-46b9-9bff-ea375fe4a1da.jpeg -------------------------------------------------------------------------------- /server/upload/image/4e5065a6-4dbd-4c20-97b6-92f1e4192647.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/4e5065a6-4dbd-4c20-97b6-92f1e4192647.jpeg -------------------------------------------------------------------------------- /server/upload/image/4ec354f7-8651-4919-b878-342896444193.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/4ec354f7-8651-4919-b878-342896444193.jpeg -------------------------------------------------------------------------------- /server/upload/image/4fdc13c2-1f8c-499b-ac75-c6fa18f54205.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/4fdc13c2-1f8c-499b-ac75-c6fa18f54205.png -------------------------------------------------------------------------------- /server/upload/image/50b04075-6b81-46a9-90da-4d5af215265b.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/50b04075-6b81-46a9-90da-4d5af215265b.jpeg -------------------------------------------------------------------------------- /server/upload/image/55c42013-b94e-44c6-b839-81471cc04dcb.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/55c42013-b94e-44c6-b839-81471cc04dcb.jpeg -------------------------------------------------------------------------------- /server/upload/image/58cd7cef-c4c6-4dd4-8d25-fc8d3e0af8ad.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/58cd7cef-c4c6-4dd4-8d25-fc8d3e0af8ad.jpeg -------------------------------------------------------------------------------- /server/upload/image/5a7fc4c7-4327-4e69-9e5e-82182d19bc03.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/5a7fc4c7-4327-4e69-9e5e-82182d19bc03.jpeg -------------------------------------------------------------------------------- /server/upload/image/5f299ffb-c2f8-4ade-980e-cba7d4938519.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/5f299ffb-c2f8-4ade-980e-cba7d4938519.png -------------------------------------------------------------------------------- /server/upload/image/63538afc-533a-44b1-8e00-7466e0c528ae.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/63538afc-533a-44b1-8e00-7466e0c528ae.jpeg -------------------------------------------------------------------------------- /server/upload/image/63e916d9-75c2-4398-bd10-0a578c13031a.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/63e916d9-75c2-4398-bd10-0a578c13031a.jpeg -------------------------------------------------------------------------------- /server/upload/image/64c66b8f-b82e-4c7a-b714-9adc32cd5ff6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/64c66b8f-b82e-4c7a-b714-9adc32cd5ff6.jpeg -------------------------------------------------------------------------------- /server/upload/image/701d29e3-8c39-46c3-95ae-264c87ee13d2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/701d29e3-8c39-46c3-95ae-264c87ee13d2.jpeg -------------------------------------------------------------------------------- /server/upload/image/70e77e0a-019a-44b3-ac28-8399ef030728.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/70e77e0a-019a-44b3-ac28-8399ef030728.jpeg -------------------------------------------------------------------------------- /server/upload/image/7859b029-5bc2-4ece-8546-4408ce8d69bb.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/7859b029-5bc2-4ece-8546-4408ce8d69bb.jpeg -------------------------------------------------------------------------------- /server/upload/image/791e2e6a-6db9-4d54-9f92-cbb9c91c57d9.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/791e2e6a-6db9-4d54-9f92-cbb9c91c57d9.jpeg -------------------------------------------------------------------------------- /server/upload/image/7b730c2e-be16-4914-a754-4ecbafc4cfce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/7b730c2e-be16-4914-a754-4ecbafc4cfce.png -------------------------------------------------------------------------------- /server/upload/image/7c37dbd8-956a-43d8-a476-0fe7f0b36e95.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/7c37dbd8-956a-43d8-a476-0fe7f0b36e95.jpeg -------------------------------------------------------------------------------- /server/upload/image/7da385db-6603-4e08-ad6b-2de775dfab68.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/7da385db-6603-4e08-ad6b-2de775dfab68.jpeg -------------------------------------------------------------------------------- /server/upload/image/7fc5f045-ac08-4be1-b88a-f07545a0e45c.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/7fc5f045-ac08-4be1-b88a-f07545a0e45c.jpeg -------------------------------------------------------------------------------- /server/upload/image/8164fc3b-f47b-4b0e-ba26-50602d4ef276.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/8164fc3b-f47b-4b0e-ba26-50602d4ef276.png -------------------------------------------------------------------------------- /server/upload/image/839fb8e2-636e-47bb-a39f-7c6d326de88f.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/839fb8e2-636e-47bb-a39f-7c6d326de88f.jpeg -------------------------------------------------------------------------------- /server/upload/image/88f76aa8-b9dd-4831-b772-e5466e877da9.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/88f76aa8-b9dd-4831-b772-e5466e877da9.jpeg -------------------------------------------------------------------------------- /server/upload/image/8e50750e-cada-47ff-8fcc-9b531d67e780.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/8e50750e-cada-47ff-8fcc-9b531d67e780.jpeg -------------------------------------------------------------------------------- /server/upload/image/9058201e-d821-4afd-b979-0553cf1fdd68.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/9058201e-d821-4afd-b979-0553cf1fdd68.jpeg -------------------------------------------------------------------------------- /server/upload/image/92b6a1c4-f786-441b-a285-ad8262db560f.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/92b6a1c4-f786-441b-a285-ad8262db560f.jpeg -------------------------------------------------------------------------------- /server/upload/image/94c9900c-1922-4616-9d9f-46917eb177ef.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/94c9900c-1922-4616-9d9f-46917eb177ef.jpeg -------------------------------------------------------------------------------- /server/upload/image/98be90a3-8c89-436c-a24b-c16ac3c379df.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/98be90a3-8c89-436c-a24b-c16ac3c379df.jpeg -------------------------------------------------------------------------------- /server/upload/image/9a6c7d68-6856-424d-897c-804bdca2f4a5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/9a6c7d68-6856-424d-897c-804bdca2f4a5.jpeg -------------------------------------------------------------------------------- /server/upload/image/9da218e9-becd-4b16-aedf-82fc46b6b2ce.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/9da218e9-becd-4b16-aedf-82fc46b6b2ce.jpeg -------------------------------------------------------------------------------- /server/upload/image/9f576635-f270-4e3a-92ec-741692d80cb7.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/9f576635-f270-4e3a-92ec-741692d80cb7.jpeg -------------------------------------------------------------------------------- /server/upload/image/a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/a.png -------------------------------------------------------------------------------- /server/upload/image/a281dfe1-3c78-4522-b38e-c53de2ff22c9.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/a281dfe1-3c78-4522-b38e-c53de2ff22c9.jpeg -------------------------------------------------------------------------------- /server/upload/image/a2e19f07-c866-4b93-b429-2e8a6937afd1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/a2e19f07-c866-4b93-b429-2e8a6937afd1.png -------------------------------------------------------------------------------- /server/upload/image/af235af7-f71f-416a-9e38-68c3ad26ad20.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/af235af7-f71f-416a-9e38-68c3ad26ad20.jpeg -------------------------------------------------------------------------------- /server/upload/image/af4777cd-2f23-4c05-9fdd-bd07274f008b.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/af4777cd-2f23-4c05-9fdd-bd07274f008b.jpeg -------------------------------------------------------------------------------- /server/upload/image/b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/b.png -------------------------------------------------------------------------------- /server/upload/image/b395ea5c-e5a9-4a56-9b5e-f1736078e722.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/b395ea5c-e5a9-4a56-9b5e-f1736078e722.jpeg -------------------------------------------------------------------------------- /server/upload/image/b5de8200-ff15-4574-8e38-7642fe952f77.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/b5de8200-ff15-4574-8e38-7642fe952f77.jpeg -------------------------------------------------------------------------------- /server/upload/image/b6dbbb0e-262f-4267-83ef-bf527d0c8aa0.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/b6dbbb0e-262f-4267-83ef-bf527d0c8aa0.jpeg -------------------------------------------------------------------------------- /server/upload/image/b7c5ee92-17f1-4040-bed8-6f61f3f5930d.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/b7c5ee92-17f1-4040-bed8-6f61f3f5930d.jpeg -------------------------------------------------------------------------------- /server/upload/image/b86fc2cd-f135-419d-8039-600d10cf674f.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/b86fc2cd-f135-419d-8039-600d10cf674f.jpeg -------------------------------------------------------------------------------- /server/upload/image/b88780a0-5b8e-4a6c-b238-8562ad7c8375.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/b88780a0-5b8e-4a6c-b238-8562ad7c8375.jpeg -------------------------------------------------------------------------------- /server/upload/image/b988bb82-552b-4ae9-acfb-b6eff78e221f.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/b988bb82-552b-4ae9-acfb-b6eff78e221f.jpeg -------------------------------------------------------------------------------- /server/upload/image/ca174798-a1fe-4e1a-ab03-8d80d74ad0d4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/ca174798-a1fe-4e1a-ab03-8d80d74ad0d4.jpeg -------------------------------------------------------------------------------- /server/upload/image/cad0f753-04da-4ebd-aeed-d2ce83cf0b9c.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/cad0f753-04da-4ebd-aeed-d2ce83cf0b9c.jpeg -------------------------------------------------------------------------------- /server/upload/image/d139c44e-d24a-47ac-9f8b-72807b5a3849.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/d139c44e-d24a-47ac-9f8b-72807b5a3849.jpeg -------------------------------------------------------------------------------- /server/upload/image/debc41a3-20b8-4e01-b17d-fca1a7820574.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/debc41a3-20b8-4e01-b17d-fca1a7820574.jpeg -------------------------------------------------------------------------------- /server/upload/image/dfbbcffe-362e-42d0-bcdd-063f5b307553.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/dfbbcffe-362e-42d0-bcdd-063f5b307553.jpeg -------------------------------------------------------------------------------- /server/upload/image/e1d4e3a4-06e7-4d96-b60d-71cb8db4b019.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/e1d4e3a4-06e7-4d96-b60d-71cb8db4b019.jpeg -------------------------------------------------------------------------------- /server/upload/image/e98af765-4b0f-4f4b-8e8a-f232133ab100.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/e98af765-4b0f-4f4b-8e8a-f232133ab100.jpeg -------------------------------------------------------------------------------- /server/upload/image/e9bbf322-28a9-4b87-83da-f1028971ac72.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/e9bbf322-28a9-4b87-83da-f1028971ac72.jpeg -------------------------------------------------------------------------------- /server/upload/image/e9c140a4-e077-4750-8e3d-9db540a150d0.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/e9c140a4-e077-4750-8e3d-9db540a150d0.jpeg -------------------------------------------------------------------------------- /server/upload/image/ea71ad95-7da2-41c0-9e49-ea2b96f81e53.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/ea71ad95-7da2-41c0-9e49-ea2b96f81e53.jpeg -------------------------------------------------------------------------------- /server/upload/image/eb71dae5-b84d-4b9a-8e36-5b2adf25c4e2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/eb71dae5-b84d-4b9a-8e36-5b2adf25c4e2.png -------------------------------------------------------------------------------- /server/upload/image/ed17adc0-d18a-4ea4-9447-7817fc2a4168.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/ed17adc0-d18a-4ea4-9447-7817fc2a4168.jpeg -------------------------------------------------------------------------------- /server/upload/image/ed6410b5-16ea-4f90-b853-c4d6e48a8548.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/ed6410b5-16ea-4f90-b853-c4d6e48a8548.jpeg -------------------------------------------------------------------------------- /server/upload/image/edff6448-f92e-4f92-a475-1556ca7a7615.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/edff6448-f92e-4f92-a475-1556ca7a7615.jpeg -------------------------------------------------------------------------------- /server/upload/image/f08190e5-502e-476c-a4f9-f7eac0be937b.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/f08190e5-502e-476c-a4f9-f7eac0be937b.jpeg -------------------------------------------------------------------------------- /server/upload/image/f3c07fdd-dada-4eda-ac8a-91c583fd0a85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/f3c07fdd-dada-4eda-ac8a-91c583fd0a85.png -------------------------------------------------------------------------------- /server/upload/image/f480ca9b-abc5-4bbf-8a69-e872fc842679.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/f480ca9b-abc5-4bbf-8a69-e872fc842679.jpeg -------------------------------------------------------------------------------- /server/upload/image/f6b8099e-9c89-4795-b3fc-ee128b5b637c.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/f6b8099e-9c89-4795-b3fc-ee128b5b637c.jpeg -------------------------------------------------------------------------------- /server/upload/image/f77de97e-b79d-48b7-b6e5-6567df26585f.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/f77de97e-b79d-48b7-b6e5-6567df26585f.jpeg -------------------------------------------------------------------------------- /server/upload/image/f79c3ceb-9690-4be8-b188-ff91933bffab.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/f79c3ceb-9690-4be8-b188-ff91933bffab.jpeg -------------------------------------------------------------------------------- /server/upload/image/f7f12f87-7a98-4175-a900-45f4f84f758c.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/f7f12f87-7a98-4175-a900-45f4f84f758c.jpeg -------------------------------------------------------------------------------- /server/upload/image/f7f8a920-5a79-480e-9288-d3caf83df406.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/f7f8a920-5a79-480e-9288-d3caf83df406.jpeg -------------------------------------------------------------------------------- /server/upload/image/fb209198-480a-4e4c-a665-56efa58c1942.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/fb209198-480a-4e4c-a665-56efa58c1942.jpeg -------------------------------------------------------------------------------- /server/upload/image/fe1245c5-0d59-4d50-90d6-ca680267027e.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/server/upload/image/fe1245c5-0d59-4d50-90d6-ca680267027e.jpeg -------------------------------------------------------------------------------- /web/.eslintignore: -------------------------------------------------------------------------------- 1 | 2 | *.sh 3 | node_modules 4 | *.md 5 | *.woff 6 | *.ttf 7 | .vscode 8 | .idea 9 | dist 10 | /public 11 | /docs 12 | .husky 13 | .local 14 | /bin 15 | Dockerfile 16 | -------------------------------------------------------------------------------- /web/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | node: true, 6 | es6: true, 7 | }, 8 | parser: 'vue-eslint-parser', 9 | parserOptions: { 10 | parser: '@typescript-eslint/parser', 11 | ecmaVersion: 2020, 12 | sourceType: 'module', 13 | jsxPragma: 'React', 14 | ecmaFeatures: { 15 | jsx: true, 16 | }, 17 | }, 18 | extends: ['plugin:vue/vue3-recommended'], 19 | rules: { 20 | "semi": 'off', 21 | 'vue/script-setup-uses-vars': 'error', 22 | '@typescript-eslint/ban-ts-ignore': 'off', 23 | '@typescript-eslint/explicit-function-return-type': 'off', 24 | '@typescript-eslint/no-explicit-any': 'off', 25 | '@typescript-eslint/no-var-requires': 'off', 26 | '@typescript-eslint/no-empty-function': 'off', 27 | 'vue/custom-event-name-casing': 'off', 28 | 'no-use-before-define': 'off', 29 | '@typescript-eslint/no-use-before-define': 'off', 30 | '@typescript-eslint/ban-ts-comment': 'off', 31 | '@typescript-eslint/ban-types': 'off', 32 | '@typescript-eslint/no-non-null-assertion': 'off', 33 | '@typescript-eslint/explicit-module-boundary-types': 'off', 34 | '@typescript-eslint/no-unused-vars': 'off', 35 | 'no-unused-vars': 'off', 36 | 'space-before-function-paren': 'off', 37 | 38 | 'vue/attributes-order': 'off', 39 | 'vue/one-component-per-file': 'off', 40 | 'vue/html-closing-bracket-newline': 'off', 41 | 'vue/max-attributes-per-line': 'off', 42 | 'vue/multiline-html-element-content-newline': 'off', 43 | 'vue/singleline-html-element-content-newline': 'off', 44 | 'vue/attribute-hyphenation': 'off', 45 | 'vue/require-default-prop': 'off', 46 | 'vue/require-explicit-emits': 'off', 47 | 'vue/html-self-closing': [ 48 | 'error', 49 | { 50 | html: { 51 | void: 'always', 52 | normal: 'never', 53 | component: 'always', 54 | }, 55 | svg: 'always', 56 | math: 'always', 57 | }, 58 | ], 59 | 'vue/multi-word-component-names': 'off', 60 | }, 61 | }; 62 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | .local 6 | .history 7 | # local env files 8 | .env.local 9 | .env.*.local 10 | .eslintcache 11 | .github 12 | .husky 13 | .vscode 14 | 15 | # Log files 16 | npm-debug.log* 17 | yarn-debug.log* 18 | yarn-error.log* 19 | pnpm-debug.log* 20 | pnpm-lock.yaml* 21 | 22 | # Editor directories and files 23 | .idea 24 | # .vscode 25 | *.suo 26 | *.ntvs* 27 | *.njsproj 28 | *.sln 29 | *.sw? 30 | ./packages 31 | ./history 32 | -------------------------------------------------------------------------------- /web/.stylelintignore: -------------------------------------------------------------------------------- 1 | /dist/* 2 | /public/* 3 | public/* 4 | -------------------------------------------------------------------------------- /web/README.md: -------------------------------------------------------------------------------- 1 | ### 学习文档 2 | > 学习过程中,遇到问题可以咨询作者:lengqin1024(微信) 3 | 4 | 5 | #### 部署步骤 6 | 7 | 1. 修改constants.ts中的BASE_URL 8 | 2. vite build 9 | 3. 将dist部署到nginx 10 | 11 | 12 | #### 配置解释 13 | 14 | 1. env.development 开发环境配置 15 | 2. eslintrc.js 代码规范化提示 16 | 3. vite.config.js vite 开发服务器配置 17 | 18 | #### 常见问题 19 | 20 | ##### 变量 21 | https://blog.csdn.net/qq_41636947/article/details/117907448 22 | 23 | ##### antd的css引入方式 24 | 在index.html里面引入的cdn 25 | 26 | ##### cdn 27 | https://cdn.jsdelivr.net/npm/ant-design-vue@3.2.20/dist/ 28 | https://cdn.staticfile.org/ant-design-vue/3.2.20/antd.min.css 29 | 30 | #### public文件夹内容在build后会自动打到dist中 31 | -------------------------------------------------------------------------------- /web/build/constant.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name Config 3 | * @description 项目配置 4 | */ 5 | 6 | 7 | // 本地服务端口 8 | export const VITE_PORT = 3000; 9 | 10 | // 包依赖分析 11 | export const ANALYSIS = true; 12 | 13 | // 代码压缩 14 | export const COMPRESSION = true; 15 | 16 | -------------------------------------------------------------------------------- /web/build/vite/plugins/autoImport.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name AutoImportDeps 3 | * @description 按需加载,自动引入 4 | */ 5 | import AutoImport from 'unplugin-auto-import/vite'; 6 | // import { AntDesignVueResolver} from 'unplugin-vue-components/resolvers'; 7 | 8 | export const AutoImportDeps = () => { 9 | return AutoImport({ 10 | dts: 'types/auto-imports.d.ts', 11 | imports: [ 12 | 'vue', 13 | 'pinia', 14 | 'vue-router', 15 | { 16 | '@vueuse/core': [], 17 | }, 18 | { 19 | 'naive-ui': ['useDialog', 'useMessage', 'useNotification', 'useLoadingBar'], 20 | }, 21 | ], 22 | resolvers: [ 23 | // AntDesignVueResolver(), 24 | ], 25 | }); 26 | }; 27 | -------------------------------------------------------------------------------- /web/build/vite/plugins/component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name AutoRegistryComponents 3 | * @description 按需加载,自动引入组件 4 | */ 5 | import Components from 'unplugin-vue-components/vite'; 6 | import { 7 | ElementPlusResolver, 8 | VueUseComponentsResolver, 9 | AntDesignVueResolver, 10 | TDesignResolver, 11 | NaiveUiResolver, 12 | } from 'unplugin-vue-components/resolvers'; 13 | export const AutoRegistryComponents = () => { 14 | return Components({ 15 | dirs: ['src/components'], 16 | extensions: ['vue'], 17 | deep: true, 18 | dts: 'types/components.d.ts', 19 | directoryAsNamespace: false, 20 | globalNamespaces: [], 21 | directives: true, 22 | importPathTransform: (v) => v, 23 | allowOverrides: false, 24 | include: [/\.vue$/, /\.vue\?vue/], 25 | exclude: [/[\\/]node_modules[\\/]/, /[\\/]\.git[\\/]/, /[\\/]\.nuxt[\\/]/], 26 | resolvers: [ 27 | ElementPlusResolver(), 28 | VueUseComponentsResolver(), 29 | AntDesignVueResolver(), 30 | TDesignResolver({ 31 | library: 'vue-next', 32 | }), 33 | NaiveUiResolver(), 34 | ], 35 | }); 36 | }; 37 | -------------------------------------------------------------------------------- /web/build/vite/plugins/compress.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name ConfigCompressPlugin 3 | * @description 开启.gz压缩 4 | */ 5 | import viteCompression from 'vite-plugin-compression'; 6 | import { COMPRESSION } from '../../constant'; 7 | 8 | export const ConfigCompressPlugin = () => { 9 | if (COMPRESSION) { 10 | return viteCompression({ 11 | verbose: true, // 默认即可 12 | disable: false, //开启压缩(不禁用),默认即可 13 | deleteOriginFile: false, //删除源文件 14 | threshold: 10240, //压缩前最小文件大小 15 | algorithm: 'gzip', //压缩算法 16 | ext: '.gz', //文件类型 17 | }); 18 | } 19 | return []; 20 | }; 21 | -------------------------------------------------------------------------------- /web/build/vite/plugins/imagemin.ts: -------------------------------------------------------------------------------- 1 | import viteImagemin from 'vite-plugin-imagemin'; 2 | 3 | export function ConfigImageminPlugin() { 4 | const plugin = viteImagemin({ 5 | gifsicle: { 6 | optimizationLevel: 7, 7 | interlaced: false, 8 | }, 9 | mozjpeg: { 10 | quality: 20, 11 | }, 12 | optipng: { 13 | optimizationLevel: 7, 14 | }, 15 | pngquant: { 16 | quality: [0.8, 0.9], 17 | speed: 4, 18 | }, 19 | svgo: { 20 | plugins: [ 21 | { 22 | name: 'removeViewBox', 23 | }, 24 | { 25 | name: 'removeEmptyAttrs', 26 | active: false, 27 | }, 28 | ], 29 | }, 30 | }); 31 | return plugin; 32 | } 33 | -------------------------------------------------------------------------------- /web/build/vite/plugins/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name createVitePlugins 3 | * @description 封装plugins数组统一调用 4 | */ 5 | import {PluginOption} from 'vite'; 6 | import vue from '@vitejs/plugin-vue'; 7 | import vueJsx from '@vitejs/plugin-vue-jsx'; 8 | import {AutoImportDeps} from './autoImport'; 9 | import {ConfigCompressPlugin} from './compress'; 10 | import {ConfigRestartPlugin} from './restart'; 11 | import {ConfigProgressPlugin} from './progress'; 12 | import {ConfigVisualizerConfig} from "./visualizer"; 13 | 14 | export function createVitePlugins(isBuild: boolean) { 15 | const vitePlugins = [ 16 | // vue支持 17 | vue(), 18 | // JSX支持 19 | vueJsx(), 20 | // setup语法糖组件名支持 21 | // vueSetupExtend(), 22 | // 提供https证书 23 | // VitePluginCertificate({ 24 | // source: 'coding', 25 | // }) as PluginOption, 26 | ]; 27 | 28 | // 自动按需引入组件 29 | // vitePlugins.push(AutoRegistryComponents()); 30 | 31 | // 自动按需引入依赖 32 | vitePlugins.push(AutoImportDeps()); 33 | 34 | // 自动生成路由 35 | // vitePlugins.push(ConfigPagesPlugin()); 36 | 37 | // 开启.gz压缩 rollup-plugin-gzip 38 | vitePlugins.push(ConfigCompressPlugin()); 39 | 40 | // 监听配置文件改动重启 41 | vitePlugins.push(ConfigRestartPlugin()); 42 | 43 | // 构建时显示进度条 44 | vitePlugins.push(ConfigProgressPlugin()); 45 | 46 | // 构建时显示进度条 47 | vitePlugins.push(ConfigVisualizerConfig()); 48 | 49 | 50 | return vitePlugins; 51 | } 52 | -------------------------------------------------------------------------------- /web/build/vite/plugins/progress.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name ConfigProgressPlugin 3 | * @description 构建显示进度条 4 | */ 5 | 6 | import progress from 'vite-plugin-progress'; 7 | export const ConfigProgressPlugin = () => { 8 | return progress(); 9 | }; 10 | -------------------------------------------------------------------------------- /web/build/vite/plugins/restart.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name ConfigRestartPlugin 3 | * @description 监听配置文件修改自动重启Vite 4 | */ 5 | import ViteRestart from 'vite-plugin-restart'; 6 | export const ConfigRestartPlugin = () => { 7 | return ViteRestart({ 8 | restart: ['*.config.[jt]s', '**/config/*.[jt]s'], 9 | }); 10 | }; 11 | -------------------------------------------------------------------------------- /web/build/vite/plugins/unocss.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name ConfigUnocssPlugin 3 | * @description 监听配置文件修改自动重启Vite 4 | */ 5 | 6 | // Unocss 7 | import Unocss from 'unocss/vite'; 8 | 9 | export const ConfigUnocssPlugin = () => { 10 | return Unocss(); 11 | }; 12 | -------------------------------------------------------------------------------- /web/build/vite/plugins/visualizer.ts: -------------------------------------------------------------------------------- 1 | import visualizer from 'rollup-plugin-visualizer'; 2 | import { ANALYSIS } from '../../constant'; 3 | 4 | export function ConfigVisualizerConfig() { 5 | if (ANALYSIS) { 6 | return visualizer({ 7 | filename: 'dist/report.html', 8 | open: true, 9 | gzipSize: true, 10 | emitFile: false 11 | }); 12 | } 13 | return []; 14 | } 15 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | java图书借阅平台 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-web-app", 3 | "version": "0.1.2", 4 | "author": "lengqin1024", 5 | "scripts": { 6 | "dev": "vite --mode development", 7 | "build": "vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "@ant-design/icons-vue": "^6.1.0", 12 | "@vueuse/components": "^9.10.0", 13 | "@vueuse/core": "^9.10.0", 14 | "ant-design-vue": "^3.2.20", 15 | "axios": "^1.2.2", 16 | "pinia": "^2.0.28", 17 | "pinia-plugin-persistedstate": "^3.0.2", 18 | "qs": "^6.11.0", 19 | "vue": "^3.2.45", 20 | "vue-router": "^4.1.6" 21 | }, 22 | "devDependencies": { 23 | "@types/qs": "^6.9.7", 24 | "@typescript-eslint/eslint-plugin": "^5.48.0", 25 | "@typescript-eslint/parser": "^5.48.0", 26 | "@vitejs/plugin-vue": "^4.0.0", 27 | "@vitejs/plugin-vue-jsx": "^3.0.0", 28 | "autoprefixer": "^10.4.13", 29 | "eslint": "8.22.0", 30 | "eslint-config-prettier": "^8.6.0", 31 | "eslint-define-config": "^1.13.0", 32 | "eslint-plugin-prettier": "^4.2.1", 33 | "eslint-plugin-vue": "^9.8.0", 34 | "less": "^4.1.3", 35 | "less-loader": "^11.1.0", 36 | "postcss": "^8.4.21", 37 | "postcss-html": "^1.5.0", 38 | "postcss-less": "^6.0.0", 39 | "prettier": "^2.8.3", 40 | "rollup-plugin-visualizer": "^5.9.0", 41 | "stylelint": "^14.16.1", 42 | "stylelint-config-standard": "^29.0.0", 43 | "stylelint-order": "^6.0.1", 44 | "typescript": "4.9.4", 45 | "unplugin-auto-import": "^0.12.2", 46 | "vite": "^4.0.3", 47 | "vite-plugin-compression": "^0.5.1", 48 | "vite-plugin-progress": "^0.0.6", 49 | "vite-plugin-restart": "^0.3.1" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /web/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /web/prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | printWidth: 140, 3 | semi: false, 4 | vueIndentScriptAndStyle: true, 5 | singleQuote: true, 6 | trailingComma: 'all', 7 | proseWrap: 'never', 8 | htmlWhitespaceSensitivity: 'strict', 9 | endOfLine: 'auto', 10 | }; 11 | -------------------------------------------------------------------------------- /web/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/public/favicon.ico -------------------------------------------------------------------------------- /web/public/images/admin-login-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/public/images/admin-login-bg.jpg -------------------------------------------------------------------------------- /web/public/images/bg2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/public/images/bg2.jpg -------------------------------------------------------------------------------- /web/public/images/demo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/public/images/demo.jpg -------------------------------------------------------------------------------- /web/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | 19 | -------------------------------------------------------------------------------- /web/src/api/ad.ts: -------------------------------------------------------------------------------- 1 | import {get, post} from '/@/utils/http/axios'; 2 | 3 | enum URL { 4 | userList = '/api/ad/list', 5 | create = '/api/ad/create', 6 | update = '/api/ad/update', 7 | delete = '/api/ad/delete', 8 | } 9 | 10 | const listApi = async (params: any) => 11 | get({url: URL.userList, params: params, data: {}, headers: {}}); 12 | const createApi = async (data: any) => 13 | post({ 14 | url: URL.create, 15 | params: {}, 16 | data: data, 17 | headers: {'Content-Type': 'multipart/form-data;charset=utf-8'} 18 | }); 19 | const updateApi = async (data: any) => 20 | post({ 21 | url: URL.update, 22 | data: data, 23 | headers: {'Content-Type': 'multipart/form-data;charset=utf-8'} 24 | }); 25 | const deleteApi = async (params: any) => 26 | post({url: URL.delete, params: params, headers: {}}); 27 | 28 | export {listApi, createApi, updateApi, deleteApi}; 29 | -------------------------------------------------------------------------------- /web/src/api/address.ts: -------------------------------------------------------------------------------- 1 | import {get, post} from '/@/utils/http/axios'; 2 | 3 | enum URL { 4 | userList = '/api/address/list', 5 | create = '/api/address/create', 6 | update = '/api/address/update', 7 | delete = '/api/address/delete', 8 | } 9 | 10 | const listApi = async (params: any) => 11 | get({url: URL.userList, params: params, data: {}, headers: {}}); 12 | const createApi = async (data: any) => 13 | post({ 14 | url: URL.create, 15 | params: {}, 16 | data: data, 17 | headers: {'Content-Type': 'multipart/form-data;charset=utf-8'} 18 | }); 19 | const updateApi = async (data: any) => 20 | post({ 21 | url: URL.update, 22 | data: data, 23 | headers: {'Content-Type': 'multipart/form-data;charset=utf-8'} 24 | }); 25 | const deleteApi = async (params: any) => 26 | post({url: URL.delete, params: params, headers: {}}); 27 | 28 | export {listApi, createApi, updateApi, deleteApi}; 29 | -------------------------------------------------------------------------------- /web/src/api/borrow.ts: -------------------------------------------------------------------------------- 1 | // 权限问题后期增加 2 | import { get, post } from '/@/utils/http/axios'; 3 | import { UserState } from '/@/store/modules/user/types'; 4 | // import axios from 'axios'; 5 | enum URL { 6 | list = '/api/borrow/list', 7 | userList = '/api/borrow/userBorrowList', 8 | returnBorrow = '/api/borrow/returnBorrow', 9 | returnUserBorrow = '/api/borrow/returnUserBorrow', 10 | delayBorrow = '/api/borrow/delayBorrow', 11 | delayUserBorrow = '/api/borrow/delayUserBorrow', 12 | create = '/api/borrow/create', 13 | } 14 | 15 | const listApi = async (params: any) => get({ url: URL.list, params: params, data: {}, headers: {} }); 16 | const userBorrowListApi = async (params: any) => get({ url: URL.userList, params: params, data: {}, headers: {} }); 17 | const createApi = async (data: any) => 18 | post({ url: URL.create, params: {}, data: data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 19 | const returnBorrowApi = async (params: any) => 20 | post({ url: URL.returnBorrow, params: params, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 21 | const returnUserBorrowApi = async (params: any) => 22 | post({ url: URL.returnUserBorrow, params: params, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 23 | const delayBorrowApi = async (params: any) => 24 | post({ url: URL.delayBorrow, params: params, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 25 | const delayUserBorrowApi = async (params: any) => 26 | post({ url: URL.delayUserBorrow, params: params, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 27 | 28 | 29 | export { listApi, userBorrowListApi, createApi, returnBorrowApi, returnUserBorrowApi, delayBorrowApi, delayUserBorrowApi }; 30 | -------------------------------------------------------------------------------- /web/src/api/classification.ts: -------------------------------------------------------------------------------- 1 | import { get, post } from '/@/utils/http/axios'; 2 | enum URL { 3 | userList = '/api/classification/list', 4 | create = '/api/classification/create', 5 | update = '/api/classification/update', 6 | delete = '/api/classification/delete', 7 | } 8 | 9 | const listApi = async (params: any) => get({ url: URL.userList, params: params, data: {}, headers: {} }); 10 | const createApi = async (data: any) => 11 | post({ url: URL.create, params: {}, data: data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 12 | const updateApi = async (params: any, data: any) => 13 | post({ url: URL.update, params: params, data: data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 14 | const deleteApi = async (params: any) => post({ url: URL.delete, params: params, headers: {} }); 15 | 16 | export { listApi, createApi, updateApi, deleteApi }; 17 | -------------------------------------------------------------------------------- /web/src/api/comment.ts: -------------------------------------------------------------------------------- 1 | import {get, post} from '/@/utils/http/axios'; 2 | 3 | enum URL { 4 | list = '/api/comment/list', 5 | create = '/api/comment/create', 6 | delete = '/api/comment/delete', 7 | listThingComments = '/api/comment/listThingComments', 8 | listUserComments = '/api/comment/listUserComments', 9 | like = '/api/comment/like' 10 | } 11 | 12 | const listApi = async (params: any) => get({url: URL.list, params: params, data: {}, headers: {}}); 13 | const createApi = async (data: any) => post({ 14 | url: URL.create, 15 | params: {}, 16 | data: data, 17 | headers: {'Content-Type': 'multipart/form-data;charset=utf-8'} 18 | }); 19 | const deleteApi = async (params: any) => post({url: URL.delete, params: params, headers: {}}); 20 | const listThingCommentsApi = async (params: any) => get({url: URL.listThingComments, params: params, data: {}, headers: {}}); 21 | const listUserCommentsApi = async (params: any) => get({url: URL.listUserComments, params: params, data: {}, headers: {}}); 22 | const likeApi = async (params: any) => post({url: URL.like, params: params, headers: {}}); 23 | 24 | export {listApi, createApi, deleteApi, listThingCommentsApi, listUserCommentsApi, likeApi}; 25 | -------------------------------------------------------------------------------- /web/src/api/log.ts: -------------------------------------------------------------------------------- 1 | import {get, post} from '/@/utils/http/axios'; 2 | 3 | enum URL { 4 | loginLogList = '/api/opLog/loginLogList', 5 | opLogList = '/api/opLog/list', 6 | errorLogList = '/api/errorLog/list', 7 | } 8 | 9 | const listLoginLogApi = async (params: any) => 10 | get({url: URL.loginLogList, params: params, data: {}, headers: {}}); 11 | const listOpLogListApi = async (params: any) => 12 | get({url: URL.opLogList, params: params, data: {}, headers: {}}); 13 | const listErrorLogListApi = async (params: any) => 14 | get({url: URL.errorLogList, params: params, data: {}, headers: {}}); 15 | 16 | export {listLoginLogApi, listOpLogListApi, listErrorLogListApi}; 17 | -------------------------------------------------------------------------------- /web/src/api/notice.ts: -------------------------------------------------------------------------------- 1 | import {get, post} from '/@/utils/http/axios'; 2 | 3 | enum URL { 4 | list = '/api/notice/list', 5 | create = '/api/notice/create', 6 | update = '/api/notice/update', 7 | delete = '/api/notice/delete', 8 | } 9 | 10 | const listApi = async (params: any) => 11 | get({url: URL.list, params: params, data: {}, headers: {}}); 12 | const createApi = async (data: any) => 13 | post({ 14 | url: URL.create, 15 | params: {}, 16 | data: data, 17 | headers: {'Content-Type': 'multipart/form-data;charset=utf-8'} 18 | }); 19 | const updateApi = async (data: any) => 20 | post({ 21 | url: URL.update, 22 | data: data, 23 | headers: {'Content-Type': 'multipart/form-data;charset=utf-8'} 24 | }); 25 | const deleteApi = async (params: any) => 26 | post({url: URL.delete, params: params, headers: {}}); 27 | 28 | export {listApi, createApi, updateApi, deleteApi}; 29 | -------------------------------------------------------------------------------- /web/src/api/order.ts: -------------------------------------------------------------------------------- 1 | import {get, post} from '/@/utils/http/axios'; 2 | 3 | enum URL { 4 | list = '/api/order/list', 5 | create = '/api/order/create', 6 | update = '/api/order/update', 7 | delete = '/api/order/delete', 8 | cancel = '/api/order/cancelOrder', 9 | cancelUserOrder = '/api/order/cancelUserOrder', 10 | userOrderList = '/api/order/userOrderList', 11 | } 12 | 13 | const listApi = async (params: any) => 14 | get({url: URL.list, params: params, data: {}, headers: {}}); 15 | const userOrderListApi = async (params: any) => 16 | get({url: URL.userOrderList, params: params, data: {}, headers: {}}); 17 | 18 | const createApi = async (data: any) => 19 | post({ 20 | url: URL.create, 21 | params: {}, 22 | data: data, 23 | headers: {'Content-Type': 'multipart/form-data;charset=utf-8'} 24 | }); 25 | const updateApi = async (params: any, data: any) => 26 | post({ 27 | url: URL.update, 28 | params: params, 29 | data: data, 30 | headers: {'Content-Type': 'multipart/form-data;charset=utf-8'} 31 | }); 32 | const deleteApi = async (params: any) => 33 | post({url: URL.delete, params: params, headers: {}}); 34 | 35 | const cancelApi = async (params: any) => 36 | post({url: URL.cancel, params: params, headers: {}}); 37 | 38 | const cancelUserOrderApi = async (params: any) => 39 | post({url: URL.cancelUserOrder, params: params, headers: {}}); 40 | 41 | export {listApi, userOrderListApi, createApi, updateApi, deleteApi, cancelApi, cancelUserOrderApi}; 42 | -------------------------------------------------------------------------------- /web/src/api/overview.ts: -------------------------------------------------------------------------------- 1 | import {get, post} from '/@/utils/http/axios'; 2 | 3 | enum URL { 4 | list = '/api/overview/count', 5 | sysInfo= '/api/overview/sysInfo', 6 | } 7 | 8 | const listApi = async (params: any) => 9 | get({url: URL.list, params: params, data: {}, headers: {}}); 10 | 11 | 12 | const sysInfoApi = async (params: any) => 13 | get({url: URL.sysInfo, params: params, data: {}, headers: {}}); 14 | 15 | export {listApi, sysInfoApi}; 16 | -------------------------------------------------------------------------------- /web/src/api/tag.ts: -------------------------------------------------------------------------------- 1 | import {get, post} from '/@/utils/http/axios'; 2 | 3 | enum URL { 4 | userList = '/api/tag/list', 5 | create = '/api/tag/create', 6 | update = '/api/tag/update', 7 | delete = '/api/tag/delete', 8 | } 9 | 10 | const listApi = async (params: any) => 11 | get({url: URL.userList, params: params, data: {}, headers: {}}); 12 | const createApi = async (data: any) => 13 | post({ 14 | url: URL.create, 15 | params: {}, 16 | data: data, 17 | headers: {'Content-Type': 'multipart/form-data;charset=utf-8'} 18 | }); 19 | const updateApi = async (params: any, data: any) => 20 | post({ 21 | url: URL.update, 22 | params: params, 23 | data: data, 24 | headers: {'Content-Type': 'multipart/form-data;charset=utf-8'} 25 | }); 26 | const deleteApi = async (params: any) => 27 | post({url: URL.delete, params: params, headers: {}}); 28 | 29 | export {listApi, createApi, updateApi, deleteApi}; 30 | -------------------------------------------------------------------------------- /web/src/api/thing.ts: -------------------------------------------------------------------------------- 1 | // 权限问题后期增加 2 | import { get, post } from '/@/utils/http/axios'; 3 | import { UserState } from '/@/store/modules/user/types'; 4 | // import axios from 'axios'; 5 | enum URL { 6 | list = '/api/thing/list', 7 | create = '/api/thing/create', 8 | update = '/api/thing/update', 9 | delete = '/api/thing/delete', 10 | detail = '/api/thing/detail', 11 | } 12 | 13 | const listApi = async (params: any) => get({ url: URL.list, params: params, data: {}, headers: {} }); 14 | const createApi = async (data: any) => 15 | post({ url: URL.create, params: {}, data: data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 16 | const updateApi = async (data: any) => 17 | post({ url: URL.update,data: data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 18 | const deleteApi = async (params: any) => post({ url: URL.delete, params: params, headers: {} }); 19 | const detailApi = async (params: any) => get({ url: URL.detail, params: params, headers: {} }); 20 | 21 | export { listApi, createApi, updateApi, deleteApi, detailApi }; 22 | -------------------------------------------------------------------------------- /web/src/api/thingCollect.ts: -------------------------------------------------------------------------------- 1 | 2 | import { get, post } from '/@/utils/http/axios'; 3 | import { UserState } from '/@/store/modules/user/types'; 4 | 5 | enum URL { 6 | userCollectList = '/api/thingCollect/getUserCollectList', 7 | collect = '/api/thingCollect/collect', 8 | unCollect = '/api/thingCollect/unCollect', 9 | } 10 | 11 | const collectApi = async (data: any) => post({ url: URL.collect, params: {}, data: data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 12 | const unCollectApi = async (params: any) => post({ url: URL.unCollect, params: params, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 13 | const userCollectListApi = async (params: any) => get({ url: URL.userCollectList, params: params }); 14 | 15 | export { collectApi, unCollectApi, userCollectListApi }; 16 | -------------------------------------------------------------------------------- /web/src/api/thingWish.ts: -------------------------------------------------------------------------------- 1 | // 权限问题后期增加 2 | import { get, post } from '/@/utils/http/axios'; 3 | import { UserState } from '/@/store/modules/user/types'; 4 | // import axios from 'axios'; 5 | enum URL { 6 | userWishList = '/api/thingWish/getUserWishList', 7 | wish = '/api/thingWish/wish', 8 | unWish = '/api/thingWish/unWish', 9 | } 10 | 11 | const wishApi = async (data: any) => post({ url: URL.wish, params: {}, data: data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 12 | const unWishApi = async (params: any) => post({ url: URL.unWish, params: params, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 13 | const userWishListApi = async (params: any) => get({ url: URL.userWishList, params: params }); 14 | 15 | export { wishApi, unWishApi, userWishListApi }; 16 | -------------------------------------------------------------------------------- /web/src/api/user.ts: -------------------------------------------------------------------------------- 1 | // 权限问题后期增加 2 | import { get, post } from '/@/utils/http/axios'; 3 | import { UserState } from '/@/store/modules/user/types'; 4 | // import axios from 'axios'; 5 | enum URL { 6 | login = '/api/user/login', 7 | userList = '/api/user/list', 8 | detail = '/api/user/detail', 9 | create = '/api/user/create', 10 | update = '/api/user/update', 11 | delete = '/api/user/delete', 12 | userLogin = '/api/user/userLogin', 13 | userRegister = '/api/user/userRegister', 14 | updateUserPwd = '/api/user/updatePwd', 15 | updateUserInfo = '/api/user/updateUserInfo' 16 | } 17 | interface LoginRes { 18 | token: string; 19 | } 20 | 21 | export interface LoginData { 22 | username: string; 23 | password: string; 24 | } 25 | 26 | const loginApi = async (data: LoginData) => post({ url: URL.login, data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 27 | const listApi = async (params: any) => get({ url: URL.userList, params: params, data: {}, headers: {} }); 28 | const detailApi = async (params: any) => get({ url: URL.detail, params: params, data: {}, headers: {} }); 29 | const createApi = async (data: any) => post({ url: URL.create, params: {}, data: data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 30 | const updateApi = async (data: any) => post({ url: URL.update, data: data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 31 | const deleteApi = async (params: any) => post({ url: URL.delete, params: params, headers: {} }); 32 | const userLoginApi = async (data: LoginData) => post({ url: URL.userLogin, data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 33 | const userRegisterApi = async (data: any) => post({ url: URL.userRegister, params: {}, data: data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 34 | const updateUserPwdApi = async (params: any) => post({ url: URL.updateUserPwd, params: params }); 35 | const updateUserInfoApi = async (data: any) => post({ url: URL.updateUserInfo, data: data, headers: { 'Content-Type': 'multipart/form-data;charset=utf-8' } }); 36 | 37 | export { loginApi, listApi, detailApi, createApi, updateApi, deleteApi, userLoginApi, userRegisterApi, updateUserPwdApi, updateUserInfoApi}; 38 | -------------------------------------------------------------------------------- /web/src/assets/fonts/Blimone-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/fonts/Blimone-ExtraBold.woff -------------------------------------------------------------------------------- /web/src/assets/fonts/Blimone-ExtraLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/fonts/Blimone-ExtraLight.woff -------------------------------------------------------------------------------- /web/src/assets/fonts/Blimone-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/fonts/Blimone-Light.woff -------------------------------------------------------------------------------- /web/src/assets/fonts/Blimone-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/fonts/Blimone-Regular.woff -------------------------------------------------------------------------------- /web/src/assets/icons/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/icons/logo.png -------------------------------------------------------------------------------- /web/src/assets/icons/svg/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/assets/icons/svg/marks.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /web/src/assets/icons/svg/test.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/assets/icons/svg/ts.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /web/src/assets/icons/svg/twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /web/src/assets/images/add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/assets/images/address-right-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/src/assets/images/ali-pay-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/src/assets/images/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/images/avatar.jpg -------------------------------------------------------------------------------- /web/src/assets/images/banner-02.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/images/banner-02.webp -------------------------------------------------------------------------------- /web/src/assets/images/cart-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /web/src/assets/images/clear-search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/assets/images/code-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/assets/images/delete-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /web/src/assets/images/ebook-download-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/assets/images/k-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/images/k-logo.png -------------------------------------------------------------------------------- /web/src/assets/images/login-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/images/login-banner.png -------------------------------------------------------------------------------- /web/src/assets/images/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/images/login.png -------------------------------------------------------------------------------- /web/src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/images/logo.png -------------------------------------------------------------------------------- /web/src/assets/images/mail-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/assets/images/message-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /web/src/assets/images/order-address-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/assets/images/order-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/src/assets/images/order-point-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/assets/images/order-thing-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /web/src/assets/images/pwd-hidden.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /web/src/assets/images/pwd-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/assets/images/qunerweima.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/images/qunerweima.jpg -------------------------------------------------------------------------------- /web/src/assets/images/read-online-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /web/src/assets/images/recommend-hover.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /web/src/assets/images/register-name.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /web/src/assets/images/search-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/src/assets/images/searchIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/src/assets/images/setting-card-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /web/src/assets/images/setting-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/src/assets/images/setting-msg-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/src/assets/images/setting-safe-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/assets/images/share-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/assets/images/tel-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/src/assets/images/want-read-hover.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /web/src/assets/images/wb-share.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /web/src/assets/images/wx-pay-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/src/assets/styles/base.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geeeeeeeek/java_book/896e409710585d8793eb44cc5dde88c5e23e83bd/web/src/assets/styles/base.less -------------------------------------------------------------------------------- /web/src/core/bootstrap.js: -------------------------------------------------------------------------------- 1 | // localStorage恢复到内存 2 | 3 | import {useUserStore} from "/@/store"; 4 | import {USER_ID, USER_NAME, USER_TOKEN, ADMIN_USER_ID, ADMIN_USER_NAME, ADMIN_USER_TOKEN} from "/@/store/constants"; 5 | 6 | export default function Initializer () { 7 | const userStore = useUserStore() 8 | userStore.$patch((state)=>{ 9 | state.user_id = localStorage.getItem(USER_ID) 10 | state.user_name = localStorage.getItem(USER_NAME) 11 | state.user_token = localStorage.getItem(USER_TOKEN) 12 | 13 | state.admin_user_id = localStorage.getItem(ADMIN_USER_ID) 14 | state.admin_user_name = localStorage.getItem(ADMIN_USER_NAME) 15 | state.admin_user_token = localStorage.getItem(ADMIN_USER_TOKEN) 16 | console.log('恢复store完毕==>', state) 17 | }) 18 | 19 | } 20 | -------------------------------------------------------------------------------- /web/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue'; 2 | import App from './App.vue'; 3 | import router from './router'; 4 | import piniaStore from './store'; 5 | 6 | import bootstrap from './core/bootstrap'; 7 | import '/@/styles/reset.less'; 8 | import '/@/styles/index.less'; 9 | import Antd from 'ant-design-vue'; 10 | 11 | const app = createApp(App); 12 | 13 | app.use(Antd); 14 | app.use(router); 15 | app.use(piniaStore); 16 | app.use(bootstrap); 17 | app.mount('#app'); 18 | -------------------------------------------------------------------------------- /web/src/router/index.ts: -------------------------------------------------------------------------------- 1 | import {createRouter, createWebHistory} from 'vue-router'; 2 | import root from './root'; 3 | 4 | import { ADMIN_USER_TOKEN, USER_TOKEN } from '/@/store/constants' 5 | 6 | // 路由权限白名单 7 | const allowList = ['adminLogin', 'login', 'register', 'portal', 'search', 'detail', '403', '404'] 8 | // 前台登录地址 9 | const loginRoutePath = '/index/login' 10 | // 后台登录地址 11 | const adminLoginRoutePath = '/adminLogin' 12 | 13 | 14 | const router = createRouter({ 15 | history: createWebHistory(), 16 | routes: root, 17 | }); 18 | 19 | router.beforeEach(async (to, from, next) => { 20 | console.log(to, from) 21 | 22 | /** 后台路由 **/ 23 | if (to.path.startsWith('/admin')) { 24 | if (localStorage.getItem(ADMIN_USER_TOKEN)) { 25 | if (to.path === adminLoginRoutePath) { 26 | next({ path: '/' }) 27 | } else { 28 | next() 29 | } 30 | } else { 31 | if (allowList.includes(to.name as string)) { 32 | // 在免登录名单,直接进入 33 | next() 34 | } else { 35 | next({ path: adminLoginRoutePath, query: { redirect: to.fullPath } }) 36 | } 37 | } 38 | // next() 39 | } 40 | 41 | /** 前台路由 **/ 42 | if (to.path.startsWith('/index')) { 43 | if (localStorage.getItem(USER_TOKEN)) { 44 | if (to.path === loginRoutePath) { 45 | next({ path: '/' }) 46 | } else { 47 | next() 48 | } 49 | } else { 50 | if (allowList.includes(to.name as string)) { 51 | // 在免登录名单,直接进入 52 | next() 53 | } else { 54 | next({ path: loginRoutePath, query: { redirect: to.fullPath } }) 55 | } 56 | } 57 | // next() 58 | } 59 | 60 | }); 61 | 62 | router.afterEach((_to) => { 63 | // 回到顶部 64 | document.getElementById("html")?.scrollTo(0, 0) 65 | }); 66 | 67 | export default router; 68 | -------------------------------------------------------------------------------- /web/src/store/constants.ts: -------------------------------------------------------------------------------- 1 | const BASE_URL = 'http://127.0.0.1:9100' 2 | // const BASE_URL = 'http://1.117.171.66:9100' 3 | 4 | const USER_ID = 'user_id' 5 | const USER_NAME = 'user_name' 6 | const USER_TOKEN = 'user_token' 7 | 8 | const ADMIN_USER_ID = 'admin_user_id' 9 | const ADMIN_USER_NAME = 'admin_user_name' 10 | const ADMIN_USER_TOKEN = 'admin_user_token' 11 | 12 | 13 | export {BASE_URL, USER_TOKEN, USER_NAME, USER_ID, ADMIN_USER_ID,ADMIN_USER_NAME,ADMIN_USER_TOKEN } 14 | -------------------------------------------------------------------------------- /web/src/store/index.ts: -------------------------------------------------------------------------------- 1 | import { createPinia } from 'pinia'; 2 | import { useAppStore } from './modules/app'; 3 | import { useUserStore } from './modules/user'; 4 | 5 | import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'; 6 | 7 | const pinia = createPinia(); 8 | pinia.use(piniaPluginPersistedstate); 9 | 10 | export { useAppStore, useUserStore }; 11 | export default pinia; 12 | -------------------------------------------------------------------------------- /web/src/store/modules/app/index.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia'; 2 | import piniaStore from '/@/store/index'; 3 | import { AppState } from './types'; 4 | 5 | export const useAppStore = defineStore( 6 | // 唯一ID 7 | 'app', 8 | { 9 | state: () => ({ 10 | title: 'FastVue3, 一个快速开箱即用的Vue3+Vite模板', 11 | h1: 'Vue3 + Vite3.x + TypeScript + Pinia大厂开发必备', 12 | theme: '', 13 | }), 14 | getters: {}, 15 | actions: { 16 | updateSettings(partial: Partial) { 17 | this.$patch(partial); 18 | }, 19 | 20 | // Change theme color 21 | toggleTheme(dark: boolean) { 22 | if (dark) { 23 | this.theme = 'dark'; 24 | document.documentElement.classList.add('dark'); 25 | } else { 26 | this.theme = 'light'; 27 | document.documentElement.classList.remove('dark'); 28 | } 29 | }, 30 | }, 31 | persist: { 32 | key: 'theme', 33 | storage: localStorage, 34 | paths: ['theme'], 35 | }, 36 | }, 37 | ); 38 | 39 | export function useAppOutsideStore() { 40 | return useAppStore(piniaStore); 41 | } 42 | -------------------------------------------------------------------------------- /web/src/store/modules/app/types.ts: -------------------------------------------------------------------------------- 1 | export interface AppState { 2 | theme: string; 3 | colorWeek: boolean; 4 | navbar: boolean; 5 | menu: boolean; 6 | menuCollapse: boolean; 7 | footer: boolean; 8 | themeColor: string; 9 | menuWidth: number; 10 | globalSettings: boolean; 11 | [key: string]: unknown; 12 | } 13 | -------------------------------------------------------------------------------- /web/src/store/modules/user/types.ts: -------------------------------------------------------------------------------- 1 | export type RoleType = '' | '*' | 'admin' | 'user'; 2 | export interface UserState { 3 | user_id: any; 4 | user_name: any; 5 | user_token: any; 6 | 7 | admin_user_id: any; 8 | admin_user_name: any; 9 | admin_user_token: any; 10 | } 11 | -------------------------------------------------------------------------------- /web/src/styles/index.less: -------------------------------------------------------------------------------- 1 | //自定义css 2 | a { 3 | color: #1890ff; 4 | } 5 | -------------------------------------------------------------------------------- /web/src/styles/reset.less: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | } 4 | 5 | *, 6 | ::before, 7 | ::after { 8 | margin: 0; 9 | padding: 0; 10 | box-sizing: inherit; 11 | } 12 | 13 | 14 | a:hover, 15 | a:link, 16 | a:visited, 17 | a:active { 18 | text-decoration: none; 19 | } 20 | 21 | ol, 22 | ul { 23 | list-style: none; 24 | } 25 | 26 | input, 27 | textarea { 28 | outline: none; 29 | border: none; 30 | resize: none; 31 | } 32 | 33 | body { 34 | font-size: 14px; 35 | font-weight: 400; 36 | } 37 | -------------------------------------------------------------------------------- /web/src/utils/auth.ts: -------------------------------------------------------------------------------- 1 | const TokenKey = 'fast-token'; 2 | const TokenPrefix = 'Bearer '; 3 | const isLogin = () => { 4 | return !!localStorage.getItem(TokenKey); 5 | }; 6 | const getToken = () => { 7 | return localStorage.getItem(TokenKey); 8 | }; 9 | const setToken = (token: string) => { 10 | localStorage.setItem(TokenKey, token); 11 | }; 12 | const clearToken = () => { 13 | localStorage.removeItem(TokenKey); 14 | }; 15 | export { TokenPrefix, isLogin, getToken, setToken, clearToken }; 16 | -------------------------------------------------------------------------------- /web/src/utils/http/axios/index.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError, InternalAxiosRequestConfig } from 'axios'; 3 | import { showMessage } from './status'; 4 | import { IResponse } from './type'; 5 | import { getToken } from '/@/utils/auth'; 6 | import { TokenPrefix } from '/@/utils/auth'; 7 | import {ADMIN_USER_TOKEN, USER_TOKEN, BASE_URL} from '/@/store/constants' 8 | 9 | const service: AxiosInstance = axios.create({ 10 | // baseURL: import.meta.env.BASE_URL + '', 11 | baseURL: BASE_URL + '', 12 | timeout: 15000, 13 | }); 14 | 15 | // axios实例拦截请求 16 | service.interceptors.request.use( 17 | (config: InternalAxiosRequestConfig) => { 18 | 19 | config.headers.ADMINTOKEN = localStorage.getItem(ADMIN_USER_TOKEN) 20 | config.headers.TOKEN = localStorage.getItem(USER_TOKEN) 21 | 22 | return config; 23 | }, 24 | (error: AxiosError) => { 25 | return Promise.reject(error); 26 | }, 27 | ); 28 | 29 | // axios实例拦截响应 30 | service.interceptors.response.use( 31 | (response: AxiosResponse) => { 32 | if(response.status == 200) { 33 | if(response.data.code == 0 || response.data.code == 200) { 34 | return response 35 | }else { 36 | return Promise.reject(response.data) 37 | } 38 | } else { 39 | return Promise.reject(response.data) 40 | } 41 | }, 42 | // 请求失败 43 | (error: any) => { 44 | console.log(error.response.status) 45 | if(error.response.status == 404) { 46 | // todo 47 | } else if(error.response.status == 403) { 48 | // todo 49 | } 50 | return Promise.reject(error) 51 | }, 52 | ); 53 | 54 | 55 | 56 | const request = (config: AxiosRequestConfig): Promise => { 57 | const conf = config; 58 | return new Promise((resolve, reject) => { 59 | service.request>(conf).then((res: AxiosResponse) => { 60 | const data = res.data 61 | resolve(data as T); 62 | }).catch(err => { 63 | reject(err) 64 | }); 65 | }); 66 | }; 67 | 68 | export function get(config: AxiosRequestConfig): Promise { 69 | return request({ ...config, method: 'GET' }); 70 | } 71 | 72 | export function post(config: AxiosRequestConfig): Promise { 73 | return request({ ...config, method: 'POST' }); 74 | } 75 | 76 | export default request; 77 | 78 | export type { AxiosInstance, AxiosResponse }; 79 | -------------------------------------------------------------------------------- /web/src/utils/http/axios/status.ts: -------------------------------------------------------------------------------- 1 | export const showMessage = (status: number | string): string => { 2 | let message = ''; 3 | switch (status) { 4 | case 400: 5 | message = '请求错误(400)'; 6 | break; 7 | case 401: 8 | message = '未授权,请重新登录(401)'; 9 | break; 10 | case 403: 11 | message = '拒绝访问(403)'; 12 | break; 13 | case 404: 14 | message = '请求出错(404)'; 15 | break; 16 | case 408: 17 | message = '请求超时(408)'; 18 | break; 19 | case 500: 20 | message = '服务器错误(500)'; 21 | break; 22 | case 501: 23 | message = '服务未实现(501)'; 24 | break; 25 | case 502: 26 | message = '网络错误(502)'; 27 | break; 28 | case 503: 29 | message = '服务不可用(503)'; 30 | break; 31 | case 504: 32 | message = '网络超时(504)'; 33 | break; 34 | case 505: 35 | message = 'HTTP版本不受支持(505)'; 36 | break; 37 | default: 38 | message = `连接出错(${status})!`; 39 | } 40 | return `${message},请检查网络或联系管理员!`; 41 | }; 42 | -------------------------------------------------------------------------------- /web/src/utils/http/axios/type.ts: -------------------------------------------------------------------------------- 1 | export interface RequestOptions { 2 | // Whether to process the request result 3 | isTransformResponse?: boolean; 4 | } 5 | 6 | // 返回res.data的interface 7 | export interface IResponse { 8 | code: number | string; 9 | result: T; 10 | message: string; 11 | status: string | number; 12 | } 13 | 14 | /**用户登录 */ 15 | export interface ILogin { 16 | /** 账户名称 */ 17 | username: string; 18 | /** 账户密码 */ 19 | password: string; 20 | } 21 | -------------------------------------------------------------------------------- /web/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | // import { resolve } from 'path'; 2 | // const fs = require('fs'); 3 | // 4 | // function pathResolve(dir: string) { 5 | // return resolve(process.cwd(), '.', dir); 6 | // } 7 | // 8 | // export const getFolder = (path: any) => { 9 | // const components: Array = []; 10 | // const files = fs.readdirSync(path); 11 | // files.forEach(function (item: string) { 12 | // const stat = fs.lstatSync(path + '/' + item); 13 | // if (stat.isDirectory() === true && item != 'components') { 14 | // components.push(path + '/' + item); 15 | // components.push(pathResolve(path + '/' + item)); 16 | // } 17 | // }); 18 | // return components; 19 | // }; 20 | 21 | export function getFormatTime(dateTime,flag) { 22 | if(dateTime != null ) { 23 | //若传入的dateTime为字符串类型,需要进行转换成数值,若不是无需下面注释代码 24 | var time = parseInt(dateTime) 25 | var date = new Date(time); 26 | //获取年份 27 | var YY = date.getFullYear(); 28 | //获取月份 29 | var MM = (date.getMonth() + 1 < 10 ? '0'+(date.getMonth() + 1) : date.getMonth() + 1); 30 | //获取日期 31 | var DD = (date.getDate() < 10 ? '0'+date.getDate() : date.getDate()); 32 | if(flag) { //flag为true,显示时分秒格式 33 | //获取小时 34 | var hh = (date.getHours() < 10 ? '0'+date.getHours() : date.getHours()); 35 | //获取分 36 | var mm = (date.getMinutes() < 10 ? '0'+date.getMinutes() : date.getMinutes()); 37 | ///获取秒 38 | var ss = (date.getSeconds() < 10 ? '0'+date.getSeconds() : date.getSeconds()); 39 | //返回时间格式: 2020-11-09 13:14:52 40 | return YY + '-' + MM + '-' + DD + ' ' + hh + ':' + mm + ':' + ss; 41 | } else { 42 | //返回时间格式: 2020-11-09 43 | return YY + '-' + MM + '-' + DD; 44 | } 45 | } else { 46 | return ""; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /web/src/utils/result.ts: -------------------------------------------------------------------------------- 1 | import { Recoverable } from 'repl'; 2 | 3 | // 返回统一格式的接口数据类型定义 4 | export function successResult(result: T, { message = 'Request success' } = {}) { 5 | return { 6 | code: 200, 7 | result, 8 | message, 9 | status: 'ok', 10 | }; 11 | } 12 | export function errorResult(message = 'Request failed', { code = -1, result = null } = {}) { 13 | return { 14 | code, 15 | result, 16 | message, 17 | status: 'fail', 18 | }; 19 | } 20 | 21 | //返回分页数据 22 | export function pageSuccessResult(page: number, pageSize: number, list: T[], { message = 'ok' } = {}) { 23 | const pageData = pagination(page, pageSize, list); 24 | return { 25 | ...successResult({ 26 | items: pageData, 27 | total: list.length, 28 | }), 29 | message, 30 | }; 31 | } 32 | 33 | // 封装分页数据 34 | export function pagination(pageNo: number, pageSize: number, array: T[]): T[] { 35 | const offset = (pageNo - 1) * Number(pageSize); 36 | const res = 37 | offset + Number(pageSize) >= array.length ? array.slice(offset, array.length) : array.slice(offset, offset + Number(pageSize)); 38 | return res; 39 | } 40 | 41 | // 返回参数类型定义 42 | export interface requestParams { 43 | method: string; 44 | body: any; 45 | headers?: { authorization?: string }; 46 | query: any; 47 | } 48 | 49 | /** 50 | * @name getRequestToken 51 | * @description 通过request数据中获取token,具体情况根据接口规范修改 52 | */ 53 | export function getRequestToken({ headers }: requestParams): string | undefined { 54 | return headers?.authorization; 55 | } 56 | -------------------------------------------------------------------------------- /web/src/views/index/components/footer.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 29 | 30 | 84 | -------------------------------------------------------------------------------- /web/src/views/index/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 9 | -------------------------------------------------------------------------------- /web/src/views/index/portal.vue: -------------------------------------------------------------------------------- 1 | 8 | 25 | 28 | -------------------------------------------------------------------------------- /web/src/views/index/search.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 17 | 18 | 25 | -------------------------------------------------------------------------------- /web/src/views/index/user/score-view.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 35 | 68 | -------------------------------------------------------------------------------- /web/src/views/index/usercenter.vue: -------------------------------------------------------------------------------- 1 | 19 | 37 | 59 | -------------------------------------------------------------------------------- /web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "moduleResolution": "node", 6 | "strict": true, 7 | "noLib": false, 8 | "forceConsistentCasingInFileNames": true, 9 | "allowSyntheticDefaultImports": true, 10 | "strictFunctionTypes": false, 11 | "jsx": "preserve", 12 | "baseUrl": ".", 13 | "allowJs": true, 14 | "sourceMap": true, 15 | "esModuleInterop": true, 16 | "resolveJsonModule": true, 17 | "noUnusedLocals": false, 18 | "noUnusedParameters": false, 19 | "experimentalDecorators": true, 20 | "lib": ["dom", "esnext"], 21 | "noImplicitAny": false, 22 | "skipLibCheck": true, 23 | "types": ["vite/client"], 24 | "removeComments": true, 25 | "paths": { 26 | "/@/*": ["src/*"], 27 | "/#/*": ["types/*"] 28 | } 29 | }, 30 | "include": [ 31 | "tests/**/*.ts", 32 | "src/**/*.ts", 33 | "src/**/*.d.ts", 34 | "src/**/*.tsx", 35 | "src/**/*.vue", 36 | "types/**/*.d.ts", 37 | "types/**/*.ts", 38 | "build/**/*.ts", 39 | "build/**/*.d.ts", 40 | "mock/**/*.ts", 41 | "vite.config.ts" 42 | ], 43 | "exclude": ["node_modules", "tests/server/**/*.ts", "dist", "**/*.js"] 44 | } 45 | -------------------------------------------------------------------------------- /web/types/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module '*.vue' { 4 | import { DefineComponent } from 'vue'; 5 | const component: DefineComponent<{}, {}, any>; 6 | export default component; 7 | } 8 | 9 | declare module 'virtual:*' { 10 | const result: any; 11 | export default result; 12 | } 13 | -------------------------------------------------------------------------------- /web/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig, ConfigEnv } from 'vite'; 2 | import { createVitePlugins } from './build/vite/plugins'; 3 | import { resolve } from 'path'; 4 | import { VITE_PORT } from './build/constant'; 5 | 6 | function pathResolve(dir: string) { 7 | return resolve(process.cwd(), '.', dir); 8 | } 9 | 10 | // https://vitejs.dev/config/ 11 | export default ({ command }: ConfigEnv): UserConfig => { 12 | const isBuild = command === 'build'; 13 | let base: string; 14 | if (command === 'build') { 15 | base = '/'; 16 | } else { 17 | base = '/'; 18 | } 19 | return { 20 | base, 21 | publicDir: "public", //静态资源服务的文件夹 22 | resolve: { 23 | alias: [ 24 | { 25 | find: 'vue-i18n', 26 | replacement: 'vue-i18n/dist/vue-i18n.cjs.js', 27 | }, 28 | // 别名 /@/xxxx => src/xxxx 29 | { 30 | find: '/@', 31 | replacement: pathResolve('src') + '/', 32 | }, 33 | ], 34 | }, 35 | // plugins 36 | plugins: createVitePlugins(isBuild), 37 | 38 | // css 39 | css: {}, 40 | 41 | // server 42 | server: { 43 | hmr: { overlay: false }, // 禁用或配置 HMR 连接 设置 server.hmr.overlay 为 false 可以禁用服务器错误遮罩层 44 | // 服务配置 45 | port: VITE_PORT, // 类型: number 指定服务器端口; 46 | open: false, // 类型: boolean | string在服务器启动时自动在浏览器中打开应用程序; 47 | cors: true, // 类型: boolean | CorsOptions 为开发服务器配置 CORS。默认启用并允许任何源 48 | host: '0.0.0.0', // IP配置,支持从IP启动 49 | https: false, // 禁用https 50 | // proxy, 51 | }, 52 | }; 53 | }; 54 | --------------------------------------------------------------------------------